From: kazuhiko Date: Wed, 22 Nov 2000 08:20:36 +0000 (+0000) Subject: sync to xemacs-21.2.37 but STILL BUGGY X-Git-Tag: r21-2-37-utf-2000-0_17-1~32 X-Git-Url: http://git.chise.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1d9bc86590766427e2431876a50d78206a99edd5;p=chise%2Fxemacs-chise.git sync to xemacs-21.2.37 but STILL BUGGY --- diff --git a/CHANGES-beta b/CHANGES-beta index aefa0ef..d00ae9a 100644 --- a/CHANGES-beta +++ b/CHANGES-beta @@ -1,3 +1,37 @@ +to 21.2.37 "Pan" +-- etags fix -- Stephen Carney +-- more gutters and tab changes -- Andy Piper +-- eval-when-compile no longer compiles its body -- Martin Buchholz +-- top-level (defvar foo) no longer generates a run-time load-history + entry -- Martin Buchholz +-- Windows 1251 code page encoding for Cyrillic -- Sergey Groznyh +-- `local-key-binding' and `global-key-binding' now have an optional + `accepts-defaults' parameter, just like `lookup-key' -- Martin Buchholz +-- 1000 arglist-related lispref documentation bugs fixed -- Martin Buchholz +-- arg to `down-list', `up-list', `backward-up-list', `kill-sexp', + `backward-kill-sexp' are now optional, just like FSF Emacs -- Martin Buchholz +-- info mode fixes -- Didier Verna +-- Massive CCL upgrade -- MIYASHITA Hisashi +-- byte-code optimizations -- Yoshiki Hayashi +-- historical purecopy's purged -- Robert Pluim +-- `mwheel-install', `turn-on-auto-fill', `turn-on-font-lock', + `turn-off-font-lock' are now interactive -- Martin Buchholz +-- Detect _getpty correctly (for SGIs) -- Martin Buchholz +-- Several GCPRO bugs found -- Yoshiki Hayashi +-- `replace-buffer-in-windows' now has the same WHICH-FRAMES and + WHICH-DEVICES paratmeters as `delete-windows-on' -- Martin Buchholz +-- Add support for Compaq C on Alpha Linux -- Martin Buchholz +-- auto-save fixes -- Yoshiki Hayashi +-- Removed unused C vars detected by Compaq C -- Martin Buchholz +-- More 64-bit cleanliness micro-fixes -- Martin Buchholz +-- Fix cachel.merged_faces memory leak -- Golubev I. N. +-- More changes to allow definitions of lisp object types by + third-party modules -- Daiki Ueno. +-- Extbyte is now a char, not unsigned char -- Martin Buchholz +-- C++ compilability is restored -- Martin Buchholz +-- New tests for CCL -- MIYASHITA Hisashi, Yoshiki Hayashi +-- Use stropts.h, not sys/stropts.h. Likewise for strtio.h -- Martin Buchholz + to 21.2.36 "Notus" -- Fix build problems on AIX 4.3 -- Martin Buchholz -- Fix build problems on HP-UX 10.20 -- Alexandre Oliva and Martin Buchholz diff --git a/ChangeLog b/ChangeLog index 6e622c7..9df5083 100644 --- a/ChangeLog +++ b/ChangeLog @@ -25,6 +25,53 @@ * configure.in: Add new option `--with-utf-2000'; define `UTF2000' if it is specified. +2000-11-14 Martin Buchholz + + * XEmacs 21.2.37 is released. + +2000-10-19 Stephen J. Turnbull + + * README.packages: Add "uninstalled package" FAQ. + + * etc/PACKAGES: Add details on os-utils contents. + +2000-11-01 Martin Buchholz + + * configure.in: Handle alloca with Compaq C on Alpha Linux. + +2000-10-27 Martin Buchholz + + * configure.in: Oops, _getpt ==> _getpty + +2000-10-23 Yoshiki Hayashi + + * Makefile.in.in: Remove lockdir related things. + +2000-10-11 Martin Buchholz + + * configure.in: + Remove checking for XFree86. Use feature tests instead! + Add check for XRegisterIMInstantiateCallback. + Add check for XRegisterIMInstantiateCallback's prototype. + +2000-10-04 Yoshiki Hayashi + + * etc/NEWS: Change lprogress-display to progress-feedback. + +2000-10-08 Karl M. Hegbloom + + * configure.in: Typo - missing paren. + +2000-10-10 Martin Buchholz + + * configure.in: + Use stropts.h, not sys/stropts.h. + Use strtio.h, not sys/strtio.h. + +2000-10-06 Martin Buchholz + + * configure.in: Pretend that DEC OSF >= 5 is really DEC OSF 4. + 2000-10-04 Martin Buchholz * XEmacs 21.2.36 is released. diff --git a/Makefile.in.in b/Makefile.in.in index 2ccb3c0..04c1805 100644 --- a/Makefile.in.in +++ b/Makefile.in.in @@ -123,7 +123,6 @@ pkgdir=@pkgdir@ ## Where to install and expect the files that XEmacs modifies as it runs. ## These files are all architecture-independent. Right now, the ## only such data is the locking directory; -## ${lockdir} is a subdirectory of this. statedir=@statedir@ ## Where to install and expect executable files to be run by XEmacs @@ -199,11 +198,6 @@ buildlispdir=${srcdir}/lisp ## at once. etcdir=@etcdir@ -## Where to create and expect the locking directory, where -## the XEmacs locking code keeps track of which files are -## currently being edited. -lockdir=@lockdir@ - ## Where to put the DOC file. docdir=@docdir@ @@ -520,10 +514,9 @@ gzip-el: ## (e.g. /usr/local/lib/${PROGNAME}-20.5/sparc-sun-solaris2.6), we use ## make-path instead of mkdir. Not all mkdirs have the `-p' flag. mkdir: FRC.mkdir - ${MAKEPATH} ${COPYDESTS} ${lockdir} ${docdir} ${infodir} ${archlibdir} \ + ${MAKEPATH} ${COPYDESTS} ${docdir} ${infodir} ${archlibdir} \ ${mandir} ${bindir} ${datadir} ${libdir} ${pkgdir} \ ${sitelispdir} ${moduledir} ${sitemoduledir} - -chmod 0777 ${lockdir} ## Delete all the installed files that the `install' target would ## create (but not the noninstalled files such as `make all' would diff --git a/README.packages b/README.packages index d618862..04cc713 100644 --- a/README.packages +++ b/README.packages @@ -19,6 +19,13 @@ Q. I really liked the old way that packages were bundled and do not A. You can grab all the packages at once like you used to with old XEmacs versions, skip to the 'Sumo Tarball' section below. +Q. After installing, I want XEmacs to do `foo', but when I invoke it + (or click the toolbar button or select the menu item), nothing (or + an error) happens, and it used to work. +A. See the first FAQ; you may be missing a package that is essential to + you. You can either track it down and install it, or install the + `Sumo Tarball' (see the second FAQ). + A note of caution ----------------- diff --git a/configure b/configure index c3df64c..7f6679f 100755 --- a/configure +++ b/configure @@ -1142,7 +1142,7 @@ case "$canonical" in *-dec-osf1.2 | *-dec-osf1* ) opsys=decosf1-2 ;; *-dec-osf3.[2-9] ) opsys=decosf3-2 ;; *-dec-osf3* ) opsys=decosf3-1 ;; - *-dec-osf4* ) opsys=decosf4-0 ;; + *-dec-osf[4-9]* ) opsys=decosf4-0 ;; *-*-ultrix[0-3].* | *-*-ultrix4.0* ) opsys=bsd4-2 ;; *-*-ultrix4.[12]* ) opsys=bsd4-3 ;; @@ -6295,33 +6295,104 @@ fi done - echo $ac_n "checking for XFree86""... $ac_c" 1>&6 -echo "configure:6300: checking for XFree86" >&5 - if test -d "/usr/X386/include" -o \ - -f "/etc/XF86Config" -o \ - -f "/etc/X11/XF86Config" -o \ - -f "/usr/X11R6/lib/X11/XF86Config"; then - echo "$ac_t""yes" 1>&6 - { test "$extra_verbose" = "yes" && cat << \EOF - Defining HAVE_XFREE386 + for ac_func in XRegisterIMInstantiateCallback +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:6302: checking for $ac_func" >&5 + +cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:6328: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + { test "$extra_verbose" = "yes" && cat << EOF + Defining $ac_tr_func +EOF +cat >> confdefs.h <&6 +fi +done + + echo $ac_n "checking for standard XRegisterIMInstantiateCallback prototype""... $ac_c" 1>&6 +echo "configure:6356: checking for standard XRegisterIMInstantiateCallback prototype" >&5 + cat > conftest.$ac_ext < +extern Bool XRegisterIMInstantiateCallback( + Display*, struct _XrmHashBucketRec*, char*, char*, XIMProc, XPointer*); + +int main() { + +; return 0; } +EOF +if { (eval echo configure:6370: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + echo "$ac_t""yes" 1>&6 +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + echo "$ac_t""no" 1>&6 + { test "$extra_verbose" = "yes" && cat << \EOF + Defining XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE EOF cat >> confdefs.h <<\EOF -#define HAVE_XFREE386 1 +#define XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE 1 EOF } - else - echo "$ac_t""no" 1>&6 - fi +fi +rm -f conftest* test -z "$with_xmu" && { echo $ac_n "checking for XmuReadBitmapDataFromFile in -lXmu""... $ac_c" 1>&6 -echo "configure:6320: checking for XmuReadBitmapDataFromFile in -lXmu" >&5 +echo "configure:6391: checking for XmuReadBitmapDataFromFile in -lXmu" >&5 ac_lib_var=`echo Xmu'_'XmuReadBitmapDataFromFile | sed 'y%./+-%__p_%'` xe_check_libs=" -lXmu " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:6407: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -6371,19 +6442,19 @@ EOF echo $ac_n "checking for main in -lXbsd""... $ac_c" 1>&6 -echo "configure:6375: checking for main in -lXbsd" >&5 +echo "configure:6446: checking for main in -lXbsd" >&5 ac_lib_var=`echo Xbsd'_'main | sed 'y%./+-%__p_%'` xe_check_libs=" -lXbsd " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:6458: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -6420,22 +6491,22 @@ fi fi if test "$with_msw" != "no"; then echo "checking for MS-Windows" 1>&6 -echo "configure:6424: checking for MS-Windows" >&5 +echo "configure:6495: checking for MS-Windows" >&5 echo $ac_n "checking for main in -lgdi32""... $ac_c" 1>&6 -echo "configure:6427: checking for main in -lgdi32" >&5 +echo "configure:6498: checking for main in -lgdi32" >&5 ac_lib_var=`echo gdi32'_'main | sed 'y%./+-%__p_%'` xe_check_libs=" -lgdi32 " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:6510: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -6501,12 +6572,12 @@ EOF fi fi cat > conftest.$ac_ext < int main() { return (open("/dev/windows", O_RDONLY, 0) > 0)? 0 : 1; } EOF -if { (eval echo configure:6510: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 +if { (eval echo configure:6581: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 then { test "$extra_verbose" = "yes" && cat << \EOF Defining HAVE_MSG_SELECT @@ -6570,15 +6641,15 @@ fi if test "$with_x11" = "yes"; then ac_safe=`echo "X11/extensions/shape.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for X11/extensions/shape.h""... $ac_c" 1>&6 -echo "configure:6574: checking for X11/extensions/shape.h" >&5 +echo "configure:6645: checking for X11/extensions/shape.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:6582: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:6653: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -6625,7 +6696,7 @@ case "$x_libraries" in *X11R4* ) esac echo "checking for WM_COMMAND option" 1>&6 -echo "configure:6629: checking for WM_COMMAND option" >&5; +echo "configure:6700: checking for WM_COMMAND option" >&5; if test "$with_wmcommand" != "no"; then { test "$extra_verbose" = "yes" && cat << \EOF Defining HAVE_WMCOMMAND @@ -6640,15 +6711,15 @@ fi test -z "$with_xauth" && test "$window_system" = "none" && with_xauth=no test -z "$with_xauth" && { ac_safe=`echo "X11/Xauth.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for X11/Xauth.h""... $ac_c" 1>&6 -echo "configure:6644: checking for X11/Xauth.h" >&5 +echo "configure:6715: checking for X11/Xauth.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:6652: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:6723: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -6671,12 +6742,12 @@ fi } test -z "$with_xauth" && { echo $ac_n "checking for XauGetAuthByAddr in -lXau""... $ac_c" 1>&6 -echo "configure:6675: checking for XauGetAuthByAddr in -lXau" >&5 +echo "configure:6746: checking for XauGetAuthByAddr in -lXau" >&5 ac_lib_var=`echo Xau'_'XauGetAuthByAddr | sed 'y%./+-%__p_%'` xe_check_libs=" -lXau " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:6762: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -6732,15 +6803,15 @@ if test "$with_tooltalk" != "no" ; then for dir in "" "Tt/" "desktop/" ; do ac_safe=`echo "${dir}tt_c.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for ${dir}tt_c.h""... $ac_c" 1>&6 -echo "configure:6736: checking for ${dir}tt_c.h" >&5 +echo "configure:6807: checking for ${dir}tt_c.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:6744: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:6815: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -6776,12 +6847,12 @@ if test "$with_tooltalk" != "no" ; then xe_msg_checking="for tt_message_create in -ltt" test -n "$extra_libs" && xe_msg_checking="$xe_msg_checking using extra libs $extra_libs" echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6 -echo "configure:6780: checking "$xe_msg_checking"" >&5 +echo "configure:6851: checking "$xe_msg_checking"" >&5 ac_lib_var=`echo tt'_'tt_message_create | sed 'y%./+-%__p_%'` xe_check_libs=" -ltt $extra_libs" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:6867: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -6849,15 +6920,15 @@ fi test -z "$with_cde" && { ac_safe=`echo "Dt/Dt.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for Dt/Dt.h""... $ac_c" 1>&6 -echo "configure:6853: checking for Dt/Dt.h" >&5 +echo "configure:6924: checking for Dt/Dt.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:6861: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:6932: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -6880,12 +6951,12 @@ fi } test -z "$with_cde" && { echo $ac_n "checking for DtDndDragStart in -lDtSvc""... $ac_c" 1>&6 -echo "configure:6884: checking for DtDndDragStart in -lDtSvc" >&5 +echo "configure:6955: checking for DtDndDragStart in -lDtSvc" >&5 ac_lib_var=`echo DtSvc'_'DtDndDragStart | sed 'y%./+-%__p_%'` xe_check_libs=" -lDtSvc " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:6971: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -6965,7 +7036,7 @@ EOF fi echo $ac_n "checking if drag and drop API is needed""... $ac_c" 1>&6 -echo "configure:6969: checking if drag and drop API is needed" >&5 +echo "configure:7040: checking if drag and drop API is needed" >&5 if test "$with_dragndrop" != "no" ; then if test -n "$dragndrop_proto" ; then with_dragndrop=yes @@ -6986,18 +7057,18 @@ EOF fi echo "checking for LDAP" 1>&6 -echo "configure:6990: checking for LDAP" >&5 +echo "configure:7061: checking for LDAP" >&5 test -z "$with_ldap" && { ac_safe=`echo "ldap.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for ldap.h""... $ac_c" 1>&6 -echo "configure:6993: checking for ldap.h" >&5 +echo "configure:7064: checking for ldap.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:7001: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:7072: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -7020,15 +7091,15 @@ fi } test -z "$with_ldap" && { ac_safe=`echo "lber.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for lber.h""... $ac_c" 1>&6 -echo "configure:7024: checking for lber.h" >&5 +echo "configure:7095: checking for lber.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:7032: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:7103: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -7052,12 +7123,12 @@ fi if test "$with_ldap" != "no"; then echo $ac_n "checking for ldap_search in -lldap""... $ac_c" 1>&6 -echo "configure:7056: checking for ldap_search in -lldap" >&5 +echo "configure:7127: checking for ldap_search in -lldap" >&5 ac_lib_var=`echo ldap'_'ldap_search | sed 'y%./+-%__p_%'` xe_check_libs=" -lldap " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7143: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7093,12 +7164,12 @@ fi xe_msg_checking="for ldap_open in -lldap" test -n "-llber" && xe_msg_checking="$xe_msg_checking using extra libs -llber" echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6 -echo "configure:7097: checking "$xe_msg_checking"" >&5 +echo "configure:7168: checking "$xe_msg_checking"" >&5 ac_lib_var=`echo ldap'_'ldap_open | sed 'y%./+-%__p_%'` xe_check_libs=" -lldap -llber" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7184: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7134,12 +7205,12 @@ fi xe_msg_checking="for ldap_open in -lldap" test -n "-llber -lkrb" && xe_msg_checking="$xe_msg_checking using extra libs -llber -lkrb" echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6 -echo "configure:7138: checking "$xe_msg_checking"" >&5 +echo "configure:7209: checking "$xe_msg_checking"" >&5 ac_lib_var=`echo ldap'_'ldap_open | sed 'y%./+-%__p_%'` xe_check_libs=" -lldap -llber -lkrb" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7225: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7175,12 +7246,12 @@ fi xe_msg_checking="for ldap_open in -lldap" test -n "-llber -lkrb -ldes" && xe_msg_checking="$xe_msg_checking using extra libs -llber -lkrb -ldes" echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6 -echo "configure:7179: checking "$xe_msg_checking"" >&5 +echo "configure:7250: checking "$xe_msg_checking"" >&5 ac_lib_var=`echo ldap'_'ldap_open | sed 'y%./+-%__p_%'` xe_check_libs=" -lldap -llber -lkrb -ldes" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7266: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7242,10 +7313,10 @@ EOF for ac_func in ldap_set_option ldap_get_lderrno ldap_result2error ldap_parse_result do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:7246: checking for $ac_func" >&5 +echo "configure:7317: checking for $ac_func" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -7299,20 +7370,20 @@ fi if test "$with_postgresql" != "no"; then echo "checking for PostgreSQL" 1>&6 -echo "configure:7303: checking for PostgreSQL" >&5 +echo "configure:7374: checking for PostgreSQL" >&5 for header_dir in "" "pgsql/" "postgresql/"; do ac_safe=`echo "${header_dir}libpq-fe.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for ${header_dir}libpq-fe.h""... $ac_c" 1>&6 -echo "configure:7308: checking for ${header_dir}libpq-fe.h" >&5 +echo "configure:7379: checking for ${header_dir}libpq-fe.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:7316: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:7387: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -7336,12 +7407,12 @@ fi test -n "$libpq_fe_h_file" && { echo $ac_n "checking for PQconnectdb in -lpq""... $ac_c" 1>&6 -echo "configure:7340: checking for PQconnectdb in -lpq" >&5 +echo "configure:7411: checking for PQconnectdb in -lpq" >&5 ac_lib_var=`echo pq'_'PQconnectdb | sed 'y%./+-%__p_%'` xe_check_libs=" -lpq " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7427: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7385,12 +7456,12 @@ EOF echo $ac_n "checking for PQconnectStart in -lpq""... $ac_c" 1>&6 -echo "configure:7389: checking for PQconnectStart in -lpq" >&5 +echo "configure:7460: checking for PQconnectStart in -lpq" >&5 ac_lib_var=`echo pq'_'PQconnectStart | sed 'y%./+-%__p_%'` xe_check_libs=" -lpq " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7476: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7449,15 +7520,15 @@ fi if test "$window_system" != "none"; then echo "checking for graphics libraries" 1>&6 -echo "configure:7453: checking for graphics libraries" >&5 +echo "configure:7524: checking for graphics libraries" >&5 xpm_problem="" if test -z "$with_xpm"; then echo $ac_n "checking for Xpm - no older than 3.4f""... $ac_c" 1>&6 -echo "configure:7458: checking for Xpm - no older than 3.4f" >&5 +echo "configure:7529: checking for Xpm - no older than 3.4f" >&5 xe_check_libs=-lXpm cat > conftest.$ac_ext < @@ -7466,7 +7537,7 @@ echo "configure:7458: checking for Xpm - no older than 3.4f" >&5 XpmIncludeVersion != XpmLibraryVersion() ? 1 : XpmIncludeVersion < 30406 ? 2 : 0 ;} EOF -if { (eval echo configure:7470: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 +if { (eval echo configure:7541: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 then ./conftest dummy_arg; xpm_status=$?; if test "$xpm_status" = "0"; then @@ -7508,17 +7579,17 @@ EOF libs_x="-lXpm $libs_x" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-lXpm\" to \$libs_x"; fi echo $ac_n "checking for \"FOR_MSW\" xpm""... $ac_c" 1>&6 -echo "configure:7512: checking for \"FOR_MSW\" xpm" >&5 +echo "configure:7583: checking for \"FOR_MSW\" xpm" >&5 xe_check_libs=-lXpm cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7593: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* xpm_for_msw=no else @@ -7544,15 +7615,15 @@ EOF test -z "$with_xface" && { ac_safe=`echo "compface.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for compface.h""... $ac_c" 1>&6 -echo "configure:7548: checking for compface.h" >&5 +echo "configure:7619: checking for compface.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:7556: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:7627: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -7575,12 +7646,12 @@ fi } test -z "$with_xface" && { echo $ac_n "checking for UnGenFace in -lcompface""... $ac_c" 1>&6 -echo "configure:7579: checking for UnGenFace in -lcompface" >&5 +echo "configure:7650: checking for UnGenFace in -lcompface" >&5 ac_lib_var=`echo compface'_'UnGenFace | sed 'y%./+-%__p_%'` xe_check_libs=" -lcompface " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7666: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7643,12 +7714,12 @@ EOF if test "$with_png $with_tiff" != "no no"; then echo $ac_n "checking for inflate in -lc""... $ac_c" 1>&6 -echo "configure:7647: checking for inflate in -lc" >&5 +echo "configure:7718: checking for inflate in -lc" >&5 ac_lib_var=`echo c'_'inflate | sed 'y%./+-%__p_%'` xe_check_libs=" -lc " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7734: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7678,12 +7749,12 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for inflate in -lz""... $ac_c" 1>&6 -echo "configure:7682: checking for inflate in -lz" >&5 +echo "configure:7753: checking for inflate in -lz" >&5 ac_lib_var=`echo z'_'inflate | sed 'y%./+-%__p_%'` xe_check_libs=" -lz " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7769: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7713,12 +7784,12 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for inflate in -lgz""... $ac_c" 1>&6 -echo "configure:7717: checking for inflate in -lgz" >&5 +echo "configure:7788: checking for inflate in -lgz" >&5 ac_lib_var=`echo gz'_'inflate | sed 'y%./+-%__p_%'` xe_check_libs=" -lgz " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7804: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7759,15 +7830,15 @@ fi test -z "$with_jpeg" && { ac_safe=`echo "jpeglib.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for jpeglib.h""... $ac_c" 1>&6 -echo "configure:7763: checking for jpeglib.h" >&5 +echo "configure:7834: checking for jpeglib.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:7771: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:7842: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -7790,12 +7861,12 @@ fi } test -z "$with_jpeg" && { echo $ac_n "checking for jpeg_destroy_decompress in -ljpeg""... $ac_c" 1>&6 -echo "configure:7794: checking for jpeg_destroy_decompress in -ljpeg" >&5 +echo "configure:7865: checking for jpeg_destroy_decompress in -ljpeg" >&5 ac_lib_var=`echo jpeg'_'jpeg_destroy_decompress | sed 'y%./+-%__p_%'` xe_check_libs=" -ljpeg " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7881: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7842,10 +7913,10 @@ EOF png_problem="" test -z "$with_png" && { echo $ac_n "checking for pow""... $ac_c" 1>&6 -echo "configure:7846: checking for pow" >&5 +echo "configure:7917: checking for pow" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7943: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_pow=yes" else @@ -7889,15 +7960,15 @@ fi } test -z "$with_png" && { ac_safe=`echo "png.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for png.h""... $ac_c" 1>&6 -echo "configure:7893: checking for png.h" >&5 +echo "configure:7964: checking for png.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:7901: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:7972: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -7920,12 +7991,12 @@ fi } test -z "$with_png" && { echo $ac_n "checking for png_read_image in -lpng""... $ac_c" 1>&6 -echo "configure:7924: checking for png_read_image in -lpng" >&5 +echo "configure:7995: checking for png_read_image in -lpng" >&5 ac_lib_var=`echo png'_'png_read_image | sed 'y%./+-%__p_%'` xe_check_libs=" -lpng " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:8011: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -7959,10 +8030,10 @@ fi } if test -z "$with_png"; then echo $ac_n "checking for workable png version information""... $ac_c" 1>&6 -echo "configure:7963: checking for workable png version information" >&5 +echo "configure:8034: checking for workable png version information" >&5 xe_check_libs="-lpng -lz" cat > conftest.$ac_ext < int main(int c, char **v) { @@ -7970,7 +8041,7 @@ echo "configure:7963: checking for workable png version information" >&5 if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING) != 0) return 1; return (PNG_LIBPNG_VER < 10002) ? 2 : 0 ;} EOF -if { (eval echo configure:7974: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 +if { (eval echo configure:8045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 then ./conftest dummy_arg; png_status=$?; if test "$png_status" = "0"; then @@ -8013,15 +8084,15 @@ EOF test -z "$with_tiff" && { ac_safe=`echo "tiffio.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for tiffio.h""... $ac_c" 1>&6 -echo "configure:8017: checking for tiffio.h" >&5 +echo "configure:8088: checking for tiffio.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8025: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8096: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8044,12 +8115,12 @@ fi } test -z "$with_tiff" && { echo $ac_n "checking for TIFFClientOpen in -ltiff""... $ac_c" 1>&6 -echo "configure:8048: checking for TIFFClientOpen in -ltiff" >&5 +echo "configure:8119: checking for TIFFClientOpen in -ltiff" >&5 ac_lib_var=`echo tiff'_'TIFFClientOpen | sed 'y%./+-%__p_%'` xe_check_libs=" -ltiff " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:8135: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -8099,10 +8170,10 @@ fi if test "$with_x11" = "yes"; then echo "checking for X11 graphics libraries" 1>&6 -echo "configure:8103: checking for X11 graphics libraries" >&5 +echo "configure:8174: checking for X11 graphics libraries" >&5 echo "checking for the Athena widgets" 1>&6 -echo "configure:8106: checking for the Athena widgets" >&5 +echo "configure:8177: checking for the Athena widgets" >&5 case "$with_athena" in "xaw" | "") athena_variant=Xaw athena_3d=no ;; @@ -8116,12 +8187,12 @@ echo "configure:8106: checking for the Athena widgets" >&5 if test "$athena_3d" = "no"; then echo $ac_n "checking for XawScrollbarSetThumb in -l$athena_variant""... $ac_c" 1>&6 -echo "configure:8120: checking for XawScrollbarSetThumb in -l$athena_variant" >&5 +echo "configure:8191: checking for XawScrollbarSetThumb in -l$athena_variant" >&5 ac_lib_var=`echo $athena_variant'_'XawScrollbarSetThumb | sed 'y%./+-%__p_%'` xe_check_libs=" -l$athena_variant " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:8207: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -8148,12 +8219,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then echo "$ac_t""yes" 1>&6 echo $ac_n "checking for threeDClassRec in -l$athena_variant""... $ac_c" 1>&6 -echo "configure:8152: checking for threeDClassRec in -l$athena_variant" >&5 +echo "configure:8223: checking for threeDClassRec in -l$athena_variant" >&5 ac_lib_var=`echo $athena_variant'_'threeDClassRec | sed 'y%./+-%__p_%'` xe_check_libs=" -l$athena_variant " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:8239: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -8195,12 +8266,12 @@ fi else echo $ac_n "checking for threeDClassRec in -l$athena_variant""... $ac_c" 1>&6 -echo "configure:8199: checking for threeDClassRec in -l$athena_variant" >&5 +echo "configure:8270: checking for threeDClassRec in -l$athena_variant" >&5 ac_lib_var=`echo $athena_variant'_'threeDClassRec | sed 'y%./+-%__p_%'` xe_check_libs=" -l$athena_variant " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:8286: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -8229,12 +8300,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for threeDClassRec in -lXaw""... $ac_c" 1>&6 -echo "configure:8233: checking for threeDClassRec in -lXaw" >&5 +echo "configure:8304: checking for threeDClassRec in -lXaw" >&5 ac_lib_var=`echo Xaw'_'threeDClassRec | sed 'y%./+-%__p_%'` xe_check_libs=" -lXaw " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:8320: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -8276,15 +8347,15 @@ fi if test "$athena_3d" = "no"; then ac_safe=`echo "X11/Xaw/ThreeD.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for X11/Xaw/ThreeD.h""... $ac_c" 1>&6 -echo "configure:8280: checking for X11/Xaw/ThreeD.h" >&5 +echo "configure:8351: checking for X11/Xaw/ThreeD.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8288: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8359: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8304,15 +8375,15 @@ else echo "$ac_t""no" 1>&6 ac_safe=`echo "X11/Xaw/XawInit.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for X11/Xaw/XawInit.h""... $ac_c" 1>&6 -echo "configure:8308: checking for X11/Xaw/XawInit.h" >&5 +echo "configure:8379: checking for X11/Xaw/XawInit.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8316: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8387: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8338,15 +8409,15 @@ fi else ac_safe=`echo "X11/$athena_variant/XawInit.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for X11/$athena_variant/XawInit.h""... $ac_c" 1>&6 -echo "configure:8342: checking for X11/$athena_variant/XawInit.h" >&5 +echo "configure:8413: checking for X11/$athena_variant/XawInit.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8350: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8421: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8363,15 +8434,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_safe=`echo "X11/$athena_variant/ThreeD.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for X11/$athena_variant/ThreeD.h""... $ac_c" 1>&6 -echo "configure:8367: checking for X11/$athena_variant/ThreeD.h" >&5 +echo "configure:8438: checking for X11/$athena_variant/ThreeD.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8375: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8446: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8399,15 +8470,15 @@ fi if test -z "$athena_h_path"; then ac_safe=`echo "$athena_variant/XawInit.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $athena_variant/XawInit.h""... $ac_c" 1>&6 -echo "configure:8403: checking for $athena_variant/XawInit.h" >&5 +echo "configure:8474: checking for $athena_variant/XawInit.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8411: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8482: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8424,15 +8495,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_safe=`echo "$athena_variant/ThreeD.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $athena_variant/ThreeD.h""... $ac_c" 1>&6 -echo "configure:8428: checking for $athena_variant/ThreeD.h" >&5 +echo "configure:8499: checking for $athena_variant/ThreeD.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8436: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8507: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8461,15 +8532,15 @@ fi if test -z "$athena_h_path" -a "$athena_variant" != "Xaw3d"; then ac_safe=`echo "X11/Xaw3d/XawInit.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for X11/Xaw3d/XawInit.h""... $ac_c" 1>&6 -echo "configure:8465: checking for X11/Xaw3d/XawInit.h" >&5 +echo "configure:8536: checking for X11/Xaw3d/XawInit.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8473: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8544: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8486,15 +8557,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_safe=`echo "X11/Xaw3d/ThreeD.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for X11/Xaw3d/ThreeD.h""... $ac_c" 1>&6 -echo "configure:8490: checking for X11/Xaw3d/ThreeD.h" >&5 +echo "configure:8561: checking for X11/Xaw3d/ThreeD.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8498: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8569: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8526,15 +8597,15 @@ fi if test -z "$athena_h_path" -a "$athena_variant" != "Xaw3d"; then ac_safe=`echo "Xaw3d/XawInit.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for Xaw3d/XawInit.h""... $ac_c" 1>&6 -echo "configure:8530: checking for Xaw3d/XawInit.h" >&5 +echo "configure:8601: checking for Xaw3d/XawInit.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8538: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8609: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8551,15 +8622,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_safe=`echo "Xaw3d/ThreeD.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for Xaw3d/ThreeD.h""... $ac_c" 1>&6 -echo "configure:8555: checking for Xaw3d/ThreeD.h" >&5 +echo "configure:8626: checking for Xaw3d/ThreeD.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8563: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8634: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8591,15 +8662,15 @@ fi if test -z "$athena_h_path"; then ac_safe=`echo "X11/Xaw/ThreeD.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for X11/Xaw/ThreeD.h""... $ac_c" 1>&6 -echo "configure:8595: checking for X11/Xaw/ThreeD.h" >&5 +echo "configure:8666: checking for X11/Xaw/ThreeD.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8603: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8674: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8634,15 +8705,15 @@ fi ac_safe=`echo "Xm/Xm.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for Xm/Xm.h""... $ac_c" 1>&6 -echo "configure:8638: checking for Xm/Xm.h" >&5 +echo "configure:8709: checking for Xm/Xm.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:8646: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:8717: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -8659,12 +8730,12 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 echo $ac_n "checking for XmStringFree in -lXm""... $ac_c" 1>&6 -echo "configure:8663: checking for XmStringFree in -lXm" >&5 +echo "configure:8734: checking for XmStringFree in -lXm" >&5 ac_lib_var=`echo Xm'_'XmStringFree | sed 'y%./+-%__p_%'` xe_check_libs=" -lXm " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:8750: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -8704,9 +8775,9 @@ fi if test "$have_motif" = "yes"; then echo $ac_n "checking for Lesstif""... $ac_c" 1>&6 -echo "configure:8708: checking for Lesstif" >&5 +echo "configure:8779: checking for Lesstif" >&5 cat > conftest.$ac_ext < #ifdef LESSTIF_VERSION @@ -9112,7 +9183,7 @@ fi if test "$with_mule" = "yes" ; then echo "checking for Mule-related features" 1>&6 -echo "configure:9116: checking for Mule-related features" >&5 +echo "configure:9187: checking for Mule-related features" >&5 { test "$extra_verbose" = "yes" && cat << \EOF Defining MULE EOF @@ -9153,15 +9224,15 @@ EOF do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:9157: checking for $ac_hdr" >&5 +echo "configure:9228: checking for $ac_hdr" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:9165: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:9236: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -9192,12 +9263,12 @@ done echo $ac_n "checking for strerror in -lintl""... $ac_c" 1>&6 -echo "configure:9196: checking for strerror in -lintl" >&5 +echo "configure:9267: checking for strerror in -lintl" >&5 ac_lib_var=`echo intl'_'strerror | sed 'y%./+-%__p_%'` xe_check_libs=" -lintl " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:9283: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -9268,18 +9339,18 @@ EOF fi echo "checking for Mule input methods" 1>&6 -echo "configure:9272: checking for Mule input methods" >&5 +echo "configure:9343: checking for Mule input methods" >&5 case "$with_xim" in "" | "yes" ) echo "checking for XIM" 1>&6 -echo "configure:9275: checking for XIM" >&5 +echo "configure:9346: checking for XIM" >&5 echo $ac_n "checking for XOpenIM in -lX11""... $ac_c" 1>&6 -echo "configure:9278: checking for XOpenIM in -lX11" >&5 +echo "configure:9349: checking for XOpenIM in -lX11" >&5 ac_lib_var=`echo X11'_'XOpenIM | sed 'y%./+-%__p_%'` xe_check_libs=" -lX11 " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:9365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -9314,12 +9385,12 @@ fi if test "$have_motif $have_lesstif" = "yes no"; then echo $ac_n "checking for XmImMbLookupString in -lXm""... $ac_c" 1>&6 -echo "configure:9318: checking for XmImMbLookupString in -lXm" >&5 +echo "configure:9389: checking for XmImMbLookupString in -lXm" >&5 ac_lib_var=`echo Xm'_'XmImMbLookupString | sed 'y%./+-%__p_%'` xe_check_libs=" -lXm " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:9405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -9395,15 +9466,15 @@ EOF if test "$with_xfs" = "yes" ; then echo "checking for XFontSet" 1>&6 -echo "configure:9399: checking for XFontSet" >&5 +echo "configure:9470: checking for XFontSet" >&5 echo $ac_n "checking for XmbDrawString in -lX11""... $ac_c" 1>&6 -echo "configure:9402: checking for XmbDrawString in -lX11" >&5 +echo "configure:9473: checking for XmbDrawString in -lX11" >&5 ac_lib_var=`echo X11'_'XmbDrawString | sed 'y%./+-%__p_%'` xe_check_libs=" -lX11 " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:9489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -9454,15 +9525,15 @@ EOF test "$with_wnn6" = "yes" && with_wnn=yes # wnn6 implies wnn support test -z "$with_wnn" && { ac_safe=`echo "wnn/jllib.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for wnn/jllib.h""... $ac_c" 1>&6 -echo "configure:9458: checking for wnn/jllib.h" >&5 +echo "configure:9529: checking for wnn/jllib.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:9466: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:9537: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -9487,10 +9558,10 @@ fi for ac_func in crypt do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:9491: checking for $ac_func" >&5 +echo "configure:9562: checking for $ac_func" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:9588: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -9542,12 +9613,12 @@ done test "$ac_cv_func_crypt" != "yes" && { echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6 -echo "configure:9546: checking for crypt in -lcrypt" >&5 +echo "configure:9617: checking for crypt in -lcrypt" >&5 ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'` xe_check_libs=" -lcrypt " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:9633: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -9593,12 +9664,12 @@ fi if test -z "$with_wnn" -o "$with_wnn" = "yes"; then echo $ac_n "checking for jl_dic_list_e in -lwnn""... $ac_c" 1>&6 -echo "configure:9597: checking for jl_dic_list_e in -lwnn" >&5 +echo "configure:9668: checking for jl_dic_list_e in -lwnn" >&5 ac_lib_var=`echo wnn'_'jl_dic_list_e | sed 'y%./+-%__p_%'` xe_check_libs=" -lwnn " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:9684: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -9627,12 +9698,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for jl_dic_list_e in -lwnn4""... $ac_c" 1>&6 -echo "configure:9631: checking for jl_dic_list_e in -lwnn4" >&5 +echo "configure:9702: checking for jl_dic_list_e in -lwnn4" >&5 ac_lib_var=`echo wnn4'_'jl_dic_list_e | sed 'y%./+-%__p_%'` xe_check_libs=" -lwnn4 " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:9718: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -9661,12 +9732,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for jl_dic_list_e in -lwnn6""... $ac_c" 1>&6 -echo "configure:9665: checking for jl_dic_list_e in -lwnn6" >&5 +echo "configure:9736: checking for jl_dic_list_e in -lwnn6" >&5 ac_lib_var=`echo wnn6'_'jl_dic_list_e | sed 'y%./+-%__p_%'` xe_check_libs=" -lwnn6 " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:9752: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -9695,12 +9766,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for dic_list_e in -lwnn6_fromsrc""... $ac_c" 1>&6 -echo "configure:9699: checking for dic_list_e in -lwnn6_fromsrc" >&5 +echo "configure:9770: checking for dic_list_e in -lwnn6_fromsrc" >&5 ac_lib_var=`echo wnn6_fromsrc'_'dic_list_e | sed 'y%./+-%__p_%'` xe_check_libs=" -lwnn6_fromsrc " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:9786: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -9759,12 +9830,12 @@ EOF if test "$with_wnn6" != "no"; then echo $ac_n "checking for jl_fi_dic_list in -l$libwnn""... $ac_c" 1>&6 -echo "configure:9763: checking for jl_fi_dic_list in -l$libwnn" >&5 +echo "configure:9834: checking for jl_fi_dic_list in -l$libwnn" >&5 ac_lib_var=`echo $libwnn'_'jl_fi_dic_list | sed 'y%./+-%__p_%'` xe_check_libs=" -l$libwnn " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:9850: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -9810,15 +9881,15 @@ EOF if test "$with_canna" != "no"; then ac_safe=`echo "canna/jrkanji.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for canna/jrkanji.h""... $ac_c" 1>&6 -echo "configure:9814: checking for canna/jrkanji.h" >&5 +echo "configure:9885: checking for canna/jrkanji.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:9822: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:9893: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -9845,15 +9916,15 @@ fi c_switch_site="$c_switch_site -I/usr/local/canna/include" ac_safe=`echo "canna/jrkanji.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for canna/jrkanji.h""... $ac_c" 1>&6 -echo "configure:9849: checking for canna/jrkanji.h" >&5 +echo "configure:9920: checking for canna/jrkanji.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:9857: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:9928: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -9881,15 +9952,15 @@ fi test -z "$with_canna" && { ac_safe=`echo "canna/RK.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for canna/RK.h""... $ac_c" 1>&6 -echo "configure:9885: checking for canna/RK.h" >&5 +echo "configure:9956: checking for canna/RK.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:9893: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:9964: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -9912,12 +9983,12 @@ fi } test -z "$with_canna" && { echo $ac_n "checking for RkBgnBun in -lRKC""... $ac_c" 1>&6 -echo "configure:9916: checking for RkBgnBun in -lRKC" >&5 +echo "configure:9987: checking for RkBgnBun in -lRKC" >&5 ac_lib_var=`echo RKC'_'RkBgnBun | sed 'y%./+-%__p_%'` xe_check_libs=" -lRKC " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10003: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -9951,12 +10022,12 @@ fi } test -z "$with_canna" && { echo $ac_n "checking for jrKanjiControl in -lcanna""... $ac_c" 1>&6 -echo "configure:9955: checking for jrKanjiControl in -lcanna" >&5 +echo "configure:10026: checking for jrKanjiControl in -lcanna" >&5 ac_lib_var=`echo canna'_'jrKanjiControl | sed 'y%./+-%__p_%'` xe_check_libs=" -lcanna " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -10016,12 +10087,12 @@ if test "$need_motif" = "yes" ; then libs_x="-lXm $libs_x" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-lXm\" to \$libs_x"; fi echo $ac_n "checking for layout_object_getvalue in -li18n""... $ac_c" 1>&6 -echo "configure:10020: checking for layout_object_getvalue in -li18n" >&5 +echo "configure:10091: checking for layout_object_getvalue in -li18n" >&5 ac_lib_var=`echo i18n'_'layout_object_getvalue | sed 'y%./+-%__p_%'` xe_check_libs=" -li18n " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10107: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -10118,10 +10189,10 @@ fi for ac_func in cbrt closedir dup2 eaccess fmod fpathconf frexp ftime getaddrinfo gethostname getnameinfo getpagesize gettimeofday getcwd getwd logb lrand48 matherr mkdir mktime perror poll random rename res_init rint rmdir select setitimer setpgid setlocale setsid sigblock sighold sigprocmask snprintf stpcpy strerror tzset ulimit usleep utimes waitpid vsnprintf fsync ftruncate umask do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:10122: checking for $ac_func" >&5 +echo "configure:10193: checking for $ac_func" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10219: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -10172,13 +10243,13 @@ fi done -for ac_func in getpt _getpt grantpt unlockpt ptsname killpg tcgetpgrp +for ac_func in getpt _getpty grantpt unlockpt ptsname killpg tcgetpgrp do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:10179: checking for $ac_func" >&5 +echo "configure:10250: checking for $ac_func" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -10230,10 +10301,10 @@ done echo $ac_n "checking for openpty""... $ac_c" 1>&6 -echo "configure:10234: checking for openpty" >&5 +echo "configure:10305: checking for openpty" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10331: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_openpty=yes" else @@ -10275,12 +10346,12 @@ else echo $ac_n "checking for openpty in -lutil""... $ac_c" 1>&6 -echo "configure:10279: checking for openpty in -lutil" >&5 +echo "configure:10350: checking for openpty in -lutil" >&5 ac_lib_var=`echo util'_'openpty | sed 'y%./+-%__p_%'` xe_check_libs=" -lutil " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10366: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -10326,15 +10397,15 @@ EOF do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:10330: checking for $ac_hdr" >&5 +echo "configure:10401: checking for $ac_hdr" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:10338: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:10409: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -10366,19 +10437,19 @@ done test "$need_libutil" = "yes" && libs_system="$libs_system -lutil" && if test "$extra_verbose" = "yes"; then echo " Appending \"-lutil\" to \$libs_system"; fi fi -for ac_hdr in sys/stropts.h +for ac_hdr in stropts.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:10374: checking for $ac_hdr" >&5 +echo "configure:10445: checking for $ac_hdr" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:10382: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:10453: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -10407,14 +10478,14 @@ else fi done -if test "$ac_cv_header_sys_stropts_h" = "yes"; then +if test "$ac_cv_header_stropts_h" = "yes"; then for ac_func in isastream do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:10415: checking for $ac_func" >&5 +echo "configure:10486: checking for $ac_func" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10512: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -10464,19 +10535,19 @@ else fi done - for ac_hdr in sys/strtio.h + for ac_hdr in strtio.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:10472: checking for $ac_hdr" >&5 +echo "configure:10543: checking for $ac_hdr" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:10480: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:10551: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -10513,10 +10584,10 @@ extra_objs="$extra_objs realpath.o" && if test "$extra_verbose" = "yes"; then for ac_func in getloadavg do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:10517: checking for $ac_func" >&5 +echo "configure:10588: checking for $ac_func" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10614: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -10572,15 +10643,15 @@ if test "$ac_cv_func_getloadavg" = "yes"; then do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:10576: checking for $ac_hdr" >&5 +echo "configure:10647: checking for $ac_hdr" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:10584: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:10655: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -10616,12 +10687,12 @@ else echo $ac_n "checking for kstat_open in -lkstat""... $ac_c" 1>&6 -echo "configure:10620: checking for kstat_open in -lkstat" >&5 +echo "configure:10691: checking for kstat_open in -lkstat" >&5 ac_lib_var=`echo kstat'_'kstat_open | sed 'y%./+-%__p_%'` xe_check_libs=" -lkstat " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10707: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -10667,15 +10738,15 @@ fi do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:10671: checking for $ac_hdr" >&5 +echo "configure:10742: checking for $ac_hdr" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:10679: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:10750: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -10707,12 +10778,12 @@ done echo $ac_n "checking for kvm_read in -lkvm""... $ac_c" 1>&6 -echo "configure:10711: checking for kvm_read in -lkvm" >&5 +echo "configure:10782: checking for kvm_read in -lkvm" >&5 ac_lib_var=`echo kvm'_'kvm_read | sed 'y%./+-%__p_%'` xe_check_libs=" -lkvm " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10798: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -10757,16 +10828,16 @@ fi fi echo $ac_n "checking whether netdb declares h_errno""... $ac_c" 1>&6 -echo "configure:10761: checking whether netdb declares h_errno" >&5 +echo "configure:10832: checking whether netdb declares h_errno" >&5 cat > conftest.$ac_ext < int main() { return h_errno; ; return 0; } EOF -if { (eval echo configure:10770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10841: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* echo "$ac_t""yes" 1>&6 { test "$extra_verbose" = "yes" && cat << \EOF @@ -10786,16 +10857,16 @@ fi rm -f conftest* echo $ac_n "checking for sigsetjmp""... $ac_c" 1>&6 -echo "configure:10790: checking for sigsetjmp" >&5 +echo "configure:10861: checking for sigsetjmp" >&5 cat > conftest.$ac_ext < int main() { sigjmp_buf bar; sigsetjmp (bar, 0); ; return 0; } EOF -if { (eval echo configure:10799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:10870: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* echo "$ac_t""yes" 1>&6 { test "$extra_verbose" = "yes" && cat << \EOF @@ -10815,11 +10886,11 @@ fi rm -f conftest* echo $ac_n "checking whether localtime caches TZ""... $ac_c" 1>&6 -echo "configure:10819: checking whether localtime caches TZ" >&5 +echo "configure:10890: checking whether localtime caches TZ" >&5 if test "$ac_cv_func_tzset" = "yes"; then cat > conftest.$ac_ext < #if STDC_HEADERS @@ -10854,7 +10925,7 @@ main() exit (0); } EOF -if { (eval echo configure:10858: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 +if { (eval echo configure:10929: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 then emacs_cv_localtime_cache=no else @@ -10884,9 +10955,9 @@ fi if test "$HAVE_TIMEVAL" = "yes"; then echo $ac_n "checking whether gettimeofday accepts one or two arguments""... $ac_c" 1>&6 -echo "configure:10888: checking whether gettimeofday accepts one or two arguments" >&5 +echo "configure:10959: checking whether gettimeofday accepts one or two arguments" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:10982: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* echo "$ac_t""two" 1>&6 else @@ -10929,19 +11000,19 @@ fi echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:10933: checking for inline" >&5 +echo "configure:11004: checking for inline" >&5 ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:11016: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else @@ -10978,20 +11049,21 @@ test "$ac_cv_c_inline" != "no" -a "$GCC" = "yes" && extra_objs="$extra_objs inli fi -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +if test "$__DECC" != "yes"; then + # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -echo "configure:10985: checking for working alloca.h" >&5 +echo "configure:11057: checking for working alloca.h" >&5 cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } EOF -if { (eval echo configure:10995: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:11067: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_header_alloca_h=yes else @@ -11015,10 +11087,10 @@ EOF fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:11019: checking for alloca" >&5 +echo "configure:11091: checking for alloca" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:11122: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_alloca_works=yes else @@ -11085,10 +11157,10 @@ EOF echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:11089: checking whether alloca needs Cray hooks" >&5 +echo "configure:11161: checking whether alloca needs Cray hooks" >&5 cat > conftest.$ac_ext <&6 if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:11116: checking for $ac_func" >&5 +echo "configure:11188: checking for $ac_func" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:11214: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -11168,10 +11240,10 @@ done fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:11172: checking stack direction for C alloca" >&5 +echo "configure:11244: checking stack direction for C alloca" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 +if { (eval echo configure:11266: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 then ac_cv_c_stack_direction=1 else @@ -11213,21 +11285,22 @@ EOF fi -test -n "$ALLOCA" && extra_objs="$extra_objs $ALLOCA" && if test "$extra_verbose" = "yes"; then + test -n "$ALLOCA" && extra_objs="$extra_objs $ALLOCA" && if test "$extra_verbose" = "yes"; then echo " xemacs will be linked with \"$ALLOCA\"" fi +fi ac_safe=`echo "vfork.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for vfork.h""... $ac_c" 1>&6 -echo "configure:11223: checking for vfork.h" >&5 +echo "configure:11296: checking for vfork.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:11231: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:11304: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -11255,10 +11328,10 @@ else fi echo $ac_n "checking for working vfork""... $ac_c" 1>&6 -echo "configure:11259: checking for working vfork" >&5 +echo "configure:11332: checking for working vfork" >&5 cat > conftest.$ac_ext < @@ -11353,7 +11426,7 @@ main() { } } EOF -if { (eval echo configure:11357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 +if { (eval echo configure:11430: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 then ac_cv_func_vfork_works=yes else @@ -11379,10 +11452,10 @@ fi echo $ac_n "checking for working strcoll""... $ac_c" 1>&6 -echo "configure:11383: checking for working strcoll" >&5 +echo "configure:11456: checking for working strcoll" >&5 cat > conftest.$ac_ext < main () @@ -11392,7 +11465,7 @@ main () strcoll ("123", "456") >= 0); } EOF -if { (eval echo configure:11396: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 +if { (eval echo configure:11469: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 then ac_cv_func_strcoll_works=yes else @@ -11420,10 +11493,10 @@ fi for ac_func in getpgrp do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:11424: checking for $ac_func" >&5 +echo "configure:11497: checking for $ac_func" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:11523: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -11474,10 +11547,10 @@ fi done echo $ac_n "checking whether getpgrp takes no argument""... $ac_c" 1>&6 -echo "configure:11478: checking whether getpgrp takes no argument" >&5 +echo "configure:11551: checking whether getpgrp takes no argument" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 +if { (eval echo configure:11609: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 then ac_cv_func_getpgrp_void=yes else @@ -11559,10 +11632,10 @@ fi echo $ac_n "checking for working mmap""... $ac_c" 1>&6 -echo "configure:11563: checking for working mmap" >&5 +echo "configure:11636: checking for working mmap" >&5 case "$opsys" in ultrix* ) have_mmap=no ;; *) cat > conftest.$ac_ext < #include @@ -11595,7 +11668,7 @@ int main (int argc, char *argv[]) return 1; } EOF -if { (eval echo configure:11599: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 +if { (eval echo configure:11672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 then have_mmap=yes else @@ -11621,9 +11694,9 @@ test "$GNU_MALLOC" != "yes" -a "$have_mmap" != "yes" && rel_alloc=no if test "$rel_alloc $have_mmap" = "default yes"; then if test "$doug_lea_malloc" = "yes"; then echo $ac_n "checking for M_MMAP_THRESHOLD""... $ac_c" 1>&6 -echo "configure:11625: checking for M_MMAP_THRESHOLD" >&5 +echo "configure:11698: checking for M_MMAP_THRESHOLD" >&5 cat > conftest.$ac_ext < int main() { @@ -11635,7 +11708,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:11639: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:11712: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* rel_alloc=no; echo "$ac_t""yes" 1>&6; else @@ -11660,15 +11733,15 @@ EOF ac_safe=`echo "termios.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for termios.h""... $ac_c" 1>&6 -echo "configure:11664: checking for termios.h" >&5 +echo "configure:11737: checking for termios.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:11672: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:11745: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -11711,15 +11784,15 @@ else echo "$ac_t""no" 1>&6 ac_safe=`echo "termio.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for termio.h""... $ac_c" 1>&6 -echo "configure:11715: checking for termio.h" >&5 +echo "configure:11788: checking for termio.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:11723: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:11796: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -11751,10 +11824,10 @@ fi echo $ac_n "checking for socket""... $ac_c" 1>&6 -echo "configure:11755: checking for socket" >&5 +echo "configure:11828: checking for socket" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:11854: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_socket=yes" else @@ -11792,15 +11865,15 @@ if eval "test \"`echo '$ac_cv_func_'socket`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_safe=`echo "netinet/in.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for netinet/in.h""... $ac_c" 1>&6 -echo "configure:11796: checking for netinet/in.h" >&5 +echo "configure:11869: checking for netinet/in.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:11804: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:11877: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -11817,15 +11890,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_safe=`echo "arpa/inet.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for arpa/inet.h""... $ac_c" 1>&6 -echo "configure:11821: checking for arpa/inet.h" >&5 +echo "configure:11894: checking for arpa/inet.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:11829: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:11902: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -11850,9 +11923,9 @@ EOF } echo $ac_n "checking "for sun_len member in struct sockaddr_un"""... $ac_c" 1>&6 -echo "configure:11854: checking "for sun_len member in struct sockaddr_un"" >&5 +echo "configure:11927: checking "for sun_len member in struct sockaddr_un"" >&5 cat > conftest.$ac_ext < @@ -11863,7 +11936,7 @@ int main() { static struct sockaddr_un x; x.sun_len = 1; ; return 0; } EOF -if { (eval echo configure:11867: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:11940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* echo "$ac_t""yes" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF Defining HAVE_SOCKADDR_SUN_LEN @@ -11881,9 +11954,9 @@ else fi rm -f conftest* echo $ac_n "checking "for ip_mreq struct in netinet/in.h"""... $ac_c" 1>&6 -echo "configure:11885: checking "for ip_mreq struct in netinet/in.h"" >&5 +echo "configure:11958: checking "for ip_mreq struct in netinet/in.h"" >&5 cat > conftest.$ac_ext < @@ -11893,7 +11966,7 @@ int main() { static struct ip_mreq x; ; return 0; } EOF -if { (eval echo configure:11897: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:11970: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* echo "$ac_t""yes" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF Defining HAVE_MULTICAST @@ -11924,10 +11997,10 @@ fi echo $ac_n "checking for msgget""... $ac_c" 1>&6 -echo "configure:11928: checking for msgget" >&5 +echo "configure:12001: checking for msgget" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12027: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_msgget=yes" else @@ -11965,15 +12038,15 @@ if eval "test \"`echo '$ac_cv_func_'msgget`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_safe=`echo "sys/ipc.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for sys/ipc.h""... $ac_c" 1>&6 -echo "configure:11969: checking for sys/ipc.h" >&5 +echo "configure:12042: checking for sys/ipc.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:11977: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:12050: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -11990,15 +12063,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_safe=`echo "sys/msg.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for sys/msg.h""... $ac_c" 1>&6 -echo "configure:11994: checking for sys/msg.h" >&5 +echo "configure:12067: checking for sys/msg.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:12002: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:12075: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12036,15 +12109,15 @@ fi ac_safe=`echo "dirent.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for dirent.h""... $ac_c" 1>&6 -echo "configure:12040: checking for dirent.h" >&5 +echo "configure:12113: checking for dirent.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:12048: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:12121: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12071,15 +12144,15 @@ else echo "$ac_t""no" 1>&6 ac_safe=`echo "sys/dir.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for sys/dir.h""... $ac_c" 1>&6 -echo "configure:12075: checking for sys/dir.h" >&5 +echo "configure:12148: checking for sys/dir.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:12083: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:12156: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12112,15 +12185,15 @@ fi ac_safe=`echo "nlist.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for nlist.h""... $ac_c" 1>&6 -echo "configure:12116: checking for nlist.h" >&5 +echo "configure:12189: checking for nlist.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:12124: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:12197: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12150,22 +12223,22 @@ fi echo "checking "for sound support"" 1>&6 -echo "configure:12154: checking "for sound support"" >&5 +echo "configure:12227: checking "for sound support"" >&5 test -z "$with_native_sound" -a -n "$native_sound_lib" && with_native_sound=yes if test "$with_native_sound" != "no"; then if test -n "$native_sound_lib"; then ac_safe=`echo "multimedia/audio_device.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for multimedia/audio_device.h""... $ac_c" 1>&6 -echo "configure:12161: checking for multimedia/audio_device.h" >&5 +echo "configure:12234: checking for multimedia/audio_device.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:12169: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:12242: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12213,12 +12286,12 @@ fi if test -z "$native_sound_lib"; then echo $ac_n "checking for ALopenport in -laudio""... $ac_c" 1>&6 -echo "configure:12217: checking for ALopenport in -laudio" >&5 +echo "configure:12290: checking for ALopenport in -laudio" >&5 ac_lib_var=`echo audio'_'ALopenport | sed 'y%./+-%__p_%'` xe_check_libs=" -laudio " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12306: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -12260,12 +12333,12 @@ fi if test -z "$native_sound_lib"; then echo $ac_n "checking for AOpenAudio in -lAlib""... $ac_c" 1>&6 -echo "configure:12264: checking for AOpenAudio in -lAlib" >&5 +echo "configure:12337: checking for AOpenAudio in -lAlib" >&5 ac_lib_var=`echo Alib'_'AOpenAudio | sed 'y%./+-%__p_%'` xe_check_libs=" -lAlib " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12353: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -12314,15 +12387,15 @@ fi for dir in "machine" "sys" "linux"; do ac_safe=`echo "${dir}/soundcard.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for ${dir}/soundcard.h""... $ac_c" 1>&6 -echo "configure:12318: checking for ${dir}/soundcard.h" >&5 +echo "configure:12391: checking for ${dir}/soundcard.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:12326: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:12399: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12383,15 +12456,15 @@ fi if test "$with_nas_sound" != "no"; then ac_safe=`echo "audio/audiolib.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for audio/audiolib.h""... $ac_c" 1>&6 -echo "configure:12387: checking for audio/audiolib.h" >&5 +echo "configure:12460: checking for audio/audiolib.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:12395: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:12468: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12409,12 +12482,12 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo $ac_n "checking for AuOpenServer in -laudio""... $ac_c" 1>&6 -echo "configure:12413: checking for AuOpenServer in -laudio" >&5 +echo "configure:12486: checking for AuOpenServer in -laudio" >&5 ac_lib_var=`echo audio'_'AuOpenServer | sed 'y%./+-%__p_%'` xe_check_libs=" -laudio " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12502: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -12464,7 +12537,7 @@ EOF fi libs_x="-laudio $libs_x" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-laudio\" to \$libs_x"; fi cat > conftest.$ac_ext < EOF @@ -12495,7 +12568,7 @@ if test "$with_esd_sound" != "no"; then # Extract the first word of "esd-config", so it can be a program name with args. set dummy esd-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:12499: checking for $ac_word" >&5 +echo "configure:12572: checking for $ac_word" >&5 if test -n "$have_esd_config"; then ac_cv_prog_have_esd_config="$have_esd_config" # Let the user override the test. @@ -12524,10 +12597,10 @@ fi c_switch_site="$c_switch_site `esd-config --cflags`" && if test "$extra_verbose" = "yes"; then echo " Appending \"`esd-config --cflags`\" to \$c_switch_site"; fi LIBS="`esd-config --libs` $LIBS" && if test "$extra_verbose" = "yes"; then echo " Prepending \"`esd-config --libs`\" to \$LIBS"; fi echo $ac_n "checking for esd_play_stream""... $ac_c" 1>&6 -echo "configure:12528: checking for esd_play_stream" >&5 +echo "configure:12601: checking for esd_play_stream" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12627: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_esd_play_stream=yes" else @@ -12601,7 +12674,7 @@ test -z "$with_tty" && with_tty=yes if test "$with_tty" = "yes" ; then echo "checking for TTY-related features" 1>&6 -echo "configure:12605: checking for TTY-related features" >&5 +echo "configure:12678: checking for TTY-related features" >&5 { test "$extra_verbose" = "yes" && cat << \EOF Defining HAVE_TTY EOF @@ -12617,12 +12690,12 @@ EOF if test -z "$with_ncurses"; then echo $ac_n "checking for tgetent in -lncurses""... $ac_c" 1>&6 -echo "configure:12621: checking for tgetent in -lncurses" >&5 +echo "configure:12694: checking for tgetent in -lncurses" >&5 ac_lib_var=`echo ncurses'_'tgetent | sed 'y%./+-%__p_%'` xe_check_libs=" -lncurses " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12710: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -12666,15 +12739,15 @@ EOF ac_safe=`echo "ncurses/curses.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for ncurses/curses.h""... $ac_c" 1>&6 -echo "configure:12670: checking for ncurses/curses.h" >&5 +echo "configure:12743: checking for ncurses/curses.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:12678: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:12751: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12696,15 +12769,15 @@ fi ac_safe=`echo "ncurses/term.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for ncurses/term.h""... $ac_c" 1>&6 -echo "configure:12700: checking for ncurses/term.h" >&5 +echo "configure:12773: checking for ncurses/term.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:12708: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:12781: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12734,15 +12807,15 @@ fi c_switch_site="$c_switch_site -I/usr/include/ncurses" ac_safe=`echo "ncurses/curses.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for ncurses/curses.h""... $ac_c" 1>&6 -echo "configure:12738: checking for ncurses/curses.h" >&5 +echo "configure:12811: checking for ncurses/curses.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:12746: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:12819: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12777,12 +12850,12 @@ fi for lib in curses termlib termcap; do echo $ac_n "checking for tgetent in -l$lib""... $ac_c" 1>&6 -echo "configure:12781: checking for tgetent in -l$lib" >&5 +echo "configure:12854: checking for tgetent in -l$lib" >&5 ac_lib_var=`echo $lib'_'tgetent | sed 'y%./+-%__p_%'` xe_check_libs=" -l$lib " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -12824,12 +12897,12 @@ fi else echo $ac_n "checking for tgetent in -lcurses""... $ac_c" 1>&6 -echo "configure:12828: checking for tgetent in -lcurses" >&5 +echo "configure:12901: checking for tgetent in -lcurses" >&5 ac_lib_var=`echo curses'_'tgetent | sed 'y%./+-%__p_%'` xe_check_libs=" -lcurses " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -12858,12 +12931,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6 -echo "configure:12862: checking for tgetent in -ltermcap" >&5 +echo "configure:12935: checking for tgetent in -ltermcap" >&5 ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'` xe_check_libs=" -ltermcap " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:12951: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -12922,15 +12995,15 @@ EOF test -z "$with_gpm" && { ac_safe=`echo "gpm.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for gpm.h""... $ac_c" 1>&6 -echo "configure:12926: checking for gpm.h" >&5 +echo "configure:12999: checking for gpm.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:12934: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:13007: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -12953,12 +13026,12 @@ fi } test -z "$with_gpm" && { echo $ac_n "checking for Gpm_Open in -lgpm""... $ac_c" 1>&6 -echo "configure:12957: checking for Gpm_Open in -lgpm" >&5 +echo "configure:13030: checking for Gpm_Open in -lgpm" >&5 ac_lib_var=`echo gpm'_'Gpm_Open | sed 'y%./+-%__p_%'` xe_check_libs=" -lgpm " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13046: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13019,20 +13092,20 @@ test "$with_x11" = "yes" -o "$with_tty" = "yes" && extra_objs="$extra_objs event test "$with_database_gdbm $with_database_dbm $with_database_berkdb" \ != "no no no" && echo "checking for database support" 1>&6 -echo "configure:13023: checking for database support" >&5 +echo "configure:13096: checking for database support" >&5 if test "$with_database_gdbm $with_database_dbm" != "no no"; then ac_safe=`echo "ndbm.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for ndbm.h""... $ac_c" 1>&6 -echo "configure:13028: checking for ndbm.h" >&5 +echo "configure:13101: checking for ndbm.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:13036: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:13109: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -13062,12 +13135,12 @@ fi if test "$with_database_gdbm" != "no"; then echo $ac_n "checking for dbm_open in -lgdbm""... $ac_c" 1>&6 -echo "configure:13066: checking for dbm_open in -lgdbm" >&5 +echo "configure:13139: checking for dbm_open in -lgdbm" >&5 ac_lib_var=`echo gdbm'_'dbm_open | sed 'y%./+-%__p_%'` xe_check_libs=" -lgdbm " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13155: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13106,10 +13179,10 @@ fi if test "$with_database_dbm" != "no"; then echo $ac_n "checking for dbm_open""... $ac_c" 1>&6 -echo "configure:13110: checking for dbm_open" >&5 +echo "configure:13183: checking for dbm_open" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13209: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_dbm_open=yes" else @@ -13151,12 +13224,12 @@ else echo $ac_n "checking for dbm_open in -ldbm""... $ac_c" 1>&6 -echo "configure:13155: checking for dbm_open in -ldbm" >&5 +echo "configure:13228: checking for dbm_open in -ldbm" >&5 ac_lib_var=`echo dbm'_'dbm_open | sed 'y%./+-%__p_%'` xe_check_libs=" -ldbm " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13244: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13208,10 +13281,10 @@ EOF if test "$with_database_berkdb" != "no"; then echo $ac_n "checking for Berkeley db.h""... $ac_c" 1>&6 -echo "configure:13212: checking for Berkeley db.h" >&5 +echo "configure:13285: checking for Berkeley db.h" >&5 for header in "db/db.h" "db.h"; do cat > conftest.$ac_ext < @@ -13233,7 +13306,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:13237: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:13310: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* db_h_file="$header"; break else @@ -13249,9 +13322,9 @@ rm -f conftest* if test "$with_database_berkdb" != "no"; then echo $ac_n "checking for Berkeley DB version""... $ac_c" 1>&6 -echo "configure:13253: checking for Berkeley DB version" >&5 +echo "configure:13326: checking for Berkeley DB version" >&5 cat > conftest.$ac_ext < #if DB_VERSION_MAJOR > 1 @@ -13270,10 +13343,10 @@ fi rm -f conftest* echo $ac_n "checking for $dbfunc""... $ac_c" 1>&6 -echo "configure:13274: checking for $dbfunc" >&5 +echo "configure:13347: checking for $dbfunc" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13373: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$dbfunc=yes" else @@ -13315,12 +13388,12 @@ else echo $ac_n "checking for $dbfunc in -ldb""... $ac_c" 1>&6 -echo "configure:13319: checking for $dbfunc in -ldb" >&5 +echo "configure:13392: checking for $dbfunc in -ldb" >&5 ac_lib_var=`echo db'_'$dbfunc | sed 'y%./+-%__p_%'` xe_check_libs=" -ldb " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13395,12 +13468,12 @@ fi if test "$with_socks" = "yes"; then echo $ac_n "checking for SOCKSinit in -lsocks""... $ac_c" 1>&6 -echo "configure:13399: checking for SOCKSinit in -lsocks" >&5 +echo "configure:13472: checking for SOCKSinit in -lsocks" >&5 ac_lib_var=`echo socks'_'SOCKSinit | sed 'y%./+-%__p_%'` xe_check_libs=" -lsocks " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13488: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13466,22 +13539,22 @@ fi if test "$with_modules" != "no"; then echo "checking for module support" 1>&6 -echo "configure:13470: checking for module support" >&5 +echo "configure:13543: checking for module support" >&5 if test "$with_msw" = "yes"; then have_dl=yes; else ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6 -echo "configure:13477: checking for dlfcn.h" >&5 +echo "configure:13550: checking for dlfcn.h" >&5 cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:13485: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:13558: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -13499,12 +13572,12 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:13503: checking for dlopen in -ldl" >&5 +echo "configure:13576: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` xe_check_libs=" -ldl " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13592: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13534,12 +13607,12 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for dlopen in -lc""... $ac_c" 1>&6 -echo "configure:13538: checking for dlopen in -lc" >&5 +echo "configure:13611: checking for dlopen in -lc" >&5 ac_lib_var=`echo c'_'dlopen | sed 'y%./+-%__p_%'` xe_check_libs=" -lc " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13627: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13589,12 +13662,12 @@ EOF else echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 -echo "configure:13593: checking for shl_load in -ldld" >&5 +echo "configure:13666: checking for shl_load in -ldld" >&5 ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` xe_check_libs=" -ldld " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13632,12 +13705,12 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for dld_init in -ldld""... $ac_c" 1>&6 -echo "configure:13636: checking for dld_init in -ldld" >&5 +echo "configure:13709: checking for dld_init in -ldld" >&5 ac_lib_var=`echo dld'_'dld_init | sed 'y%./+-%__p_%'` xe_check_libs=" -ldld " cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:13725: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -13693,7 +13766,7 @@ xehost=$canonical xealias=$internal_configuration echo "checking how to build dynamic libraries for ${xehost}" 1>&6 -echo "configure:13697: checking how to build dynamic libraries for ${xehost}" >&5 +echo "configure:13770: checking how to build dynamic libraries for ${xehost}" >&5 # Transform *-*-linux* to *-*-linux-gnu*, to support old configure scripts. case "$xehost" in *-*-linux-gnu*) ;; @@ -13721,9 +13794,9 @@ if test "$GCC" = "yes"; then XEGCC=yes else echo $ac_n "checking checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:13725: checking checking whether we are using GNU C" >&5 +echo "configure:13798: checking checking whether we are using GNU C" >&5 cat > conftest.$ac_ext <&6 -echo "configure:13749: checking how to produce PIC code" >&5 +echo "configure:13822: checking how to produce PIC code" >&5 wl= can_build_shared=yes @@ -13841,18 +13914,18 @@ if test -n "$dll_cflags"; then # Check to make sure the dll_cflags actually works. echo $ac_n "checking if PIC flag ${dll_cflags} really works""... $ac_c" 1>&6 -echo "configure:13845: checking if PIC flag ${dll_cflags} really works" >&5 +echo "configure:13918: checking if PIC flag ${dll_cflags} really works" >&5 save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $dll_cflags -DPIC" cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:13929: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* # On HP-UX, the stripped-down bundled CC doesn't accept +Z, but also @@ -13883,7 +13956,7 @@ cc_produces_so=no xldf= xcldf= echo $ac_n "checking if C compiler can produce shared libraries""... $ac_c" 1>&6 -echo "configure:13887: checking if C compiler can produce shared libraries" >&5 +echo "configure:13960: checking if C compiler can produce shared libraries" >&5 if test "$XEGCC" = yes; then xcldf="-shared" xldf="-shared" @@ -13934,14 +14007,14 @@ if test -n "$xcldf"; then xe_libs= ac_link='${CC-cc} -o conftest $CFLAGS '"$xe_cppflags $xe_ldflags"' conftest.$ac_ext '"$xe_libs"' 1>&5' cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14018: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* cc_produces_so=yes else @@ -13966,7 +14039,7 @@ if test -z "$LTLD"; then if test "$XEGCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 -echo "configure:13970: checking for ld used by GCC" >&5 +echo "configure:14043: checking for ld used by GCC" >&5 ac_prog=`($CC -print-prog-name=ld) 2>&5` case "$ac_prog" in # Accept absolute paths. @@ -13991,7 +14064,7 @@ echo "configure:13970: checking for ld used by GCC" >&5 esac else echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 -echo "configure:13995: checking for GNU ld" >&5 +echo "configure:14068: checking for GNU ld" >&5 fi if test -z "$LTLD"; then @@ -14029,7 +14102,7 @@ ld_dynamic_link_flags= # Check to see if it really is or isn't GNU ld. echo $ac_n "checking if the linker is GNU ld""... $ac_c" 1>&6 -echo "configure:14033: checking if the linker is GNU ld" >&5 +echo "configure:14106: checking if the linker is GNU ld" >&5 # I'd rather use --version here, but apparently some GNU ld's only accept -v. if $LTLD -v 2>&1 &5; then xe_gnu_ld=yes @@ -14057,7 +14130,7 @@ else # OK - only NOW do we futz about with ld. # See if the linker supports building shared libraries. echo $ac_n "checking whether the linker supports shared libraries""... $ac_c" 1>&6 -echo "configure:14061: checking whether the linker supports shared libraries" >&5 +echo "configure:14134: checking whether the linker supports shared libraries" >&5 dll_ld=$CC dll_ldflags=$LDFLAGS ld_shlibs=yes @@ -14272,10 +14345,10 @@ EOF for ac_func in dlerror _dlerror do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:14276: checking for $ac_func" >&5 +echo "configure:14349: checking for $ac_func" >&5 cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:14375: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -14337,11 +14410,11 @@ done fi cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 +if { (eval echo configure:14418: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5 then : else diff --git a/configure.in b/configure.in index 15eced9..58b3db1 100644 --- a/configure.in +++ b/configure.in @@ -57,7 +57,7 @@ dnl - no cache file dnl - non-standard options dnl - suport for extra-verbosity dnl - ordinary libs are handled separately from X libs (might be a mistake) -dnl - various random kludges (e.g. -with-dnet=no +dnl - various random kludges (e.g. -with-dnet=no) dnl PRINT_VAR(var var ...) prints values of shell variables define([PRINT_VAR],[for var in patsubst([$1],[[ @@ -1110,7 +1110,7 @@ case "$canonical" in *-dec-osf1.2 | *-dec-osf1* ) opsys=decosf1-2 ;; *-dec-osf3.[[2-9]] ) opsys=decosf3-2 ;; *-dec-osf3* ) opsys=decosf3-1 ;; - *-dec-osf4* ) opsys=decosf4-0 ;; + *-dec-osf[[4-9]]* ) opsys=decosf4-0 ;; dnl DEC Ultrix *-*-ultrix[[0-3]].* | *-*-ultrix4.0* ) opsys=bsd4-2 ;; @@ -2712,17 +2712,18 @@ dnl Avoid re-AC_DEFINE-ing xmkmf symbols we've already defined above. AC_CHECK_HEADERS(X11/Xlocale.h) - dnl remove this - we should avoid checking for specific OS - AC_MSG_CHECKING(for XFree86) - if test -d "/usr/X386/include" -o \ - -f "/etc/XF86Config" -o \ - -f "/etc/X11/XF86Config" -o \ - -f "/usr/X11R6/lib/X11/XF86Config"; then - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_XFREE386) - else - AC_MSG_RESULT(no) - fi + dnl XFree86 has a non-standard prototype for this X11R6 function + AC_CHECK_FUNCS(XRegisterIMInstantiateCallback) + AC_MSG_CHECKING(for standard XRegisterIMInstantiateCallback prototype) + AC_TRY_COMPILE([ +#define NeedFunctionPrototypes 1 +#include +extern Bool XRegisterIMInstantiateCallback( + Display*, struct _XrmHashBucketRec*, char*, char*, XIMProc, XPointer*); +], [], + [AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) + AC_DEFINE(XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE)]) dnl autodetect -lXmu test -z "$with_xmu" && { AC_CHECK_LIB(Xmu, XmuReadBitmapDataFromFile, @@ -3570,10 +3571,10 @@ fi AC_CHECK_FUNCS(cbrt closedir dup2 eaccess fmod fpathconf frexp ftime getaddrinfo gethostname getnameinfo getpagesize gettimeofday getcwd getwd logb lrand48 matherr mkdir mktime perror poll random rename res_init rint rmdir select setitimer setpgid setlocale setsid sigblock sighold sigprocmask snprintf stpcpy strerror tzset ulimit usleep utimes waitpid vsnprintf fsync ftruncate umask) dnl Check for PTY support functions. -dnl getpt is the preferred pty allocation method on glibc systems. -dnl _getpt is the preferred pty allocation method on SGI systems. +dnl getpt is the preferred pty allocation method on glibc systems. +dnl _getpty is the preferred pty allocation method on SGI systems. dnl grantpt, unlockpt, ptsname are defined by Unix98. -AC_CHECK_FUNCS(getpt _getpt grantpt unlockpt ptsname killpg tcgetpgrp) +AC_CHECK_FUNCS(getpt _getpty grantpt unlockpt ptsname killpg tcgetpgrp) dnl openpty is the preferred pty allocation method on BSD and Tru64 systems. dnl openpty might be declared in pty.h or in libutil.h. @@ -3587,10 +3588,10 @@ fi dnl Check for STREAM support functions. dnl Confusingly, "str" means both "string" and "SysV Streams". -AC_CHECK_HEADERS(sys/stropts.h) -if test "$ac_cv_header_sys_stropts_h" = "yes"; then +AC_CHECK_HEADERS(stropts.h) +if test "$ac_cv_header_stropts_h" = "yes"; then AC_CHECK_FUNCS(isastream) - AC_CHECK_HEADERS(sys/strtio.h) dnl TIOCSIGNAL + AC_CHECK_HEADERS(strtio.h) dnl TIOCSIGNAL fi dnl Use our own realpath always. @@ -3710,8 +3711,11 @@ dnl case "${GCC}${opsys}" in hpux* ) dnl AC_CHECK_FUNC(alloca, [:], [AC_CHECK_LIB(PW, alloca)]) dnl esac -AC_FUNC_ALLOCA -test -n "$ALLOCA" && XE_ADD_OBJS($ALLOCA) +dnl AC_FUNC_ALLOCA doesn't know about DEC C's #pragma intrinsic(alloca) +if test "$__DECC" != "yes"; then + AC_FUNC_ALLOCA + test -n "$ALLOCA" && XE_ADD_OBJS($ALLOCA) +fi dnl Check whether vfork exists and works correctly. (This does more dnl than just check for its existence.) If so, it defines HAVE_VFORK_H. diff --git a/etc/NEWS b/etc/NEWS index 856fc15..e2ae0ca 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -255,7 +255,7 @@ height of the default face. Set `window-pixel-scroll-increment' to modify this behavior. ** Operation progress can be displayed using graphical widgets. -See `lprogress-display' for details. This support has been switched +See `progress-feedback' for details. This support has been switched on by default for font-lock and some web browsing functions. If you do not like this behavior set `progress-feedback-use-echo-area'. diff --git a/etc/PACKAGES b/etc/PACKAGES index 138ea65..7251e06 100644 --- a/etc/PACKAGES +++ b/etc/PACKAGES @@ -227,7 +227,8 @@ Front-end for Inferior Lisp. *** os-utils -Miscellaneous single-file O/S utilities. +Miscellaneous single-file O/S utilities, for printing, archiving, +compression, remote shells, etc. *** view-process diff --git a/info/internals.info b/info/internals.info index 4acd152..fd90b74 100644 --- a/info/internals.info +++ b/info/internals.info @@ -41,12 +41,12 @@ Foundation instead of in the original English. Indirect: internals.info-1: 1776 internals.info-2: 46627 -internals.info-3: 94462 -internals.info-4: 144159 +internals.info-3: 94463 +internals.info-4: 144160 internals.info-5: 194051 -internals.info-6: 243653 -internals.info-7: 287720 -internals.info-8: 336587 +internals.info-6: 243655 +internals.info-7: 287722 +internals.info-8: 336589  Tag Table: (Indirect) @@ -65,34 +65,34 @@ Node: The XEmacs Object System (Abstractly Speaking)46627 Node: How Lisp Objects Are Represented in C60713 Node: Rules When Writing New C Code65390 Node: General Coding Rules66194 -Node: Writing Lisp Primitives71914 -Node: Adding Global Lisp Variables83083 -Node: Coding for Mule86721 -Node: Character-Related Data Types87700 -Node: Working With Character and Byte Positions90697 -Node: Conversion to and from External Data94462 -Node: General Guidelines for Writing Mule-Aware Code100603 -Node: An Example of Mule-Aware Code103291 -Node: Techniques for XEmacs Developers105272 -Node: A Summary of the Various XEmacs Modules113219 -Node: Low-Level Modules114039 -Node: Basic Lisp Modules121500 -Node: Modules for Standard Editing Operations128094 -Node: Editor-Level Control Flow Modules133982 -Node: Modules for the Basic Displayable Lisp Objects137493 -Node: Modules for other Display-Related Lisp Objects140446 -Node: Modules for the Redisplay Mechanism141787 -Node: Modules for Interfacing with the File System144159 -Node: Modules for Other Aspects of the Lisp Interpreter and Object System147857 -Node: Modules for Interfacing with the Operating System153310 -Node: Modules for Interfacing with X Windows160866 -Node: Modules for Internationalization164349 -Node: Allocation of Objects in XEmacs Lisp166986 -Node: Introduction to Allocation167507 -Node: Garbage Collection171193 -Node: GCPROing172349 -Node: Garbage Collection - Step by Step179353 -Node: Invocation179745 +Node: Writing Lisp Primitives71915 +Node: Adding Global Lisp Variables83084 +Node: Coding for Mule86722 +Node: Character-Related Data Types87701 +Node: Working With Character and Byte Positions90698 +Node: Conversion to and from External Data94463 +Node: General Guidelines for Writing Mule-Aware Code100604 +Node: An Example of Mule-Aware Code103292 +Node: Techniques for XEmacs Developers105273 +Node: A Summary of the Various XEmacs Modules113220 +Node: Low-Level Modules114040 +Node: Basic Lisp Modules121501 +Node: Modules for Standard Editing Operations128095 +Node: Editor-Level Control Flow Modules133983 +Node: Modules for the Basic Displayable Lisp Objects137494 +Node: Modules for other Display-Related Lisp Objects140447 +Node: Modules for the Redisplay Mechanism141788 +Node: Modules for Interfacing with the File System144160 +Node: Modules for Other Aspects of the Lisp Interpreter and Object System147858 +Node: Modules for Interfacing with the Operating System153311 +Node: Modules for Interfacing with X Windows160867 +Node: Modules for Internationalization164350 +Node: Allocation of Objects in XEmacs Lisp166987 +Node: Introduction to Allocation167508 +Node: Garbage Collection171194 +Node: GCPROing172350 +Node: Garbage Collection - Step by Step179354 +Node: Invocation179746 Node: garbage_collect_1182759 Node: mark_object192239 Node: gc_sweep194051 @@ -103,87 +103,87 @@ Node: sweep_bit_vectors_1203254 Node: Integers and Characters203930 Node: Allocation from Frob Blocks204682 Node: lrecords206286 -Node: Low-level allocation218510 -Node: Cons222617 -Node: Vector223343 -Node: Bit Vector223920 -Node: Symbol224413 -Node: Marker224767 -Node: String225322 -Node: Compiled Function228935 -Node: Dumping229104 -Node: Overview231325 -Node: Data descriptions231895 -Node: Dumping phase233900 -Node: Object inventory234303 -Node: Address allocation237157 -Node: The header238544 -Node: Data dumping239052 -Node: Pointers dumping239713 -Node: Reloading phase240931 -Node: Remaining issues242692 -Node: Events and the Event Loop243653 -Node: Introduction to Events244103 -Node: Main Loop246052 -Node: Specifics of the Event Gathering Mechanism249627 -Node: Specifics About the Emacs Event262080 -Node: The Event Stream Callback Routines262335 -Node: Other Event Loop Functions262580 -Node: Converting Events263720 -Node: Dispatching Events; The Command Builder264329 -Node: Evaluation; Stack Frames; Bindings264564 -Node: Evaluation264906 -Node: Dynamic Binding; The specbinding Stack; Unwind-Protects271461 -Node: Simple Special Forms273845 -Node: Catch and Throw274628 -Node: Symbols and Variables277203 -Node: Introduction to Symbols277467 -Node: Obarrays278535 -Node: Symbol Values282068 -Node: Buffers and Textual Representation284356 -Node: Introduction to Buffers285014 -Node: The Text in a Buffer287720 -Node: Buffer Lists294870 -Node: Markers and Extents296821 -Node: Bufbytes and Emchars299086 -Node: The Buffer Object299301 -Node: MULE Character Sets and Encodings302781 -Node: Character Sets303843 -Node: Encodings307328 -Node: Japanese EUC (Extended Unix Code)308395 -Node: JIS7309227 -Node: Internal Mule Encodings310577 -Node: Internal String Encoding312407 -Node: Internal Character Encoding314552 -Node: CCL316276 -Node: The Lisp Reader and Compiler323029 -Node: Lstreams323242 -Node: Creating an Lstream324273 -Node: Lstream Types325500 -Node: Lstream Functions325752 -Node: Lstream Methods329318 -Node: Consoles; Devices; Frames; Windows332460 -Node: Introduction to Consoles; Devices; Frames; Windows332775 -Node: Point335308 -Node: Window Hierarchy336587 -Node: The Window Object341035 -Node: The Redisplay Mechanism344472 -Node: Critical Redisplay Sections345264 -Node: Line Start Cache346251 -Node: Redisplay Piece by Piece349487 -Node: Extents351524 -Node: Introduction to Extents352058 -Node: Extent Ordering353200 -Node: Format of the Extent Info354441 -Node: Zero-Length Extents356328 -Node: Mathematics of Extent Ordering357726 -Node: Extent Fragments362483 -Node: Faces363569 -Node: Glyphs363685 -Node: Specifiers366704 -Node: Menus366833 -Node: Subprocesses369091 -Node: Interface to X Windows371067 -Node: Index371238 +Node: Low-level allocation218512 +Node: Cons222619 +Node: Vector223345 +Node: Bit Vector223922 +Node: Symbol224415 +Node: Marker224769 +Node: String225324 +Node: Compiled Function228937 +Node: Dumping229106 +Node: Overview231327 +Node: Data descriptions231897 +Node: Dumping phase233902 +Node: Object inventory234305 +Node: Address allocation237159 +Node: The header238546 +Node: Data dumping239054 +Node: Pointers dumping239715 +Node: Reloading phase240933 +Node: Remaining issues242694 +Node: Events and the Event Loop243655 +Node: Introduction to Events244105 +Node: Main Loop246054 +Node: Specifics of the Event Gathering Mechanism249629 +Node: Specifics About the Emacs Event262082 +Node: The Event Stream Callback Routines262337 +Node: Other Event Loop Functions262582 +Node: Converting Events263722 +Node: Dispatching Events; The Command Builder264331 +Node: Evaluation; Stack Frames; Bindings264566 +Node: Evaluation264908 +Node: Dynamic Binding; The specbinding Stack; Unwind-Protects271463 +Node: Simple Special Forms273847 +Node: Catch and Throw274630 +Node: Symbols and Variables277205 +Node: Introduction to Symbols277469 +Node: Obarrays278537 +Node: Symbol Values282070 +Node: Buffers and Textual Representation284358 +Node: Introduction to Buffers285016 +Node: The Text in a Buffer287722 +Node: Buffer Lists294872 +Node: Markers and Extents296823 +Node: Bufbytes and Emchars299088 +Node: The Buffer Object299303 +Node: MULE Character Sets and Encodings302783 +Node: Character Sets303845 +Node: Encodings307330 +Node: Japanese EUC (Extended Unix Code)308397 +Node: JIS7309229 +Node: Internal Mule Encodings310579 +Node: Internal String Encoding312409 +Node: Internal Character Encoding314554 +Node: CCL316278 +Node: The Lisp Reader and Compiler323031 +Node: Lstreams323244 +Node: Creating an Lstream324275 +Node: Lstream Types325502 +Node: Lstream Functions325754 +Node: Lstream Methods329320 +Node: Consoles; Devices; Frames; Windows332462 +Node: Introduction to Consoles; Devices; Frames; Windows332777 +Node: Point335310 +Node: Window Hierarchy336589 +Node: The Window Object341041 +Node: The Redisplay Mechanism344478 +Node: Critical Redisplay Sections345270 +Node: Line Start Cache346257 +Node: Redisplay Piece by Piece349493 +Node: Extents351530 +Node: Introduction to Extents352064 +Node: Extent Ordering353206 +Node: Format of the Extent Info354447 +Node: Zero-Length Extents356334 +Node: Mathematics of Extent Ordering357734 +Node: Extent Fragments362491 +Node: Faces363577 +Node: Glyphs363693 +Node: Specifiers366712 +Node: Menus366841 +Node: Subprocesses369099 +Node: Interface to X Windows371075 +Node: Index371246  End Tag Table diff --git a/info/internals.info-2 b/info/internals.info-2 index 0dbaa54..b3867f7 100644 --- a/info/internals.info-2 +++ b/info/internals.info-2 @@ -590,9 +590,9 @@ copying a supplied argument into a local variable, so that Lisp lists are popular data structures in the C code as well as in Elisp. There are two sets of macros that iterate over lists. `EXTERNAL_LIST_LOOP_N' should be used when the list has been supplied -by the user, and cannot be trusted to be acyclic and nil-terminated. A -`malformed-list' or `circular-list' error will be generated if the list -being iterated over is not entirely kosher. `LIST_LOOP_N', on the +by the user, and cannot be trusted to be acyclic and `nil'-terminated. +A `malformed-list' or `circular-list' error will be generated if the +list being iterated over is not entirely kosher. `LIST_LOOP_N', on the other hand, is faster and less safe, and can be used only on trusted lists. diff --git a/info/internals.info-4 b/info/internals.info-4 index 5535878..13db1b3 100644 --- a/info/internals.info-4 +++ b/info/internals.info-4 @@ -915,8 +915,8 @@ are used that are worth remembering are various elisp commands, as for example `or', `and', `if', `cond', `while', `setq', etc., miscellaneous `gui_item_...' functions, everything related to `eval' (`Feval_buffer', `call0', ...) and inside `Fsignal'. The latter is used to handle -signals, as for example the ones raised by every `QUITE'-macro -triggered after pressing Ctrl-g. +signals, as for example the ones raised by every `QUIT'-macro triggered +after pressing Ctrl-g.  File: internals.info, Node: garbage_collect_1, Next: mark_object, Prev: Invocation, Up: Garbage Collection - Step by Step diff --git a/info/internals.info-5 b/info/internals.info-5 index 56833c5..19f604d 100644 --- a/info/internals.info-5 +++ b/info/internals.info-5 @@ -388,8 +388,8 @@ into the enum's code at compile-time. which is used to mark an object. All Lisp objects that are contained within the object need to be marked by applying this function to them. The mark method should also return a Lisp - object, which should be either nil or an object to mark. (This can - be used in lieu of calling `mark_object()' on the object, to + object, which should be either `nil' or an object to mark. (This + can be used in lieu of calling `mark_object()' on the object, to reduce the recursion depth, and consequently should be the most heavily nested sub-object, such as a long list.) diff --git a/info/internals.info-8 b/info/internals.info-8 index c35a30f..0e44efd 100644 --- a/info/internals.info-8 +++ b/info/internals.info-8 @@ -92,14 +92,14 @@ combination window. "hchild" (a list of horizontally-arrayed children), "vchild" (a list of vertically-arrayed children), and "buffer" (the buffer contained in a leaf window). Exactly one of these will be - non-nil. Remember that "horizontally-arrayed" means + non-`nil'. Remember that "horizontally-arrayed" means "side-by-side" and "vertically-arrayed" means "one above the other". 7. Leaf windows also have markers in their `start' (the first buffer position displayed in the window) and `pointm' (the window's stashed value of `point'--see above) fields, while combination - windows have nil in these fields. + windows have `nil' in these fields. 8. The list of children for a window is threaded through the `next' and `prev' fields of each child window. @@ -516,7 +516,7 @@ Zero-Length Extents Extents can be zero-length, and will end up that way if their endpoints are explicitly set that way or if their detachable property -is nil and all the text in the extent is deleted. (The exception is +is `nil' and all the text in the extent is deleted. (The exception is open-open zero-length extents, which are barred from existing because there is no sensible way to define their properties. Deletion of the text in an open-open extent causes it to be converted into a closed-open diff --git a/info/lispref.info b/info/lispref.info index f7da7ad..6ab2727 100644 --- a/info/lispref.info +++ b/info/lispref.info @@ -53,51 +53,52 @@ Foundation instead of in the original English. Indirect: lispref.info-1: 2366 lispref.info-2: 48665 -lispref.info-3: 97204 -lispref.info-4: 147044 -lispref.info-5: 195878 -lispref.info-6: 243565 -lispref.info-7: 291843 -lispref.info-8: 340452 -lispref.info-9: 388779 -lispref.info-10: 438231 -lispref.info-11: 486459 -lispref.info-12: 536230 -lispref.info-13: 584130 -lispref.info-14: 632353 -lispref.info-15: 680607 -lispref.info-16: 726799 -lispref.info-17: 775533 -lispref.info-18: 825531 -lispref.info-19: 875222 -lispref.info-20: 924063 -lispref.info-21: 973600 -lispref.info-22: 1021181 -lispref.info-23: 1067505 -lispref.info-24: 1116678 -lispref.info-25: 1165730 -lispref.info-26: 1215205 -lispref.info-27: 1260832 -lispref.info-28: 1310121 -lispref.info-29: 1357971 -lispref.info-30: 1406195 -lispref.info-31: 1455872 -lispref.info-32: 1504421 -lispref.info-33: 1553719 -lispref.info-34: 1595052 -lispref.info-35: 1641357 -lispref.info-36: 1690574 -lispref.info-37: 1727545 -lispref.info-38: 1776475 -lispref.info-39: 1825715 -lispref.info-40: 1874374 -lispref.info-41: 1922471 -lispref.info-42: 1970588 -lispref.info-43: 2018981 -lispref.info-44: 2067685 -lispref.info-45: 2117245 -lispref.info-46: 2159831 -lispref.info-47: 2189044 +lispref.info-3: 97152 +lispref.info-4: 146992 +lispref.info-5: 196731 +lispref.info-6: 245085 +lispref.info-7: 293492 +lispref.info-8: 342147 +lispref.info-9: 387229 +lispref.info-10: 436160 +lispref.info-11: 485017 +lispref.info-12: 533548 +lispref.info-13: 581024 +lispref.info-14: 630620 +lispref.info-15: 678992 +lispref.info-16: 724920 +lispref.info-17: 770257 +lispref.info-18: 817727 +lispref.info-19: 865285 +lispref.info-20: 912910 +lispref.info-21: 960937 +lispref.info-22: 1009857 +lispref.info-23: 1056119 +lispref.info-24: 1102583 +lispref.info-25: 1152243 +lispref.info-26: 1200932 +lispref.info-27: 1249787 +lispref.info-28: 1298454 +lispref.info-29: 1345033 +lispref.info-30: 1393850 +lispref.info-31: 1442263 +lispref.info-32: 1492252 +lispref.info-33: 1540816 +lispref.info-34: 1587991 +lispref.info-35: 1637817 +lispref.info-36: 1686493 +lispref.info-37: 1732226 +lispref.info-38: 1781365 +lispref.info-39: 1828801 +lispref.info-40: 1877354 +lispref.info-41: 1923907 +lispref.info-42: 1972602 +lispref.info-43: 2016977 +lispref.info-44: 2061346 +lispref.info-45: 2107840 +lispref.info-46: 2148682 +lispref.info-47: 2197899 +lispref.info-48: 2211766  Tag Table: (Indirect) @@ -105,813 +106,813 @@ Node: Top2366 Node: Copying48665 Node: Introduction67823 Node: Caveats69414 -Node: Lisp History71145 -Node: Conventions72401 -Node: Some Terms73216 -Node: nil and t73937 -Node: Evaluation Notation75614 -Node: Printing Notation76527 -Node: Error Messages77401 -Node: Buffer Text Notation77842 -Node: Format of Descriptions78717 -Node: A Sample Function Description79571 -Node: A Sample Variable Description83557 -Node: Acknowledgements84465 -Node: Lisp Data Types86443 -Node: Printed Representation88998 -Node: Comments91040 -Node: Primitive Types91937 -Node: Programming Types93596 -Node: Integer Type95548 -Node: Floating Point Type96585 -Node: Character Type97204 -Node: Symbol Type105108 -Node: Sequence Type107803 -Node: Cons Cell Type109322 -Node: Dotted Pair Notation113806 -Node: Association List Type115927 -Node: Array Type116810 -Node: String Type118276 -Node: Vector Type120957 -Node: Bit Vector Type121729 -Node: Function Type122591 -Node: Macro Type123704 -Node: Primitive Function Type124401 -Node: Compiled-Function Type125927 -Node: Autoload Type126481 -Node: Char Table Type127495 -Node: Hash Table Type127669 -Node: Range Table Type128824 -Node: Weak List Type129677 -Node: Editing Types129827 -Node: Buffer Type131454 -Node: Marker Type133481 -Node: Extent Type134205 -Node: Window Type135473 -Node: Frame Type136884 -Node: Device Type137679 -Node: Console Type138505 -Node: Window Configuration Type139706 -Node: Event Type140404 -Node: Process Type140568 -Node: Stream Type141603 -Node: Keymap Type142726 -Node: Syntax Table Type143264 -Node: Display Table Type144287 -Node: Database Type144726 -Node: Charset Type144892 -Node: Coding System Type145056 -Node: ToolTalk Message Type145240 -Node: ToolTalk Pattern Type145439 -Node: Window-System Types145611 -Node: Face Type146757 -Node: Glyph Type146888 -Node: Specifier Type147044 -Node: Font Instance Type147217 -Node: Color Instance Type147407 -Node: Image Instance Type147604 -Node: Toolbar Button Type147802 -Node: Subwindow Type147995 -Node: X Resource Type148174 -Node: Type Predicates148327 -Node: Equality Predicates157456 -Node: Numbers162261 -Node: Integer Basics163716 -Node: Float Basics166065 -Node: Predicates on Numbers167807 -Node: Comparison of Numbers169440 -Node: Numeric Conversions173261 -Node: Arithmetic Operations174727 -Node: Rounding Operations180192 -Node: Bitwise Operations181297 -Node: Math Functions190343 -Node: Random Numbers192659 -Node: Strings and Characters194425 -Node: String Basics195878 -Node: Predicates for Strings198296 -Node: Creating Strings199059 -Node: Predicates for Characters204376 -Node: Character Codes205447 -Node: Text Comparison206860 -Node: String Conversion210222 -Node: Modifying Strings213898 -Node: String Properties214539 -Node: Formatting Strings215184 -Node: Character Case224802 -Node: Case Tables227948 -Node: Char Tables231846 -Node: Char Table Types233238 -Node: Working With Char Tables234813 -Node: Lists236762 -Node: Cons Cells237885 -Node: Lists as Boxes239221 -Node: List-related Predicates241863 -Node: List Elements243565 -Node: Building Lists248594 -Node: Modifying Lists254586 -Node: Setcar255398 -Node: Setcdr257819 -Node: Rearrangement260330 -Node: Sets And Lists265916 -Node: Association Lists270144 -Ref: Association Lists-Footnote-1279435 -Node: Property Lists279640 -Node: Working With Normal Plists281188 -Node: Working With Lax Plists283456 -Node: Converting Plists To/From Alists285696 -Node: Weak Lists287044 -Node: Sequences Arrays Vectors289207 -Node: Sequence Functions291843 -Node: Arrays295502 -Node: Array Functions298566 -Node: Vectors301099 -Node: Vector Functions302597 -Node: Bit Vectors305168 -Node: Bit Vector Functions306013 -Node: Symbols308263 -Node: Symbol Components309312 -Node: Definitions313485 -Node: Creating Symbols315710 -Node: Symbol Properties322744 -Node: Plists and Alists324271 -Node: Object Plists326020 -Node: Other Plists328780 -Node: Evaluation330582 -Node: Intro Eval331387 -Ref: Intro Eval-Footnote-1334740 -Node: Eval334875 -Node: Forms339293 -Node: Self-Evaluating Forms340452 -Node: Symbol Forms341965 -Node: Classifying Lists342882 -Node: Function Indirection343638 -Node: Function Forms346749 -Node: Macro Forms347746 -Node: Special Forms349346 -Node: Autoloading351655 -Node: Quoting352153 -Node: Control Structures353514 -Node: Sequencing355134 -Node: Conditionals357999 -Node: Combining Conditions361422 -Node: Iteration364692 -Node: Nonlocal Exits366471 -Node: Catch and Throw367173 -Node: Examples of Catch371012 -Node: Errors373031 -Node: Signaling Errors374520 -Node: Processing of Errors379259 -Node: Handling Errors381538 -Node: Error Symbols388779 -Node: Cleanups392735 -Node: Variables396513 -Node: Global Variables398282 -Node: Constant Variables399358 -Node: Local Variables399984 -Node: Void Variables404921 -Node: Defining Variables408437 -Node: Accessing Variables415601 -Node: Setting Variables417026 -Node: Variable Scoping421545 -Node: Scope423144 -Node: Extent424669 -Node: Impl of Scope426148 -Node: Using Scoping428111 -Node: Buffer-Local Variables429633 -Node: Intro to Buffer-Local430469 -Node: Creating Buffer-Local433012 -Node: Default Value438231 -Node: Variable Aliases441374 -Node: Functions443159 -Node: What Is a Function444253 -Node: Lambda Expressions448299 -Node: Lambda Components449209 -Node: Simple Lambda451041 -Node: Argument List452698 -Node: Function Documentation456426 -Node: Function Names458368 -Node: Defining Functions460941 -Node: Calling Functions463981 -Node: Mapping Functions467830 -Node: Anonymous Functions470518 -Node: Function Cells473763 -Node: Inline Functions478573 -Node: Related Topics480383 -Node: Macros481436 -Node: Simple Macro482720 -Node: Expansion483455 -Node: Compiling Macros486459 -Node: Defining Macros488295 -Node: Backquote489612 -Node: Problems with Macros492009 -Node: Argument Evaluation492704 -Node: Surprising Local Vars495619 -Node: Eval During Expansion497687 -Node: Repeated Expansion499380 -Node: Customization501296 -Node: Common Keywords501765 -Node: Group Definitions504610 -Node: Variable Definitions506802 -Node: Customization Types511792 -Node: Simple Types513227 -Node: Composite Types515384 -Node: Splicing into Lists520074 -Node: Type Keywords521909 -Node: Loading525429 -Node: How Programs Do Loading527104 -Node: Autoload536230 -Node: Repeated Loading542309 -Node: Named Features544422 -Node: Unloading550854 -Node: Hooks for Loading553010 -Node: Byte Compilation553727 -Node: Speed of Byte-Code555644 -Node: Compilation Functions556851 -Node: Docs and Compilation563239 -Node: Dynamic Loading565892 -Node: Eval During Compile568256 -Node: Compiled-Function Objects569521 -Node: Disassembly574319 -Node: Debugging581573 -Node: Debugger582985 -Node: Error Debugging584130 -Node: Infinite Loops586883 -Node: Function Debugging588127 -Node: Explicit Debug590917 -Node: Using Debugger591688 -Node: Debugger Commands593550 -Node: Invoking the Debugger597867 -Node: Internals of Debugger601782 -Node: Syntax Errors606669 -Node: Excess Open607917 -Node: Excess Close609792 -Node: Compilation Errors611213 -Node: Edebug612501 -Node: Using Edebug614609 -Node: Instrumenting617306 -Node: Edebug Execution Modes620795 -Node: Jumping623905 -Node: Edebug Misc626248 -Node: Breakpoints627637 -Node: Global Break Condition630443 -Node: Embedded Breakpoints631398 -Node: Trapping Errors632353 -Node: Edebug Views634429 -Node: Edebug Eval636394 -Node: Eval List637571 -Node: Reading in Edebug640956 -Node: Printing in Edebug641755 -Node: Tracing643470 -Node: Coverage Testing645356 -Node: The Outside Context647397 -Node: Checking Whether to Stop648346 -Node: Edebug Display Update648993 -Node: Edebug Recursive Edit651016 -Node: Instrumenting Macro Calls652671 -Node: Specification List655153 -Node: Backtracking664564 -Node: Debugging Backquote666502 -Node: Specification Examples670208 -Node: Edebug Options672275 -Node: Read and Print677612 -Node: Streams Intro678589 -Node: Input Streams680607 -Node: Input Functions685508 -Node: Output Streams687568 -Node: Output Functions691619 -Node: Output Variables695919 -Node: Minibuffers700718 -Node: Intro to Minibuffers701870 -Node: Text from Minibuffer704058 -Node: Object from Minibuffer709144 -Node: Minibuffer History713239 -Node: Completion716218 -Node: Basic Completion718193 -Node: Minibuffer Completion723222 -Node: Completion Commands726799 -Node: High-Level Completion731456 -Node: Reading File Names736199 -Node: Programmed Completion739891 -Node: Yes-or-No Queries742273 -Node: Multiple Queries748010 -Node: Reading a Password752077 -Node: Minibuffer Misc753414 -Node: Command Loop758284 -Node: Command Overview759628 -Node: Defining Commands762906 -Node: Using Interactive763654 -Node: Interactive Codes768427 -Node: Interactive Examples774219 -Node: Interactive Call775533 -Node: Command Loop Info780934 -Node: Events785913 -Node: Event Types787373 -Node: Event Contents789296 -Node: Event Predicates793772 -Node: Accessing Mouse Event Positions795097 -Node: Frame-Level Event Position Info795796 -Node: Window-Level Event Position Info796836 -Node: Event Text Position Info798600 -Node: Event Glyph Position Info801092 -Node: Event Toolbar Position Info802415 -Node: Other Event Position Info803086 -Node: Accessing Other Event Info803495 -Node: Working With Events805115 -Node: Converting Events811103 -Node: Reading Input814055 -Node: Key Sequence Input815057 -Node: Reading One Event817011 -Node: Dispatching an Event819828 -Node: Quoted Character Input820279 -Node: Peeking and Discarding821627 -Node: Waiting825531 -Node: Quitting827839 -Node: Prefix Command Arguments832247 -Node: Recursive Editing837334 -Node: Disabling Commands842130 -Node: Command History844198 -Node: Keyboard Macros845935 -Node: Keymaps848152 -Node: Keymap Terminology849729 -Node: Format of Keymaps852658 -Node: Creating Keymaps853069 -Node: Inheritance and Keymaps855148 -Node: Key Sequences857520 -Node: Prefix Keys862316 -Node: Active Keymaps865901 -Node: Key Lookup875222 -Node: Functions for Key Lookup880385 -Node: Changing Key Bindings886082 -Node: Key Binding Commands892979 -Node: Scanning Keymaps895044 -Node: Other Keymap Functions903555 -Node: Menus904177 -Node: Menu Format904769 -Node: Menubar Format913415 -Node: Menubar914040 -Node: Modifying Menus917153 -Node: Menu Filters922167 -Node: Pop-Up Menus924063 -Node: Menu Accelerators926268 -Node: Creating Menu Accelerators927024 -Node: Keyboard Menu Traversal928384 -Node: Menu Accelerator Functions929111 -Node: Buffers Menu932188 -Node: Dialog Boxes933482 -Node: Dialog Box Format933649 -Node: Dialog Box Functions935074 -Node: Toolbar935471 -Node: Toolbar Intro935906 -Node: Creating Toolbar938306 -Node: Toolbar Descriptor Format939223 -Node: Specifying the Toolbar943720 -Node: Other Toolbar Variables947325 -Node: Gutter951751 -Node: Gutter Intro952340 -Node: Creating Gutter954343 -Node: Gutter Descriptor Format957226 -Node: Specifying a Gutter961683 -Node: Other Gutter Variables965216 -Node: Common Gutter Widgets969601 -Node: Buffer Tabs970593 -Node: Progress Bars970734 -Node: Scrollbars970879 -Node: Drag and Drop971014 -Node: Supported Protocols972090 -Node: OffiX DND972593 -Node: CDE dt973600 -Node: MSWindows OLE974191 -Node: Loose ends974362 -Node: Drop Interface974754 -Node: Drag Interface975776 -Node: Modes975950 -Node: Major Modes976901 -Node: Major Mode Conventions979816 -Node: Example Major Modes985771 -Node: Auto Major Mode993804 -Node: Mode Help1001252 -Node: Derived Modes1002353 -Node: Minor Modes1004544 -Node: Minor Mode Conventions1005846 -Node: Keymaps and Minor Modes1008709 -Node: Modeline Format1009544 -Node: Modeline Data1011312 -Node: Modeline Variables1016465 -Node: %-Constructs1021181 -Node: Hooks1024168 -Node: Documentation1030930 -Node: Documentation Basics1032353 -Node: Accessing Documentation1035403 -Node: Keys in Documentation1041682 -Node: Describing Characters1045161 -Node: Help Functions1047510 -Node: Obsoleteness1053961 -Node: Files1056955 -Node: Visiting Files1058880 -Node: Visiting Functions1060385 -Node: Subroutines of Visiting1065432 -Node: Saving Buffers1067505 -Node: Reading from Files1073598 -Node: Writing to Files1075755 -Node: File Locks1078472 -Node: Information about Files1081525 -Node: Testing Accessibility1082286 -Node: Kinds of Files1086026 -Node: Truenames1087707 -Node: File Attributes1088709 -Node: Changing File Attributes1093848 -Node: File Names1099254 -Node: File Name Components1100863 -Node: Directory Names1103964 -Node: Relative File Names1107417 -Node: File Name Expansion1108495 -Node: Unique File Names1112402 -Node: File Name Completion1114017 -Node: User Name Completion1116678 -Node: Contents of Directories1118018 -Node: Create/Delete Dirs1121331 -Node: Magic File Names1122437 -Node: Partial Files1128067 -Node: Intro to Partial Files1128295 -Node: Creating a Partial File1129535 -Node: Detached Partial Files1130470 -Node: Format Conversion1131592 -Node: Files and MS-DOS1138108 -Node: Backups and Auto-Saving1140172 -Node: Backup Files1140847 -Node: Making Backups1142244 -Node: Rename or Copy1144993 -Node: Numbered Backups1147486 -Node: Backup Names1149721 -Node: Auto-Saving1153013 -Node: Reverting1161155 -Node: Buffers1164313 -Node: Buffer Basics1165730 -Node: Current Buffer1167783 -Node: Buffer Names1172471 -Node: Buffer File Name1175676 -Node: Buffer Modification1179795 -Node: Modification Time1181988 -Node: Read Only Buffers1185363 -Node: The Buffer List1187781 -Node: Creating Buffers1192611 -Node: Killing Buffers1194757 -Node: Indirect Buffers1198488 -Node: Windows1201060 -Node: Basic Windows1202538 -Node: Splitting Windows1205636 -Node: Deleting Windows1212525 -Node: Selecting Windows1215205 -Node: Cyclic Window Ordering1218334 -Node: Buffers and Windows1222958 -Node: Displaying Buffers1224799 -Node: Choosing Window1229975 -Node: Window Point1237691 -Node: Window Start1239738 -Node: Vertical Scrolling1244228 -Node: Horizontal Scrolling1250365 -Node: Size of Window1253874 -Node: Position of Window1258592 -Node: Resizing Windows1260832 -Node: Window Configurations1266261 -Node: Frames1269686 -Node: Creating Frames1272027 -Node: Frame Properties1273368 -Node: Property Access1274184 -Node: Initial Properties1275033 -Node: X Frame Properties1277519 -Node: Size and Position1282153 -Node: Frame Name1284149 -Node: Frame Titles1285063 -Node: Deleting Frames1286887 -Node: Finding All Frames1287487 -Node: Frames and Windows1289481 -Node: Minibuffers and Frames1291186 -Node: Input Focus1292104 -Node: Visibility of Frames1295181 -Node: Raising and Lowering1297100 -Node: Frame Configurations1299476 -Node: Frame Hooks1300070 -Node: Consoles and Devices1301875 -Node: Basic Console Functions1304618 -Node: Basic Device Functions1305041 -Node: Console Types and Device Classes1305757 -Node: Connecting to a Console or Device1307958 -Node: The Selected Console and Device1310121 -Node: Console and Device I/O1311147 -Node: Positions1311911 -Node: Point1312880 -Node: Motion1315970 -Node: Character Motion1316737 -Node: Word Motion1318974 -Node: Buffer End Motion1320475 -Node: Text Lines1321972 -Node: Screen Lines1326567 -Node: List Motion1330630 -Node: Skipping Characters1334038 -Node: Excursions1336257 -Node: Narrowing1339289 -Node: Markers1344614 -Node: Overview of Markers1345520 -Node: Predicates on Markers1350212 -Node: Creating Markers1351458 -Node: Information from Markers1355495 -Node: Changing Markers1356593 -Node: The Mark1357971 -Node: The Region1366465 -Node: Text1372151 -Node: Near Point1374850 -Node: Buffer Contents1379037 -Node: Comparing Text1380443 -Node: Insertion1381851 -Node: Commands for Insertion1385693 -Node: Deletion1388649 -Node: User-Level Deletion1392244 -Node: The Kill Ring1396405 -Node: Kill Ring Concepts1398579 -Node: Kill Functions1399633 -Node: Yank Commands1401538 -Node: Low-Level Kill Ring1403409 -Node: Internals of Kill Ring1406195 -Node: Undo1408975 -Node: Maintaining Undo1413304 -Node: Filling1415924 -Node: Margins1421918 -Node: Auto Filling1425847 -Node: Sorting1427028 -Node: Columns1436328 -Node: Indentation1438844 -Node: Primitive Indent1439623 -Node: Mode-Specific Indent1440867 -Node: Region Indent1443378 -Node: Relative Indent1446326 -Node: Indent Tabs1448708 -Node: Motion by Indent1450029 -Node: Case Changes1450808 -Node: Text Properties1454059 -Node: Examining Properties1455872 -Node: Changing Properties1457739 -Node: Property Search1461330 -Node: Special Properties1466041 -Node: Saving Properties1466322 -Node: Substitution1469464 -Node: Registers1472734 -Node: Transposition1475277 -Node: Change Hooks1476171 -Node: Transformations1478211 -Node: Searching and Matching1482596 -Node: String Search1483727 -Node: Regular Expressions1488451 -Node: Syntax of Regexps1489818 -Node: Regexp Example1504421 -Node: Regexp Search1506591 -Node: POSIX Regexps1512679 -Node: Search and Replace1514514 -Node: Match Data1517879 -Node: Simple Match Data1519009 -Node: Replacing Match1523274 -Node: Entire Match Data1525608 -Node: Saving Match Data1527599 -Node: Searching and Case1528980 -Node: Standard Regexps1531014 -Node: Syntax Tables1533212 -Node: Syntax Basics1534326 -Node: Syntax Descriptors1537298 -Node: Syntax Class Table1539148 -Node: Syntax Flags1545186 -Node: Syntax Table Functions1548403 -Node: Motion and Syntax1552267 -Node: Parsing Expressions1553719 -Node: Standard Syntax Tables1559788 -Node: Syntax Table Internals1560632 -Node: Abbrevs1561658 -Node: Abbrev Mode1563461 -Node: Abbrev Tables1564181 -Node: Defining Abbrevs1565714 -Node: Abbrev Files1567619 -Node: Abbrev Expansion1569392 -Node: Standard Abbrev Tables1574023 -Node: Extents1575182 -Node: Intro to Extents1576425 -Node: Creating and Modifying Extents1580417 -Node: Extent Endpoints1581924 -Node: Finding Extents1585187 -Node: Mapping Over Extents1588935 -Node: Extent Properties1595052 -Node: Detached Extents1605196 -Node: Extent Parents1607055 -Node: Duplicable Extents1608749 -Node: Extents and Events1611970 -Node: Atomic Extents1613877 -Node: Specifiers1614324 -Node: Introduction to Specifiers1616437 -Node: Specifiers In-Depth1618747 -Node: Specifier Instancing1623659 -Node: Specifier Types1626921 -Node: Adding Specifications1631995 -Node: Retrieving Specifications1641357 -Node: Specifier Tag Functions1645092 -Node: Specifier Instancing Functions1648326 -Node: Specifier Example1651733 -Node: Creating Specifiers1654889 -Node: Specifier Validation Functions1659206 -Node: Other Specification Functions1661590 -Node: Faces and Window-System Objects1665409 -Node: Faces1665733 -Node: Merging Faces1667350 -Node: Basic Face Functions1669311 -Node: Face Properties1671409 -Node: Face Convenience Functions1681651 -Node: Other Face Display Functions1684781 -Node: Fonts1685594 -Node: Font Specifiers1686295 -Node: Font Instances1687480 -Node: Font Instance Names1688447 -Node: Font Instance Size1689288 -Node: Font Instance Characteristics1690574 -Node: Font Convenience Functions1691743 -Node: Colors1693033 -Node: Color Specifiers1693473 -Node: Color Instances1695831 -Node: Color Instance Properties1696575 -Node: Color Convenience Functions1697201 -Node: Glyphs1698254 -Node: Glyph Functions1699855 -Node: Creating Glyphs1700262 -Node: Glyph Properties1712902 -Node: Glyph Convenience Functions1722069 -Node: Glyph Dimensions1726016 -Node: Images1727096 -Node: Image Specifiers1727545 -Node: Image Instantiator Conversion1742891 -Node: Image Instances1744256 -Node: Image Instance Types1745007 -Node: Image Instance Functions1747770 -Node: Glyph Types1754821 -Node: Mouse Pointer1756593 -Node: Redisplay Glyphs1759596 -Node: Subwindows1760629 -Node: Annotations1760872 -Node: Annotation Basics1761888 -Node: Annotation Primitives1765826 -Node: Annotation Properties1767155 -Node: Locating Annotations1770195 -Node: Margin Primitives1771032 -Node: Annotation Hooks1772926 -Node: Display1773586 -Node: Refresh Screen1774564 -Node: Truncation1776475 -Node: The Echo Area1779000 -Node: Warnings1785435 -Node: Invisible Text1789871 -Node: Selective Display1792450 -Node: Overlay Arrow1796576 -Node: Temporary Displays1797929 -Node: Blinking1802050 -Node: Usual Display1804235 -Node: Display Tables1806784 -Node: Display Table Format1807588 -Node: Active Display Table1809030 -Node: Character Descriptors1813025 -Node: Beeping1813782 -Node: Hash Tables1818548 -Node: Introduction to Hash Tables1819156 -Node: Working With Hash Tables1825715 -Node: Weak Hash Tables1826832 -Node: Range Tables1828849 -Node: Introduction to Range Tables1829538 -Node: Working With Range Tables1829969 -Node: Databases1830854 -Node: Connecting to a Database1831153 -Node: Working With a Database1832245 -Node: Other Database Functions1833103 -Node: Processes1833677 -Node: Subprocess Creation1835901 -Node: Synchronous Processes1839190 -Node: MS-DOS Subprocesses1845908 -Node: Asynchronous Processes1846982 -Node: Deleting Processes1850695 -Node: Process Information1852566 -Node: Input to Processes1856492 -Node: Signals to Processes1858782 -Node: Output from Processes1863598 -Node: Process Buffers1864410 -Node: Filter Functions1867277 -Node: Accepting Output1872847 -Node: Sentinels1874374 -Node: Process Window Size1877864 -Node: Transaction Queues1878213 -Node: Network1879911 -Node: System Interface1881745 -Node: Starting Up1883015 -Node: Start-up Summary1883609 -Node: Init File1887163 -Node: Terminal-Specific1889544 -Node: Command Line Arguments1892703 -Node: Getting Out1896192 -Node: Killing XEmacs1896761 -Node: Suspending XEmacs1898430 -Node: System Environment1901772 -Node: User Identification1908439 -Node: Time of Day1911968 -Node: Time Conversion1914755 -Node: Timers1919795 -Node: Terminal Input1921968 -Node: Input Modes1922471 -Node: Translating Input1924884 -Node: Recording Input1929049 -Node: Terminal Output1931149 -Node: Flow Control1934772 -Node: Batch Mode1938564 -Node: X-Windows1939946 -Node: X Selections1940817 -Node: X Server1943027 -Node: Resources1943478 -Node: Server Data1948787 -Node: Grabs1949994 -Node: X Miscellaneous1951574 -Node: ToolTalk Support1953959 -Node: XEmacs ToolTalk API Summary1954176 -Node: Sending Messages1955476 -Node: Example of Sending Messages1955727 -Node: Elisp Interface for Sending Messages1956789 -Node: Receiving Messages1963181 -Node: Example of Receiving Messages1963404 -Node: Elisp Interface for Receiving Messages1964240 -Node: LDAP Support1968065 -Node: Building XEmacs with LDAP support1968559 -Node: XEmacs LDAP API1969536 -Node: LDAP Variables1970588 -Node: The High-Level LDAP API1973188 -Node: The Low-Level LDAP API1976651 -Node: The LDAP Lisp Object1977482 -Node: Opening and Closing a LDAP Connection1978035 -Node: Low-level Operations on a LDAP Server1979835 -Node: LDAP Internationalization1982529 -Node: LDAP Internationalization Variables1983434 -Node: Encoder/Decoder Functions1985163 -Node: Syntax of Search Filters1986202 -Node: PostgreSQL Support1987500 -Node: Building XEmacs with PostgreSQL support1987895 -Node: XEmacs PostgreSQL libpq API1989242 -Node: libpq Lisp Variables1991121 -Node: libpq Lisp Symbols and DataTypes1994085 -Node: Synchronous Interface Functions2007325 -Node: Asynchronous Interface Functions2011816 -Node: Large Object Support2015319 -Node: Other libpq Functions2015946 -Node: Unimplemented libpq Functions2018981 -Node: XEmacs PostgreSQL libpq Examples2024300 -Node: Internationalization2030391 -Node: I18N Levels 1 and 22030734 -Node: I18N Level 32031440 -Node: Level 3 Basics2031721 -Node: Level 3 Primitives2032554 -Node: Dynamic Messaging2034160 -Node: Domain Specification2034623 -Node: Documentation String Extraction2036526 -Node: I18N Level 42037444 -Node: MULE2037636 -Node: Internationalization Terminology2038685 -Node: Charsets2050884 -Node: Charset Properties2051580 -Node: Basic Charset Functions2056295 -Node: Charset Property Functions2058476 -Node: Predefined Charsets2060518 -Node: MULE Characters2063438 -Node: Composite Characters2064285 -Node: Coding Systems2065545 -Node: Coding System Types2067685 -Node: ISO 20222071669 -Node: EOL Conversion2083944 -Node: Coding System Properties2085116 -Node: Basic Coding System Functions2089433 -Node: Coding System Property Functions2091467 -Node: Encoding and Decoding Text2092025 -Node: Detection of Textual Encoding2093161 -Node: Big5 and Shift-JIS Functions2094697 -Node: Predefined Coding Systems2095823 -Node: CCL2107917 -Node: CCL Syntax2111021 -Node: CCL Statements2112597 -Node: CCL Expressions2117245 -Node: Calling CCL2119784 -Node: CCL Examples2122773 -Node: Category Tables2122910 -Node: Tips2125268 -Node: Style Tips2125909 -Node: Compilation Tips2135428 -Node: Documentation Tips2137342 -Node: Comment Tips2142851 -Node: Library Headers2145853 -Node: Building XEmacs and Object Allocation2149825 -Node: Building XEmacs2150708 -Node: Pure Storage2157043 -Node: Garbage Collection2159831 -Node: Standard Errors2170970 -Node: Standard Buffer-Local Variables2175179 -Node: Standard Keymaps2177812 -Node: Standard Hooks2181544 -Node: Index2189044 +Node: Lisp History71093 +Node: Conventions72349 +Node: Some Terms73164 +Node: nil and t73885 +Node: Evaluation Notation75562 +Node: Printing Notation76475 +Node: Error Messages77349 +Node: Buffer Text Notation77790 +Node: Format of Descriptions78665 +Node: A Sample Function Description79519 +Node: A Sample Variable Description83505 +Node: Acknowledgements84413 +Node: Lisp Data Types86391 +Node: Printed Representation88946 +Node: Comments90988 +Node: Primitive Types91885 +Node: Programming Types93544 +Node: Integer Type95496 +Node: Floating Point Type96533 +Node: Character Type97152 +Node: Symbol Type105056 +Node: Sequence Type107751 +Node: Cons Cell Type109270 +Node: Dotted Pair Notation113754 +Node: Association List Type115875 +Node: Array Type116758 +Node: String Type118224 +Node: Vector Type120905 +Node: Bit Vector Type121677 +Node: Function Type122539 +Node: Macro Type123652 +Node: Primitive Function Type124349 +Node: Compiled-Function Type125875 +Node: Autoload Type126429 +Node: Char Table Type127443 +Node: Hash Table Type127617 +Node: Range Table Type128772 +Node: Weak List Type129625 +Node: Editing Types129775 +Node: Buffer Type131402 +Node: Marker Type133429 +Node: Extent Type134153 +Node: Window Type135421 +Node: Frame Type136832 +Node: Device Type137627 +Node: Console Type138453 +Node: Window Configuration Type139654 +Node: Event Type140352 +Node: Process Type140516 +Node: Stream Type141551 +Node: Keymap Type142674 +Node: Syntax Table Type143212 +Node: Display Table Type144235 +Node: Database Type144674 +Node: Charset Type144840 +Node: Coding System Type145004 +Node: ToolTalk Message Type145188 +Node: ToolTalk Pattern Type145387 +Node: Window-System Types145559 +Node: Face Type146705 +Node: Glyph Type146836 +Node: Specifier Type146992 +Node: Font Instance Type147165 +Node: Color Instance Type147355 +Node: Image Instance Type147552 +Node: Toolbar Button Type147750 +Node: Subwindow Type147943 +Node: X Resource Type148122 +Node: Type Predicates148275 +Node: Equality Predicates157404 +Node: Numbers162215 +Node: Integer Basics163670 +Node: Float Basics166019 +Node: Predicates on Numbers167761 +Node: Comparison of Numbers169394 +Node: Numeric Conversions173215 +Node: Arithmetic Operations174681 +Node: Rounding Operations180820 +Node: Bitwise Operations181933 +Node: Math Functions190979 +Node: Random Numbers193512 +Node: Strings and Characters195278 +Node: String Basics196731 +Node: Predicates for Strings199149 +Node: Creating Strings199912 +Node: Predicates for Characters205253 +Node: Character Codes206324 +Node: Text Comparison207744 +Node: String Conversion211189 +Node: Modifying Strings214859 +Node: String Properties215500 +Node: Formatting Strings216145 +Node: Character Case225763 +Node: Case Tables229317 +Node: Char Tables233288 +Node: Char Table Types234680 +Node: Working With Char Tables236265 +Node: Lists238282 +Node: Cons Cells239405 +Node: Lists as Boxes240741 +Node: List-related Predicates243383 +Node: List Elements245085 +Node: Building Lists250114 +Node: Modifying Lists256106 +Node: Setcar256918 +Node: Setcdr259349 +Node: Rearrangement261870 +Node: Sets And Lists267456 +Node: Association Lists271684 +Ref: Association Lists-Footnote-1280975 +Node: Property Lists281180 +Node: Working With Normal Plists282728 +Node: Working With Lax Plists285065 +Node: Converting Plists To/From Alists287345 +Node: Weak Lists288693 +Node: Sequences Arrays Vectors290856 +Node: Sequence Functions293492 +Node: Arrays297151 +Node: Array Functions300215 +Node: Vectors302748 +Node: Vector Functions304246 +Node: Bit Vectors306817 +Node: Bit Vector Functions307662 +Node: Symbols309961 +Node: Symbol Components311010 +Node: Definitions315183 +Node: Creating Symbols317408 +Node: Symbol Properties324442 +Node: Plists and Alists325969 +Node: Object Plists327718 +Node: Other Plists330478 +Node: Evaluation332277 +Node: Intro Eval333082 +Ref: Intro Eval-Footnote-1336435 +Node: Eval336570 +Node: Forms340988 +Node: Self-Evaluating Forms342147 +Node: Symbol Forms343660 +Node: Classifying Lists344577 +Node: Function Indirection345333 +Node: Function Forms348432 +Node: Macro Forms349429 +Node: Special Forms351029 +Node: Autoloading353338 +Node: Quoting353836 +Node: Control Structures355197 +Node: Sequencing356817 +Node: Conditionals359682 +Node: Combining Conditions363105 +Node: Iteration366375 +Node: Nonlocal Exits368154 +Node: Catch and Throw368856 +Node: Examples of Catch372695 +Node: Errors374714 +Node: Signaling Errors376203 +Node: Processing of Errors384950 +Node: Handling Errors387229 +Node: Error Symbols394470 +Node: Cleanups398426 +Node: Variables402204 +Node: Global Variables403973 +Node: Constant Variables405049 +Node: Local Variables405675 +Node: Void Variables410612 +Node: Defining Variables414128 +Node: Accessing Variables421292 +Node: Setting Variables422717 +Node: Variable Scoping427236 +Node: Scope428835 +Node: Extent430360 +Node: Impl of Scope431839 +Node: Using Scoping433802 +Node: Buffer-Local Variables435324 +Node: Intro to Buffer-Local436160 +Node: Creating Buffer-Local438703 +Node: Default Value444602 +Node: Variable Aliases447745 +Node: Functions449596 +Node: What Is a Function450690 +Node: Lambda Expressions454736 +Node: Lambda Components455646 +Node: Simple Lambda457478 +Node: Argument List459135 +Node: Function Documentation462863 +Node: Function Names464805 +Node: Defining Functions467378 +Node: Calling Functions470418 +Node: Mapping Functions474266 +Node: Anonymous Functions476954 +Node: Function Cells480199 +Node: Inline Functions485017 +Node: Related Topics486827 +Node: Macros487880 +Node: Simple Macro489164 +Node: Expansion489899 +Node: Compiling Macros492903 +Node: Defining Macros494739 +Node: Backquote496056 +Node: Problems with Macros498453 +Node: Argument Evaluation499148 +Node: Surprising Local Vars502063 +Node: Eval During Expansion504131 +Node: Repeated Expansion505824 +Node: Customization507740 +Node: Common Keywords508209 +Node: Group Definitions511054 +Node: Variable Definitions513246 +Node: Customization Types518236 +Node: Simple Types519671 +Node: Composite Types521828 +Node: Splicing into Lists526518 +Node: Type Keywords528353 +Node: Loading531873 +Node: How Programs Do Loading533548 +Node: Autoload542674 +Node: Repeated Loading548744 +Node: Named Features550857 +Node: Unloading557287 +Node: Hooks for Loading559443 +Node: Byte Compilation560160 +Node: Speed of Byte-Code562077 +Node: Compilation Functions563284 +Node: Docs and Compilation569941 +Node: Dynamic Loading572594 +Node: Eval During Compile574958 +Node: Compiled-Function Objects576223 +Node: Disassembly581024 +Node: Debugging588278 +Node: Debugger589690 +Node: Error Debugging590835 +Node: Infinite Loops593588 +Node: Function Debugging594832 +Node: Explicit Debug597632 +Node: Using Debugger598403 +Node: Debugger Commands600265 +Node: Invoking the Debugger604582 +Node: Internals of Debugger608497 +Node: Syntax Errors613384 +Node: Excess Open614632 +Node: Excess Close616507 +Node: Compilation Errors617928 +Node: Edebug619216 +Node: Using Edebug621324 +Node: Instrumenting624021 +Node: Edebug Execution Modes627510 +Node: Jumping630620 +Node: Edebug Misc632963 +Node: Breakpoints634352 +Node: Global Break Condition637158 +Node: Embedded Breakpoints638113 +Node: Trapping Errors639068 +Node: Edebug Views641144 +Node: Edebug Eval643109 +Node: Eval List644286 +Node: Reading in Edebug647671 +Node: Printing in Edebug648470 +Node: Tracing650185 +Node: Coverage Testing652073 +Node: The Outside Context654114 +Node: Checking Whether to Stop655063 +Node: Edebug Display Update655710 +Node: Edebug Recursive Edit657733 +Node: Instrumenting Macro Calls659388 +Node: Specification List661870 +Node: Backtracking671281 +Node: Debugging Backquote673219 +Node: Specification Examples676925 +Node: Edebug Options678992 +Node: Read and Print684331 +Node: Streams Intro685308 +Node: Input Streams687326 +Node: Input Functions692227 +Node: Output Streams694287 +Node: Output Functions698338 +Node: Output Variables702638 +Node: Minibuffers707439 +Node: Intro to Minibuffers708591 +Node: Text from Minibuffer710779 +Node: Object from Minibuffer715873 +Node: Minibuffer History719966 +Node: Completion722945 +Node: Basic Completion724920 +Node: Minibuffer Completion729803 +Node: Completion Commands733380 +Node: High-Level Completion738037 +Node: Reading File Names742786 +Node: Programmed Completion746478 +Node: Yes-or-No Queries748860 +Node: Multiple Queries754597 +Node: Reading a Password758664 +Node: Minibuffer Misc760007 +Node: Command Loop764887 +Node: Command Overview766231 +Node: Defining Commands769509 +Node: Using Interactive770257 +Node: Interactive Codes775030 +Node: Interactive Examples780822 +Node: Interactive Call782136 +Node: Command Loop Info787551 +Node: Events792530 +Node: Event Types793991 +Node: Event Contents795914 +Node: Event Predicates800390 +Node: Accessing Mouse Event Positions801708 +Node: Frame-Level Event Position Info802407 +Node: Window-Level Event Position Info803447 +Node: Event Text Position Info805211 +Node: Event Glyph Position Info807703 +Node: Event Toolbar Position Info809026 +Node: Other Event Position Info809697 +Node: Accessing Other Event Info810106 +Node: Working With Events811726 +Node: Converting Events817727 +Node: Reading Input821126 +Node: Key Sequence Input822128 +Node: Reading One Event824763 +Node: Dispatching an Event827587 +Node: Quoted Character Input828038 +Node: Peeking and Discarding829386 +Node: Waiting833290 +Node: Quitting835604 +Node: Prefix Command Arguments840012 +Node: Recursive Editing845099 +Node: Disabling Commands849894 +Node: Command History851962 +Node: Keyboard Macros853699 +Node: Keymaps855916 +Node: Keymap Terminology857493 +Node: Format of Keymaps860422 +Node: Creating Keymaps860833 +Node: Inheritance and Keymaps862913 +Node: Key Sequences865285 +Node: Prefix Keys870081 +Node: Active Keymaps873666 +Node: Key Lookup883037 +Node: Functions for Key Lookup888200 +Node: Changing Key Bindings893901 +Node: Key Binding Commands901063 +Node: Scanning Keymaps903128 +Node: Other Keymap Functions911696 +Node: Menus912318 +Node: Menu Format912910 +Node: Menubar Format921556 +Node: Menubar922181 +Node: Modifying Menus925294 +Node: Menu Filters930638 +Node: Pop-Up Menus932534 +Node: Menu Accelerators934862 +Node: Creating Menu Accelerators935618 +Node: Keyboard Menu Traversal936978 +Node: Menu Accelerator Functions937705 +Node: Buffers Menu940781 +Node: Dialog Boxes942075 +Node: Dialog Box Format942242 +Node: Dialog Box Functions943667 +Node: Toolbar944064 +Node: Toolbar Intro944499 +Node: Creating Toolbar946899 +Node: Toolbar Descriptor Format947816 +Node: Specifying the Toolbar952313 +Node: Other Toolbar Variables955920 +Node: Gutter960348 +Node: Gutter Intro960937 +Node: Creating Gutter962940 +Node: Gutter Descriptor Format965827 +Node: Specifying a Gutter970284 +Node: Other Gutter Variables973819 +Node: Common Gutter Widgets978206 +Node: Buffer Tabs979198 +Node: Progress Bars979339 +Node: Scrollbars979484 +Node: Drag and Drop979619 +Node: Supported Protocols980695 +Node: OffiX DND981198 +Node: CDE dt982205 +Node: MSWindows OLE982796 +Node: Loose ends982967 +Node: Drop Interface983359 +Node: Drag Interface984381 +Node: Modes984555 +Node: Major Modes985506 +Node: Major Mode Conventions988421 +Node: Example Major Modes994376 +Node: Auto Major Mode1002409 +Node: Mode Help1009857 +Node: Derived Modes1010958 +Node: Minor Modes1013149 +Node: Minor Mode Conventions1014451 +Node: Keymaps and Minor Modes1017314 +Node: Modeline Format1018149 +Node: Modeline Data1019917 +Node: Modeline Variables1025070 +Node: %-Constructs1029786 +Node: Hooks1032773 +Node: Documentation1039533 +Node: Documentation Basics1040956 +Node: Accessing Documentation1044006 +Node: Keys in Documentation1050287 +Node: Describing Characters1053770 +Node: Help Functions1056119 +Node: Obsoleteness1062569 +Node: Files1065561 +Node: Visiting Files1067486 +Node: Visiting Functions1068991 +Node: Subroutines of Visiting1074149 +Node: Saving Buffers1076222 +Node: Reading from Files1082315 +Node: Writing to Files1084476 +Node: File Locks1087193 +Node: Information about Files1090260 +Node: Testing Accessibility1091021 +Node: Kinds of Files1094761 +Node: Truenames1096442 +Node: File Attributes1097444 +Node: Changing File Attributes1102583 +Node: File Names1108005 +Node: File Name Components1109578 +Node: Directory Names1112023 +Node: Relative File Names1115253 +Node: File Name Expansion1116223 +Node: Unique File Names1119977 +Node: File Name Completion1121592 +Node: User Name Completion1124860 +Node: Contents of Directories1126267 +Node: Create/Delete Dirs1129580 +Node: Magic File Names1130686 +Node: Partial Files1136334 +Node: Intro to Partial Files1136562 +Node: Creating a Partial File1137802 +Node: Detached Partial Files1138738 +Node: Format Conversion1139860 +Node: Files and MS-DOS1145358 +Node: Backups and Auto-Saving1147422 +Node: Backup Files1148097 +Node: Making Backups1149494 +Node: Rename or Copy1152243 +Node: Numbered Backups1154736 +Node: Backup Names1156971 +Node: Auto-Saving1160263 +Node: Reverting1168424 +Node: Buffers1171759 +Node: Buffer Basics1173175 +Node: Current Buffer1175228 +Node: Buffer Names1179932 +Node: Buffer File Name1183139 +Node: Buffer Modification1187258 +Node: Modification Time1189501 +Node: Read Only Buffers1192876 +Node: The Buffer List1196115 +Node: Creating Buffers1200932 +Node: Killing Buffers1203078 +Node: Indirect Buffers1206910 +Node: Windows1209484 +Node: Basic Windows1210962 +Node: Splitting Windows1214060 +Node: Deleting Windows1219386 +Node: Selecting Windows1223304 +Node: Cyclic Window Ordering1227527 +Node: Buffers and Windows1232682 +Node: Displaying Buffers1234460 +Node: Choosing Window1239799 +Node: Window Point1247717 +Node: Window Start1249787 +Node: Vertical Scrolling1254586 +Node: Horizontal Scrolling1260784 +Node: Size of Window1264313 +Node: Position of Window1269031 +Node: Resizing Windows1271284 +Node: Window Configurations1276722 +Node: Frames1280219 +Node: Creating Frames1282560 +Node: Frame Properties1283900 +Node: Property Access1284716 +Node: Initial Properties1285623 +Node: X Frame Properties1288109 +Node: Size and Position1292743 +Node: Frame Name1294741 +Node: Frame Titles1295655 +Node: Deleting Frames1297479 +Node: Finding All Frames1298454 +Node: Frames and Windows1301682 +Node: Minibuffers and Frames1304464 +Node: Input Focus1305382 +Node: Visibility of Frames1308487 +Node: Raising and Lowering1310477 +Node: Frame Configurations1312853 +Node: Frame Hooks1313910 +Node: Consoles and Devices1315715 +Node: Basic Console Functions1318458 +Node: Basic Device Functions1318881 +Node: Console Types and Device Classes1319727 +Node: Connecting to a Console or Device1321994 +Node: The Selected Console and Device1324178 +Node: Console and Device I/O1325204 +Node: Positions1325968 +Node: Point1326937 +Node: Motion1330027 +Node: Character Motion1330794 +Node: Word Motion1333031 +Node: Buffer End Motion1334532 +Node: Text Lines1336069 +Node: Screen Lines1340970 +Node: List Motion1345033 +Node: Skipping Characters1348515 +Node: Excursions1350734 +Node: Narrowing1353774 +Node: Markers1359105 +Node: Overview of Markers1360011 +Node: Predicates on Markers1364703 +Node: Creating Markers1365949 +Node: Information from Markers1370149 +Node: Changing Markers1371247 +Node: The Mark1372775 +Node: The Region1381278 +Node: Text1386964 +Node: Near Point1389663 +Node: Buffer Contents1393850 +Node: Comparing Text1395256 +Node: Insertion1396664 +Node: Commands for Insertion1400574 +Node: Deletion1403468 +Node: User-Level Deletion1407062 +Node: The Kill Ring1411222 +Node: Kill Ring Concepts1413396 +Node: Kill Functions1414450 +Node: Yank Commands1416373 +Node: Low-Level Kill Ring1418244 +Node: Internals of Kill Ring1421330 +Node: Undo1424110 +Node: Maintaining Undo1428447 +Node: Filling1431065 +Node: Margins1437059 +Node: Auto Filling1441082 +Node: Sorting1442263 +Node: Columns1451577 +Node: Indentation1454658 +Node: Primitive Indent1455437 +Node: Mode-Specific Indent1456762 +Node: Region Indent1459294 +Node: Relative Indent1462241 +Node: Indent Tabs1464623 +Node: Motion by Indent1465944 +Node: Case Changes1466723 +Node: Text Properties1470076 +Node: Examining Properties1471889 +Node: Changing Properties1473772 +Node: Property Search1477363 +Node: Special Properties1482082 +Node: Saving Properties1482363 +Node: Substitution1485505 +Node: Registers1488775 +Node: Transposition1491358 +Node: Change Hooks1492252 +Node: Transformations1494292 +Node: Searching and Matching1499396 +Node: String Search1500527 +Node: Regular Expressions1505508 +Node: Syntax of Regexps1506875 +Node: Regexp Example1521478 +Node: Regexp Search1523648 +Node: POSIX Regexps1529979 +Node: Search and Replace1532056 +Node: Match Data1535421 +Node: Simple Match Data1536551 +Node: Replacing Match1540816 +Node: Entire Match Data1543497 +Node: Saving Match Data1545735 +Node: Searching and Case1547123 +Node: Standard Regexps1549157 +Node: Syntax Tables1551355 +Node: Syntax Basics1552469 +Node: Syntax Descriptors1555441 +Node: Syntax Class Table1557291 +Node: Syntax Flags1563329 +Node: Syntax Table Functions1566546 +Node: Motion and Syntax1570834 +Node: Parsing Expressions1572286 +Node: Standard Syntax Tables1578355 +Node: Syntax Table Internals1579199 +Node: Abbrevs1580225 +Node: Abbrev Mode1582028 +Node: Abbrev Tables1582748 +Node: Defining Abbrevs1584287 +Node: Abbrev Files1586208 +Node: Abbrev Expansion1587991 +Node: Standard Abbrev Tables1592622 +Node: Extents1593781 +Node: Intro to Extents1595024 +Node: Creating and Modifying Extents1599016 +Node: Extent Endpoints1600597 +Node: Finding Extents1603860 +Node: Mapping Over Extents1607982 +Node: Extent Properties1614105 +Node: Detached Extents1624266 +Node: Extent Parents1626125 +Node: Duplicable Extents1627819 +Node: Extents and Events1631040 +Node: Atomic Extents1632947 +Node: Specifiers1633394 +Node: Introduction to Specifiers1635507 +Node: Specifiers In-Depth1637817 +Node: Specifier Instancing1642729 +Node: Specifier Types1645991 +Node: Adding Specifications1651065 +Node: Retrieving Specifications1660486 +Node: Specifier Tag Functions1664231 +Node: Specifier Instancing Functions1667465 +Node: Specifier Example1670872 +Node: Creating Specifiers1674028 +Node: Specifier Validation Functions1678345 +Node: Other Specification Functions1680731 +Node: Faces and Window-System Objects1684552 +Node: Faces1684876 +Node: Merging Faces1686493 +Node: Basic Face Functions1688454 +Node: Face Properties1690602 +Node: Face Convenience Functions1700875 +Node: Other Face Display Functions1704095 +Node: Fonts1704907 +Node: Font Specifiers1705608 +Node: Font Instances1706793 +Node: Font Instance Names1707760 +Node: Font Instance Size1708601 +Node: Font Instance Characteristics1709887 +Node: Font Convenience Functions1711065 +Node: Colors1712355 +Node: Color Specifiers1712795 +Node: Color Instances1715155 +Node: Color Instance Properties1715899 +Node: Color Convenience Functions1716525 +Node: Glyphs1717578 +Node: Glyph Functions1719179 +Node: Creating Glyphs1719586 +Node: Glyph Properties1732226 +Node: Glyph Convenience Functions1741393 +Node: Glyph Dimensions1745340 +Node: Images1746420 +Node: Image Specifiers1746869 +Node: Image Instantiator Conversion1762360 +Node: Image Instances1763725 +Node: Image Instance Types1764476 +Node: Image Instance Functions1767241 +Node: Glyph Types1774298 +Node: Mouse Pointer1776070 +Node: Redisplay Glyphs1779073 +Node: Subwindows1780106 +Node: Annotations1780349 +Node: Annotation Basics1781365 +Node: Annotation Primitives1785303 +Node: Annotation Properties1786642 +Node: Locating Annotations1789682 +Node: Margin Primitives1790519 +Node: Annotation Hooks1792413 +Node: Display1793073 +Node: Refresh Screen1794051 +Node: Truncation1796245 +Node: The Echo Area1798770 +Node: Warnings1805207 +Node: Invisible Text1809643 +Node: Selective Display1812222 +Node: Overlay Arrow1816348 +Node: Temporary Displays1817701 +Node: Blinking1821822 +Node: Usual Display1824006 +Node: Display Tables1826555 +Node: Display Table Format1827359 +Node: Active Display Table1828801 +Node: Character Descriptors1832796 +Node: Beeping1833553 +Node: Hash Tables1838319 +Node: Introduction to Hash Tables1838927 +Node: Working With Hash Tables1845486 +Node: Weak Hash Tables1846603 +Node: Range Tables1848620 +Node: Introduction to Range Tables1849309 +Node: Working With Range Tables1849755 +Node: Databases1850714 +Node: Connecting to a Database1851013 +Node: Working With a Database1852120 +Node: Other Database Functions1852994 +Node: Processes1853563 +Node: Subprocess Creation1855787 +Node: Synchronous Processes1859238 +Node: MS-DOS Subprocesses1865960 +Node: Asynchronous Processes1867034 +Node: Deleting Processes1871391 +Node: Process Information1873262 +Node: Input to Processes1877354 +Node: Signals to Processes1880049 +Node: Output from Processes1884864 +Node: Process Buffers1885676 +Node: Filter Functions1888555 +Node: Accepting Output1894146 +Node: Sentinels1895673 +Node: Process Window Size1899163 +Node: Transaction Queues1899512 +Node: Network1901210 +Node: System Interface1903844 +Node: Starting Up1905114 +Node: Start-up Summary1905708 +Node: Init File1909262 +Node: Terminal-Specific1911643 +Node: Command Line Arguments1914802 +Node: Getting Out1918291 +Node: Killing XEmacs1918860 +Node: Suspending XEmacs1920528 +Node: System Environment1923907 +Node: User Identification1930088 +Node: Time of Day1933617 +Node: Time Conversion1936404 +Node: Timers1941646 +Node: Terminal Input1943819 +Node: Input Modes1944322 +Node: Translating Input1946781 +Node: Recording Input1950946 +Node: Terminal Output1953046 +Node: Flow Control1956667 +Node: Batch Mode1960629 +Node: X-Windows1962011 +Node: X Selections1962882 +Node: X Server1965633 +Node: Resources1966084 +Node: Server Data1971395 +Node: Grabs1972602 +Node: X Miscellaneous1974182 +Node: ToolTalk Support1976567 +Node: XEmacs ToolTalk API Summary1976784 +Node: Sending Messages1978084 +Node: Example of Sending Messages1978335 +Node: Elisp Interface for Sending Messages1979397 +Node: Receiving Messages1985993 +Node: Example of Receiving Messages1986216 +Node: Elisp Interface for Receiving Messages1987052 +Node: LDAP Support1990909 +Node: Building XEmacs with LDAP support1991403 +Node: XEmacs LDAP API1992380 +Node: LDAP Variables1993432 +Node: The High-Level LDAP API1996032 +Node: The Low-Level LDAP API1999505 +Node: The LDAP Lisp Object2000336 +Node: Opening and Closing a LDAP Connection2000891 +Node: Low-level Operations on a LDAP Server2002697 +Node: LDAP Internationalization2005421 +Node: LDAP Internationalization Variables2006326 +Node: Encoder/Decoder Functions2008057 +Node: Syntax of Search Filters2009094 +Node: PostgreSQL Support2010392 +Node: Building XEmacs with PostgreSQL support2010787 +Node: XEmacs PostgreSQL libpq API2012134 +Node: libpq Lisp Variables2014013 +Node: libpq Lisp Symbols and DataTypes2016977 +Node: Synchronous Interface Functions2030217 +Node: Asynchronous Interface Functions2034708 +Node: Large Object Support2038213 +Node: Other libpq Functions2038840 +Node: Unimplemented libpq Functions2041875 +Node: XEmacs PostgreSQL libpq Examples2047194 +Node: Internationalization2053285 +Node: I18N Levels 1 and 22053628 +Node: I18N Level 32054334 +Node: Level 3 Basics2054615 +Node: Level 3 Primitives2055448 +Node: Dynamic Messaging2057054 +Node: Domain Specification2057517 +Node: Documentation String Extraction2059187 +Node: I18N Level 42060105 +Node: MULE2060297 +Node: Internationalization Terminology2061346 +Node: Charsets2073545 +Node: Charset Properties2074241 +Node: Basic Charset Functions2078956 +Node: Charset Property Functions2081137 +Node: Predefined Charsets2083207 +Node: MULE Characters2086127 +Node: Composite Characters2087002 +Node: Coding Systems2088269 +Node: Coding System Types2090409 +Node: ISO 20222094393 +Node: EOL Conversion2106668 +Node: Coding System Properties2107840 +Node: Basic Coding System Functions2112163 +Node: Coding System Property Functions2114197 +Node: Encoding and Decoding Text2114755 +Node: Detection of Textual Encoding2115891 +Node: Big5 and Shift-JIS Functions2117427 +Node: Predefined Coding Systems2118579 +Node: CCL2130673 +Node: CCL Syntax2133777 +Node: CCL Statements2135353 +Node: CCL Expressions2140001 +Node: Calling CCL2142540 +Node: CCL Examples2145545 +Node: Category Tables2145682 +Node: Tips2148041 +Node: Style Tips2148682 +Node: Compilation Tips2158201 +Node: Documentation Tips2160115 +Node: Comment Tips2165624 +Node: Library Headers2168626 +Node: Building XEmacs and Object Allocation2172598 +Node: Building XEmacs2173481 +Node: Pure Storage2180059 +Node: Garbage Collection2182847 +Node: Standard Errors2193690 +Node: Standard Buffer-Local Variables2197899 +Node: Standard Keymaps2200532 +Node: Standard Hooks2204266 +Node: Index2211766  End Tag Table diff --git a/info/lispref.info-10 b/info/lispref.info-10 index 43fb10f..536420b 100644 --- a/info/lispref.info-10 +++ b/info/lispref.info-10 @@ -50,6 +50,191 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Intro to Buffer-Local, Next: Creating Buffer-Local, Up: Buffer-Local Variables + +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 `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 `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 +`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. + + A more powerful operation is to mark the variable as "automatically +buffer-local" by calling `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 `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 `setq'; you need to use +`setq-default' to do that. + + Local variables in a file you edit are also represented by +buffer-local bindings for the buffer that holds the file within XEmacs. +*Note Auto Major Mode::. + + +File: lispref.info, Node: Creating Buffer-Local, Next: Default Value, Prev: Intro to Buffer-Local, Up: Buffer-Local Variables + +Creating and Deleting Buffer-Local Bindings +------------------------------------------- + + - Command: make-local-variable variable + This function creates a buffer-local binding in the current buffer + for VARIABLE (a symbol). Other buffers are not affected. The + value returned is VARIABLE. + + The buffer-local value of VARIABLE starts out as the same value + VARIABLE previously had. If VARIABLE was void, it remains void. + + ;; In buffer `b1': + (setq foo 5) ; Affects all buffers. + => 5 + (make-local-variable 'foo) ; Now it is local in `b1'. + => foo + foo ; That did not change + => 5 ; the value. + (setq foo 6) ; Change the value + => 6 ; in `b1'. + foo + => 6 + + ;; In buffer `b2', the value hasn't changed. + (save-excursion + (set-buffer "b2") + foo) + => 5 + + Making a variable buffer-local within a `let'-binding for that + variable does not work. This is because `let' does not distinguish + between different kinds of bindings; it knows only which variable + the binding was made for. + + *Please note:* do not use `make-local-variable' for a hook + variable. Instead, use `make-local-hook'. *Note Hooks::. + + - Command: make-variable-buffer-local variable + This function marks 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 VARIABLE. + + - Function: local-variable-p variable buffer &optional after-set + This returns `t' if VARIABLE is buffer-local in buffer BUFFER; + else `nil'. + + If optional third arg AFTER-SET is non-`nil', return `t' if SYMBOL + would be buffer-local after it is set, regardless of whether it is + so presently. + + A `nil' value for BUFFER is _not_ the same as `(current-buffer)', + but means "no buffer". Specifically: + + If BUFFER is `nil' and AFTER-SET is `nil', a return value of `t' + indicates that the variable is one of the special built-in + variables that is always buffer-local. (This includes + `buffer-file-name', `buffer-read-only', `buffer-undo-list', and + others.) + + If BUFFER is `nil' and AFTER-SET is `t', a return value of `t' + indicates that the variable has had `make-variable-buffer-local' + applied to it. + + - Function: buffer-local-variables &optional buffer + This function returns a list describing the buffer-local variables + in buffer BUFFER. It returns an association list (*note + Association Lists::) in which each association contains one + buffer-local variable and its value. When a buffer-local variable + is void in BUFFER, then it appears directly in the resulting list. + If BUFFER is omitted, the current buffer is used. + + (make-local-variable 'foobar) + (makunbound 'foobar) + (make-local-variable 'bind-me) + (setq bind-me 69) + (setq lcl (buffer-local-variables)) + ;; First, built-in variables local in all buffers: + => ((mark-active . nil) + (buffer-undo-list nil) + (mode-name . "Fundamental") + ... + ;; Next, non-built-in local variables. + ;; This one is local and void: + foobar + ;; This one is local and nonvoid: + (bind-me . 69)) + + Note that storing new values into the CDRs of cons cells in this + list does _not_ change the local values of the variables. + + - Command: kill-local-variable variable + This function deletes the buffer-local binding (if any) for + VARIABLE (a symbol) in the current buffer. As a result, the + global (default) binding of VARIABLE becomes visible in this + buffer. Usually this results in a change in the value of + 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. + + `kill-local-variable' returns 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. + + - Function: 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 `nil', the syntax table to + the value of `standard-syntax-table', and the abbrev table to the + value of `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. + + `kill-all-local-variables' returns `nil'. + + A local variable is "permanent" if the variable name (a symbol) has a +`permanent-local' property that is non-`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. + + File: lispref.info, Node: Default Value, Prev: Creating Buffer-Local, Up: Buffer-Local Variables The Default Value of a Buffer-Local Variable @@ -157,12 +342,12 @@ Obsoleteness::). variable, a variable that has a buffer-local value in any buffer, or the symbols `nil' or `t'. - - Function: variable-alias variable + - Function: variable-alias variable &optional follow-past-lisp-magic If VARIABLE is aliased to another variable, this function returns that variable. VARIABLE should be a symbol. If VARIABLE is not aliased, this function returns `nil'. - - Function: indirect-variable object + - Function: indirect-variable object &optional follow-past-lisp-magic This function returns the variable at the end of OBJECT's variable-alias chain. If OBJECT is a symbol, follow all variable aliases and return the final (non-aliased) symbol. If OBJECT is @@ -745,7 +930,7 @@ function: - Function: identity arg This function returns ARG and has no side effects. - - Function: ignore &rest args + - Command: ignore &rest args This function ignores any arguments and returns `nil'.  @@ -949,9 +1134,9 @@ cell contains no object whatsoever. can make it void once more using `fmakunbound'. - Function: fboundp symbol - This function returns `t' if the symbol has an object in its - function cell, `nil' otherwise. It does not check that the object - is a legitimate function. + This function returns `t' if SYMBOL has an object in its function + cell, `nil' otherwise. It does not check that the object is a + legitimate function. - Function: fmakunbound symbol This function makes SYMBOL's function cell void, so that a @@ -979,9 +1164,9 @@ can make it void once more using `fmakunbound'. * Giving a symbol a function definition that is not a list and therefore cannot be made with `defun'. For example, you can - use `fset' to give a symbol `s1' a function definition which - is another symbol `s2'; then `s1' serves as an alias for - whatever definition `s2' presently has. + use `fset' to give a symbol SYMBOL1 a function definition + which is another symbol SYMBOL2; then SYMBOL1 serves as an + alias for whatever definition SYMBOL2 presently has. * In constructs for defining or altering functions. If `defun' were not a primitive, it could be written in Lisp (as a @@ -1031,215 +1216,3 @@ before moving aside the old definition of `foo'. But it is unmodular and unclean, in any case, for a Lisp file to redefine a function defined elsewhere. - -File: lispref.info, Node: Inline Functions, Next: Related Topics, Prev: Function Cells, Up: Functions - -Inline Functions -================ - - You can define an "inline function" by using `defsubst' instead of -`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 XEmacs, 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 `apply', -`mapcar' and so on. Also, it takes some work to convert an ordinary -function into a macro. (*Note Macros::.) To convert it into an inline -function is very easy; simply replace `defun' with `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. (*Note Argument Evaluation::.) - - Inline functions can be used and open-coded later on in the same -file, following the definition, just like macros. - - -File: lispref.info, Node: Related Topics, Prev: Inline Functions, Up: Functions - -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. - -`apply' - See *Note Calling Functions::. - -`autoload' - See *Note Autoload::. - -`call-interactively' - See *Note Interactive Call::. - -`commandp' - See *Note Interactive Call::. - -`documentation' - See *Note Accessing Documentation::. - -`eval' - See *Note Eval::. - -`funcall' - See *Note Calling Functions::. - -`ignore' - See *Note Calling Functions::. - -`indirect-function' - See *Note Function Indirection::. - -`interactive' - See *Note Using Interactive::. - -`interactive-p' - See *Note Interactive Call::. - -`mapatoms' - See *Note Creating Symbols::. - -`mapcar' - See *Note Mapping Functions::. - -`mapconcat' - See *Note Mapping Functions::. - -`undefined' - See *Note Key Lookup::. - - -File: lispref.info, Node: Macros, Next: Loading, Prev: Functions, Up: Top - -Macros -****** - - "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 "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. *Note 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. - - -File: lispref.info, Node: Simple Macro, Next: Expansion, Up: Macros - -A Simple Example of a Macro -=========================== - - Suppose we would like to define a Lisp construct to increment a -variable value, much like the `++' operator in C. We would like to -write `(inc x)' and have the effect of `(setq x (1+ x))'. Here's a -macro definition that does the job: - - (defmacro inc (var) - (list 'setq var (list '1+ var))) - - When this is called with `(inc x)', the argument `var' has the value -`x'--_not_ the _value_ of `x'. The body of the macro uses this to -construct the expansion, which is `(setq x (1+ x))'. Once the macro -definition returns this expansion, Lisp proceeds to evaluate it, thus -incrementing `x'. - - -File: lispref.info, Node: Expansion, Next: Compiling Macros, Prev: Simple Macro, Up: Macros - -Expansion of a 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 `&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 "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 -`macroexpand'. - - - Function: macroexpand form &optional environment - This function expands 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 - `macroexpand'. If FORM is not a macro call to begin with, it is - returned as given. - - Note that `macroexpand' does not look at the subexpressions of - FORM (although some macro definitions may do so). Even if they - are macro calls themselves, `macroexpand' does not expand them. - - The function `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 ENVIRONMENT is provided, it specifies an alist of macro - definitions that shadow the currently defined macros. Byte - compilation uses this feature. - - (defmacro inc (var) - (list 'setq var (list '1+ var))) - => inc - - (macroexpand '(inc r)) - => (setq r (1+ r)) - - (defmacro inc2 (var1 var2) - (list 'progn (list 'inc var1) (list 'inc var2))) - => inc2 - - (macroexpand '(inc2 r s)) - => (progn (inc r) (inc s)) ; `inc' not expanded here. - diff --git a/info/lispref.info-11 b/info/lispref.info-11 index 1780b0a..d276a20 100644 --- a/info/lispref.info-11 +++ b/info/lispref.info-11 @@ -50,6 +50,218 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Inline Functions, Next: Related Topics, Prev: Function Cells, Up: Functions + +Inline Functions +================ + + You can define an "inline function" by using `defsubst' instead of +`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 XEmacs, 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 `apply', +`mapcar' and so on. Also, it takes some work to convert an ordinary +function into a macro. (*Note Macros::.) To convert it into an inline +function is very easy; simply replace `defun' with `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. (*Note Argument Evaluation::.) + + Inline functions can be used and open-coded later on in the same +file, following the definition, just like macros. + + +File: lispref.info, Node: Related Topics, Prev: Inline Functions, Up: Functions + +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. + +`apply' + See *Note Calling Functions::. + +`autoload' + See *Note Autoload::. + +`call-interactively' + See *Note Interactive Call::. + +`commandp' + See *Note Interactive Call::. + +`documentation' + See *Note Accessing Documentation::. + +`eval' + See *Note Eval::. + +`funcall' + See *Note Calling Functions::. + +`ignore' + See *Note Calling Functions::. + +`indirect-function' + See *Note Function Indirection::. + +`interactive' + See *Note Using Interactive::. + +`interactive-p' + See *Note Interactive Call::. + +`mapatoms' + See *Note Creating Symbols::. + +`mapcar' + See *Note Mapping Functions::. + +`mapconcat' + See *Note Mapping Functions::. + +`undefined' + See *Note Key Lookup::. + + +File: lispref.info, Node: Macros, Next: Loading, Prev: Functions, Up: Top + +Macros +****** + + "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 "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. *Note 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. + + +File: lispref.info, Node: Simple Macro, Next: Expansion, Up: Macros + +A Simple Example of a Macro +=========================== + + Suppose we would like to define a Lisp construct to increment a +variable value, much like the `++' operator in C. We would like to +write `(inc x)' and have the effect of `(setq x (1+ x))'. Here's a +macro definition that does the job: + + (defmacro inc (var) + (list 'setq var (list '1+ var))) + + When this is called with `(inc x)', the argument `var' has the value +`x'--_not_ the _value_ of `x'. The body of the macro uses this to +construct the expansion, which is `(setq x (1+ x))'. Once the macro +definition returns this expansion, Lisp proceeds to evaluate it, thus +incrementing `x'. + + +File: lispref.info, Node: Expansion, Next: Compiling Macros, Prev: Simple Macro, Up: Macros + +Expansion of a 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 `&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 "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 +`macroexpand'. + + - Function: macroexpand form &optional environment + This function expands 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 + `macroexpand'. If FORM is not a macro call to begin with, it is + returned as given. + + Note that `macroexpand' does not look at the subexpressions of + FORM (although some macro definitions may do so). Even if they + are macro calls themselves, `macroexpand' does not expand them. + + The function `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 ENVIRONMENT is provided, it specifies an alist of macro + definitions that shadow the currently defined macros. Byte + compilation uses this feature. + + (defmacro inc (var) + (list 'setq var (list '1+ var))) + => inc + + (macroexpand '(inc r)) + => (setq r (1+ r)) + + (defmacro inc2 (var1 var2) + (list 'progn (list 'inc var1) (list 'inc var2))) + => inc2 + + (macroexpand '(inc2 r s)) + => (progn (inc r) (inc s)) ; `inc' not expanded here. + + File: lispref.info, Node: Compiling Macros, Next: Defining Macros, Prev: Expansion, Up: Macros Macros and Byte Compilation @@ -1077,192 +1289,3 @@ the forms are function definitions and variable definitions. * Hooks for Loading:: Providing code to be run when particular libraries are loaded. - -File: lispref.info, Node: How Programs Do Loading, Next: Autoload, Up: Loading - -How Programs Do Loading -======================= - - XEmacs Lisp has several interfaces for loading. For example, -`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 (*note Autoload::). `require' loads a file -if it isn't already loaded (*note Named Features::). Ultimately, all -these facilities call the `load' function to do the work. - - - Function: 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, `load' first looks for a file named - `FILENAME.elc', that is, for a file whose name is FILENAME with - `.elc' appended. If such a file exists, it is loaded. If there - is no file by that name, then `load' looks for a file named - `FILENAME.el'. If that file exists, it is loaded. Finally, if - neither of those names is found, `load' looks for a file named - FILENAME with nothing appended, and loads it if it exists. (The - `load' function is not clever about looking at FILENAME. In the - perverse case of a file named `foo.el.el', evaluation of `(load - "foo.el")' will indeed find it.) - - If the optional argument NOSUFFIX is non-`nil', then the suffixes - `.elc' and `.el' are not tried. In this case, you must specify - the precise file name you want. - - If FILENAME is a relative file name, such as `foo' or - `baz/foo.bar', `load' searches for the file using the variable - `load-path'. It appends FILENAME to each of the directories - listed in `load-path', and loads the first file it finds whose name - matches. The current default directory is tried only if it is - specified in `load-path', where `nil' stands for the default - directory. `load' tries all three possible suffixes in the first - directory in `load-path', then all three suffixes in the second - directory, and so on. - - If you get a warning that `foo.elc' is older than `foo.el', it - means you should consider recompiling `foo.el'. *Note Byte - Compilation::. - - Messages like `Loading foo...' and `Loading foo...done' appear in - the echo area during loading unless NOMESSAGE is non-`nil'. - - Any unhandled errors while loading a file terminate loading. If - the load was done for the sake of `autoload', any function - definitions made during the loading are undone. - - If `load' can't find the file to load, then normally it signals the - error `file-error' (with `Cannot open load file FILENAME'). But - if MISSING-OK is non-`nil', then `load' just returns `nil'. - - You can use the variable `load-read-function' to specify a function - for `load' to use instead of `read' for reading expressions. See - below. - - `load' returns `t' if the file loads successfully. - - - User Option: load-path - The value of this variable is a list of directories to search when - loading files with `load'. Each element is a string (which must be - a directory name) or `nil' (which stands for the current working - directory). The value of `load-path' is initialized from the - environment variable `EMACSLOADPATH', if that exists; otherwise its - default value is specified in `emacs/src/paths.h' when XEmacs is - built. - - The syntax of `EMACSLOADPATH' is the same as used for `PATH'; `:' - (or `;', according to the operating system) separates directory - names, and `.' is used for the current default directory. Here is - an example of how to set your `EMACSLOADPATH' variable from a - `csh' `.login' file: - - setenv EMACSLOADPATH .:/user/bil/emacs:/usr/lib/emacs/lisp - - Here is how to set it using `sh': - - export EMACSLOADPATH - EMACSLOADPATH=.:/user/bil/emacs:/usr/local/lib/emacs/lisp - - Here is an example of code you can place in a `.emacs' file to add - several directories to the front of your default `load-path': - - (setq load-path - (append (list nil "/user/bil/emacs" - "/usr/local/lisplib" - "~/emacs") - load-path)) - - In this example, the path searches the current working directory - first, followed then by the `/user/bil/emacs' directory, the - `/usr/local/lisplib' directory, and the `~/emacs' directory, which - are then followed by the standard directories for Lisp code. - - The command line options `-l' or `-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 `load-path' so the file can be found there. Newer - Emacs versions also find such files in the current directory, but - without altering `load-path'. - - Dumping Emacs uses a special value of `load-path'. If the value of - `load-path' at the end of dumping is unchanged (that is, still the - same special value), the dumped Emacs switches to the ordinary - `load-path' value when it starts up, as described above. But if - `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 `load-path' temporarily for - loading a few libraries in `site-init.el' or `site-load.el', you - should bind `load-path' locally with `let' around the calls to - `load'. - - - Function: locate-file filename path-list &optional suffixes mode - This function searches for a file in the same way that `load' does, - and returns the file found (if any). (In fact, `load' uses this - function to search through `load-path'.) It searches for FILENAME - through PATH-LIST, expanded by one of the optional SUFFIXES - (string of suffixes separated by `:'s), checking for access MODE - (0|1|2|4 = exists|executable|writable|readable), default readable. - - `locate-file' keeps hash tables of the directories it searches - through, in order to speed things up. It tries valiantly to not - get confused in the face of a changing and unpredictable - environment, but can occasionally get tripped up. In this case, - you will have to call `locate-file-clear-hashing' to get it back - on track. See that function for details. - - - Function: locate-file-clear-hashing path - This function clears the hash records for the specified list of - directories. `locate-file' uses a hashing scheme to speed lookup, - and will correctly track the following environmental changes: - - * changes of any sort to the list of directories to be searched. - - * addition and deletion of non-shadowing files (see below) from - the directories in the list. - - * byte-compilation of a .el file into a .elc file. - - `locate-file' will primarily get confused if you add a file that - shadows (i.e. has the same name as) another file further down in - the directory list. In this case, you must call - `locate-file-clear-hashing'. - - - Variable: load-in-progress - This variable is non-`nil' if Emacs is in the process of loading a - file, and it is `nil' otherwise. - - - Variable: load-read-function - This variable specifies an alternate expression-reading function - for `load' and `eval-region' to use instead of `read'. The - function should accept one argument, just as `read' does. - - Normally, the variable's value is `nil', which means those - functions should use `read'. - - - User Option: load-warn-when-source-newer - This variable specifies whether `load' should check whether the - source is newer than the binary. If this variable is true, then - when a `.elc' file is being loaded and the corresponding `.el' is - newer, a warning message will be printed. The default is `nil', - but it is bound to `t' during the initial loadup. - - - User Option: load-warn-when-source-only - This variable specifies whether `load' should warn when loading a - `.el' file instead of an `.elc'. If this variable is true, then - when `load' is called with a filename without an extension, and - the `.elc' version doesn't exist but the `.el' version does, then - a message will be printed. If an explicit extension is passed to - `load', no warning will be printed. The default is `nil', but it - is bound to `t' during the initial loadup. - - - User Option: load-ignore-elc-files - This variable specifies whether `load' should ignore `.elc' files - when a suffix is not given. This is normally used only to - bootstrap the `.elc' files when building XEmacs, when you use the - command `make all-elc'. (This forces the `.el' versions to be - loaded in the process of compiling those same files, so that - existing out-of-date `.elc' files do not make it mess things up.) - - To learn how `load' is used to build XEmacs, see *Note Building -XEmacs::. - diff --git a/info/lispref.info-12 b/info/lispref.info-12 index d4dc774..6fd3e06 100644 --- a/info/lispref.info-12 +++ b/info/lispref.info-12 @@ -50,6 +50,195 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: How Programs Do Loading, Next: Autoload, Up: Loading + +How Programs Do Loading +======================= + + XEmacs Lisp has several interfaces for loading. For example, +`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 (*note Autoload::). `require' loads a file +if it isn't already loaded (*note Named Features::). Ultimately, all +these facilities call the `load' function to do the work. + + - Function: 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, `load' first looks for a file named + `FILENAME.elc', that is, for a file whose name is FILENAME with + `.elc' appended. If such a file exists, it is loaded. If there + is no file by that name, then `load' looks for a file named + `FILENAME.el'. If that file exists, it is loaded. Finally, if + neither of those names is found, `load' looks for a file named + FILENAME with nothing appended, and loads it if it exists. (The + `load' function is not clever about looking at FILENAME. In the + perverse case of a file named `foo.el.el', evaluation of `(load + "foo.el")' will indeed find it.) + + If the optional argument NOSUFFIX is non-`nil', then the suffixes + `.elc' and `.el' are not tried. In this case, you must specify + the precise file name you want. + + If FILENAME is a relative file name, such as `foo' or + `baz/foo.bar', `load' searches for the file using the variable + `load-path'. It appends FILENAME to each of the directories + listed in `load-path', and loads the first file it finds whose name + matches. The current default directory is tried only if it is + specified in `load-path', where `nil' stands for the default + directory. `load' tries all three possible suffixes in the first + directory in `load-path', then all three suffixes in the second + directory, and so on. + + If you get a warning that `foo.elc' is older than `foo.el', it + means you should consider recompiling `foo.el'. *Note Byte + Compilation::. + + Messages like `Loading foo...' and `Loading foo...done' appear in + the echo area during loading unless NOMESSAGE is non-`nil'. + + Any unhandled errors while loading a file terminate loading. If + the load was done for the sake of `autoload', any function + definitions made during the loading are undone. + + If `load' can't find the file to load, then normally it signals the + error `file-error' (with `Cannot open load file FILENAME'). But + if MISSING-OK is non-`nil', then `load' just returns `nil'. + + You can use the variable `load-read-function' to specify a function + for `load' to use instead of `read' for reading expressions. See + below. + + `load' returns `t' if the file loads successfully. + + - User Option: load-path + The value of this variable is a list of directories to search when + loading files with `load'. Each element is a string (which must be + a directory name) or `nil' (which stands for the current working + directory). The value of `load-path' is initialized from the + environment variable `EMACSLOADPATH', if that exists; otherwise its + default value is specified in `emacs/src/paths.h' when XEmacs is + built. + + The syntax of `EMACSLOADPATH' is the same as used for `PATH'; `:' + (or `;', according to the operating system) separates directory + names, and `.' is used for the current default directory. Here is + an example of how to set your `EMACSLOADPATH' variable from a + `csh' `.login' file: + + setenv EMACSLOADPATH .:/user/bil/emacs:/usr/lib/emacs/lisp + + Here is how to set it using `sh': + + export EMACSLOADPATH + EMACSLOADPATH=.:/user/bil/emacs:/usr/local/lib/emacs/lisp + + Here is an example of code you can place in a `.emacs' file to add + several directories to the front of your default `load-path': + + (setq load-path + (append (list nil "/user/bil/emacs" + "/usr/local/lisplib" + "~/emacs") + load-path)) + + In this example, the path searches the current working directory + first, followed then by the `/user/bil/emacs' directory, the + `/usr/local/lisplib' directory, and the `~/emacs' directory, which + are then followed by the standard directories for Lisp code. + + The command line options `-l' or `-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 `load-path' so the file can be found there. Newer + Emacs versions also find such files in the current directory, but + without altering `load-path'. + + Dumping Emacs uses a special value of `load-path'. If the value of + `load-path' at the end of dumping is unchanged (that is, still the + same special value), the dumped Emacs switches to the ordinary + `load-path' value when it starts up, as described above. But if + `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 `load-path' temporarily for + loading a few libraries in `site-init.el' or `site-load.el', you + should bind `load-path' locally with `let' around the calls to + `load'. + + - Function: locate-file filename path-list &optional suffixes mode + This function searches for a file in the same way that `load' does, + and returns the file found (if any). (In fact, `load' uses this + function to search through `load-path'.) It searches for FILENAME + through PATH-LIST, expanded by one of the optional SUFFIXES + (string of suffixes separated by `:'s), checking for access MODE + (0|1|2|4 = exists|executable|writable|readable), default readable. + + `locate-file' keeps hash tables of the directories it searches + through, in order to speed things up. It tries valiantly to not + get confused in the face of a changing and unpredictable + environment, but can occasionally get tripped up. In this case, + you will have to call `locate-file-clear-hashing' to get it back + on track. See that function for details. + + - Function: locate-file-clear-hashing path + This function clears the hash records for the specified list of + directories. `locate-file' uses a hashing scheme to speed lookup, + and will correctly track the following environmental changes: + + * changes of any sort to the list of directories to be searched. + + * addition and deletion of non-shadowing files (see below) from + the directories in the list. + + * byte-compilation of a .el file into a .elc file. + + `locate-file' will primarily get confused if you add a file that + shadows (i.e. has the same name as) another file further down in + the directory list. In this case, you must call + `locate-file-clear-hashing'. + + - Variable: load-in-progress + This variable is non-`nil' if Emacs is in the process of loading a + file, and it is `nil' otherwise. + + - Variable: load-read-function + This variable specifies an alternate expression-reading function + for `load' and `eval-region' to use instead of `read'. The + function should accept one argument, just as `read' does. + + Normally, the variable's value is `nil', which means those + functions should use `read'. + + - User Option: load-warn-when-source-newer + This variable specifies whether `load' should check whether the + source is newer than the binary. If this variable is true, then + when a `.elc' file is being loaded and the corresponding `.el' is + newer, a warning message will be printed. The default is `nil', + but it is bound to `t' during the initial loadup. + + - User Option: load-warn-when-source-only + This variable specifies whether `load' should warn when loading a + `.el' file instead of an `.elc'. If this variable is true, then + when `load' is called with a filename without an extension, and + the `.elc' version doesn't exist but the `.el' version does, then + a message will be printed. If an explicit extension is passed to + `load', no warning will be printed. The default is `nil', but it + is bound to `t' during the initial loadup. + + - User Option: load-ignore-elc-files + This variable specifies whether `load' should ignore `.elc' files + when a suffix is not given. This is normally used only to + bootstrap the `.elc' files when building XEmacs, when you use the + command `make all-elc'. (This forces the `.el' versions to be + loaded in the process of compiling those same files, so that + existing out-of-date `.elc' files do not make it mess things up.) + + To learn how `load' is used to build XEmacs, see *Note Building +XEmacs::. + + File: lispref.info, Node: Autoload, Next: Repeated Loading, Prev: How Programs Do Loading, Up: Loading Autoload @@ -78,11 +267,10 @@ installed along with Emacs. specifies the file to load to get the real definition of FUNCTION. The argument 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 `autoload' makes it possible - to look at the documentation without loading the function's real - definition. + function. Normally, this is identical to the documentation string + in the function definition itself. Specifying the documentation + string in the call to `autoload' makes it possible to look at the + documentation without loading the function's real definition. If INTERACTIVE is non-`nil', then the function can be called interactively. This lets completion in `M-x' work without loading @@ -344,7 +532,7 @@ loading. and `t' is returned if it is found, `nil' otherwise. If FEXP is a number, the function returns `t' if this Emacs has an - equal or greater number than `fexp', `nil' otherwise. Note that + equal or greater number than FEXP, `nil' otherwise. Note that minor Emacs version is expected to be 2 decimal places wide, so `(featurep 20.4)' will return `nil' on XEmacs 20.4--you must write `(featurep 20.04)', unless you wish to match for XEmacs 20.40. @@ -641,14 +829,21 @@ around the `require' calls (*note Eval During Compile::). -rw-r--r-- 1 lewis 638 Oct 8 20:25 push.elc - Command: byte-recompile-directory directory &optional flag + norecursion force This function recompiles every `.el' file in DIRECTORY that needs recompilation. A file needs recompilation if a `.elc' file exists but is older than the `.el' file. + Files in subdirectories of DIRECTORY are also processed unless + optional argument NORECURSION is non-`nil'. + When a `.el' file has no corresponding `.elc' file, then FLAG says what to do. If it is `nil', these files are ignored. If it is non-`nil', the user is asked whether to compile each such file. + If the fourth optional argument FORCE is non-`nil', recompile + every `.el' file that already has a `.elc' file. + The return value of this command is unpredictable. - Function: batch-byte-compile @@ -672,7 +867,7 @@ around the `require' calls (*note Eval During Compile::). normally `nil', but is bound to `t' by `batch-byte-recompile-directory'. - - Function: byte-code instructions constants stack-size + - Function: byte-code instructions constants stack-depth This function actually interprets byte-code. Don't call this function yourself. Only the byte compiler knows how to generate valid calls to this function. @@ -855,7 +1050,7 @@ CONSTANTS The vector of Lisp objects referenced by the byte code. These include symbols used as function names and variable names. -STACK-SIZE +STACK-DEPTH The maximum stack size this function needs. DOC-STRING @@ -886,7 +1081,7 @@ representation. It is the definition of the command `backward-sexp'. The primitive way to create a compiled-function object is with `make-byte-code': - - Function: make-byte-code arglist instructions constants stack-size + - Function: make-byte-code arglist instructions constants stack-depth &optional doc-string interactive This function constructs and returns a compiled-function object with the specified attributes. @@ -921,7 +1116,7 @@ a compiled-function object. This function returns the vector of Lisp objects referenced by compiled-function object FUNCTION. - - Function: compiled-function-stack-size function + - Function: compiled-function-stack-depth function This function returns the maximum stack size needed by compiled-function object FUNCTION. @@ -941,239 +1136,3 @@ a compiled-function object. FUNCTION, if any. The result will be a string or `nil'. *Note Domain Specification::. - -File: lispref.info, Node: Disassembly, Prev: Compiled-Function Objects, Up: Byte Compilation - -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. - - - Command: disassemble object &optional stream - This function prints the disassembled code for OBJECT. If STREAM - is supplied, then output goes there. Otherwise, the disassembled - code is printed to the stream `standard-output'. The argument - 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 `*Disassemble*'. - - Here are two examples of using the `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 `disassemble'. - - (defun factorial (integer) - "Compute factorial of an integer." - (if (= 1 integer) 1 - (* integer (factorial (1- integer))))) - => factorial - - (factorial 4) - => 24 - - (disassemble 'factorial) - -| byte-code for factorial: - doc: Compute factorial of an integer. - args: (integer) - - 0 varref integer ; Get value of `integer' - ; from the environment - ; and push the value - ; onto the stack. - - 1 constant 1 ; Push 1 onto stack. - - 2 eqlsign ; Pop top two values off stack, - ; compare them, - ; and push result onto stack. - - 3 goto-if-nil 1 ; Pop and test top of stack; - ; if `nil', - ; go to label 1 (which is also byte 7), - ; else continue. - - 5 constant 1 ; Push 1 onto top of stack. - - 6 return ; Return the top element - ; of the stack. - - 7:1 varref integer ; Push value of `integer' onto stack. - - 8 constant factorial ; Push `factorial' onto stack. - - 9 varref integer ; Push value of `integer' onto stack. - - 10 sub1 ; Pop `integer', decrement value, - ; push new value onto stack. - - ; Stack now contains: - ; - decremented value of `integer' - ; - `factorial' - ; - value of `integer' - - 15 call 1 ; Call function `factorial' using - ; the first (i.e., the top) element - ; of the stack as the argument; - ; push returned value onto stack. - - ; Stack now contains: - ; - result of recursive - ; call to `factorial' - ; - value of `integer' - - 12 mult ; Pop top two values off the stack, - ; multiply them, - ; pushing the result onto the stack. - - 13 return ; Return the top element - ; of the stack. - => nil - - The `silly-loop' function is somewhat more complex: - - (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)))) - => silly-loop - - (disassemble 'silly-loop) - -| byte-code for silly-loop: - doc: Return time before and after N iterations of a loop. - args: (n) - - 0 constant current-time-string ; Push - ; `current-time-string' - ; onto top of stack. - - 1 call 0 ; Call `current-time-string' - ; with no argument, - ; pushing result onto stack. - - 2 varbind t1 ; Pop stack and bind `t1' - ; to popped value. - - 3:1 varref n ; Get value of `n' from - ; the environment and push - ; the value onto the stack. - - 4 sub1 ; Subtract 1 from top of stack. - - 5 dup ; Duplicate the top of the stack; - ; i.e., copy the top of - ; the stack and push the - ; copy onto the stack. - - 6 varset n ; Pop the top of the stack, - ; and set `n' to the value. - - ; In effect, the sequence `dup varset' - ; copies the top of the stack - ; into the value of `n' - ; without popping it. - - 7 constant 0 ; Push 0 onto stack. - - 8 gtr ; Pop top two values off stack, - ; test if N is greater than 0 - ; and push result onto stack. - - 9 goto-if-not-nil 1 ; Goto label 1 (byte 3) if `n' <= 0 - ; (this exits the while loop). - ; else pop top of stack - ; and continue - - 11 varref t1 ; Push value of `t1' onto stack. - - 12 constant current-time-string ; Push - ; `current-time-string' - ; onto top of stack. - - 13 call 0 ; Call `current-time-string' again. - - 14 unbind 1 ; Unbind `t1' in local environment. - - 15 list2 ; Pop top two elements off stack, - ; create a list of them, - ; and push list onto stack. - - 16 return ; Return the top element of the stack. - - => nil - - -File: lispref.info, Node: Debugging, Next: Read and Print, Prev: Byte Compilation, Up: Top - -Debugging Lisp Programs -*********************** - - There are three ways to investigate a problem in an XEmacs Lisp -program, depending on what you are doing with the program when the -problem appears. - - * 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. - - * If the problem is syntactic, so that Lisp cannot even read the - program, you can use the XEmacs facilities for editing Lisp to - localize it. - - * 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. - -* Menu: - -* Debugger:: How the XEmacs 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 XEmacs Lisp debugger. - - Another useful debugging tool is the dribble file. When a dribble -file is open, XEmacs copies all keyboard input characters to that file. -Afterward, you can examine the file to find out what input was used. -*Note Terminal Input::. - - For debugging problems in terminal descriptions, the -`open-termscript' function can be useful. *Note Terminal Output::. - - -File: lispref.info, Node: Debugger, Next: Syntax Errors, Up: Debugging - -The Lisp Debugger -================= - - The "Lisp debugger" provides the ability to suspend evaluation of a -form. While evaluation is suspended (a state that is commonly known as -a "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 XEmacs are -available; you can even run programs that will enter the debugger -recursively. *Note 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 `debug'. -* Internals of Debugger:: Subroutines of the debugger, and global variables. - diff --git a/info/lispref.info-13 b/info/lispref.info-13 index f3f19ee..06f3d06 100644 --- a/info/lispref.info-13 +++ b/info/lispref.info-13 @@ -50,6 +50,242 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Disassembly, Prev: Compiled-Function Objects, Up: Byte Compilation + +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. + + - Command: disassemble object &optional stream + This function prints the disassembled code for OBJECT. If STREAM + is supplied, then output goes there. Otherwise, the disassembled + code is printed to the stream `standard-output'. The argument + 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 `*Disassemble*'. + + Here are two examples of using the `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 `disassemble'. + + (defun factorial (integer) + "Compute factorial of an integer." + (if (= 1 integer) 1 + (* integer (factorial (1- integer))))) + => factorial + + (factorial 4) + => 24 + + (disassemble 'factorial) + -| byte-code for factorial: + doc: Compute factorial of an integer. + args: (integer) + + 0 varref integer ; Get value of `integer' + ; from the environment + ; and push the value + ; onto the stack. + + 1 constant 1 ; Push 1 onto stack. + + 2 eqlsign ; Pop top two values off stack, + ; compare them, + ; and push result onto stack. + + 3 goto-if-nil 1 ; Pop and test top of stack; + ; if `nil', + ; go to label 1 (which is also byte 7), + ; else continue. + + 5 constant 1 ; Push 1 onto top of stack. + + 6 return ; Return the top element + ; of the stack. + + 7:1 varref integer ; Push value of `integer' onto stack. + + 8 constant factorial ; Push `factorial' onto stack. + + 9 varref integer ; Push value of `integer' onto stack. + + 10 sub1 ; Pop `integer', decrement value, + ; push new value onto stack. + + ; Stack now contains: + ; - decremented value of `integer' + ; - `factorial' + ; - value of `integer' + + 15 call 1 ; Call function `factorial' using + ; the first (i.e., the top) element + ; of the stack as the argument; + ; push returned value onto stack. + + ; Stack now contains: + ; - result of recursive + ; call to `factorial' + ; - value of `integer' + + 12 mult ; Pop top two values off the stack, + ; multiply them, + ; pushing the result onto the stack. + + 13 return ; Return the top element + ; of the stack. + => nil + + The `silly-loop' function is somewhat more complex: + + (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)))) + => silly-loop + + (disassemble 'silly-loop) + -| byte-code for silly-loop: + doc: Return time before and after N iterations of a loop. + args: (n) + + 0 constant current-time-string ; Push + ; `current-time-string' + ; onto top of stack. + + 1 call 0 ; Call `current-time-string' + ; with no argument, + ; pushing result onto stack. + + 2 varbind t1 ; Pop stack and bind `t1' + ; to popped value. + + 3:1 varref n ; Get value of `n' from + ; the environment and push + ; the value onto the stack. + + 4 sub1 ; Subtract 1 from top of stack. + + 5 dup ; Duplicate the top of the stack; + ; i.e., copy the top of + ; the stack and push the + ; copy onto the stack. + + 6 varset n ; Pop the top of the stack, + ; and set `n' to the value. + + ; In effect, the sequence `dup varset' + ; copies the top of the stack + ; into the value of `n' + ; without popping it. + + 7 constant 0 ; Push 0 onto stack. + + 8 gtr ; Pop top two values off stack, + ; test if N is greater than 0 + ; and push result onto stack. + + 9 goto-if-not-nil 1 ; Goto label 1 (byte 3) if `n' <= 0 + ; (this exits the while loop). + ; else pop top of stack + ; and continue + + 11 varref t1 ; Push value of `t1' onto stack. + + 12 constant current-time-string ; Push + ; `current-time-string' + ; onto top of stack. + + 13 call 0 ; Call `current-time-string' again. + + 14 unbind 1 ; Unbind `t1' in local environment. + + 15 list2 ; Pop top two elements off stack, + ; create a list of them, + ; and push list onto stack. + + 16 return ; Return the top element of the stack. + + => nil + + +File: lispref.info, Node: Debugging, Next: Read and Print, Prev: Byte Compilation, Up: Top + +Debugging Lisp Programs +*********************** + + There are three ways to investigate a problem in an XEmacs Lisp +program, depending on what you are doing with the program when the +problem appears. + + * 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. + + * If the problem is syntactic, so that Lisp cannot even read the + program, you can use the XEmacs facilities for editing Lisp to + localize it. + + * 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. + +* Menu: + +* Debugger:: How the XEmacs 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 XEmacs Lisp debugger. + + Another useful debugging tool is the dribble file. When a dribble +file is open, XEmacs copies all keyboard input characters to that file. +Afterward, you can examine the file to find out what input was used. +*Note Terminal Input::. + + For debugging problems in terminal descriptions, the +`open-termscript' function can be useful. *Note Terminal Output::. + + +File: lispref.info, Node: Debugger, Next: Syntax Errors, Up: Debugging + +The Lisp Debugger +================= + + The "Lisp debugger" provides the ability to suspend evaluation of a +form. While evaluation is suspended (a state that is commonly known as +a "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 XEmacs are +available; you can even run programs that will enter the debugger +recursively. *Note 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 `debug'. +* Internals of Debugger:: Subroutines of the debugger, and global variables. + + File: lispref.info, Node: Error Debugging, Next: Infinite Loops, Up: Debugger Entering the Debugger on an Error @@ -197,7 +433,7 @@ function, and then step through its caller. (debug (quote debug)) (if (zerop n) 1 (* n (fact (1- n))))) - - Command: cancel-debug-on-entry function-name + - Command: cancel-debug-on-entry &optional function-name This function undoes the effect of `debug-on-entry' on FUNCTION-NAME. When called interactively, it prompts for FUNCTION-NAME in the minibuffer. If FUNCTION-NAME is `nil' or the @@ -962,221 +1198,3 @@ keyboard macro outside of Edebug does not affect the command loop inside Edebug. This is usually an advantage. But see `edebug-continue-kbd-macro'. - -File: lispref.info, Node: Jumping, Next: Edebug Misc, Prev: Edebug Execution Modes, Up: Edebug - -Jumping -------- - - Commands described here let you jump to a specified location. All, -except `i', use temporary breakpoints to establish the stop point and -then switch to `go' mode. Any other breakpoint reached before the -intended stop point will also stop execution. See *Note Breakpoints:: -for the details on breakpoints. - -`f' - Run the program forward over one expression - (`edebug-forward-sexp'). More precisely, set a temporary - breakpoint at the position that `C-M-f' would reach, then execute - in `go' mode so that the program will stop at breakpoints. - - With a prefix argument N, the temporary breakpoint is placed N - sexps beyond point. If the containing list ends before N more - elements, then the place to stop is after the containing - expression. - - Be careful that the position `C-M-f' finds is a place that the - program will really get to; this may not be true in a `cond', for - example. - - This command does `forward-sexp' starting at point rather than the - stop point. If you want to execute one expression from the - current stop point, type `w' first, to move point there. - -`o' - Continue "out of" an expression (`edebug-step-out'). It places a - temporary breakpoint at the end of the sexp containing point. - - If the containing sexp is a function definition itself, it - 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. - -`I' - Step into the function or macro after point after first ensuring - that it is instrumented. It does this by calling - `edebug-on-entry' and then switching to `go' mode. - - Although the automatic instrumentation is convenient, it is not - later automatically uninstrumented. - -`h' - Proceed to the stop point near where point is using a temporary - breakpoint (`edebug-goto-here'). - - All the commands in this section 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. - - -File: lispref.info, Node: Edebug Misc, Next: Breakpoints, Prev: Jumping, Up: Edebug - -Miscellaneous -------------- - - Some miscellaneous commands are described here. - -`?' - Display the help message for Edebug (`edebug-help'). - -`C-]' - Abort one level back to the previous command level - (`abort-recursive-edit'). - -`q' - Return to the top level editor command loop (`top-level'). This - exits all recursive editing levels, including all levels of Edebug - activity. However, instrumented code protected with - `unwind-protect' or `condition-case' forms may resume debugging. - -`Q' - Like `q' but don't stop even for protected code - (`top-level-nonstop'). - -`r' - Redisplay the most recently known expression result in the echo - area (`edebug-previous-result'). - -`d' - Display a backtrace, excluding Edebug's own functions for clarity - (`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. - - 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 `q' or abort one recursive edit level with `C-]'. -You can display a backtrace of all the pending evaluations with `d'. - - -File: lispref.info, Node: Breakpoints, Next: Trapping Errors, Prev: Edebug Misc, Up: Edebug - -Breakpoints ------------ - - There are three more ways to stop execution once it has started: -breakpoints, the global break condition, and embedded breakpoints. - - While using Edebug, you can specify "breakpoints" in the program you -are testing: points where execution should stop. You can set a -breakpoint at any stop point, as defined in *Note 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: - -`b' - Set a breakpoint at the stop point at or after point - (`edebug-set-breakpoint'). If you use a prefix argument, the - breakpoint is temporary (it turns off the first time it stops the - program). - -`u' - Unset the breakpoint (if any) at the stop point at or after the - current point (`edebug-unset-breakpoint'). - -`x CONDITION ' - Set a conditional breakpoint which stops the program only if - CONDITION evaluates to a non-`nil' value - (`edebug-set-conditional-breakpoint'). If you use a prefix - argument, the breakpoint is temporary (it turns off the first time - it stops the program). - -`B' - Move point to the next breakpoint in the definition - (`edebug-next-breakpoint'). - - While in Edebug, you can set a breakpoint with `b' and unset one -with `u'. First you must move point to a position at or before the -desired Edebug stop point, then hit the key to change the breakpoint. -Unsetting a breakpoint that has not been set does nothing. - - Reevaluating or reinstrumenting a definition clears all its -breakpoints. - - A "conditional breakpoint" tests a condition each time the program -gets there. To set a conditional breakpoint, use `x', and specify the -condition expression in the minibuffer. Setting a conditional -breakpoint at a stop point that already has a conditional breakpoint -puts the current condition expression in the minibuffer so you can edit -it. - - You can make both conditional and unconditional breakpoints -"temporary" by using a prefix arg to the command to set the breakpoint. -After breaking at a temporary breakpoint, it is automatically cleared. - - 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 `B', which moves point -to the next breakpoint in the definition following point, 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. -* Embedded Breakpoints:: Embedding breakpoints in code. - - -File: lispref.info, Node: Global Break Condition, Next: Embedded Breakpoints, Up: Breakpoints - -Global Break Condition -...................... - - In contrast to breaking when execution reaches specified locations, -you can also cause a break when a certain event occurs. The "global -break condition" is a condition that is repeatedly evaluated at every -stop point. If it evaluates to a non-`nil' value, then execution is -stopped or paused depending on the execution mode, just like a -breakpoint. Any errors that might occur as a result of evaluating the -condition are ignored, as if the result were `nil'. - - You can set or edit the condition expression, stored in -`edebug-global-break-condition', using `X' -(`edebug-set-global-break-condition'). - - Using the global break condition is perhaps the fastest way to find -where in your code some event occurs, but since it is rather expensive -you should reset the condition to `nil' when not in use. - - -File: lispref.info, Node: Embedded Breakpoints, Prev: Global Break Condition, Up: Breakpoints - -Embedded Breakpoints -.................... - - Since all breakpoints in a definition are cleared each time you -reinstrument it, you might rather create an "embedded breakpoint" which -is simply a call to the function `edebug'. You can, of course, make -such a call conditional. For example, in the `fac' function, insert -the first line as shown below to stop when the argument reaches zero: - - (defun fac (n) - (if (= n 0) (edebug)) - (if (< 0 n) - (* n (fac (1- n))) - 1)) - - When the `fac' definition is instrumented and the function is -called, Edebug will stop before the call to `edebug'. Depending on the -execution mode, Edebug will stop or pause. - - However, if no instrumented code is being executed, calling `edebug' -will instead invoke `debug'. Calling `debug' will always invoke the -standard backtrace debugger. - diff --git a/info/lispref.info-14 b/info/lispref.info-14 index 489d392..bd55715 100644 --- a/info/lispref.info-14 +++ b/info/lispref.info-14 @@ -50,6 +50,224 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Jumping, Next: Edebug Misc, Prev: Edebug Execution Modes, Up: Edebug + +Jumping +------- + + Commands described here let you jump to a specified location. All, +except `i', use temporary breakpoints to establish the stop point and +then switch to `go' mode. Any other breakpoint reached before the +intended stop point will also stop execution. See *Note Breakpoints:: +for the details on breakpoints. + +`f' + Run the program forward over one expression + (`edebug-forward-sexp'). More precisely, set a temporary + breakpoint at the position that `C-M-f' would reach, then execute + in `go' mode so that the program will stop at breakpoints. + + With a prefix argument N, the temporary breakpoint is placed N + sexps beyond point. If the containing list ends before N more + elements, then the place to stop is after the containing + expression. + + Be careful that the position `C-M-f' finds is a place that the + program will really get to; this may not be true in a `cond', for + example. + + This command does `forward-sexp' starting at point rather than the + stop point. If you want to execute one expression from the + current stop point, type `w' first, to move point there. + +`o' + Continue "out of" an expression (`edebug-step-out'). It places a + temporary breakpoint at the end of the sexp containing point. + + If the containing sexp is a function definition itself, it + 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. + +`I' + Step into the function or macro after point after first ensuring + that it is instrumented. It does this by calling + `edebug-on-entry' and then switching to `go' mode. + + Although the automatic instrumentation is convenient, it is not + later automatically uninstrumented. + +`h' + Proceed to the stop point near where point is using a temporary + breakpoint (`edebug-goto-here'). + + All the commands in this section 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. + + +File: lispref.info, Node: Edebug Misc, Next: Breakpoints, Prev: Jumping, Up: Edebug + +Miscellaneous +------------- + + Some miscellaneous commands are described here. + +`?' + Display the help message for Edebug (`edebug-help'). + +`C-]' + Abort one level back to the previous command level + (`abort-recursive-edit'). + +`q' + Return to the top level editor command loop (`top-level'). This + exits all recursive editing levels, including all levels of Edebug + activity. However, instrumented code protected with + `unwind-protect' or `condition-case' forms may resume debugging. + +`Q' + Like `q' but don't stop even for protected code + (`top-level-nonstop'). + +`r' + Redisplay the most recently known expression result in the echo + area (`edebug-previous-result'). + +`d' + Display a backtrace, excluding Edebug's own functions for clarity + (`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. + + 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 `q' or abort one recursive edit level with `C-]'. +You can display a backtrace of all the pending evaluations with `d'. + + +File: lispref.info, Node: Breakpoints, Next: Trapping Errors, Prev: Edebug Misc, Up: Edebug + +Breakpoints +----------- + + There are three more ways to stop execution once it has started: +breakpoints, the global break condition, and embedded breakpoints. + + While using Edebug, you can specify "breakpoints" in the program you +are testing: points where execution should stop. You can set a +breakpoint at any stop point, as defined in *Note 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: + +`b' + Set a breakpoint at the stop point at or after point + (`edebug-set-breakpoint'). If you use a prefix argument, the + breakpoint is temporary (it turns off the first time it stops the + program). + +`u' + Unset the breakpoint (if any) at the stop point at or after the + current point (`edebug-unset-breakpoint'). + +`x CONDITION ' + Set a conditional breakpoint which stops the program only if + CONDITION evaluates to a non-`nil' value + (`edebug-set-conditional-breakpoint'). If you use a prefix + argument, the breakpoint is temporary (it turns off the first time + it stops the program). + +`B' + Move point to the next breakpoint in the definition + (`edebug-next-breakpoint'). + + While in Edebug, you can set a breakpoint with `b' and unset one +with `u'. First you must move point to a position at or before the +desired Edebug stop point, then hit the key to change the breakpoint. +Unsetting a breakpoint that has not been set does nothing. + + Reevaluating or reinstrumenting a definition clears all its +breakpoints. + + A "conditional breakpoint" tests a condition each time the program +gets there. To set a conditional breakpoint, use `x', and specify the +condition expression in the minibuffer. Setting a conditional +breakpoint at a stop point that already has a conditional breakpoint +puts the current condition expression in the minibuffer so you can edit +it. + + You can make both conditional and unconditional breakpoints +"temporary" by using a prefix arg to the command to set the breakpoint. +After breaking at a temporary breakpoint, it is automatically cleared. + + 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 `B', which moves point +to the next breakpoint in the definition following point, 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. +* Embedded Breakpoints:: Embedding breakpoints in code. + + +File: lispref.info, Node: Global Break Condition, Next: Embedded Breakpoints, Up: Breakpoints + +Global Break Condition +...................... + + In contrast to breaking when execution reaches specified locations, +you can also cause a break when a certain event occurs. The "global +break condition" is a condition that is repeatedly evaluated at every +stop point. If it evaluates to a non-`nil' value, then execution is +stopped or paused depending on the execution mode, just like a +breakpoint. Any errors that might occur as a result of evaluating the +condition are ignored, as if the result were `nil'. + + You can set or edit the condition expression, stored in +`edebug-global-break-condition', using `X' +(`edebug-set-global-break-condition'). + + Using the global break condition is perhaps the fastest way to find +where in your code some event occurs, but since it is rather expensive +you should reset the condition to `nil' when not in use. + + +File: lispref.info, Node: Embedded Breakpoints, Prev: Global Break Condition, Up: Breakpoints + +Embedded Breakpoints +.................... + + Since all breakpoints in a definition are cleared each time you +reinstrument it, you might rather create an "embedded breakpoint" which +is simply a call to the function `edebug'. You can, of course, make +such a call conditional. For example, in the `fac' function, insert +the first line as shown below to stop when the argument reaches zero: + + (defun fac (n) + (if (= n 0) (edebug)) + (if (< 0 n) + (* n (fac (1- n))) + 1)) + + When the `fac' definition is instrumented and the function is +called, Edebug will stop before the call to `edebug'. Depending on the +execution mode, Edebug will stop or pause. + + However, if no instrumented code is being executed, calling `edebug' +will instead invoke `debug'. Calling `debug' will always invoke the +standard backtrace debugger. + + File: lispref.info, Node: Trapping Errors, Next: Edebug Views, Prev: Breakpoints, Up: Edebug Trapping Errors @@ -325,7 +543,7 @@ called _tracing_ (see *Note Edebug Execution Modes::), Edebug can produce a traditional trace listing of execution in a separate buffer, `*edebug-trace*'. - If the variable `edebug-trace' is non-nil, each function entry and + If the variable `edebug-trace' is non-`nil', each function entry and exit adds lines to the trace buffer. On function entry, Edebug prints `::::{' followed by the function name and argument values. On function exit, Edebug prints `::::}' followed by the function name and result of @@ -987,194 +1205,3 @@ causes very deep recursion that could fail.) (vector &rest backquote-form) sexp)) - -File: lispref.info, Node: Edebug Options, Prev: Instrumenting Macro Calls, Up: Edebug - -Edebug Options --------------- - - These options affect the behavior of Edebug: - - - User Option: 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 - `edebug-setup-hook' is reset to `nil'. You could use this to load - up Edebug specifications associated with a package you are using - but only when you also use Edebug. See *Note Instrumenting::. - - - User Option: edebug-all-defs - If non-`nil', normal evaluation of any defining forms (e.g. - `defun' and `defmacro') will instrument them for Edebug. This - applies to `eval-defun', `eval-region', and `eval-current-buffer'. - - Use the command `M-x edebug-all-defs' to toggle the value of this - variable. You may want to make this variable local to each buffer - by calling `(make-local-variable 'edebug-all-defs)' in your - `emacs-lisp-mode-hook'. See *Note Instrumenting::. - - - User Option: edebug-all-forms - If non-`nil', normal evaluation of any forms by `eval-defun', - `eval-region', and `eval-current-buffer' will instrument them for - Edebug. - - Use the command `M-x edebug-all-forms' to toggle the value of this - option. See *Note Instrumenting::. - - - User Option: edebug-save-windows - If non-`nil', save and restore window configuration on Edebug - calls. It takes some time to do this, so if your program does not - care what happens to data about windows, you may want to set this - variable to `nil'. - - If the value is a list, only the listed windows are saved and - restored. - - `M-x edebug-toggle-save-windows' may be used to change this - variable. This command is bound to `W' in source code buffers. - See *Note Edebug Display Update::. - - - User Option: edebug-save-displayed-buffer-points - If non-`nil', save and restore point in all displayed buffers. - This 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, the buffer's point - will be changed to the window's point. - - This is an expensive operation since it visits each window and - therefore each displayed buffer twice for each Edebug activation, - so it is best to avoid it if you can. See *Note Edebug Display - Update::. - - - User Option: edebug-initial-mode - If this variable is non-`nil', it specifies the initial execution - mode for Edebug when it is first activated. Possible values are - `step', `next', `go', `Go-nonstop', `trace', `Trace-fast', - `continue', and `Continue-fast'. - - The default value is `step'. See *Note Edebug Execution Modes::. - - - User Option: edebug-trace - Non-`nil' means display a trace of function entry and exit. - Tracing output is displayed in a buffer named `*edebug-trace*', one - function entry or exit per line, indented by the recursion level. - - The default value is `nil'. - - Also see `edebug-tracing'. See *Note Tracing::. - - - User Option: edebug-test-coverage - If non-`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 `M-x edebug-display-freq-count' to display the frequency count - and coverage information for a definition. See *Note Coverage - Testing::. - - - User Option: edebug-continue-kbd-macro - If non-`nil', continue defining or executing any keyboard macro - that is executing outside of Edebug. Use this with caution since - it is not debugged. See *Note Edebug Execution Modes::. - - - User Option: edebug-print-length - If non-`nil', bind `print-length' to this while printing results - in Edebug. The default value is `50'. See *Note Printing in - Edebug::. - - - User Option: edebug-print-level - If non-`nil', bind `print-level' to this while printing results in - Edebug. The default value is `50'. - - - User Option: edebug-print-circle - If non-`nil', bind `print-circle' to this while printing results - in Edebug. The default value is `nil'. - - - User Option: edebug-on-error - `debug-on-error' is bound to this while Edebug is active. See - *Note Trapping Errors::. - - - User Option: edebug-on-quit - `debug-on-quit' is bound to this while Edebug is active. See - *Note Trapping Errors::. - - - User Option: edebug-unwrap-results - Non-`nil' if Edebug should unwrap results of expressions. This is - useful when debugging macros where the results of expressions are - instrumented expressions. But don't do this when results might be - circular or an infinite loop will result. See *Note Debugging - Backquote::. - - - User Option: edebug-global-break-condition - If non-`nil', an expression to test for at every stop point. If - the result is non-nil, then break. Errors are ignored. See *Note - Global Break Condition::. - - -File: lispref.info, Node: Read and Print, Next: Minibuffers, Prev: Debugging, Up: Top - -Reading and Printing Lisp Objects -********************************* - - "Printing" and "reading" are the operations of converting Lisp -objects to textual form and vice versa. They use the printed -representations and read syntax described in *Note Lisp Data Types::. - - This chapter describes the Lisp functions for reading and printing. -It also describes "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. - - -File: lispref.info, Node: Streams Intro, Next: Input Streams, Up: Read and Print - -Introduction to Reading and Printing -==================================== - - "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 -"read syntax" of the object. For example, the text `(a . 5)' is the -read syntax for a cons cell whose CAR is `a' and whose CDR is the -number 5. - - "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 `(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 `foo' produces the text `foo', and reading that text -returns the symbol `foo'. Printing a list whose elements are `a' and -`b' produces the text `(a b)', and reading that text produces a list -(but not the same list) with elements `a' and `b'. - - However, these two operations are not precisely inverses. There are -three kinds of exceptions: - - * Printing can produce text that cannot be read. For example, - buffers, windows, frames, subprocesses and markers print into text - that starts with `#'; if you try to read this text, you get an - error. There is no way to read those data types. - - * One object can have multiple textual representations. For example, - `1' and `01' represent the same integer, and `(a b)' and `(a . - (b))' represent the same list. Reading will accept any of the - alternatives, but printing must choose one of them. - - * Comments can appear at certain points in the middle of an object's - read sequence without affecting the result of reading it. - diff --git a/info/lispref.info-15 b/info/lispref.info-15 index 9818e56..8e2a635 100644 --- a/info/lispref.info-15 +++ b/info/lispref.info-15 @@ -50,6 +50,197 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Edebug Options, Prev: Instrumenting Macro Calls, Up: Edebug + +Edebug Options +-------------- + + These options affect the behavior of Edebug: + + - User Option: 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 + `edebug-setup-hook' is reset to `nil'. You could use this to load + up Edebug specifications associated with a package you are using + but only when you also use Edebug. See *Note Instrumenting::. + + - User Option: edebug-all-defs + If non-`nil', normal evaluation of any defining forms (e.g. + `defun' and `defmacro') will instrument them for Edebug. This + applies to `eval-defun', `eval-region', and `eval-current-buffer'. + + Use the command `M-x edebug-all-defs' to toggle the value of this + variable. You may want to make this variable local to each buffer + by calling `(make-local-variable 'edebug-all-defs)' in your + `emacs-lisp-mode-hook'. See *Note Instrumenting::. + + - User Option: edebug-all-forms + If non-`nil', normal evaluation of any forms by `eval-defun', + `eval-region', and `eval-current-buffer' will instrument them for + Edebug. + + Use the command `M-x edebug-all-forms' to toggle the value of this + option. See *Note Instrumenting::. + + - User Option: edebug-save-windows + If non-`nil', save and restore window configuration on Edebug + calls. It takes some time to do this, so if your program does not + care what happens to data about windows, you may want to set this + variable to `nil'. + + If the value is a list, only the listed windows are saved and + restored. + + `M-x edebug-toggle-save-windows' may be used to change this + variable. This command is bound to `W' in source code buffers. + See *Note Edebug Display Update::. + + - User Option: edebug-save-displayed-buffer-points + If non-`nil', save and restore point in all displayed buffers. + This 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, the buffer's point + will be changed to the window's point. + + This is an expensive operation since it visits each window and + therefore each displayed buffer twice for each Edebug activation, + so it is best to avoid it if you can. See *Note Edebug Display + Update::. + + - User Option: edebug-initial-mode + If this variable is non-`nil', it specifies the initial execution + mode for Edebug when it is first activated. Possible values are + `step', `next', `go', `Go-nonstop', `trace', `Trace-fast', + `continue', and `Continue-fast'. + + The default value is `step'. See *Note Edebug Execution Modes::. + + - User Option: edebug-trace + Non-`nil' means display a trace of function entry and exit. + Tracing output is displayed in a buffer named `*edebug-trace*', one + function entry or exit per line, indented by the recursion level. + + The default value is `nil'. + + Also see `edebug-tracing'. See *Note Tracing::. + + - User Option: edebug-test-coverage + If non-`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 `M-x edebug-display-freq-count' to display the frequency count + and coverage information for a definition. See *Note Coverage + Testing::. + + - User Option: edebug-continue-kbd-macro + If non-`nil', continue defining or executing any keyboard macro + that is executing outside of Edebug. Use this with caution since + it is not debugged. See *Note Edebug Execution Modes::. + + - User Option: edebug-print-length + If non-`nil', bind `print-length' to this while printing results + in Edebug. The default value is `50'. See *Note Printing in + Edebug::. + + - User Option: edebug-print-level + If non-`nil', bind `print-level' to this while printing results in + Edebug. The default value is `50'. + + - User Option: edebug-print-circle + If non-`nil', bind `print-circle' to this while printing results + in Edebug. The default value is `nil'. + + - User Option: edebug-on-error + `debug-on-error' is bound to this while Edebug is active. See + *Note Trapping Errors::. + + - User Option: edebug-on-quit + `debug-on-quit' is bound to this while Edebug is active. See + *Note Trapping Errors::. + + - User Option: edebug-unwrap-results + Non-`nil' if Edebug should unwrap results of expressions. This is + useful when debugging macros where the results of expressions are + instrumented expressions. But don't do this when results might be + circular or an infinite loop will result. See *Note Debugging + Backquote::. + + - User Option: edebug-global-break-condition + If non-`nil', an expression to test for at every stop point. If + the result is non-`nil', then break. Errors are ignored. See + *Note Global Break Condition::. + + +File: lispref.info, Node: Read and Print, Next: Minibuffers, Prev: Debugging, Up: Top + +Reading and Printing Lisp Objects +********************************* + + "Printing" and "reading" are the operations of converting Lisp +objects to textual form and vice versa. They use the printed +representations and read syntax described in *Note Lisp Data Types::. + + This chapter describes the Lisp functions for reading and printing. +It also describes "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. + + +File: lispref.info, Node: Streams Intro, Next: Input Streams, Up: Read and Print + +Introduction to Reading and Printing +==================================== + + "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 +"read syntax" of the object. For example, the text `(a . 5)' is the +read syntax for a cons cell whose CAR is `a' and whose CDR is the +number 5. + + "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 `(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 `foo' produces the text `foo', and reading that text +returns the symbol `foo'. Printing a list whose elements are `a' and +`b' produces the text `(a b)', and reading that text produces a list +(but not the same list) with elements `a' and `b'. + + However, these two operations are not precisely inverses. There are +three kinds of exceptions: + + * Printing can produce text that cannot be read. For example, + buffers, windows, frames, subprocesses and markers print into text + that starts with `#'; if you try to read this text, you get an + error. There is no way to read those data types. + + * One object can have multiple textual representations. For example, + `1' and `01' represent the same integer, and `(a b)' and `(a . + (b))' represent the same list. Reading will accept any of the + alternatives, but printing must choose one of them. + + * Comments can appear at certain points in the middle of an object's + read sequence without affecting the result of reading it. + + File: lispref.info, Node: Input Streams, Next: Input Functions, Prev: Streams Intro, Up: Read and Print Input Streams @@ -581,7 +772,7 @@ Variables Affecting Output following the decimal point. With `f', a precision of 0 means to omit the decimal point. 0 is not allowed with `f' or `g'. - A value of nil means to use `%.16g'. + A value of `nil' means to use `%.16g'. Regardless of the value of `float-output-format', a floating point number will never be printed in such a way that it is ambiguous @@ -740,10 +931,10 @@ Defining Commands::. The arguments PROMPT and INITIAL are used as in `read-from-minibuffer'. The keymap used is `minibuffer-local-map'. - The optional argument HISTORY, if non-nil, specifies a history + The optional argument HISTORY, if non-`nil', specifies a history list and optionally the initial position in the list. The optional - argument DEFAULT specifies a default value to return if the user - enters null input; it should be a string. + argument DEFAULT-VALUE specifies a default value to return if the + user enters null input; it should be a string. This function is a simplified interface to the `read-from-minibuffer' function: @@ -793,7 +984,7 @@ minibuffer. returns it without evaluating it. The arguments PROMPT and INITIAL are used as in `read-from-minibuffer'. - The optional argument HISTORY, if non-nil, specifies a history + The optional argument HISTORY, if non-`nil', specifies a history list and optionally the initial position in the list. The optional argument DEFAULT-VALUE specifies a default value to return if the user enters null input; it should be a string. @@ -832,7 +1023,7 @@ minibuffer. evaluates it, then returns the result. The arguments PROMPT and INITIAL are used as in `read-from-minibuffer'. - The optional argument HISTORY, if non-nil, specifies a history + The optional argument HISTORY, if non-`nil', specifies a history list and optionally the initial position in the list. The optional argument DEFAULT-VALUE specifies a default value to return if the user enters null input; it should be a string. @@ -844,10 +1035,10 @@ minibuffer. == (eval (read-expression PROMPT INITIAL)) - - Function: edit-and-eval-command prompt command &optional history + - Function: edit-and-eval-command prompt form &optional history This function reads a Lisp expression in the minibuffer, and then evaluates it. The difference between this command and - `eval-minibuffer' is that here the initial COMMAND is not optional + `eval-minibuffer' is that here the initial 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 `prin1', so if it is a string, double-quote characters (`"') @@ -993,199 +1184,3 @@ certain kinds of names with completion. * Reading File Names:: Using completion to read file names. * Programmed Completion:: Finding the completions for a given file name. - -File: lispref.info, Node: Basic Completion, Next: Minibuffer Completion, Up: Completion - -Basic Completion Functions --------------------------- - - The two functions `try-completion' and `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. - - - Function: try-completion string collection &optional predicate - This function returns the longest common substring of all possible - completions of STRING in COLLECTION. The value of COLLECTION must - be an alist, an obarray, or a function that implements a virtual - set of strings (see below). - - Completion compares STRING against each of the permissible - completions specified by COLLECTION; if the beginning of the - permissible completion equals STRING, it matches. If no - permissible completions match, `try-completion' returns `nil'. If - only one permissible completion matches, and the match is exact, - then `try-completion' returns `t'. Otherwise, the value is the - longest initial sequence common to all the permissible completions - that match. - - If COLLECTION is an alist (*note Association Lists::), the CARs of - the alist elements form the set of permissible completions. - - If COLLECTION is an obarray (*note Creating Symbols::), the names - of all symbols in the obarray form the set of permissible - completions. The global variable `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 `intern'. Also, - you cannot intern a given symbol in more than one obarray. - - If the argument PREDICATE is non-`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 PREDICATE returns non-`nil'. The - argument given to PREDICATE is either a cons cell from the alist - (the CAR of which is a string) or else it is a symbol (_not_ a - symbol name) from the obarray. - - You can also use a symbol that is a function as COLLECTION. Then - the function is solely responsible for performing completion; - `try-completion' returns whatever this function returns. The - function is called with three arguments: STRING, PREDICATE and - `nil'. (The reason for the third argument is so that the same - function can be used in `all-completions' and do the appropriate - thing in either case.) *Note Programmed Completion::. - - In the first of the following examples, the string `foo' is - matched by three of the alist CARs. All of the matches begin with - the characters `fooba', so that is the result. In the second - example, there is only one possible match, and it is exact, so the - value is `t'. - - (try-completion - "foo" - '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))) - => "fooba" - - (try-completion "foo" '(("barfoo" 2) ("foo" 3))) - => t - - In the following example, numerous symbols begin with the - characters `forw', and all of them begin with the word `forward'. - In most of the symbols, this is followed with a `-', but not in - all, so no more than `forward' can be completed. - - (try-completion "forw" obarray) - => "forward" - - Finally, in the following example, only two of the three possible - matches pass the predicate `test' (the string `foobaz' is too - short). Both of those begin with the string `foobar'. - - (defun test (s) - (> (length (car s)) 6)) - => test - (try-completion - "foo" - '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) - 'test) - => "foobar" - - - Function: all-completions string collection &optional predicate - nospace - This function returns a list of all possible completions of - STRING. The arguments to this function are the same as those of - `try-completion'. - - If COLLECTION is a function, it is called with three arguments: - STRING, PREDICATE and `t'; then `all-completions' returns whatever - the function returns. *Note Programmed Completion::. - - If NOSPACE is non-`nil', completions that start with a space are - ignored unless STRING also starts with a space. - - Here is an example, using the function `test' shown in the example - for `try-completion': - - (defun test (s) - (> (length (car s)) 6)) - => test - - (all-completions - "foo" - '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) - 'test) - => ("foobar1" "foobar2") - - - Variable: completion-ignore-case - If the value of this variable is non-`nil', XEmacs does not - consider case significant in completion. - - -File: lispref.info, Node: Minibuffer Completion, Next: Completion Commands, Prev: Basic Completion, Up: Completion - -Completion and the Minibuffer ------------------------------ - - This section describes the basic interface for reading from the -minibuffer with completion. - - - Function: completing-read prompt collection &optional predicate - require-match initial hist default - This function reads a string in the minibuffer, assisting the user - by providing completion. It activates the minibuffer with prompt - PROMPT, which must be a string. If INITIAL is non-`nil', - `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 COLLECTION and PREDICATE - to the function `try-completion'. This happens in certain - commands bound in the local keymaps used for completion. - - If REQUIRE-MATCH is `t', the usual minibuffer exit commands won't - exit unless the input completes to an element of COLLECTION. If - REQUIRE-MATCH is neither `nil' nor `t', then the exit commands - won't exit unless the input typed is itself an element of - COLLECTION. If REQUIRE-MATCH is `nil', the exit commands work - regardless of the input in the minibuffer. - - However, empty input is always permitted, regardless of the value - of REQUIRE-MATCH; in that case, `completing-read' returns DEFAULT. - The value of DEFAULT (if non-`nil') is also available to the user - through the history commands. - - The user can exit with null input by typing with an empty - minibuffer. Then `completing-read' returns `""'. This is how the - user requests whatever default the command uses for the value being - read. The user can return using in this way regardless of - the value of REQUIRE-MATCH, and regardless of whether the empty - string is included in COLLECTION. - - The function `completing-read' works by calling `read-expression'. - It uses `minibuffer-local-completion-map' as the keymap if - REQUIRE-MATCH is `nil', and uses `minibuffer-local-must-match-map' - if REQUIRE-MATCH is non-`nil'. *Note Completion Commands::. - - The argument HIST specifies which history list variable to use for - saving the input and for minibuffer history commands. It defaults - to `minibuffer-history'. *Note Minibuffer History::. - - Completion ignores case when comparing the input against the - possible matches, if the built-in variable - `completion-ignore-case' is non-`nil'. *Note Basic Completion::. - - Here's an example of using `completing-read': - - (completing-read - "Complete a foo: " - '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) - nil t "fo") - - ;; After evaluation of the preceding expression, - ;; the following appears in the minibuffer: - - ---------- Buffer: Minibuffer ---------- - Complete a foo: fo-!- - ---------- Buffer: Minibuffer ---------- - - If the user then types ` b ', `completing-read' - returns `barfoo'. - - The `completing-read' function binds three variables to pass - information to the commands that actually do completion. These - variables are `minibuffer-completion-table', - `minibuffer-completion-predicate' and - `minibuffer-completion-confirm'. For more information about them, - see *Note Completion Commands::. - diff --git a/info/lispref.info-16 b/info/lispref.info-16 index 5e63304..f7987c8 100644 --- a/info/lispref.info-16 +++ b/info/lispref.info-16 @@ -50,6 +50,198 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Basic Completion, Next: Minibuffer Completion, Up: Completion + +Basic Completion Functions +-------------------------- + + The two functions `try-completion' and `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. + + - Function: try-completion string collection &optional predicate + This function returns the longest common prefix of all possible + completions of STRING in COLLECTION. The value of COLLECTION must + be an alist, an obarray, or a function that implements a virtual + set of strings (see below). + + Completion compares STRING against each of the permissible + completions specified by COLLECTION; if the beginning of the + permissible completion equals STRING, it matches. If no + permissible completions match, `try-completion' returns `nil'. If + only one permissible completion matches, and the match is exact, + then `try-completion' returns `t'. Otherwise, the value is the + longest initial sequence common to all the permissible completions + that match. + + If COLLECTION is an alist (*note Association Lists::), the CARs of + the alist elements form the set of permissible completions. + + If COLLECTION is an obarray (*note Creating Symbols::), the names + of all symbols in the obarray form the set of permissible + completions. The global variable `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 `intern'. Also, + you cannot intern a given symbol in more than one obarray. + + If the argument PREDICATE is non-`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 PREDICATE returns non-`nil'. The + argument given to PREDICATE is either a cons cell from the alist + (the CAR of which is a string) or else it is a symbol (_not_ a + symbol name) from the obarray. + + You can also use a symbol that is a function as COLLECTION. Then + the function is solely responsible for performing completion; + `try-completion' returns whatever this function returns. The + function is called with three arguments: STRING, PREDICATE and + `nil'. (The reason for the third argument is so that the same + function can be used in `all-completions' and do the appropriate + thing in either case.) *Note Programmed Completion::. + + In the first of the following examples, the string `foo' is + matched by three of the alist CARs. All of the matches begin with + the characters `fooba', so that is the result. In the second + example, there is only one possible match, and it is exact, so the + value is `t'. + + (try-completion + "foo" + '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))) + => "fooba" + + (try-completion "foo" '(("barfoo" 2) ("foo" 3))) + => t + + In the following example, numerous symbols begin with the + characters `forw', and all of them begin with the word `forward'. + In most of the symbols, this is followed with a `-', but not in + all, so no more than `forward' can be completed. + + (try-completion "forw" obarray) + => "forward" + + Finally, in the following example, only two of the three possible + matches pass the predicate `test' (the string `foobaz' is too + short). Both of those begin with the string `foobar'. + + (defun test (s) + (> (length (car s)) 6)) + => test + (try-completion + "foo" + '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) + 'test) + => "foobar" + + - Function: all-completions string collection &optional predicate + This function returns a list of all possible completions of STRING. + The arguments to this function are the same as those of + `try-completion'. + + If COLLECTION is a function, it is called with three arguments: + STRING, PREDICATE and `t'; then `all-completions' returns whatever + the function returns. *Note Programmed Completion::. + + Here is an example, using the function `test' shown in the example + for `try-completion': + + (defun test (s) + (> (length (car s)) 6)) + => test + + (all-completions + "foo" + '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) + 'test) + => ("foobar1" "foobar2") + + - Variable: completion-ignore-case + If the value of this variable is non-`nil', XEmacs does not + consider case significant in completion. + + +File: lispref.info, Node: Minibuffer Completion, Next: Completion Commands, Prev: Basic Completion, Up: Completion + +Completion and the Minibuffer +----------------------------- + + This section describes the basic interface for reading from the +minibuffer with completion. + + - Function: completing-read prompt collection &optional predicate + require-match initial hist default + This function reads a string in the minibuffer, assisting the user + by providing completion. It activates the minibuffer with prompt + PROMPT, which must be a string. If INITIAL is non-`nil', + `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 COLLECTION and PREDICATE + to the function `try-completion'. This happens in certain + commands bound in the local keymaps used for completion. + + If REQUIRE-MATCH is `t', the usual minibuffer exit commands won't + exit unless the input completes to an element of COLLECTION. If + REQUIRE-MATCH is neither `nil' nor `t', then the exit commands + won't exit unless the input typed is itself an element of + COLLECTION. If REQUIRE-MATCH is `nil', the exit commands work + regardless of the input in the minibuffer. + + However, empty input is always permitted, regardless of the value + of REQUIRE-MATCH; in that case, `completing-read' returns DEFAULT. + The value of DEFAULT (if non-`nil') is also available to the user + through the history commands. + + The user can exit with null input by typing with an empty + minibuffer. Then `completing-read' returns `""'. This is how the + user requests whatever default the command uses for the value being + read. The user can return using in this way regardless of + the value of REQUIRE-MATCH, and regardless of whether the empty + string is included in COLLECTION. + + The function `completing-read' works by calling `read-expression'. + It uses `minibuffer-local-completion-map' as the keymap if + REQUIRE-MATCH is `nil', and uses `minibuffer-local-must-match-map' + if REQUIRE-MATCH is non-`nil'. *Note Completion Commands::. + + The argument HIST specifies which history list variable to use for + saving the input and for minibuffer history commands. It defaults + to `minibuffer-history'. *Note Minibuffer History::. + + Completion ignores case when comparing the input against the + possible matches, if the built-in variable + `completion-ignore-case' is non-`nil'. *Note Basic Completion::. + + Here's an example of using `completing-read': + + (completing-read + "Complete a foo: " + '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) + nil t "fo") + + ;; After evaluation of the preceding expression, + ;; the following appears in the minibuffer: + + ---------- Buffer: Minibuffer ---------- + Complete a foo: fo-!- + ---------- Buffer: Minibuffer ---------- + + If the user then types ` b ', `completing-read' + returns `barfoo'. + + The `completing-read' function binds three variables to pass + information to the commands that actually do completion. These + variables are `minibuffer-completion-table', + `minibuffer-completion-predicate' and + `minibuffer-completion-confirm'. For more information about them, + see *Note Completion Commands::. + + File: lispref.info, Node: Completion Commands, Next: High-Level Completion, Prev: Minibuffer Completion, Up: Completion Minibuffer Commands That Do Completion @@ -253,9 +445,9 @@ Defining Commands::. The argument DEFAULT-VALUE specifies what to return if the user enters null input. It can be a symbol or a string; if it is a - string, `read-variable' interns it before returning it. If DEFAULT - is `nil', that means no default has been specified; then if the - user enters null input, the return value is `nil'. + string, `read-variable' interns it before returning it. If + DEFAULT-VALUE is `nil', that means no default has been specified; + then if the user enters null input, the return value is `nil'. (read-variable "Variable name? ") @@ -664,13 +856,13 @@ function `read-passwd'. `read-passwd' returns the null string in that case. - User Option: passwd-invert-frame-when-keyboard-grabbed - If non-nil swap the foreground and background colors of all faces - while reading a password. Default values is `t' unless feature - `infodock' is provided. + If non-`nil', swap the foreground and background colors of all + faces while reading a password. Default values is `t', unless + feature `infodock' is provided. - User Option: passwd-echo This specifies the character echoed when typing a password. When - nil, nothing is echoed. + `nil', nothing is echoed.  File: lispref.info, Node: Minibuffer Misc, Prev: Reading a Password, Up: Minibuffers @@ -740,7 +932,7 @@ minibuffers. frame--a frame that has no minibuffer of its own necessarily uses some other frame's minibuffer window. - - Function: window-minibuffer-p window + - Function: window-minibuffer-p &optional window This function returns non-`nil' if WINDOW is a minibuffer window. It is not correct to determine whether a given window is a @@ -899,318 +1091,3 @@ controls the reading of arguments for an interactive call. in various ways. * Interactive Examples:: Examples of how to read interactive arguments. - -File: lispref.info, Node: Using Interactive, Next: Interactive Codes, Up: Defining Commands - -Using `interactive' -------------------- - - This section describes how to write the `interactive' form that -makes a Lisp function an interactively-callable command. - - - Special Form: interactive arg-descriptor - This special form declares that the function in which it appears - is a command, and that it may therefore be called interactively - (via `M-x' or by entering a key sequence bound to it). The - argument 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 - ARG-DESCRIPTOR has no effect. - - The `interactive' form has its effect because the command loop - (actually, its subroutine `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 - `interactive' form are executed, but at this time `interactive' - simply returns `nil' without even evaluating its argument. - - There are three possibilities for the argument ARG-DESCRIPTOR: - - * It may be omitted or `nil'; then the command is called with no - arguments. This leads quickly to an error if the command requires - one or more arguments. - - * 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. - - 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 _not_ to do: - - (interactive - (list (region-beginning) (region-end) - (read-string "Foo: " nil 'my-history))) - - Here's how to avoid the problem, by examining point and the mark - only after reading the keyboard input: - - (interactive - (let ((string (read-string "Foo: " nil 'my-history))) - (list (region-beginning) (region-end) string))) - - * 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: - - (interactive "bFrobnicate buffer: ") - - The code letter `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. - - The prompt string can use `%' to include previous argument values - (starting with the first argument) in the prompt. This is done - using `format' (*note 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: - - (interactive "bBuffer to rename: \nsRename buffer %s to: ") - - If the first character in the string is `*', then an error is - signaled if the buffer is read-only. - - If the first character in the string is `@', 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. - - If the first character in the string is `_', then this command will - not cause the region to be deactivated when it completes; that is, - `zmacs-region-stays' will be set to `t' when the command exits - successfully. - - You can use `*', `@', and `_' 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 `*', - `@', or `_'). - - - Function: function-interactive function - This function retrieves the interactive specification of FUNCTION, - which may be any funcallable object. The specification will be - returned as the list of the symbol `interactive' and the specs. If - FUNCTION is not interactive, `nil' will be returned. - - -File: lispref.info, Node: Interactive Codes, Next: Interactive Examples, Prev: Using Interactive, Up: Defining Commands - -Code Characters for `interactive' ---------------------------------- - - The code character descriptions below contain a number of key words, -defined here as follows: - -Completion - Provide completion. , , and perform name - completion because the argument is read using `completing-read' - (*note Completion::). `?' displays a list of possible completions. - -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. - -Default - A default value of some sort is used if the user enters no text in - the minibuffer. The default depends on the code character. - -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. - -Prompt - A prompt immediately follows the code character. The prompt ends - either with the end of the string or with a newline. - -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. - - Here are the code character descriptions for use with `interactive': - -`*' - Signal an error if the current buffer is read-only. Special. - -`@' - Select the window mentioned in the first mouse event in the key - sequence that invoked this command. Special. - -`_' - Do not cause the region to be deactivated when this command - completes. Special. - -`a' - A function name (i.e., a symbol satisfying `fboundp'). Existing, - Completion, Prompt. - -`b' - The name of an existing buffer. By default, uses the name of the - current buffer (*note Buffers::). Existing, Completion, Default, - Prompt. - -`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. - -`c' - A character. The cursor does not move into the echo area. Prompt. - -`C' - A command name (i.e., a symbol satisfying `commandp'). Existing, - Completion, Prompt. - -`d' - The position of point, as an integer (*note Point::). No I/O. - -`D' - A directory name. The default is the current default directory of - the current buffer, `default-directory' (*note System - Environment::). Existing, Completion, Default, Prompt. - -`e' - The last mouse-button or misc-user event in the key sequence that - invoked the command. No I/O. - - You can use `e' more than once in a single command's interactive - specification. If the key sequence that invoked the command has N - mouse-button or misc-user events, the Nth `e' provides the Nth - such event. - -`f' - A file name of an existing file (*note File Names::). The default - directory is `default-directory'. Existing, Completion, Default, - Prompt. - -`F' - A file name. The file need not exist. Completion, Default, - Prompt. - -`k' - A key sequence (*note 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 - vector of events. The cursor does not move into the echo area. - Prompt. - - This kind of input is used by commands such as `describe-key' and - `global-set-key'. - -`K' - A key sequence, whose definition you intend to change. This works - like `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. - -`m' - The position of the mark, as an integer. No I/O. - -`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. - -`N' - The raw prefix argument. If the prefix argument is `nil', then - read a number as with `n'. Requires a number. *Note Prefix - Command Arguments::. Prompt. - -`p' - The numeric prefix argument. (Note that this `p' is lower case.) - No I/O. - -`P' - The raw prefix argument. (Note that this `P' is upper case.) No - I/O. - -`r' - Point and the mark, as two numeric arguments, smallest first. - This is the only code letter that specifies two successive - arguments rather than one. No I/O. - -`s' - Arbitrary text, read in the minibuffer and returned as a string - (*note Text from Minibuffer::). Terminate the input with either - or . (`C-q' may be used to include either of these - characters in the input.) Prompt. - -`S' - An interned symbol whose name is read in the minibuffer. Any - whitespace character terminates the input. (Use `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. - -`v' - A variable declared to be a user option (i.e., satisfying the - predicate `user-variable-p'). *Note High-Level Completion::. - Existing, Completion, Prompt. - -`x' - A Lisp object, specified with its read syntax, terminated with a - or . The object is not evaluated. *Note Object from - Minibuffer::. Prompt. - -`X' - A Lisp form is read as with `x', but then evaluated so that its - value becomes the argument for the command. Prompt. - - -File: lispref.info, Node: Interactive Examples, Prev: Interactive Codes, Up: Defining Commands - -Examples of Using `interactive' -------------------------------- - - Here are some examples of `interactive': - - (defun foo1 () ; `foo1' takes no arguments, - (interactive) ; just moves forward two words. - (forward-word 2)) - => foo1 - - (defun foo2 (n) ; `foo2' takes one argument, - (interactive "p") ; which is the numeric prefix. - (forward-word (* 2 n))) - => foo2 - - (defun foo3 (n) ; `foo3' takes one argument, - (interactive "nCount:") ; which is read with the Minibuffer. - (forward-word (* 2 n))) - => foo3 - - (defun three-b (b1 b2 b3) - "Select three existing buffers. - Put them into three windows, selecting the last one." - (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)) - => three-b - (three-b "*scratch*" "declarations.texi" "*mail*") - => nil - diff --git a/info/lispref.info-17 b/info/lispref.info-17 index f9926db..d3a35b9 100644 --- a/info/lispref.info-17 +++ b/info/lispref.info-17 @@ -50,6 +50,321 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Using Interactive, Next: Interactive Codes, Up: Defining Commands + +Using `interactive' +------------------- + + This section describes how to write the `interactive' form that +makes a Lisp function an interactively-callable command. + + - Special Form: interactive arg-descriptor + This special form declares that the function in which it appears + is a command, and that it may therefore be called interactively + (via `M-x' or by entering a key sequence bound to it). The + argument 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 + ARG-DESCRIPTOR has no effect. + + The `interactive' form has its effect because the command loop + (actually, its subroutine `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 + `interactive' form are executed, but at this time `interactive' + simply returns `nil' without even evaluating its argument. + + There are three possibilities for the argument ARG-DESCRIPTOR: + + * It may be omitted or `nil'; then the command is called with no + arguments. This leads quickly to an error if the command requires + one or more arguments. + + * 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. + + 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 _not_ to do: + + (interactive + (list (region-beginning) (region-end) + (read-string "Foo: " nil 'my-history))) + + Here's how to avoid the problem, by examining point and the mark + only after reading the keyboard input: + + (interactive + (let ((string (read-string "Foo: " nil 'my-history))) + (list (region-beginning) (region-end) string))) + + * 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: + + (interactive "bFrobnicate buffer: ") + + The code letter `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. + + The prompt string can use `%' to include previous argument values + (starting with the first argument) in the prompt. This is done + using `format' (*note 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: + + (interactive "bBuffer to rename: \nsRename buffer %s to: ") + + If the first character in the string is `*', then an error is + signaled if the buffer is read-only. + + If the first character in the string is `@', 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. + + If the first character in the string is `_', then this command will + not cause the region to be deactivated when it completes; that is, + `zmacs-region-stays' will be set to `t' when the command exits + successfully. + + You can use `*', `@', and `_' 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 `*', + `@', or `_'). + + - Function: function-interactive function + This function retrieves the interactive specification of FUNCTION, + which may be any funcallable object. The specification will be + returned as the list of the symbol `interactive' and the specs. If + FUNCTION is not interactive, `nil' will be returned. + + +File: lispref.info, Node: Interactive Codes, Next: Interactive Examples, Prev: Using Interactive, Up: Defining Commands + +Code Characters for `interactive' +--------------------------------- + + The code character descriptions below contain a number of key words, +defined here as follows: + +Completion + Provide completion. , , and perform name + completion because the argument is read using `completing-read' + (*note Completion::). `?' displays a list of possible completions. + +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. + +Default + A default value of some sort is used if the user enters no text in + the minibuffer. The default depends on the code character. + +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. + +Prompt + A prompt immediately follows the code character. The prompt ends + either with the end of the string or with a newline. + +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. + + Here are the code character descriptions for use with `interactive': + +`*' + Signal an error if the current buffer is read-only. Special. + +`@' + Select the window mentioned in the first mouse event in the key + sequence that invoked this command. Special. + +`_' + Do not cause the region to be deactivated when this command + completes. Special. + +`a' + A function name (i.e., a symbol satisfying `fboundp'). Existing, + Completion, Prompt. + +`b' + The name of an existing buffer. By default, uses the name of the + current buffer (*note Buffers::). Existing, Completion, Default, + Prompt. + +`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. + +`c' + A character. The cursor does not move into the echo area. Prompt. + +`C' + A command name (i.e., a symbol satisfying `commandp'). Existing, + Completion, Prompt. + +`d' + The position of point, as an integer (*note Point::). No I/O. + +`D' + A directory name. The default is the current default directory of + the current buffer, `default-directory' (*note System + Environment::). Existing, Completion, Default, Prompt. + +`e' + The last mouse-button or misc-user event in the key sequence that + invoked the command. No I/O. + + You can use `e' more than once in a single command's interactive + specification. If the key sequence that invoked the command has N + mouse-button or misc-user events, the Nth `e' provides the Nth + such event. + +`f' + A file name of an existing file (*note File Names::). The default + directory is `default-directory'. Existing, Completion, Default, + Prompt. + +`F' + A file name. The file need not exist. Completion, Default, + Prompt. + +`k' + A key sequence (*note 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 + vector of events. The cursor does not move into the echo area. + Prompt. + + This kind of input is used by commands such as `describe-key' and + `global-set-key'. + +`K' + A key sequence, whose definition you intend to change. This works + like `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. + +`m' + The position of the mark, as an integer. No I/O. + +`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. + +`N' + The raw prefix argument. If the prefix argument is `nil', then + read a number as with `n'. Requires a number. *Note Prefix + Command Arguments::. Prompt. + +`p' + The numeric prefix argument. (Note that this `p' is lower case.) + No I/O. + +`P' + The raw prefix argument. (Note that this `P' is upper case.) No + I/O. + +`r' + Point and the mark, as two numeric arguments, smallest first. + This is the only code letter that specifies two successive + arguments rather than one. No I/O. + +`s' + Arbitrary text, read in the minibuffer and returned as a string + (*note Text from Minibuffer::). Terminate the input with either + or . (`C-q' may be used to include either of these + characters in the input.) Prompt. + +`S' + An interned symbol whose name is read in the minibuffer. Any + whitespace character terminates the input. (Use `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. + +`v' + A variable declared to be a user option (i.e., satisfying the + predicate `user-variable-p'). *Note High-Level Completion::. + Existing, Completion, Prompt. + +`x' + A Lisp object, specified with its read syntax, terminated with a + or . The object is not evaluated. *Note Object from + Minibuffer::. Prompt. + +`X' + A Lisp form is read as with `x', but then evaluated so that its + value becomes the argument for the command. Prompt. + + +File: lispref.info, Node: Interactive Examples, Prev: Interactive Codes, Up: Defining Commands + +Examples of Using `interactive' +------------------------------- + + Here are some examples of `interactive': + + (defun foo1 () ; `foo1' takes no arguments, + (interactive) ; just moves forward two words. + (forward-word 2)) + => foo1 + + (defun foo2 (n) ; `foo2' takes one argument, + (interactive "p") ; which is the numeric prefix. + (forward-word (* 2 n))) + => foo2 + + (defun foo3 (n) ; `foo3' takes one argument, + (interactive "nCount:") ; which is read with the Minibuffer. + (forward-word (* 2 n))) + => foo3 + + (defun three-b (b1 b2 b3) + "Select three existing buffers. + Put them into three windows, selecting the last one." + (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)) + => three-b + (three-b "*scratch*" "declarations.texi" "*mail*") + => nil + + File: lispref.info, Node: Interactive Call, Next: Command Loop Info, Prev: Defining Commands, Up: Command Loop Interactive Call @@ -61,9 +376,9 @@ definition, it invokes that definition using the function `command-execute' calls `call-interactively', which reads the arguments and calls the command. You can also call these functions yourself. - - Function: commandp object - Returns `t' if OBJECT is suitable for calling interactively; that - is, if OBJECT is a command. Otherwise, returns `nil'. + - Function: commandp function + Returns `t' if FUNCTION is suitable for calling interactively; + that is, if FUNCTION is a command. Otherwise, returns `nil'. The interactively callable objects include strings and vectors (treated as keyboard macros), lambda expressions that contain a @@ -80,7 +395,7 @@ and calls the command. You can also call these functions yourself. See `documentation' in *Note Accessing Documentation::, for a realistic example of using `commandp'. - - Function: call-interactively command &optional record-flag + - Function: call-interactively command &optional record-flag keys This function calls the interactively callable function COMMAND, reading arguments according to its interactive calling specifications. An error is signaled if COMMAND is not a function @@ -90,7 +405,7 @@ and calls the command. You can also call these functions yourself. functions. If RECORD-FLAG is the symbol `lambda', the interactive calling - arguments for `command' are read and returned as a list, but the + arguments for COMMAND are read and returned as a list, but the function is not called on them. If RECORD-FLAG is `t', then this command and its arguments are @@ -98,7 +413,7 @@ and calls the command. You can also call these functions yourself. the command is added only if it uses the minibuffer to read an argument. *Note Command History::. - - Function: command-execute command &optional record-flag + - Function: command-execute command &optional record-flag keys This function executes COMMAND as an editing command. The argument COMMAND must satisfy the `commandp' predicate; i.e., it must be an interactively callable function or a keyboard macro. @@ -310,7 +625,7 @@ command binding of the key sequence. *Note Reading Input::. - Function: eventp object - This function returns non-`nil' if EVENT is an input event. + This function returns non-`nil' if OBJECT is an input event. * Menu: @@ -560,7 +875,7 @@ particular type. - Function: key-press-event-p object This is true if OBJECT is a key-press event. - - Function: button-event-p object object + - Function: button-event-p object This is true if OBJECT is a mouse button-press or button-release event. @@ -957,10 +1272,10 @@ latter case. (event-properties EVENT))) - Function: copy-event event1 &optional event2 - This function makes a copy of the given event object. If a second - argument is given, the first event is copied into the second and - the second is returned. If the second argument is not supplied - (or is `nil') then a new event will be made. + This function makes a copy of the event object EVENT1. If a + second event argument EVENT2 is given, EVENT1 is copied into + EVENT2 and EVENT2 is returned. If EVENT2 is not supplied (or is + `nil') then a new event will be made, as with `make-event'. - Function: deallocate-event event This function allows the given event structure to be reused. You @@ -968,345 +1283,5 @@ latter case. it. You will lose. It is not necessary to call this function, as event objects are garbage-collected like all other objects; however, it may be more efficient to explicitly deallocate events - when you are sure that that is safe. - - -File: lispref.info, Node: Converting Events, Prev: Working With Events, Up: Events - -Converting Events ------------------ - - XEmacs provides some auxiliary functions for converting between -events and other ways of representing keys. These are useful when -working with ASCII strings and with keymaps. - - - Function: character-to-event ch &optional event device - This function converts a numeric ASCII value to an event structure, - replete with modifier bits. CH is the character to convert, and - EVENT is the event object to fill in. This function contains - knowledge about what the codes "mean"--for example, the number 9 is - converted to the character , not the distinct character - . - - Note that CH does not have to be a numeric value, but can be a - symbol such as `clear' or a list such as `(control backspace)'. - - If `event' is not `nil', it is modified; otherwise, a new event - object is created. In both cases, the event is returned. - - Optional third arg DEVICE is the device to store in the event; - this also affects whether the high bit is interpreted as a meta - key. A value of `nil' means use the selected device but always - treat the high bit as meta. - - Beware that `character-to-event' and `event-to-character' are not - strictly inverse functions, since events contain much more - information than the ASCII character set can encode. - - - Function: event-to-character event &optional allow-extra-modifiers - allow-meta allow-non-ascii - This function returns the closest ASCII approximation to EVENT. - If the event isn't a keypress, this returns `nil'. - - If ALLOW-EXTRA-MODIFIERS is non-`nil', then this is lenient in its - translation; it will ignore modifier keys other than and - , and will ignore the modifier on those characters - which have no shifted ASCII equivalent ( for - example, will be mapped to the same ASCII code as ). - - If ALLOW-META is non-`nil', then the modifier will be - represented by turning on the high bit of the byte returned; - otherwise, `nil' will be returned for events containing the - modifier. - - If ALLOW-NON-ASCII is non-`nil', then characters which are present - in the prevailing character set (*note variable - `character-set-property': Keymaps.) will be returned as their code - in that character set, instead of the return value being - restricted to ASCII. - - Note that specifying both ALLOW-META and ALLOW-NON-ASCII is - ambiguous, as both use the high bit; and will be - indistinguishable. - - - Function: events-to-keys events &optional no-mice - Given a vector of event objects, this function returns a vector of - key descriptors, or a string (if they all fit in the ASCII range). - Optional arg NO-MICE means that button events are not allowed. - - -File: lispref.info, Node: Reading Input, Next: Waiting, Prev: Events, Up: Command Loop - -Reading Input -============= - - The editor command loop reads keyboard input using the function -`next-event' and constructs key sequences out of the events using -`dispatch-event'. Lisp programs can also use the function -`read-key-sequence', which reads input a key sequence at a time. See -also `momentary-string-display' in *Note Temporary Displays::, and -`sit-for' in *Note Waiting::. *Note Terminal Input::, for functions -and variables for controlling terminal input modes and debugging -terminal input. - - For higher-level input facilities, see *Note Minibuffers::. - -* Menu: - -* Key Sequence Input:: How to read one key sequence. -* Reading One Event:: How to read just one event. -* Dispatching an Event:: What to do with an event once it has been read. -* Quoted Character Input:: Asking the user to specify a character. -* Peeking and Discarding:: How to reread or throw away input events. - - -File: lispref.info, Node: Key Sequence Input, Next: Reading One Event, Up: Reading Input - -Key Sequence Input ------------------- - - Lisp programs can read input a key sequence at a time by calling -`read-key-sequence'; for example, `describe-key' uses it to read the -key to describe. - - - Function: read-key-sequence prompt - This function reads a sequence of keystrokes or mouse clicks and - returns it as a vector of events. 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. - - The vector and the event objects it contains are freshly created, - and will not be side-effected by subsequent calls to this function. - - The function `read-key-sequence' suppresses quitting: `C-g' typed - while reading with this function works like any other character, - and does not set `quit-flag'. *Note Quitting::. - - The argument PROMPT is either a string to be displayed in the echo - area as a prompt, or `nil', meaning not to display a prompt. - - If the user selects a menu item while we are prompting for a key - sequence, the returned value will be a vector of a single - menu-selection event (a misc-user event). An error will be - signalled if you pass this value to `lookup-key' or a related - function. - - In the example below, the prompt `?' is displayed in the echo area, - and the user types `C-x C-f'. - - (read-key-sequence "?") - - ---------- Echo Area ---------- - ?C-x C-f - ---------- Echo Area ---------- - - => [# #] - - If an input character is an upper-case letter and has no key binding, -but its lower-case equivalent has one, then `read-key-sequence' -converts the character to lower case. Note that `lookup-key' does not -perform case conversion in this way. - - -File: lispref.info, Node: Reading One Event, Next: Dispatching an Event, Prev: Key Sequence Input, Up: Reading Input - -Reading One Event ------------------ - - The lowest level functions for command input are those which read a -single event. These functions often make a distinction between -"command events", which are user actions (keystrokes and mouse -actions), and other events, which serve as communication between XEmacs -and the window system. - - - Function: next-event &optional event prompt - This function reads and returns the next available event from the - window system or terminal driver, waiting if necessary until an - event is available. Pass this object to `dispatch-event' to - handle it. If an event object is supplied, it is filled in and - returned; otherwise a new event object will be created. - - Events can come directly from the user, from a keyboard macro, or - from `unread-command-events'. - - In most cases, the function `next-command-event' is more - appropriate. - - - Function: next-command-event &optional event - This function returns the next available "user" event from the - window system or terminal driver. Pass this object to - `dispatch-event' to handle it. If an event object is supplied, it - is filled in and returned, otherwise a new event object will be - created. - - The event returned will be a keyboard, mouse press, or mouse - release event. If there are non-command events available (mouse - motion, sub-process output, etc) then these will be executed (with - `dispatch-event') and discarded. This function is provided as a - convenience; it is equivalent to the Lisp code - - (while (progn - (next-event event) - (not (or (key-press-event-p event) - (button-press-event-p event) - (button-release-event-p event) - (menu-event-p event)))) - (dispatch-event event)) - - Here is what happens if you call `next-command-event' and then - press the right-arrow function key: - - (next-command-event) - => # - - - Function: read-char - This function reads and returns a character of command input. If a - mouse click is detected, an error is signalled. The character - typed is returned as an ASCII value. This function is retained for - compatibility with Emacs 18, and is most likely the wrong thing - for you to be using: consider using `next-command-event' instead. - - - Function: enqueue-eval-event function object - This function adds an eval event to the back of the queue. The - eval event will be the next event read after all pending events. - - -File: lispref.info, Node: Dispatching an Event, Next: Quoted Character Input, Prev: Reading One Event, Up: Reading Input - -Dispatching an Event --------------------- - - - Function: dispatch-event event - Given an event object returned by `next-event', this function - executes it. This is the basic function that makes XEmacs respond - to user input; it also deals with notifications from the window - system (such as Expose events). - - -File: lispref.info, Node: Quoted Character Input, Next: Peeking and Discarding, Prev: Dispatching an Event, Up: Reading Input - -Quoted Character Input ----------------------- - - You can use the function `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 `quoted-insert' uses this function. - - - Function: read-quoted-char &optional prompt - This function is like `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 `C-g'. *Note Quitting::. - - If 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 `-'. - - In the following example, the user types in the octal number 177 - (which is 127 in decimal). - - (read-quoted-char "What character") - - ---------- Echo Area ---------- - What character-177 - ---------- Echo Area ---------- - - => 127 - - -File: lispref.info, Node: Peeking and Discarding, Prev: Quoted Character Input, Up: Reading Input - -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. - - See also the variables `last-command-event' and `last-command-char' -(*Note Command Loop Info::). - - - Variable: unread-command-events - 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. - - 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. - - - - Variable: unread-command-event - This variable holds a single event to be read as command input. - - This variable is mostly obsolete now that you can use - `unread-command-events' instead; it exists only to support programs - written for versions of XEmacs prior to 19.12. - - - Function: input-pending-p - This function determines whether any command input is currently - available to be read. It returns immediately, with value `t' if - there is available input, `nil' otherwise. On rare occasions it - may return `t' when no input is available. - - - Variable: last-input-event - This variable is set to the last keyboard or mouse button event - received. - - This variable is off limits: you may not set its value or modify - the event that is its value, as it is destructively modified by - `read-key-sequence'. If you want to keep a pointer to this value, - you must use `copy-event'. - - Note that this variable is an alias for `last-input-char' in FSF - Emacs. - - In the example below, a character is read (the character `1'). It - becomes the value of `last-input-event', while `C-e' (from the - `C-x C-e' command used to evaluate this expression) remains the - value of `last-command-event'. - - (progn (print (next-command-event)) - (print last-command-event) - last-input-event) - -| # - -| # - => # - - - Variable: last-input-char - If the value of `last-input-event' is a keyboard event, then this - is the nearest ASCII equivalent to it. Remember that there is - _not_ a 1:1 mapping between keyboard events and ASCII characters: - the set of keyboard events is much larger, so writing code that - examines this variable to determine what key has been typed is bad - practice, unless you are certain that it will be one of a small - set of characters. - - This function exists for compatibility with Emacs version 18. - - - Function: discard-input - 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 `nil'. - - In the following example, the user may type a number of characters - right after starting the evaluation of the form. After the - `sleep-for' finishes sleeping, `discard-input' discards any - characters typed during the sleep. - - (progn (sleep-for 2) - (discard-input)) - => nil + when you are sure that it is safe to do so. diff --git a/info/lispref.info-18 b/info/lispref.info-18 index 47f826c..79b603d 100644 --- a/info/lispref.info-18 +++ b/info/lispref.info-18 @@ -50,6 +50,369 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Converting Events, Prev: Working With Events, Up: Events + +Converting Events +----------------- + + XEmacs provides some auxiliary functions for converting between +events and other ways of representing keys. These are useful when +working with ASCII strings and with keymaps. + + - Function: character-to-event key-description &optional event console + use-console-meta-flag + This function converts a keystroke description to an event + structure. KEY-DESCRIPTION is the specification of a key stroke, + and EVENT is the event object to fill in. This function contains + knowledge about what the codes "mean"--for example, the number 9 is + converted to the character , not the distinct character + . + + Note that KEY-DESCRIPTION can be an integer, a character, a symbol + such as `clear' or a list such as `(control backspace)'. + + If optional arg EVENT is non-`nil', it is modified; otherwise, a + new event object is created. In both cases, the event is returned. + + Optional third arg CONSOLE is the console to store in the event, + and defaults to the selected console. + + If KEY-DESCRIPTION is an integer or character, the high bit may be + interpreted as the meta key. (This is done for backward + compatibility in lots of places.) If USE-CONSOLE-META-FLAG is + `nil', this will always be the case. If USE-CONSOLE-META-FLAG is + non-`nil', the `meta' flag for CONSOLE affects whether the high + bit is interpreted as a meta key. (See `set-input-mode'.) If you + don't want this silly meta interpretation done, you should pass in + a list containing the character. + + Beware that `character-to-event' and `event-to-character' are not + strictly inverse functions, since events contain much more + information than the ASCII character set can encode. + + - Function: event-to-character event &optional allow-extra-modifiers + allow-meta allow-non-ascii + This function returns the closest ASCII approximation to EVENT. + If the event isn't a keypress, this returns `nil'. + + If ALLOW-EXTRA-MODIFIERS is non-`nil', then this is lenient in its + translation; it will ignore modifier keys other than and + , and will ignore the modifier on those characters + which have no shifted ASCII equivalent ( for + example, will be mapped to the same ASCII code as ). + + If ALLOW-META is non-`nil', then the modifier will be + represented by turning on the high bit of the byte returned; + otherwise, `nil' will be returned for events containing the + modifier. + + If ALLOW-NON-ASCII is non-`nil', then characters which are present + in the prevailing character set (*note variable + `character-set-property': Keymaps.) will be returned as their code + in that character set, instead of the return value being + restricted to ASCII. + + Note that specifying both ALLOW-META and ALLOW-NON-ASCII is + ambiguous, as both use the high bit; and will be + indistinguishable. + + - Function: events-to-keys events &optional no-mice + Given a vector of event objects, this function returns a vector of + key descriptors, or a string (if they all fit in the ASCII range). + Optional arg NO-MICE means that button events are not allowed. + + +File: lispref.info, Node: Reading Input, Next: Waiting, Prev: Events, Up: Command Loop + +Reading Input +============= + + The editor command loop reads keyboard input using the function +`next-event' and constructs key sequences out of the events using +`dispatch-event'. Lisp programs can also use the function +`read-key-sequence', which reads input a key sequence at a time. See +also `momentary-string-display' in *Note Temporary Displays::, and +`sit-for' in *Note Waiting::. *Note Terminal Input::, for functions +and variables for controlling terminal input modes and debugging +terminal input. + + For higher-level input facilities, see *Note Minibuffers::. + +* Menu: + +* Key Sequence Input:: How to read one key sequence. +* Reading One Event:: How to read just one event. +* Dispatching an Event:: What to do with an event once it has been read. +* Quoted Character Input:: Asking the user to specify a character. +* Peeking and Discarding:: How to reread or throw away input events. + + +File: lispref.info, Node: Key Sequence Input, Next: Reading One Event, Up: Reading Input + +Key Sequence Input +------------------ + + Lisp programs can read input a key sequence at a time by calling +`read-key-sequence'; for example, `describe-key' uses it to read the +key to describe. + + - Function: read-key-sequence prompt &optional continue-echo + dont-downcase-last + This function reads a sequence of keystrokes or mouse clicks and + returns it as a vector of event objects read. 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. + + The vector and the event objects it contains are freshly created + (and so will not be side-effected by subsequent calls to this + function). + + The function `read-key-sequence' suppresses quitting: `C-g' typed + while reading with this function works like any other character, + and does not set `quit-flag'. *Note Quitting::. + + The argument PROMPT is either a string to be displayed in the echo + area as a prompt, or `nil', meaning not to display a prompt. + + Second optional arg CONTINUE-ECHO non-`nil' means this key echoes + as a continuation of the previous key. + + Third optional arg DONT-DOWNCASE-LAST non-`nil' means do not + convert the last event to lower case. (Normally any upper case + event is converted to lower case if the original event is + undefined and the lower case equivalent is defined.) This argument + is provided mostly for FSF compatibility; the equivalent effect + can be achieved more generally by binding + `retry-undefined-key-binding-unshifted' to `nil' around the call + to `read-key-sequence'. + + If the user selects a menu item while we are prompting for a key + sequence, the returned value will be a vector of a single + menu-selection event (a misc-user event). An error will be + signalled if you pass this value to `lookup-key' or a related + function. + + In the example below, the prompt `?' is displayed in the echo area, + and the user types `C-x C-f'. + + (read-key-sequence "?") + + ---------- Echo Area ---------- + ?C-x C-f + ---------- Echo Area ---------- + + => [# #] + + If an input character is an upper-case letter and has no key binding, +but its lower-case equivalent has one, then `read-key-sequence' +converts the character to lower case. Note that `lookup-key' does not +perform case conversion in this way. + + +File: lispref.info, Node: Reading One Event, Next: Dispatching an Event, Prev: Key Sequence Input, Up: Reading Input + +Reading One Event +----------------- + + The lowest level functions for command input are those which read a +single event. These functions often make a distinction between +"command events", which are user actions (keystrokes and mouse +actions), and other events, which serve as communication between XEmacs +and the window system. + + - Function: next-event &optional event prompt + This function reads and returns the next available event from the + window system or terminal driver, waiting if necessary until an + event is available. Pass this object to `dispatch-event' to + handle it. If an event object is supplied, it is filled in and + returned; otherwise a new event object will be created. + + Events can come directly from the user, from a keyboard macro, or + from `unread-command-events'. + + In most cases, the function `next-command-event' is more + appropriate. + + - Function: next-command-event &optional event prompt + This function returns the next available "user" event from the + window system or terminal driver. Pass this object to + `dispatch-event' to handle it. If an event object is supplied, it + is filled in and returned, otherwise a new event object will be + created. + + The event returned will be a keyboard, mouse press, or mouse + release event. If there are non-command events available (mouse + motion, sub-process output, etc) then these will be executed (with + `dispatch-event') and discarded. This function is provided as a + convenience; it is equivalent to the Lisp code + + (while (progn + (next-event event) + (not (or (key-press-event-p event) + (button-press-event-p event) + (button-release-event-p event) + (menu-event-p event)))) + (dispatch-event event)) + + Here is what happens if you call `next-command-event' and then + press the right-arrow function key: + + (next-command-event) + => # + + - Function: read-char + This function reads and returns a character of command input. If a + mouse click is detected, an error is signalled. The character + typed is returned as an ASCII value. This function is retained for + compatibility with Emacs 18, and is most likely the wrong thing + for you to be using: consider using `next-command-event' instead. + + - Function: enqueue-eval-event function object + This function adds an eval event to the back of the queue. The + eval event will be the next event read after all pending events. + + +File: lispref.info, Node: Dispatching an Event, Next: Quoted Character Input, Prev: Reading One Event, Up: Reading Input + +Dispatching an Event +-------------------- + + - Function: dispatch-event event + Given an event object returned by `next-event', this function + executes it. This is the basic function that makes XEmacs respond + to user input; it also deals with notifications from the window + system (such as Expose events). + + +File: lispref.info, Node: Quoted Character Input, Next: Peeking and Discarding, Prev: Dispatching an Event, Up: Reading Input + +Quoted Character Input +---------------------- + + You can use the function `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 `quoted-insert' uses this function. + + - Function: read-quoted-char &optional prompt + This function is like `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 `C-g'. *Note Quitting::. + + If 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 `-'. + + In the following example, the user types in the octal number 177 + (which is 127 in decimal). + + (read-quoted-char "What character") + + ---------- Echo Area ---------- + What character-177 + ---------- Echo Area ---------- + + => 127 + + +File: lispref.info, Node: Peeking and Discarding, Prev: Quoted Character Input, Up: Reading Input + +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. + + See also the variables `last-command-event' and `last-command-char' +(*Note Command Loop Info::). + + - Variable: unread-command-events + 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. + + 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. + + + - Variable: unread-command-event + This variable holds a single event to be read as command input. + + This variable is mostly obsolete now that you can use + `unread-command-events' instead; it exists only to support programs + written for versions of XEmacs prior to 19.12. + + - Function: input-pending-p + This function determines whether any command input is currently + available to be read. It returns immediately, with value `t' if + there is available input, `nil' otherwise. On rare occasions it + may return `t' when no input is available. + + - Variable: last-input-event + This variable is set to the last keyboard or mouse button event + received. + + This variable is off limits: you may not set its value or modify + the event that is its value, as it is destructively modified by + `read-key-sequence'. If you want to keep a pointer to this value, + you must use `copy-event'. + + Note that this variable is an alias for `last-input-char' in FSF + Emacs. + + In the example below, a character is read (the character `1'). It + becomes the value of `last-input-event', while `C-e' (from the + `C-x C-e' command used to evaluate this expression) remains the + value of `last-command-event'. + + (progn (print (next-command-event)) + (print last-command-event) + last-input-event) + -| # + -| # + => # + + - Variable: last-input-char + If the value of `last-input-event' is a keyboard event, then this + is the nearest ASCII equivalent to it. Remember that there is + _not_ a 1:1 mapping between keyboard events and ASCII characters: + the set of keyboard events is much larger, so writing code that + examines this variable to determine what key has been typed is bad + practice, unless you are certain that it will be one of a small + set of characters. + + This function exists for compatibility with Emacs version 18. + + - Function: discard-input + 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 `nil'. + + In the following example, the user may type a number of characters + right after starting the evaluation of the form. After the + `sleep-for' finishes sleeping, `discard-input' discards any + characters typed during the sleep. + + (progn (sleep-for 2) + (discard-input)) + => nil + + File: lispref.info, Node: Waiting, Next: Quitting, Prev: Reading Input, Up: Command Loop Waiting for Elapsed Time or Input @@ -65,7 +428,7 @@ input comes in, while `sleep-for' pauses without updating the screen. two arguments to specify the time (one integer and one float value), instead of a single argument that can be either an integer or a float. - - Function: sit-for seconds &optional nodisp + - Function: sit-for seconds &optional nodisplay This function performs redisplay (provided there is no pending input from the user), then waits SECONDS seconds, or until input is available. The result is `t' if `sit-for' waited the full time @@ -81,9 +444,9 @@ instead of a single argument that can be either an integer or a float. *Note Refresh Screen::.) If there is no input pending, you can force an update with no delay by using `(sit-for 0)'. - If NODISP is non-`nil', then `sit-for' does not redisplay, but it - still returns as soon as input is available (or when the timeout - elapses). + If NODISPLAY is non-`nil', then `sit-for' does not redisplay, but + it still returns as soon as input is available (or when the + timeout elapses). The usual purpose of `sit-for' is to give the user time to read text that you display. @@ -276,9 +639,9 @@ argument, either numeric or raw, in the `interactive' declaration. value of the prefix argument directly in the variable `current-prefix-arg', but this is less clean. - - Function: prefix-numeric-value arg + - Function: prefix-numeric-value raw This function returns the numeric meaning of a valid raw prefix - argument value, ARG. The argument may be a symbol, a number, or a + argument value, RAW. The argument may be a symbol, a number, or a list. If it is `nil', the value 1 is returned; if it is `-', the value -1 is returned; if it is a number, that number is returned; if it is a list, the CAR of that list (which should be a number) is @@ -378,7 +741,7 @@ recursive edit but also provides the other features of the debugger. Recursive editing levels are also used when you type `C-r' in `query-replace' or use `C-x q' (`kbd-macro-query'). - - Function: recursive-edit + - Command: recursive-edit This function invokes the editor command loop. It is called automatically by the initialization of XEmacs, to let the user begin editing. When called from a Lisp program, it enters a @@ -679,7 +1042,7 @@ Creating Keymaps entries in it are `nil', meaning "command undefined". The only difference between this function and `make-keymap' is that this function returns a "smaller" keymap (one that is expected to - contain fewer entries). As keymaps dynamically resize, the + contain fewer entries). As keymaps dynamically resize, this distinction is not great. Optional argument NAME specifies a name to assign to the keymap, @@ -760,408 +1123,3 @@ key bindings. This function returns the default binding of KEYMAP, or `nil' if it has none. - -File: lispref.info, Node: Key Sequences, Next: Prefix Keys, Prev: Inheritance and Keymaps, Up: Keymaps - -Key Sequences -============= - - Contrary to popular belief, the world is not ASCII. When running -under a window manager, XEmacs can tell the difference between, for -example, the keystrokes `control-h', `control-shift-h', and -`backspace'. You can, in fact, bind different commands to each of -these. - - A "key sequence" is a set of keystrokes. A "keystroke" is a keysym -and some set of modifiers (such as and ). A "keysym" -is what is printed on the keys on your keyboard. - - A keysym may be represented by a symbol, or (if and only if it is -equivalent to an ASCII character in the range 32 - 255) by a character -or its equivalent ASCII code. The `A' key may be represented by the -symbol `A', the character `?A', or by the number 65. The `break' key -may be represented only by the symbol `break'. - - A keystroke may be represented by a list: the last element of the -list is the key (a symbol, character, or number, as above) and the -preceding elements are the symbolic names of modifier keys (, -, , , , and ). Thus, the sequence -`control-b' is represented by the forms `(control b)', `(control ?b)', -and `(control 98)'. A keystroke may also be represented by an event -object, as returned by the `next-command-event' and `read-key-sequence' -functions. - - Note that in this context, the keystroke `control-b' is _not_ -represented by the number 2 (the ASCII code for `^B') or the character -`?\^B'. See below. - - The modifier is somewhat of a special case. You should not -(and cannot) use `(meta shift a)' to mean `(meta A)', since for -characters that have ASCII equivalents, the state of the shift key is -implicit in the keysym (`a' vs. `A'). You also cannot say `(shift =)' -to mean `+', as that sort of thing varies from keyboard to keyboard. -The modifier is for use only with characters that do not have a -second keysym on the same key, such as `backspace' and `tab'. - - A key sequence is a vector of keystrokes. As a degenerate case, -elements of this vector may also be keysyms if they have no modifiers. -That is, the `A' keystroke is represented by all of these forms: - - A ?A 65 (A) (?A) (65) - [A] [?A] [65] [(A)] [(?A)] [(65)] - - the `control-a' keystroke is represented by these forms: - - (control A) (control ?A) (control 65) - [(control A)] [(control ?A)] [(control 65)] - - the key sequence `control-c control-a' is represented by these forms: - - [(control c) (control a)] [(control ?c) (control ?a)] - [(control 99) (control 65)] etc. - - Mouse button clicks work just like keypresses: `(control button1)' -means pressing the left mouse button while holding down the control -key. `[(control c) (shift button3)]' means `control-c', hold , -click right. - - Commands may be bound to the mouse-button up-stroke rather than the -down-stroke as well. `button1' means the down-stroke, and `button1up' -means the up-stroke. Different commands may be bound to the up and -down strokes, though that is probably not what you want, so be careful. - - For backward compatibility, a key sequence may also be represented by -a string. In this case, it represents the key sequence(s) that would -produce that sequence of ASCII characters in a purely ASCII world. For -example, a string containing the ASCII backspace character, `"\^H"', -would represent two key sequences: `(control h)' and `backspace'. -Binding a command to this will actually bind both of those key -sequences. Likewise for the following pairs: - - control h backspace - control i tab - control m return - control j linefeed - control [ escape - control @ control space - - After binding a command to two key sequences with a form like - - (define-key global-map "\^X\^I" 'command-1) - -it is possible to redefine only one of those sequences like so: - - (define-key global-map [(control x) (control i)] 'command-2) - (define-key global-map [(control x) tab] 'command-3) - - Of course, all of this applies only when running under a window -system. If you're talking to XEmacs through a TTY connection, you -don't get any of these features. - - - Function: event-matches-key-specifier-p event key-specifier - This function returns non-`nil' if EVENT matches KEY-SPECIFIER, - which can be any valid form representing a key sequence. This can - be useful, e.g., to determine if the user pressed `help-char' or - `quit-char'. - - -File: lispref.info, Node: Prefix Keys, Next: Active Keymaps, Prev: Key Sequences, Up: Keymaps - -Prefix Keys -=========== - - A "prefix key" has an associated keymap that defines what to do with -key sequences that start with the prefix key. For example, `C-x' is a -prefix key, and it uses a keymap that is also stored in the variable -`ctl-x-map'. Here is a list of the standard prefix keys of XEmacs and -their keymaps: - - * `help-map' is used for events that follow `C-h'. - - * `mode-specific-map' is for events that follow `C-c'. This map is - not actually mode specific; its name was chosen to be informative - for the user in `C-h b' (`display-bindings'), where it describes - the main use of the `C-c' prefix key. - - * `ctl-x-map' is the map used for events that follow `C-x'. This - map is also the function definition of `Control-X-prefix'. - - * `ctl-x-4-map' is used for events that follow `C-x 4'. - - * `ctl-x-5-map' is used for events that follow `C-x 5'. - - * The prefix keys `C-x n', `C-x r' and `C-x a' use keymaps that have - no special name. - - * `esc-map' is an evil hack that is present for compatibility - purposes with Emacs 18. Defining a key in `esc-map' is equivalent - to defining the same key in `global-map' but with the - prefix added. You should _not_ use this in your code. (This map is - also the function definition of `ESC-prefix'.) - - 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 `C-x' is -the symbol `Control-X-prefix', whose function definition is the keymap -for `C-x' commands. (The same keymap is also the value of `ctl-x-map'.) - - Prefix key definitions can appear in any active keymap. The -definitions of `C-c', `C-x', `C-h' and 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. *Note -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 `C-p' a prefix key in the local -keymap, in such a way that `C-p' is identical to `C-x'. Then the -binding for `C-p C-f' is the function `find-file', just like `C-x C-f'. -The key sequence `C-p 6' is not found in any active keymap. - - (use-local-map (make-sparse-keymap)) - => nil - (local-set-key "\C-p" ctl-x-map) - => nil - (key-binding "\C-p\C-f") - => find-file - - (key-binding "\C-p6") - => nil - - - Function: define-prefix-command symbol &optional mapvar - This function defines SYMBOL as a prefix command: it creates a - keymap and stores it as SYMBOL's function definition. Storing the - symbol as the binding of a key makes the key a prefix key that has - a name. If optional argument MAPVAR is not specified, it also - sets SYMBOL as a variable, to have the keymap as its value. (If - MAPVAR is given and is not `t', its value is stored as the value - of SYMBOL.) The function returns SYMBOL. - - In Emacs version 18, only the function definition of SYMBOL was - set, not the value as a variable. - - -File: lispref.info, Node: Active Keymaps, Next: Key Lookup, Prev: Prefix Keys, Up: Keymaps - -Active Keymaps -============== - - XEmacs normally contains many keymaps; at any given time, just a few -of them are "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 "global keymap" holds the bindings of keys that are defined -regardless of the current buffer, such as `C-f'. The variable -`global-map' holds this keymap, which is always active. - - Each buffer may have another keymap, its "local keymap", which may -contain new or overriding definitions for keys. The current buffer's -local keymap is always active except when `overriding-local-map' or -`overriding-terminal-local-map' overrides it. Extents and text -properties can specify an alternative local map for certain parts of the -buffer; see *Note Extents and Events::. - - Each minor mode may have a keymap; if it does, the keymap is active -when the minor mode is enabled. - - The variable `overriding-local-map' and -`overriding-terminal-local-map', if non-`nil', specify other local -keymaps that override 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. XEmacs searches these maps one by one, -in order of decreasing precedence, until it finds a binding in one of -the maps. - - More specifically: - - For key-presses, the order of keymaps searched is: - - * the `keymap' property of any extent(s) or text properties at point; - - * any applicable minor-mode maps; - - * the current local map of the current buffer; - - * the current global map. - - For mouse-clicks, the order of keymaps searched is: - - * the current local map of the `mouse-grabbed-buffer' if any; - - * the `keymap' property of any extent(s) at the position of the click - (this includes modeline extents); - - * the `modeline-map' of the buffer corresponding to the modeline - under the mouse (if the click happened over a modeline); - - * the value of `toolbar-map' in the current buffer (if the click - happened over a toolbar); - - * the current local map of the buffer under the mouse (does not - apply to toolbar clicks); - - * any applicable minor-mode maps; - - * the current global map. - - Note that if `overriding-local-map' or -`overriding-terminal-local-map' is non-`nil', _only_ those two maps and -the current global map are searched. - - The procedure for searching a single keymap is called "key lookup"; -see *Note Key Lookup::. - - 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 `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 `lisp-mode-map', -`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. *Note Intro to Minibuffers::. - - *Note Standard Keymaps::, for a list of standard keymaps. - - - Function: current-keymaps &optional event-or-keys - This function returns a list of the current keymaps that will be - searched for bindings. This lists keymaps such as the current - local map and the minor-mode maps, but does not list the parents - of those keymaps. EVENT-OR-KEYS controls which keymaps will be - listed. If EVENT-OR-KEYS is a mouse event (or a vector whose last - element is a mouse event), the keymaps for that mouse event will - be listed. Otherwise, the keymaps for key presses will be listed. - - - Variable: global-map - This variable contains the default global keymap that maps XEmacs - keyboard input to commands. The global keymap is normally this - keymap. The default global keymap is a full keymap that binds - `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. - - - Function: current-global-map - This function returns the current global keymap. This is the same - as the value of `global-map' unless you change one or the other. - - (current-global-map) - => # - - - Function: current-local-map - This function returns the current buffer's local keymap, or `nil' - if it has none. In the following example, the keymap for the - `*scratch*' buffer (using Lisp Interaction mode) has a number of - entries, including one prefix key, `C-x'. - - (current-local-map) - => # - (describe-bindings-internal (current-local-map)) - => ; Inserted into the buffer: - backspace backward-delete-char-untabify - linefeed eval-print-last-sexp - delete delete-char - C-j eval-print-last-sexp - C-x << Prefix Command >> - M-tab lisp-complete-symbol - M-; lisp-indent-for-comment - M-C-i lisp-complete-symbol - M-C-q indent-sexp - M-C-x eval-defun - Alt-backspace backward-kill-sexp - Alt-delete kill-sexp - - C-x x edebug-defun - - - Function: current-minor-mode-maps - This function returns a list of the keymaps of currently enabled - minor modes. - - - Function: use-global-map keymap - This function makes KEYMAP the new current global keymap. It - returns `nil'. - - It is very unusual to change the global keymap. - - - Function: use-local-map keymap &optional buffer - This function makes KEYMAP the new local keymap of BUFFER. BUFFER - defaults to the current buffer. If KEYMAP is `nil', then the - buffer has no local keymap. `use-local-map' returns `nil'. Most - major mode commands use this function. - - - Variable: 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: - - (VARIABLE . KEYMAP) - - The keymap KEYMAP is active whenever VARIABLE has a non-`nil' - value. Typically VARIABLE is the variable that enables or - disables a minor mode. *Note Keymaps and Minor Modes::. - - Note that elements of `minor-mode-map-alist' do not have the same - structure as elements of `minor-mode-alist'. The map must be the - 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 CDR. It does not - work to store a variable in the 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 `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 `minor-mode-key-binding', above. See *Note Keymaps and - Minor Modes::, for more information about minor modes. - - - Variable: modeline-map - This variable holds the keymap consulted for mouse-clicks on the - modeline of a window. This variable may be buffer-local; its - value will be looked up in the buffer of the window whose modeline - was clicked upon. - - - Variable: toolbar-map - This variable holds the keymap consulted for mouse-clicks over a - toolbar. - - - Variable: mouse-grabbed-buffer - If non-`nil', a buffer which should be consulted first for all - mouse activity. When a mouse-click is processed, it will first be - looked up in the local-map of this buffer, and then through the - normal mechanism if there is no binding for that click. This - buffer's value of `mode-motion-hook' will be consulted instead of - the `mode-motion-hook' of the buffer of the window under the mouse. - You should _bind_ this, not set it. - - - Variable: overriding-local-map - If non-`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. - - - Variable: overriding-terminal-local-map - If non-`nil', this variable holds a keymap to use instead of the - buffer's local keymap and instead of all the minor mode keymaps, - but for the selected console only. (In other words, this variable - is always console-local; putting a keymap here only applies to - keystrokes coming from the selected console. *Note Consoles and - Devices::.) This keymap, if any, overrides all other maps that - would have been active, except for the current global map. - diff --git a/info/lispref.info-19 b/info/lispref.info-19 index d2354ad..39a30bf 100644 --- a/info/lispref.info-19 +++ b/info/lispref.info-19 @@ -50,6 +50,413 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Key Sequences, Next: Prefix Keys, Prev: Inheritance and Keymaps, Up: Keymaps + +Key Sequences +============= + + Contrary to popular belief, the world is not ASCII. When running +under a window manager, XEmacs can tell the difference between, for +example, the keystrokes `control-h', `control-shift-h', and +`backspace'. You can, in fact, bind different commands to each of +these. + + A "key sequence" is a set of keystrokes. A "keystroke" is a keysym +and some set of modifiers (such as and ). A "keysym" +is what is printed on the keys on your keyboard. + + A keysym may be represented by a symbol, or (if and only if it is +equivalent to an ASCII character in the range 32 - 255) by a character +or its equivalent ASCII code. The `A' key may be represented by the +symbol `A', the character `?A', or by the number 65. The `break' key +may be represented only by the symbol `break'. + + A keystroke may be represented by a list: the last element of the +list is the key (a symbol, character, or number, as above) and the +preceding elements are the symbolic names of modifier keys (, +, , , , and ). Thus, the sequence +`control-b' is represented by the forms `(control b)', `(control ?b)', +and `(control 98)'. A keystroke may also be represented by an event +object, as returned by the `next-command-event' and `read-key-sequence' +functions. + + Note that in this context, the keystroke `control-b' is _not_ +represented by the number 2 (the ASCII code for `^B') or the character +`?\^B'. See below. + + The modifier is somewhat of a special case. You should not +(and cannot) use `(meta shift a)' to mean `(meta A)', since for +characters that have ASCII equivalents, the state of the shift key is +implicit in the keysym (`a' vs. `A'). You also cannot say `(shift =)' +to mean `+', as that sort of thing varies from keyboard to keyboard. +The modifier is for use only with characters that do not have a +second keysym on the same key, such as `backspace' and `tab'. + + A key sequence is a vector of keystrokes. As a degenerate case, +elements of this vector may also be keysyms if they have no modifiers. +That is, the `A' keystroke is represented by all of these forms: + + A ?A 65 (A) (?A) (65) + [A] [?A] [65] [(A)] [(?A)] [(65)] + + the `control-a' keystroke is represented by these forms: + + (control A) (control ?A) (control 65) + [(control A)] [(control ?A)] [(control 65)] + + the key sequence `control-c control-a' is represented by these forms: + + [(control c) (control a)] [(control ?c) (control ?a)] + [(control 99) (control 65)] etc. + + Mouse button clicks work just like keypresses: `(control button1)' +means pressing the left mouse button while holding down the control +key. `[(control c) (shift button3)]' means `control-c', hold , +click right. + + Commands may be bound to the mouse-button up-stroke rather than the +down-stroke as well. `button1' means the down-stroke, and `button1up' +means the up-stroke. Different commands may be bound to the up and +down strokes, though that is probably not what you want, so be careful. + + For backward compatibility, a key sequence may also be represented by +a string. In this case, it represents the key sequence(s) that would +produce that sequence of ASCII characters in a purely ASCII world. For +example, a string containing the ASCII backspace character, `"\^H"', +would represent two key sequences: `(control h)' and `backspace'. +Binding a command to this will actually bind both of those key +sequences. Likewise for the following pairs: + + control h backspace + control i tab + control m return + control j linefeed + control [ escape + control @ control space + + After binding a command to two key sequences with a form like + + (define-key global-map "\^X\^I" 'command-1) + +it is possible to redefine only one of those sequences like so: + + (define-key global-map [(control x) (control i)] 'command-2) + (define-key global-map [(control x) tab] 'command-3) + + Of course, all of this applies only when running under a window +system. If you're talking to XEmacs through a TTY connection, you +don't get any of these features. + + - Function: event-matches-key-specifier-p event key-specifier + This function returns non-`nil' if EVENT matches KEY-SPECIFIER, + which can be any valid form representing a key sequence. This can + be useful, e.g., to determine if the user pressed `help-char' or + `quit-char'. + + +File: lispref.info, Node: Prefix Keys, Next: Active Keymaps, Prev: Key Sequences, Up: Keymaps + +Prefix Keys +=========== + + A "prefix key" has an associated keymap that defines what to do with +key sequences that start with the prefix key. For example, `C-x' is a +prefix key, and it uses a keymap that is also stored in the variable +`ctl-x-map'. Here is a list of the standard prefix keys of XEmacs and +their keymaps: + + * `help-map' is used for events that follow `C-h'. + + * `mode-specific-map' is for events that follow `C-c'. This map is + not actually mode specific; its name was chosen to be informative + for the user in `C-h b' (`display-bindings'), where it describes + the main use of the `C-c' prefix key. + + * `ctl-x-map' is the map used for events that follow `C-x'. This + map is also the function definition of `Control-X-prefix'. + + * `ctl-x-4-map' is used for events that follow `C-x 4'. + + * `ctl-x-5-map' is used for events that follow `C-x 5'. + + * The prefix keys `C-x n', `C-x r' and `C-x a' use keymaps that have + no special name. + + * `esc-map' is an evil hack that is present for compatibility + purposes with Emacs 18. Defining a key in `esc-map' is equivalent + to defining the same key in `global-map' but with the + prefix added. You should _not_ use this in your code. (This map is + also the function definition of `ESC-prefix'.) + + 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 `C-x' is +the symbol `Control-X-prefix', whose function definition is the keymap +for `C-x' commands. (The same keymap is also the value of `ctl-x-map'.) + + Prefix key definitions can appear in any active keymap. The +definitions of `C-c', `C-x', `C-h' and 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. *Note +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 `C-p' a prefix key in the local +keymap, in such a way that `C-p' is identical to `C-x'. Then the +binding for `C-p C-f' is the function `find-file', just like `C-x C-f'. +The key sequence `C-p 6' is not found in any active keymap. + + (use-local-map (make-sparse-keymap)) + => nil + (local-set-key "\C-p" ctl-x-map) + => nil + (key-binding "\C-p\C-f") + => find-file + + (key-binding "\C-p6") + => nil + + - Function: define-prefix-command symbol &optional mapvar + This function defines SYMBOL as a prefix command: it creates a + keymap and stores it as SYMBOL's function definition. Storing the + symbol as the binding of a key makes the key a prefix key that has + a name. If optional argument MAPVAR is not specified, it also + sets SYMBOL as a variable, to have the keymap as its value. (If + MAPVAR is given and is not `t', its value is stored as the value + of SYMBOL.) The function returns SYMBOL. + + In Emacs version 18, only the function definition of SYMBOL was + set, not the value as a variable. + + +File: lispref.info, Node: Active Keymaps, Next: Key Lookup, Prev: Prefix Keys, Up: Keymaps + +Active Keymaps +============== + + XEmacs normally contains many keymaps; at any given time, just a few +of them are "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 "global keymap" holds the bindings of keys that are defined +regardless of the current buffer, such as `C-f'. The variable +`global-map' holds this keymap, which is always active. + + Each buffer may have another keymap, its "local keymap", which may +contain new or overriding definitions for keys. The current buffer's +local keymap is always active except when `overriding-local-map' or +`overriding-terminal-local-map' overrides it. Extents and text +properties can specify an alternative local map for certain parts of the +buffer; see *Note Extents and Events::. + + Each minor mode may have a keymap; if it does, the keymap is active +when the minor mode is enabled. + + The variable `overriding-local-map' and +`overriding-terminal-local-map', if non-`nil', specify other local +keymaps that override 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. XEmacs searches these maps one by one, +in order of decreasing precedence, until it finds a binding in one of +the maps. + + More specifically: + + For key-presses, the order of keymaps searched is: + + * the `keymap' property of any extent(s) or text properties at point; + + * any applicable minor-mode maps; + + * the current local map of the current buffer; + + * the current global map. + + For mouse-clicks, the order of keymaps searched is: + + * the current local map of the `mouse-grabbed-buffer' if any; + + * the `keymap' property of any extent(s) at the position of the click + (this includes modeline extents); + + * the `modeline-map' of the buffer corresponding to the modeline + under the mouse (if the click happened over a modeline); + + * the value of `toolbar-map' in the current buffer (if the click + happened over a toolbar); + + * the current local map of the buffer under the mouse (does not + apply to toolbar clicks); + + * any applicable minor-mode maps; + + * the current global map. + + Note that if `overriding-local-map' or +`overriding-terminal-local-map' is non-`nil', _only_ those two maps and +the current global map are searched. + + The procedure for searching a single keymap is called "key lookup"; +see *Note Key Lookup::. + + 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 `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 `lisp-mode-map', +`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. *Note Intro to Minibuffers::. + + *Note Standard Keymaps::, for a list of standard keymaps. + + - Function: current-keymaps &optional event-or-keys + This function returns a list of the current keymaps that will be + searched for bindings. This lists keymaps such as the current + local map and the minor-mode maps, but does not list the parents + of those keymaps. EVENT-OR-KEYS controls which keymaps will be + listed. If EVENT-OR-KEYS is a mouse event (or a vector whose last + element is a mouse event), the keymaps for that mouse event will + be listed. Otherwise, the keymaps for key presses will be listed. + + - Variable: global-map + This variable contains the default global keymap that maps XEmacs + keyboard input to commands. The global keymap is normally this + keymap. The default global keymap is a full keymap that binds + `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. + + - Function: current-global-map + This function returns the current global keymap. This is the same + as the value of `global-map' unless you change one or the other. + + (current-global-map) + => # + + - Function: current-local-map &optional buffer + This function returns BUFFER's local keymap, or `nil' if it has + none. BUFFER defaults to the current buffer. + + In the following example, the keymap for the `*scratch*' buffer + (using Lisp Interaction mode) has a number of entries, including + one prefix key, `C-x'. + + (current-local-map) + => # + (describe-bindings-internal (current-local-map)) + => ; Inserted into the buffer: + backspace backward-delete-char-untabify + linefeed eval-print-last-sexp + delete delete-char + C-j eval-print-last-sexp + C-x << Prefix Command >> + M-tab lisp-complete-symbol + M-; lisp-indent-for-comment + M-C-i lisp-complete-symbol + M-C-q indent-sexp + M-C-x eval-defun + Alt-backspace backward-kill-sexp + Alt-delete kill-sexp + + C-x x edebug-defun + + - Function: current-minor-mode-maps + This function returns a list of the keymaps of currently enabled + minor modes. + + - Function: use-global-map keymap + This function makes KEYMAP the new current global keymap. It + returns `nil'. + + It is very unusual to change the global keymap. + + - Function: use-local-map keymap &optional buffer + This function makes KEYMAP the new local keymap of BUFFER. BUFFER + defaults to the current buffer. If KEYMAP is `nil', then the + buffer has no local keymap. `use-local-map' returns `nil'. Most + major mode commands use this function. + + - Variable: 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: + + (VARIABLE . KEYMAP) + + The keymap KEYMAP is active whenever VARIABLE has a non-`nil' + value. Typically VARIABLE is the variable that enables or + disables a minor mode. *Note Keymaps and Minor Modes::. + + Note that elements of `minor-mode-map-alist' do not have the same + structure as elements of `minor-mode-alist'. The map must be the + 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 CDR. It does not + work to store a variable in the 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 `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 `minor-mode-key-binding', above. See *Note Keymaps and + Minor Modes::, for more information about minor modes. + + - Variable: modeline-map + This variable holds the keymap consulted for mouse-clicks on the + modeline of a window. This variable may be buffer-local; its + value will be looked up in the buffer of the window whose modeline + was clicked upon. + + - Variable: toolbar-map + This variable holds the keymap consulted for mouse-clicks over a + toolbar. + + - Variable: mouse-grabbed-buffer + If non-`nil', a buffer which should be consulted first for all + mouse activity. When a mouse-click is processed, it will first be + looked up in the local-map of this buffer, and then through the + normal mechanism if there is no binding for that click. This + buffer's value of `mode-motion-hook' will be consulted instead of + the `mode-motion-hook' of the buffer of the window under the mouse. + You should _bind_ this, not set it. + + - Variable: overriding-local-map + If non-`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. + + - Variable: overriding-terminal-local-map + If non-`nil', this variable holds a keymap to use instead of the + buffer's local keymap and instead of all the minor mode keymaps, + but for the selected console only. (In other words, this variable + is always console-local; putting a keymap here only applies to + keystrokes coming from the selected console. *Note Consoles and + Devices::.) This keymap, if any, overrides all other maps that + would have been active, except for the current global map. + + File: lispref.info, Node: Key Lookup, Next: Functions for Key Lookup, Prev: Active Keymaps, Up: Keymaps Key Lookup @@ -226,15 +633,15 @@ Functions for Key Lookup (key-binding [escape escape escape]) => keyboard-escape-quit - - Function: local-key-binding key &optional accept-defaults - This function returns the binding for KEY in the current local + - Function: local-key-binding keys &optional accept-defaults + This function returns the binding for KEYS in the current local keymap, or `nil' if it is undefined there. The argument ACCEPT-DEFAULTS controls checking for default bindings, as in `lookup-key' (above). - - Function: global-key-binding key &optional accept-defaults - This function returns the binding for command KEY in the current + - Function: global-key-binding keys &optional accept-defaults + This function returns the binding for command KEYS in the current global keymap, or `nil' if it is undefined there. The argument ACCEPT-DEFAULTS controls checking for default @@ -402,10 +809,13 @@ changing an entry in `ctl-x-map', and this has the effect of changing the bindings of both `C-p C-f' and `C-x C-f' in the default global map. - Function: substitute-key-definition olddef newdef keymap &optional - oldmap + oldmap prefix This function replaces OLDDEF with NEWDEF for any keys in KEYMAP that were bound to OLDDEF. In other words, OLDDEF is replaced - with NEWDEF wherever it appears. The function returns `nil'. + with NEWDEF wherever it appears. Prefix keymaps are checked + recursively. + + The function returns `nil'. For example, this redefines `C-x C-f', if you do it in an XEmacs with standard bindings: @@ -414,7 +824,7 @@ the bindings of both `C-p C-f' and `C-x C-f' in the default global map. 'find-file 'find-file-read-only (current-global-map)) If OLDMAP is non-`nil', then its bindings determine which keys to - rebind. The rebindings still happen in NEWMAP, not in OLDMAP. + rebind. The rebindings still happen in KEYMAP, not in OLDMAP. Thus, you can change one map under the control of the bindings in another. For example, @@ -425,6 +835,10 @@ the bindings of both `C-p C-f' and `C-x C-f' in the default global map. puts the special deletion command in `my-map' for whichever keys are globally bound to the standard deletion command. + If argument PREFIX is non-`nil', then only those occurrences of + OLDDEF found in keymaps accessible through the keymap bound to + PREFIX in KEYMAP are redefined. See also `accessible-keymaps'. + - Function: suppress-keymap keymap &optional nodigits This function changes the contents of the full keymap KEYMAP by @@ -614,7 +1028,7 @@ information. 2 entries 0x3f5>)) - Function: map-keymap function keymap &optional sort-first - This function applies FUNCTION to each element of `KEYMAP'. + This function applies FUNCTION to each element of KEYMAP. FUNCTION will be called with two arguments: a key-description list, and the binding. The order in which the elements of the keymap are passed to the function is unspecified. If the function @@ -649,9 +1063,9 @@ information. exactly those keymaps and no others). If KEYMAPS is nil, search in the currently applicable maps for EVENT-OR-KEYS. - If KEYMAP is a keymap, then the maps searched are KEYMAP and the - global keymap. If KEYMAP is a list of keymaps, then the maps - searched are exactly those keymaps, and no others. If KEYMAP is + If KEYMAPS is a keymap, then the maps searched are KEYMAPS and the + global keymap. If KEYMAPS is a list of keymaps, then the maps + searched are exactly those keymaps, and no others. If KEYMAPS is `nil', then the maps used are the current active keymaps for EVENT-OR-KEYS (this is equivalent to specifying `(current-keymaps EVENT-OR-KEYS)' as the argument to KEYMAPS). @@ -685,13 +1099,13 @@ information. `describe-bindings-internal' is used to implement the help command `describe-bindings'. - - Command: describe-bindings prefix mouse-only-p + - Command: describe-bindings &optional prefix mouse-only-p This function creates a listing of all defined keys and their definitions. It writes the listing in a buffer named `*Help*' and displays it in a window. - If PREFIX is non-`nil', it should be a prefix key; then the - listing includes only keys that start with PREFIX. + If optional argument PREFIX is non-`nil', it should be a prefix + key; then the listing includes only keys that start with PREFIX. When several characters with consecutive ASCII codes have the same definition, they are shown together, as `FIRSTCHAR..LASTCHAR'. In @@ -703,8 +1117,9 @@ information. digits, punctuation, etc.); all these characters are bound to `self-insert-command'. - If the second argument (prefix arg, interactively) is non-`nil' - then only the mouse bindings are displayed. + If the second optional argument MOUSE-ONLY-P (prefix arg, + interactively) is non-`nil' then only the mouse bindings are + displayed.  File: lispref.info, Node: Other Keymap Functions, Prev: Scanning Keymaps, Up: Keymaps @@ -740,497 +1155,3 @@ Menus * Menu Accelerators:: Using and controlling menu accelerator keys * Buffers Menu:: The menu that displays the list of buffers. - -File: lispref.info, Node: Menu Format, Next: Menubar Format, Up: Menus - -Format of Menus -=============== - - A menu is described using a "menu description", which is a list of -menu items, keyword-value pairs, strings, and submenus. The menu -description specifies which items are present in the menu, what function -each item invokes, and whether the item is selectable or not. Pop-up -menus are directly described with a menu description, while menubars are -described slightly differently (see below). - - The first element of a menu must be a string, which is the name of -the menu. This is the string that will be displayed in the parent menu -or menubar, if any. This string is not displayed in the menu itself, -except in the case of the top level pop-up menu, where there is no -parent. In this case, the string will be displayed at the top of the -menu if `popup-menu-titles' is non-`nil'. - - Immediately following the first element there may optionally be up -to four keyword-value pairs, as follows: - -`:included FORM' - This can be used to control the visibility of a menu. The form is - evaluated and the menu will be omitted if the result is `nil'. - -`:config SYMBOL' - This is an efficient shorthand for `:included (memq SYMBOL - menubar-configuration)'. See the variable `menubar-configuration'. - -`:filter FUNCTION' - A menu filter is used to sensitize or incrementally create a - submenu only when it is selected by the user and not every time - the menubar is activated. The filter function is passed the list - of menu items in the submenu and must return a list of menu items - to be used for the menu. It is called only when the menu is about - to be displayed, so other menus may already be displayed. Vile - and terrible things will happen if a menu filter function changes - the current buffer, window, or frame. It also should not raise, - lower, or iconify any frames. Basically, the filter function - should have no side-effects. - -`:accelerator KEY' - A menu accelerator is a keystroke which can be pressed while the - menu is visible which will immediately activate the item. KEY - must be a char or the symbol name of a key. *Note Menu - Accelerators::. - - The rest of the menu consists of elements as follows: - - * A "menu item", which is a vector in the following form: - - `[ NAME CALLBACK :KEYWORD VALUE :KEYWORD VALUE ... ]' - - NAME is a string, the name of the menu item; it is the string to - display on the menu. It is filtered through the resource - database, so it is possible for resources to override what string - is actually displayed. - - CALLBACK is a form that will be invoked when the menu item is - selected. If the callback of a menu item is a symbol, then it - must name a command. It will be invoked with - `call-interactively'. If it is a list, then it is evaluated with - `eval'. - - The valid keywords and their meanings are described below. - - Note that for compatibility purposes, the form - - `[ NAME CALLBACK ACTIVE-P ]' - - is also accepted and is equivalent to - - `[ NAME CALLBACK :active ACTIVE-P ]' - - and the form - - `[ NAME CALLBACK ACTIVE-P SUFFIX]' - - is accepted and is equivalent to - - `[ NAME CALLBACK :active ACTIVE-P :suffix SUFFIX]' - - However, these older forms are deprecated and should generally not - be used. - - * If an element of a menu is a string, then that string will be - presented in the menu as unselectable text. - - * If an element of a menu is a string consisting solely of hyphens, - then that item will be presented as a solid horizontal line. - - * If an element of a menu is a string beginning with `--:', then a - particular sort of horizontal line will be displayed, as follows: - - `"--:singleLine"' - A solid horizontal line. This is equivalent to a string - consisting solely of hyphens. - - `"--:doubleLine"' - A solid double horizontal line. - - `"--:singleDashedLine"' - A dashed horizontal line. - - `"--:doubleDashedLine"' - A dashed double horizontal line. - - `"--:noLine"' - No line (but a small space is left). - - `"--:shadowEtchedIn"' - A solid horizontal line with a 3-d recessed appearance. - - `"--:shadowEtchedOut"' - A solid horizontal line with a 3-d pushed-out appearance. - - `"--:shadowDoubleEtchedIn"' - A solid double horizontal line with a 3-d recessed appearance. - - `"--:shadowDoubleEtchedOut"' - A solid double horizontal line with a 3-d pushed-out - appearance. - - `"--:shadowEtchedInDash"' - A dashed horizontal line with a 3-d recessed appearance. - - `"--:shadowEtchedOutDash"' - A dashed horizontal line with a 3-d pushed-out appearance. - - `"--:shadowDoubleEtchedInDash"' - A dashed double horizontal line with a 3-d recessed - appearance. - - `"--:shadowDoubleEtchedOutDash"' - A dashed double horizontal line with a 3-d pushed-out - appearance. - - * If an element of a menu is a list, it is treated as a submenu. - The name of that submenu (the first element in the list) will be - used as the name of the item representing this menu on the parent. - - The possible keywords are as follows: - -:active FORM - FORM will be evaluated when the menu that this item is a part of - is about to be displayed, and the item will be selectable only if - the result is non-`nil'. If the item is unselectable, it will - usually be displayed grayed-out to indicate this. - -:suffix FORM - FORM will be evaluated when the menu that this item is a part of - is about to be displayed, and the resulting string is appended to - the displayed name. This provides a convenient way of adding the - name of a command's "argument" to the menu, like `Kill Buffer - NAME'. - -:keys STRING - Normally, the keyboard equivalents of commands in menus are - displayed when the "callback" is a symbol. This can be used to - specify keys for more complex menu items. It is passed through - `substitute-command-keys' first. - -:style STYLE - Specifies what kind of object this menu item is. STYLE be one of - the symbols - - `nil' - A normal menu item. - - `toggle' - A toggle button. - - `radio' - A radio button. - - `button' - A menubar button. - - The only difference between toggle and radio buttons is how they - are displayed. But for consistency, a toggle button should be - used when there is one option whose value can be turned on or off, - and radio buttons should be used when there is a set of mutually - exclusive options. When using a group of radio buttons, you - should arrange for no more than one to be marked as selected at a - time. - -:selected FORM - Meaningful only when STYLE is `toggle', `radio' or `button'. This - specifies whether the button will be in the selected or unselected - state. FORM is evaluated, as for `:active'. - -:included FORM - This can be used to control the visibility of a menu item. The - form is evaluated and the menu item is only displayed if the - result is non-`nil'. Note that this is different from `:active': - If `:active' evaluates to `nil', the item will be displayed grayed - out, while if `:included' evaluates to `nil', the item will be - omitted entirely. - -:config SYMBOL - This is an efficient shorthand for `:included (memq SYMBOL - menubar-configuration)'. See the variable `menubar-configuration'. - -:accelerator KEY - A menu accelerator is a keystroke which can be pressed while the - menu is visible which will immediately activate the item. KEY - must be a char or the symbol name of a key. *Note Menu - Accelerators::. - - - Variable: menubar-configuration - This variable holds a list of symbols, against which the value of - the `:config' tag for each menubar item will be compared. If a - menubar item has a `:config' tag, then it is omitted from the - menubar if that tag is not a member of the `menubar-configuration' - list. - - For example: - - ("File" - :filter file-menu-filter ; file-menu-filter is a function that takes - ; one argument (a list of menu items) and - ; returns a list of menu items - [ "Save As..." write-file] - [ "Revert Buffer" revert-buffer :active (buffer-modified-p) ] - [ "Read Only" toggle-read-only :style toggle :selected buffer-read-only ] - ) - - -File: lispref.info, Node: Menubar Format, Next: Menubar, Prev: Menu Format, Up: Menus - -Format of the Menubar -===================== - - A menubar is a list of menus, menu items, and strings. The format is -similar to that of a menu, except: - - * The first item need not be a string, and is not treated specially. - - * A string consisting solely of hyphens is not treated specially. - - * If an element of a menubar is `nil', then it is used to represent - the division between the set of menubar items which are flush-left - and those which are flush-right. (Note: this isn't completely - implemented yet.) - - -File: lispref.info, Node: Menubar, Next: Modifying Menus, Prev: Menubar Format, Up: Menus - -Menubar -======= - - - Variable: current-menubar - This variable holds the description of the current menubar. This - may be buffer-local. When the menubar is changed, the function - `set-menubar-dirty-flag' has to be called in order for the menubar - to be updated on the screen. - - - Constant: default-menubar - This variable holds the menubar description of the menubar that is - visible at startup. This is the value that `current-menubar' has - at startup. - - - Function: set-menubar-dirty-flag - This function tells XEmacs that the menubar widget has to be - updated. Changes to the menubar will generally not be visible - until this function is called. - - The following convenience functions are provided for setting the -menubar. They are equivalent to doing the appropriate action to change -`current-menubar', and then calling `set-menubar-dirty-flag'. Note -that these functions copy their argument using `copy-sequence'. - - - Function: set-menubar menubar - This function sets the default menubar to be MENUBAR (*note Menu - Format::). This is the menubar that will be visible in buffers - that have not defined their own, buffer-local menubar. - - - Function: set-buffer-menubar menubar - This function sets the buffer-local menubar to be MENUBAR. This - does not change the menubar in any buffers other than the current - one. - - Miscellaneous: - - - Variable: menubar-show-keybindings - If true, the menubar will display keyboard equivalents. If false, - only the command names will be displayed. - - - Variable: activate-menubar-hook - Function or functions called before a menubar menu is pulled down. - These functions are called with no arguments, and should - interrogate and modify the value of `current-menubar' as desired. - - The functions on this hook are invoked after the mouse goes down, - but before the menu is mapped, and may be used to activate, - deactivate, add, or delete items from the menus. However, using a - filter (with the `:filter' keyword in a menu description) is - generally a more efficient way of accomplishing the same thing, - because the filter is invoked only when the actual menu goes down. - With a complex menu, there can be a quite noticeable and - sometimes aggravating delay if all menu modification is - implemented using the `activate-menubar-hook'. See above. - - These functions may return the symbol `t' to assert that they have - made no changes to the menubar. If any other value is returned, - the menubar is recomputed. If `t' is returned but the menubar has - been changed, then the changes may not show up right away. - Returning `nil' when the menubar has not changed is not so bad; - more computation will be done, but redisplay of the menubar will - still be performed optimally. - - - Variable: menu-no-selection-hook - Function or functions to call when a menu or dialog box is - dismissed without a selection having been made. - - -File: lispref.info, Node: Modifying Menus, Next: Pop-Up Menus, Prev: Menubar, Up: Menus - -Modifying Menus -=============== - - The following functions are provided to modify the menubar of one of -its submenus. Note that these functions modify the menu in-place, -rather than copying it and making a new menu. - - Some of these functions take a "menu path", which is a list of -strings identifying the menu to be modified. For example, `("File")' -names the top-level "File" menu. `("File" "Foo")' names a hypothetical -submenu of "File". - - Others take a "menu item path", which is similar to a menu path but -also specifies a particular item to be modified. For example, `("File" -"Save")' means the menu item called "Save" under the top-level "File" -menu. `("Menu" "Foo" "Item")' means the menu item called "Item" under -the "Foo" submenu of "Menu". - - - Function: add-submenu menu-path submenu &optional before - This function adds a menu to the menubar or one of its submenus. - If the named menu exists already, it is changed. - - MENU-PATH identifies the menu under which the new menu should be - inserted. If MENU-PATH is `nil', then the menu will be added to - the menubar itself. - - SUBMENU is the new menu to add (*note Menu Format::). - - BEFORE, if provided, is the name of a menu before which this menu - should be added, if this menu is not on its parent already. If - the menu is already present, it will not be moved. - - - Function: add-menu-button menu-path menu-leaf &optional before - This function adds a menu item to some menu, creating the menu - first if necessary. If the named item exists already, it is - changed. - - MENU-PATH identifies the menu under which the new menu item should - be inserted. - - MENU-LEAF is a menubar leaf node (*note Menu Format::). - - BEFORE, if provided, is the name of a menu before which this item - should be added, if this item is not on the menu already. If the - item is already present, it will not be moved. - - - Function: delete-menu-item menu-item-path - This function removes the menu item specified by MENU-ITEM-PATH - from the menu hierarchy. - - - Function: enable-menu-item menu-item-path - This function makes the menu item specified by MENU-ITEM-PATH be - selectable. - - - Function: disable-menu-item menu-item-path - This function makes the menu item specified by MENU-ITEM-PATH be - unselectable. - - - Function: relabel-menu-item menu-item-path new-name - This function changes the string of the menu item specified by - MENU-ITEM-PATH. NEW-NAME is the string that the menu item will be - printed as from now on. - - The following function can be used to search for a particular item in -a menubar specification, given a path to the item. - - - Function: find-menu-item menubar menu-item-path &optional parent - This function searches MENUBAR for the item given by - MENU-ITEM-PATH starting from PARENT (`nil' means start at the top - of MENUBAR). This function returns `(ITEM . PARENT)', where - PARENT is the immediate parent of the item found (a menu - description), and ITEM is either a vector, list, or string, - depending on the nature of the menu item. - - This function signals an error if the item is not found. - - The following deprecated functions are also documented, so that -existing code can be understood. You should not use these functions in -new code. - - - Function: add-menu menu-path menu-name menu-items &optional before - This function adds a menu to the menubar or one of its submenus. - If the named menu exists already, it is changed. This is - obsolete; use `add-submenu' instead. - - MENU-PATH identifies the menu under which the new menu should be - inserted. If MENU-PATH is `nil', then the menu will be added to - the menubar itself. - - MENU-NAME is the string naming the menu to be added; MENU-ITEMS is - a list of menu items, strings, and submenus. These two arguments - are the same as the first and following elements of a menu - description (*note Menu Format::). - - BEFORE, if provided, is the name of a menu before which this menu - should be added, if this menu is not on its parent already. If the - menu is already present, it will not be moved. - - - Function: add-menu-item menu-path item-name function enabled-p - &optional before - This function adds a menu item to some menu, creating the menu - first if necessary. If the named item exists already, it is - changed. This is obsolete; use `add-menu-button' instead. - - MENU-PATH identifies the menu under which the new menu item should - be inserted. ITEM-NAME, FUNCTION, and ENABLED-P are the first, - second, and third elements of a menu item vector (*note Menu - Format::). - - BEFORE, if provided, is the name of a menu item before which this - item should be added, if this item is not on the menu already. If - the item is already present, it will not be moved. - - -File: lispref.info, Node: Menu Filters, Next: Menu Accelerators, Prev: Pop-Up Menus, Up: Menus - -Menu Filters -============ - - The following filter functions are provided for use in -`default-menubar'. You may want to use them in your own menubar -description. - - - Function: file-menu-filter menu-items - This function changes the arguments and sensitivity of these File - menu items: - - `Delete Buffer' - Has the name of the current buffer appended to it. - - `Print Buffer' - Has the name of the current buffer appended to it. - - `Pretty-Print Buffer' - Has the name of the current buffer appended to it. - - `Save Buffer' - Has the name of the current buffer appended to it, and is - sensitive only when the current buffer is modified. - - `Revert Buffer' - Has the name of the current buffer appended to it, and is - sensitive only when the current buffer has a file. - - `Delete Frame' - Sensitive only when there is more than one visible frame. - - - Function: edit-menu-filter menu-items - This function changes the arguments and sensitivity of these Edit - menu items: - - `Cut' - Sensitive only when XEmacs owns the primary X Selection (if - `zmacs-regions' is `t', this is equivalent to saying that - there is a region selected). - - `Copy' - Sensitive only when XEmacs owns the primary X Selection. - - `Clear' - Sensitive only when XEmacs owns the primary X Selection. - - `Paste' - Sensitive only when there is an owner for the X Clipboard - Selection. - - `Undo' - Sensitive only when there is undo information. While in the - midst of an undo, this is changed to `Undo More'. - - - Function: buffers-menu-filter menu-items - This function sets up the Buffers menu. *Note Buffers Menu::, for - more information. - diff --git a/info/lispref.info-2 b/info/lispref.info-2 index e2a39c4..9d40b0e 100644 --- a/info/lispref.info-2 +++ b/info/lispref.info-2 @@ -460,7 +460,7 @@ 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. +intentionally. 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 diff --git a/info/lispref.info-20 b/info/lispref.info-20 index 4f618d5..3dbc967 100644 --- a/info/lispref.info-20 +++ b/info/lispref.info-20 @@ -50,15 +50,519 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Menu Format, Next: Menubar Format, Up: Menus + +Format of Menus +=============== + + A menu is described using a "menu description", which is a list of +menu items, keyword-value pairs, strings, and submenus. The menu +description specifies which items are present in the menu, what function +each item invokes, and whether the item is selectable or not. Pop-up +menus are directly described with a menu description, while menubars are +described slightly differently (see below). + + The first element of a menu must be a string, which is the name of +the menu. This is the string that will be displayed in the parent menu +or menubar, if any. This string is not displayed in the menu itself, +except in the case of the top level pop-up menu, where there is no +parent. In this case, the string will be displayed at the top of the +menu if `popup-menu-titles' is non-`nil'. + + Immediately following the first element there may optionally be up +to four keyword-value pairs, as follows: + +`:included FORM' + This can be used to control the visibility of a menu. The form is + evaluated and the menu will be omitted if the result is `nil'. + +`:config SYMBOL' + This is an efficient shorthand for `:included (memq SYMBOL + menubar-configuration)'. See the variable `menubar-configuration'. + +`:filter FUNCTION' + A menu filter is used to sensitize or incrementally create a + submenu only when it is selected by the user and not every time + the menubar is activated. The filter function is passed the list + of menu items in the submenu and must return a list of menu items + to be used for the menu. It is called only when the menu is about + to be displayed, so other menus may already be displayed. Vile + and terrible things will happen if a menu filter function changes + the current buffer, window, or frame. It also should not raise, + lower, or iconify any frames. Basically, the filter function + should have no side-effects. + +`:accelerator KEY' + A menu accelerator is a keystroke which can be pressed while the + menu is visible which will immediately activate the item. KEY + must be a char or the symbol name of a key. *Note Menu + Accelerators::. + + The rest of the menu consists of elements as follows: + + * A "menu item", which is a vector in the following form: + + `[ NAME CALLBACK :KEYWORD VALUE :KEYWORD VALUE ... ]' + + NAME is a string, the name of the menu item; it is the string to + display on the menu. It is filtered through the resource + database, so it is possible for resources to override what string + is actually displayed. + + CALLBACK is a form that will be invoked when the menu item is + selected. If the callback of a menu item is a symbol, then it + must name a command. It will be invoked with + `call-interactively'. If it is a list, then it is evaluated with + `eval'. + + The valid keywords and their meanings are described below. + + Note that for compatibility purposes, the form + + `[ NAME CALLBACK ACTIVE-P ]' + + is also accepted and is equivalent to + + `[ NAME CALLBACK :active ACTIVE-P ]' + + and the form + + `[ NAME CALLBACK ACTIVE-P SUFFIX]' + + is accepted and is equivalent to + + `[ NAME CALLBACK :active ACTIVE-P :suffix SUFFIX]' + + However, these older forms are deprecated and should generally not + be used. + + * If an element of a menu is a string, then that string will be + presented in the menu as unselectable text. + + * If an element of a menu is a string consisting solely of hyphens, + then that item will be presented as a solid horizontal line. + + * If an element of a menu is a string beginning with `--:', then a + particular sort of horizontal line will be displayed, as follows: + + `"--:singleLine"' + A solid horizontal line. This is equivalent to a string + consisting solely of hyphens. + + `"--:doubleLine"' + A solid double horizontal line. + + `"--:singleDashedLine"' + A dashed horizontal line. + + `"--:doubleDashedLine"' + A dashed double horizontal line. + + `"--:noLine"' + No line (but a small space is left). + + `"--:shadowEtchedIn"' + A solid horizontal line with a 3-d recessed appearance. + + `"--:shadowEtchedOut"' + A solid horizontal line with a 3-d pushed-out appearance. + + `"--:shadowDoubleEtchedIn"' + A solid double horizontal line with a 3-d recessed appearance. + + `"--:shadowDoubleEtchedOut"' + A solid double horizontal line with a 3-d pushed-out + appearance. + + `"--:shadowEtchedInDash"' + A dashed horizontal line with a 3-d recessed appearance. + + `"--:shadowEtchedOutDash"' + A dashed horizontal line with a 3-d pushed-out appearance. + + `"--:shadowDoubleEtchedInDash"' + A dashed double horizontal line with a 3-d recessed + appearance. + + `"--:shadowDoubleEtchedOutDash"' + A dashed double horizontal line with a 3-d pushed-out + appearance. + + * If an element of a menu is a list, it is treated as a submenu. + The name of that submenu (the first element in the list) will be + used as the name of the item representing this menu on the parent. + + The possible keywords are as follows: + +:active FORM + FORM will be evaluated when the menu that this item is a part of + is about to be displayed, and the item will be selectable only if + the result is non-`nil'. If the item is unselectable, it will + usually be displayed grayed-out to indicate this. + +:suffix FORM + FORM will be evaluated when the menu that this item is a part of + is about to be displayed, and the resulting string is appended to + the displayed name. This provides a convenient way of adding the + name of a command's "argument" to the menu, like `Kill Buffer + NAME'. + +:keys STRING + Normally, the keyboard equivalents of commands in menus are + displayed when the "callback" is a symbol. This can be used to + specify keys for more complex menu items. It is passed through + `substitute-command-keys' first. + +:style STYLE + Specifies what kind of object this menu item is. STYLE be one of + the symbols + + `nil' + A normal menu item. + + `toggle' + A toggle button. + + `radio' + A radio button. + + `button' + A menubar button. + + The only difference between toggle and radio buttons is how they + are displayed. But for consistency, a toggle button should be + used when there is one option whose value can be turned on or off, + and radio buttons should be used when there is a set of mutually + exclusive options. When using a group of radio buttons, you + should arrange for no more than one to be marked as selected at a + time. + +:selected FORM + Meaningful only when STYLE is `toggle', `radio' or `button'. This + specifies whether the button will be in the selected or unselected + state. FORM is evaluated, as for `:active'. + +:included FORM + This can be used to control the visibility of a menu item. The + form is evaluated and the menu item is only displayed if the + result is non-`nil'. Note that this is different from `:active': + If `:active' evaluates to `nil', the item will be displayed grayed + out, while if `:included' evaluates to `nil', the item will be + omitted entirely. + +:config SYMBOL + This is an efficient shorthand for `:included (memq SYMBOL + menubar-configuration)'. See the variable `menubar-configuration'. + +:accelerator KEY + A menu accelerator is a keystroke which can be pressed while the + menu is visible which will immediately activate the item. KEY + must be a char or the symbol name of a key. *Note Menu + Accelerators::. + + - Variable: menubar-configuration + This variable holds a list of symbols, against which the value of + the `:config' tag for each menubar item will be compared. If a + menubar item has a `:config' tag, then it is omitted from the + menubar if that tag is not a member of the `menubar-configuration' + list. + + For example: + + ("File" + :filter file-menu-filter ; file-menu-filter is a function that takes + ; one argument (a list of menu items) and + ; returns a list of menu items + [ "Save As..." write-file] + [ "Revert Buffer" revert-buffer :active (buffer-modified-p) ] + [ "Read Only" toggle-read-only :style toggle :selected buffer-read-only ] + ) + + +File: lispref.info, Node: Menubar Format, Next: Menubar, Prev: Menu Format, Up: Menus + +Format of the Menubar +===================== + + A menubar is a list of menus, menu items, and strings. The format is +similar to that of a menu, except: + + * The first item need not be a string, and is not treated specially. + + * A string consisting solely of hyphens is not treated specially. + + * If an element of a menubar is `nil', then it is used to represent + the division between the set of menubar items which are flush-left + and those which are flush-right. (Note: this isn't completely + implemented yet.) + + +File: lispref.info, Node: Menubar, Next: Modifying Menus, Prev: Menubar Format, Up: Menus + +Menubar +======= + + - Variable: current-menubar + This variable holds the description of the current menubar. This + may be buffer-local. When the menubar is changed, the function + `set-menubar-dirty-flag' has to be called in order for the menubar + to be updated on the screen. + + - Constant: default-menubar + This variable holds the menubar description of the menubar that is + visible at startup. This is the value that `current-menubar' has + at startup. + + - Function: set-menubar-dirty-flag + This function tells XEmacs that the menubar widget has to be + updated. Changes to the menubar will generally not be visible + until this function is called. + + The following convenience functions are provided for setting the +menubar. They are equivalent to doing the appropriate action to change +`current-menubar', and then calling `set-menubar-dirty-flag'. Note +that these functions copy their argument using `copy-sequence'. + + - Function: set-menubar menubar + This function sets the default menubar to be MENUBAR (*note Menu + Format::). This is the menubar that will be visible in buffers + that have not defined their own, buffer-local menubar. + + - Function: set-buffer-menubar menubar + This function sets the buffer-local menubar to be MENUBAR. This + does not change the menubar in any buffers other than the current + one. + + Miscellaneous: + + - Variable: menubar-show-keybindings + If true, the menubar will display keyboard equivalents. If false, + only the command names will be displayed. + + - Variable: activate-menubar-hook + Function or functions called before a menubar menu is pulled down. + These functions are called with no arguments, and should + interrogate and modify the value of `current-menubar' as desired. + + The functions on this hook are invoked after the mouse goes down, + but before the menu is mapped, and may be used to activate, + deactivate, add, or delete items from the menus. However, using a + filter (with the `:filter' keyword in a menu description) is + generally a more efficient way of accomplishing the same thing, + because the filter is invoked only when the actual menu goes down. + With a complex menu, there can be a quite noticeable and + sometimes aggravating delay if all menu modification is + implemented using the `activate-menubar-hook'. See above. + + These functions may return the symbol `t' to assert that they have + made no changes to the menubar. If any other value is returned, + the menubar is recomputed. If `t' is returned but the menubar has + been changed, then the changes may not show up right away. + Returning `nil' when the menubar has not changed is not so bad; + more computation will be done, but redisplay of the menubar will + still be performed optimally. + + - Variable: menu-no-selection-hook + Function or functions to call when a menu or dialog box is + dismissed without a selection having been made. + + +File: lispref.info, Node: Modifying Menus, Next: Pop-Up Menus, Prev: Menubar, Up: Menus + +Modifying Menus +=============== + + The following functions are provided to modify the menubar of one of +its submenus. Note that these functions modify the menu in-place, +rather than copying it and making a new menu. + + Some of these functions take a "menu path", which is a list of +strings identifying the menu to be modified. For example, `("File")' +names the top-level "File" menu. `("File" "Foo")' names a hypothetical +submenu of "File". + + Others take a "menu item path", which is similar to a menu path but +also specifies a particular item to be modified. For example, `("File" +"Save")' means the menu item called "Save" under the top-level "File" +menu. `("Menu" "Foo" "Item")' means the menu item called "Item" under +the "Foo" submenu of "Menu". + + - Function: add-submenu menu-path submenu &optional before in-menu + This function adds a menu to the menubar or one of its submenus. + If the named menu exists already, it is changed. + + MENU-PATH identifies the menu under which the new menu should be + inserted. If MENU-PATH is `nil', then the menu will be added to + the menubar itself. + + SUBMENU is the new menu to add (*note Menu Format::). + + BEFORE, if provided, is the name of a menu before which this menu + should be added, if this menu is not on its parent already. If + the menu is already present, it will not be moved. + + If IN-MENU is present use that instead of `current-menubar' as the + menu to change. + + - Function: add-menu-button menu-path menu-leaf &optional before + in-menu + This function adds a menu item to some menu, creating the menu + first if necessary. If the named item exists already, it is + changed. + + MENU-PATH identifies the menu under which the new menu item should + be inserted. + + MENU-LEAF is a menubar leaf node (*note Menu Format::). + + BEFORE, if provided, is the name of a menu before which this item + should be added, if this item is not on the menu already. If the + item is already present, it will not be moved. + + If IN-MENU is present use that instead of `current-menubar' as the + menu to change. + + - Function: delete-menu-item menu-item-path &optional from-menu + This function removes the menu item specified by MENU-ITEM-PATH + from the menu hierarchy. + + If FROM-MENU is present use that instead of `current-menubar' as + the menu to change. + + - Function: enable-menu-item menu-item-path + This function makes the menu item specified by MENU-ITEM-PATH be + selectable. + + - Function: disable-menu-item menu-item-path + This function makes the menu item specified by MENU-ITEM-PATH be + unselectable. + + - Function: relabel-menu-item menu-item-path new-name + This function changes the string of the menu item specified by + MENU-ITEM-PATH. NEW-NAME is the string that the menu item will be + printed as from now on. + + The following function can be used to search for a particular item in +a menubar specification, given a path to the item. + + - Function: find-menu-item menubar menu-item-path &optional parent + This function searches MENUBAR for the item given by + MENU-ITEM-PATH starting from PARENT (`nil' means start at the top + of MENUBAR). This function returns `(ITEM . PARENT)', where + PARENT is the immediate parent of the item found (a menu + description), and ITEM is either a vector, list, or string, + depending on the nature of the menu item. + + This function signals an error if the item is not found. + + The following deprecated functions are also documented, so that +existing code can be understood. You should not use these functions in +new code. + + - Function: add-menu menu-path menu-name menu-items &optional before + This function adds a menu to the menubar or one of its submenus. + If the named menu exists already, it is changed. This is + obsolete; use `add-submenu' instead. + + MENU-PATH identifies the menu under which the new menu should be + inserted. If MENU-PATH is `nil', then the menu will be added to + the menubar itself. + + MENU-NAME is the string naming the menu to be added; MENU-ITEMS is + a list of menu items, strings, and submenus. These two arguments + are the same as the first and following elements of a menu + description (*note Menu Format::). + + BEFORE, if provided, is the name of a menu before which this menu + should be added, if this menu is not on its parent already. If the + menu is already present, it will not be moved. + + - Function: add-menu-item menu-path item-name function enabled-p + &optional before + This function adds a menu item to some menu, creating the menu + first if necessary. If the named item exists already, it is + changed. This is obsolete; use `add-menu-button' instead. + + MENU-PATH identifies the menu under which the new menu item should + be inserted. ITEM-NAME, FUNCTION, and ENABLED-P are the first, + second, and third elements of a menu item vector (*note Menu + Format::). + + BEFORE, if provided, is the name of a menu item before which this + item should be added, if this item is not on the menu already. If + the item is already present, it will not be moved. + + +File: lispref.info, Node: Menu Filters, Next: Menu Accelerators, Prev: Pop-Up Menus, Up: Menus + +Menu Filters +============ + + The following filter functions are provided for use in +`default-menubar'. You may want to use them in your own menubar +description. + + - Function: file-menu-filter menu-items + This function changes the arguments and sensitivity of these File + menu items: + + `Delete Buffer' + Has the name of the current buffer appended to it. + + `Print Buffer' + Has the name of the current buffer appended to it. + + `Pretty-Print Buffer' + Has the name of the current buffer appended to it. + + `Save Buffer' + Has the name of the current buffer appended to it, and is + sensitive only when the current buffer is modified. + + `Revert Buffer' + Has the name of the current buffer appended to it, and is + sensitive only when the current buffer has a file. + + `Delete Frame' + Sensitive only when there is more than one visible frame. + + - Function: edit-menu-filter menu-items + This function changes the arguments and sensitivity of these Edit + menu items: + + `Cut' + Sensitive only when XEmacs owns the primary X Selection (if + `zmacs-regions' is `t', this is equivalent to saying that + there is a region selected). + + `Copy' + Sensitive only when XEmacs owns the primary X Selection. + + `Clear' + Sensitive only when XEmacs owns the primary X Selection. + + `Paste' + Sensitive only when there is an owner for the X Clipboard + Selection. + + `Undo' + Sensitive only when there is undo information. While in the + midst of an undo, this is changed to `Undo More'. + + - Function: buffers-menu-filter menu-items + This function sets up the Buffers menu. *Note Buffers Menu::, for + more information. + + File: lispref.info, Node: Pop-Up Menus, Next: Menu Filters, Prev: Modifying Menus, Up: Menus Pop-Up Menus ============ - - Function: popup-menu menu-desc - This function pops up a menu specified by MENU-DESC, which is a - menu description (*note Menu Format::). The menu is displayed at - the current mouse position. + - Function: popup-menu menu-description &optional event + This function pops up a menu specified by MENU-DESCRIPTION, which + is a menu description (*note Menu Format::). The menu is + displayed at the current mouse position. - Function: popup-menu-up-p This function returns `t' if a pop-up menu is up, `nil' otherwise. @@ -100,13 +604,14 @@ the binding for button3. The following convenience functions are provided for displaying pop-up menus. - - Function: popup-buffer-menu event + - Command: popup-buffer-menu event This function pops up a copy of the `Buffers' menu (from the - menubar) where the mouse is clicked. + menubar) where the mouse is clicked. It should be bound to a + mouse button event. - - Function: popup-menubar-menu event + - Command: popup-menubar-menu event This function pops up a copy of menu that also appears in the - menubar. + menubar. It should be bound to a mouse button event.  File: lispref.info, Node: Menu Accelerators, Next: Buffers Menu, Prev: Menu Filters, Up: Menus @@ -180,7 +685,7 @@ File: lispref.info, Node: Menu Accelerator Functions, Prev: Keyboard Menu Trav Menu Accelerator Functions -------------------------- - - Function: accelerate-menu + - Command: accelerate-menu Make the menubar immediately active and place the cursor on the left most entry in the top level menu. Menu items can be selected as usual. @@ -593,7 +1098,7 @@ this position. Specifier for the toolbar at the right edge of the frame. - Function: toolbar-specifier-p object - This function returns non-nil if OBJECT is a toolbar specifier. + This function returns non-`nil' if OBJECT is a toolbar specifier. Toolbar specifiers are the actual objects contained in the toolbar variables described above, and their valid instantiators are toolbar descriptors (*note Toolbar Descriptor Format::). @@ -680,8 +1185,8 @@ thickness or visibility that is used in frame geometry calculations. the left toolbar width for that frame to 68 pixels, then the frame will be sized to fit 80 characters plus a 68-pixel left toolbar. If you then set the left toolbar width to 0 for a particular buffer (or if that -buffer does not specify a left toolbar or has a nil value specified for -`left-toolbar-visible-p'), you will find that, when that buffer is +buffer does not specify a left toolbar or has a `nil' value specified +for `left-toolbar-visible-p'), you will find that, when that buffer is displayed in the selected window, the window will have a width of 86 or 87 characters--the frame is sized for a 68-pixel left toolbar but the selected window specifies that the left toolbar is not visible, so it is @@ -717,494 +1222,3 @@ contain arbitrary text or graphics. * Other Gutter Variables:: Controlling the size of gutters. * Common Gutter Widgets:: Things to put in gutters. - -File: lispref.info, Node: Gutter Intro, Next: Creating Gutter, Prev: Gutter, Up: Gutter - -Gutter Intro -============ - - A "gutter" is a rectangle displayed along one edge of a frame. It -can contain arbitrary text or graphics. It could be considered a -generalization of a toolbar, although toolbars are not currently -implemented using gutters. - - In XEmacs, a gutter can be displayed along any of the four edges of -the frame, and two or more different edges can be displaying gutters -simultaneously. The contents, thickness, and visibility of the gutters -can be controlled separately, and the values can be per-buffer, -per-frame, etc., using specifiers (*note Specifiers::). - - Normally, there is one gutter displayed in a frame. Usually, this is -the default gutter, containing buffer tabs, but modes cab override this -and substitute their own gutter. This default gutter is usually -positioned along the top of the frame, but this can be changed using -`set-default-gutter-position'. - - Note that, for each of the gutter properties (contents, thickness, -and visibility), there is a separate specifier for each of the four -gutter positions (top, bottom, left, and right), and an additional -specifier for the "default" gutter, i.e. the gutter whose position is -controlled by `set-default-gutter-position'. The way this works is -that `set-default-gutter-position' arranges things so that the -appropriate position-specific specifiers for the default position -inherit from the corresponding default specifiers. That way, if the -position-specific specifier does not give a value (which it usually -doesn't), then the value from the default specifier applies. If you -want to control the default gutter, you just change the default -specifiers, and everything works. A package such as VM that wants to -put its own gutter in a different location from the default just sets -the position-specific specifiers, and if the user sets the default -gutter to the same position, it will just not be visible. - - -File: lispref.info, Node: Creating Gutter, Next: Gutter Descriptor Format, Prev: Gutter Intro, Up: Gutter - -Creating Gutter -=============== - - - Function: make-gutter-specifier spec-list - Return a new `gutter' specifier object with the given specification - list. SPEC-LIST can be a list of specifications (each of which is - a cons of a locale and a list of instantiators), a single - instantiator, or a list of instantiators. *Note Specifiers::, for - more information about specifiers. - - Gutter specifiers are used to specify the format of a gutter. The - values of the variables `default-gutter', `top-gutter', - `left-gutter', `right-gutter', and `bottom-gutter' are always - gutter specifiers. - - Valid gutter instantiators are called "gutter descriptors" and are - either strings or property-lists of strings. See `default-gutter' - for a description of the exact format. - - - Function: make-gutter-size-specifier spec-list - Return a new `gutter-size' specifier object with the given spec - list. SPEC-LIST can be a list of specifications (each of which is - a cons of a locale and a list of instantiators), a single - instantiator, or a list of instantiators. *Note Specifiers::, for - more information about specifiers. - - Gutter-size specifiers are used to specify the size of a gutter. - The values of the variables `default-gutter-size', - `top-gutter-size', `left-gutter-size', `right-gutter-size', and - `bottom-gutter-size' are always gutter-size specifiers. - - Valid gutter-size instantiators are either integers or the special - symbol `autodetect'. If a gutter-size is set to `autodetect' them - the size of the gutter will be adjusted to just accommodate the - gutters contents. `autodetect' only works for top and bottom - gutters. - - - Function: make-gutter-visible-specifier spec-list - Return a new `gutter-visible' specifier object with the given spec - list. SPEC-LIST can be a list of specifications (each of which is - a cons of a locale and a list of instantiators), a single - instantiator, or a list of instantiators. *Note Specifiers::, for - more information about specifiers. - - Gutter-visible specifiers are used to specify the visibility of a - gutter. The values of the variables `default-gutter-visible-p', - `top-gutter-visible-p', `left-gutter-visible-p', - `right-gutter-visible-p', and `bottom-gutter-visible-p' are always - gutter-visible specifiers. - - Valid gutter-visible instantiators are t, nil or a list of - symbols. If a gutter-visible instantiator is set to a list of - symbols, and the corresponding gutter specification is a - property-list strings, then elements of the gutter specification - will only be visible if the corresponding symbol occurs in the - gutter-visible instantiator. - - -File: lispref.info, Node: Gutter Descriptor Format, Next: Specifying a Gutter, Prev: Creating Gutter, Up: Gutter - -Gutter Descriptor Format -======================== - - The contents of a gutter are specified using a "gutter descriptor". -The format of a gutter descriptor is a list of "gutter button -descriptors". Each gutter button descriptor is a vector in one of the -following formats: - - * `[GLYPH-LIST FUNCTION ENABLED-P HELP]' - - * `[:style 2D-OR-3D]' - - * `[:style 2D-OR-3D :size WIDTH-OR-HEIGHT]' - - * `[:size WIDTH-OR-HEIGHT :style 2D-OR-3D]' - - Optionally, one of the gutter button descriptors may be `nil' -instead of a vector; this signifies the division between the gutter -buttons that are to be displayed flush-left, and the buttons to be -displayed flush-right. - - The first vector format above specifies a normal gutter button; the -others specify blank areas in the gutter. - - For the first vector format: - - * GLYPH-LIST should be a list of one to six glyphs (as created by - `make-glyph') or a symbol whose value is such a list. The first - glyph, which must be provided, is the glyph used to display the - gutter button when it is in the "up" (not pressed) state. The - optional second glyph is for displaying the button when it is in - the "down" (pressed) state. The optional third glyph is for when - the button is disabled. The last three glyphs are for displaying - the button in the "up", "down", and "disabled" states, - respectively, but are used when the user has called for captioned - gutter buttons (using `gutter-buttons-captioned-p'). The function - `gutter-make-button-list' is useful in creating these glyph lists. - - * Even if you do not provide separate down-state and disabled-state - glyphs, the user will still get visual feedback to indicate which - state the button is in. Buttons in the up-state are displayed - with a shadowed border that gives a raised appearance to the - button. Buttons in the down-state are displayed with shadows that - give a recessed appearance. Buttons in the disabled state are - displayed with no shadows, giving a 2-d effect. - - * If some of the gutter glyphs are not provided, they inherit as - follows: - - UP: up - DOWN: down -> up - DISABLED: disabled -> up - CAP-UP: cap-up -> up - CAP-DOWN: cap-down -> cap-up -> down -> up - CAP-DISABLED: cap-disabled -> cap-up -> disabled -> up - - * The second element FUNCTION is a function to be called when the - gutter button is activated (i.e. when the mouse is released over - the gutter button, if the press occurred in the gutter). It can - be any form accepted by `call-interactively', since this is how it - is invoked. - - * The third element ENABLED-P specifies whether the gutter button is - enabled (disabled buttons do nothing when they are activated, and - are displayed differently; see above). It should be either a - boolean or a form that evaluates to a boolean. - - * The fourth element HELP, if non-`nil', should be a string. This - string is displayed in the echo area when the mouse passes over the - gutter button. - - For the other vector formats (specifying blank areas of the gutter): - - * 2D-OR-3D should be one of the symbols `2d' or `3d', indicating - whether the area is displayed with shadows (giving it a raised, - 3-d appearance) or without shadows (giving it a flat appearance). - - * WIDTH-OR-HEIGHT specifies the length, in pixels, of the blank - area. If omitted, it defaults to a device-specific value (8 - pixels for X devices). - - - Function: gutter-make-button-list up &optional down disabled cap-up - cap-down cap-disabled - This function calls `make-glyph' on each arg and returns a list of - the results. This is useful for setting the first argument of a - gutter button descriptor (typically, the result of this function - is assigned to a symbol, which is specified as the first argument - of the gutter button descriptor). - - - Function: check-gutter-button-syntax button &optional noerror - Verify the syntax of entry BUTTON in a gutter description list. - If you want to verify the syntax of a gutter description list as a - whole, use `check-valid-instantiator' with a specifier type of - `gutter'. - - -File: lispref.info, Node: Specifying a Gutter, Next: Other Gutter Variables, Prev: Gutter Descriptor Format, Up: Gutter - -Specifying a Gutter -=================== - - In order to specify the contents of a gutter, set one of the -specifier variables `default-gutter', `top-gutter', `bottom-gutter', -`left-gutter', or `right-gutter'. These are specifiers, which means -you set them with `set-specifier' and query them with `specifier-specs' -or `specifier-instance'. You will get an error if you try to set them -using `setq'. The valid instantiators for these specifiers are gutter -descriptors, as described above. *Note Specifiers::, for more -information. - - Most of the time, you will set `default-gutter', which allows the -user to choose where the gutter should go. - - - Specifier: default-gutter - The position of this gutter is specified in the function - `default-gutter-position'. If the corresponding position-specific - gutter (e.g. `top-gutter' if `default-gutter-position' is `top') - does not specify a gutter in a particular domain, then the value - of `default-gutter' in that domain, of any, will be used instead. - - Note that the gutter at any particular position will not be displayed -unless its thickness (width or height, depending on orientation) is -non-zero and its visibility status is true. The thickness is controlled -by the specifiers `top-gutter-height', `bottom-gutter-height', -`left-gutter-width', and `right-gutter-width', and the visibility -status is controlled by the specifiers `top-gutter-visible-p', -`bottom-gutter-visible-p', `left-gutter-visible-p', and -`right-gutter-visible-p' (*note Other Gutter Variables::). - - - Function: set-default-gutter-position position - This function sets the position that the `default-gutter' will be - displayed at. Valid positions are the symbols `top', `bottom', - `left' and `right'. What this actually does is set the fallback - specifier for the position-specific specifier corresponding to the - given position to `default-gutter', and set the fallbacks for the - other position-specific specifiers to `nil'. It also does the - same thing for the position-specific thickness and visibility - specifiers, which inherit from one of `default-gutter-height' or - `default-gutter-width', and from `default-gutter-visible-p', - respectively (*note Other Gutter Variables::). - - - Function: default-gutter-position - This function returns the position that the `default-gutter' will - be displayed at. - - You can also explicitly set a gutter at a particular position. When -redisplay determines what to display at a particular position in a -particular domain (i.e. window), it first consults the position-specific -gutter. If that does not yield a gutter descriptor, the -`default-gutter' is consulted if `default-gutter-position' indicates -this position. - - - Specifier: top-gutter - Specifier for the gutter at the top of the frame. - - - Specifier: bottom-gutter - Specifier for the gutter at the bottom of the frame. - - - Specifier: left-gutter - Specifier for the gutter at the left edge of the frame. - - - Specifier: right-gutter - Specifier for the gutter at the right edge of the frame. - - - Function: gutter-specifier-p object - This function returns non-nil if OBJECT is a gutter specifier. - Gutter specifiers are the actual objects contained in the gutter - variables described above, and their valid instantiators are - gutter descriptors (*note Gutter Descriptor Format::). - - -File: lispref.info, Node: Other Gutter Variables, Next: Common Gutter Widgets, Prev: Specifying a Gutter, Up: Gutter - -Other Gutter Variables -====================== - - The variables to control the gutter thickness, visibility status, and -captioned status are all specifiers. *Note Specifiers::. - - - Specifier: default-gutter-height - This specifies the height of the default gutter, if it's oriented - horizontally. The position of the default gutter is specified by - the function `set-default-gutter-position'. If the corresponding - position-specific gutter thickness specifier (e.g. - `top-gutter-height' if `default-gutter-position' is `top') does - not specify a thickness in a particular domain (a window or a - frame), then the value of `default-gutter-height' or - `default-gutter-width' (depending on the gutter orientation) in - that domain, if any, will be used instead. - - - Specifier: default-gutter-width - This specifies the width of the default gutter, if it's oriented - vertically. This behaves like `default-gutter-height'. - - Note that `default-gutter-height' is only used when -`default-gutter-position' is `top' or `bottom', and -`default-gutter-width' is only used when `default-gutter-position' is -`left' or `right'. - - - Specifier: top-gutter-height - This specifies the height of the top gutter. - - - Specifier: bottom-gutter-height - This specifies the height of the bottom gutter. - - - Specifier: left-gutter-width - This specifies the width of the left gutter. - - - Specifier: right-gutter-width - This specifies the width of the right gutter. - - Note that all of the position-specific gutter thickness specifiers -have a fallback value of zero when they do not correspond to the -default gutter. Therefore, you will have to set a non-zero thickness -value if you want a position-specific gutter to be displayed. - - - Specifier: default-gutter-visible-p - This specifies whether the default gutter is visible. The - position of the default gutter is specified by the function - `set-default-gutter-position'. If the corresponding - position-specific gutter visibility specifier (e.g. - `top-gutter-visible-p' if `default-gutter-position' is `top') does - not specify a visible-p value in a particular domain (a window or - a frame), then the value of `default-gutter-visible-p' in that - domain, if any, will be used instead. - - - Specifier: top-gutter-visible-p - This specifies whether the top gutter is visible. - - - Specifier: bottom-gutter-visible-p - This specifies whether the bottom gutter is visible. - - - Specifier: left-gutter-visible-p - This specifies whether the left gutter is visible. - - - Specifier: right-gutter-visible-p - This specifies whether the right gutter is visible. - - `default-gutter-visible-p' and all of the position-specific gutter -visibility specifiers have a fallback value of true. - - Internally, gutter thickness and visibility specifiers are -instantiated in both window and frame domains, for different purposes. -The value in the domain of a frame's selected window specifies the -actual gutter thickness or visibility that you will see in that frame. -The value in the domain of a frame itself specifies the gutter -thickness or visibility that is used in frame geometry calculations. - - Thus, for example, if you set the frame width to 80 characters and -the left gutter width for that frame to 68 pixels, then the frame will -be sized to fit 80 characters plus a 68-pixel left gutter. If you then -set the left gutter width to 0 for a particular buffer (or if that -buffer does not specify a left gutter or has a nil value specified for -`left-gutter-visible-p'), you will find that, when that buffer is -displayed in the selected window, the window will have a width of 86 or -87 characters - the frame is sized for a 68-pixel left gutter but the -selected window specifies that the left gutter is not visible, so it is -expanded to take up the slack. - - - Specifier: gutter-buttons-captioned-p - Whether gutter buttons are captioned. This affects which glyphs - from a gutter button descriptor are chosen. *Note Gutter - Descriptor Format::. - - You can also reset the gutter to what it was when XEmacs started up. - - - Constant: initial-gutter-spec - The gutter descriptor used to initialize `default-gutter' at - startup. - - -File: lispref.info, Node: Common Gutter Widgets, Prev: Other Gutter Variables, Up: Gutter - -Common Gutter Widgets -===================== - - A gutter can contain arbitrary text. So, for example, in an Info -buffer you could put the title of the current node in the top gutter, -and it would not scroll out of view in a long node. (This is an -artificial example, since usually the node name is sufficiently -descriptive, and Info puts that in the mode line.) - - A more common use for the gutter is to hold some kind of active -widget. The buffer-tab facility, available in all XEmacs frames, -creates an array of file-folder-like tabs, which the user can click with -the mouse to switch buffers. W3 uses a progress-bar widget in the -bottom gutter to give a visual indication of the progress of -time-consuming operations like downloading. - -* Menu: - -* Buffer Tabs:: Tabbed divider index metaphor for switching buffers. -* Progress Bars:: Visual indication of operation progress. - - -File: lispref.info, Node: Buffer Tabs, Next: Progress Bars, Up: Common Gutter Widgets - -Buffer Tabs ------------ - - Not documented yet. - - -File: lispref.info, Node: Progress Bars, Prev: Buffer Tabs, Up: Common Gutter Widgets - -Progress Bars -------------- - - Not documented yet. - - -File: lispref.info, Node: Scrollbars, Next: Drag and Drop, Prev: Gutter, Up: Top - -Scrollbars -********** - - Not yet documented. - - -File: lispref.info, Node: Drag and Drop, Next: Modes, Prev: Scrollbars, Up: Top - -Drag and Drop -************* - - _WARNING_: the Drag'n'Drop API is still under development and the -interface may change! The current implementation is considered -experimental. - - Drag'n'drop is a way to transfer information between multiple -applications. To do this several GUIs define their own protocols. -Examples are OffiX, CDE, Motif, KDE, MSWindows, GNOME, and many more. -To catch all these protocols, XEmacs provides a generic API. - - One prime idea behind the API is to use a data interface that is -transparent for all systems. The author thinks that this is best -archived by using URL and MIME data, cause any internet enabled system -must support these for email already. XEmacs also already provides -powerful interfaces to support these types of data (tm and w3). - -* Menu: - -* Supported Protocols:: Which low-level protocols are supported. -* Drop Interface:: How XEmacs handles a drop from another application. -* Drag Interface:: Calls to initiate a drag from XEmacs. - - -File: lispref.info, Node: Supported Protocols, Next: Drop Interface, Up: Drag and Drop - -Supported Protocols -=================== - - The current release of XEmacs only support a small set of Drag'n'drop -protocols. Some of these only support limited options available in the -API. - -* Menu: - -* OffiX DND:: A generic X based protocol. -* CDE dt:: Common Desktop Environment used on suns. -* MSWindows OLE:: Mr. Gates way of live. -* Loose ends:: The other protocols. - - -File: lispref.info, Node: OffiX DND, Next: CDE dt, Up: Supported Protocols - -OffiX DND ---------- - - _WARNING_: If you compile in OffiX, you may not be able to use -multiple X displays successfully. If the two servers are from -different vendors, the results may be unpredictable. - - The OffiX Drag'n'Drop protocol is part of a X API/Widget library -created by Cesar Crusius. It is based on X-Atoms and ClientMessage -events, and works with any X platform supporting them. - - OffiX is supported if 'offix is member of the variable -dragdrop-protocols, or the feature 'offix is defined. - - Unfortunately it uses it's own data types. Examples are: File, Files, -Exe, Link, URL, MIME. The API tries to choose the right type for the -data that is dragged from XEmacs (well, not yet...). - - XEmacs supports both MIME and URL drags and drops using this API. No -application interaction is possible while dragging is in progress. - - For information about the OffiX project have a look at -http://leb.net/~offix/ - diff --git a/info/lispref.info-21 b/info/lispref.info-21 index bac2669..cf39e4c 100644 --- a/info/lispref.info-21 +++ b/info/lispref.info-21 @@ -50,6 +50,497 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Gutter Intro, Next: Creating Gutter, Prev: Gutter, Up: Gutter + +Gutter Intro +============ + + A "gutter" is a rectangle displayed along one edge of a frame. It +can contain arbitrary text or graphics. It could be considered a +generalization of a toolbar, although toolbars are not currently +implemented using gutters. + + In XEmacs, a gutter can be displayed along any of the four edges of +the frame, and two or more different edges can be displaying gutters +simultaneously. The contents, thickness, and visibility of the gutters +can be controlled separately, and the values can be per-buffer, +per-frame, etc., using specifiers (*note Specifiers::). + + Normally, there is one gutter displayed in a frame. Usually, this is +the default gutter, containing buffer tabs, but modes cab override this +and substitute their own gutter. This default gutter is usually +positioned along the top of the frame, but this can be changed using +`set-default-gutter-position'. + + Note that, for each of the gutter properties (contents, thickness, +and visibility), there is a separate specifier for each of the four +gutter positions (top, bottom, left, and right), and an additional +specifier for the "default" gutter, i.e. the gutter whose position is +controlled by `set-default-gutter-position'. The way this works is +that `set-default-gutter-position' arranges things so that the +appropriate position-specific specifiers for the default position +inherit from the corresponding default specifiers. That way, if the +position-specific specifier does not give a value (which it usually +doesn't), then the value from the default specifier applies. If you +want to control the default gutter, you just change the default +specifiers, and everything works. A package such as VM that wants to +put its own gutter in a different location from the default just sets +the position-specific specifiers, and if the user sets the default +gutter to the same position, it will just not be visible. + + +File: lispref.info, Node: Creating Gutter, Next: Gutter Descriptor Format, Prev: Gutter Intro, Up: Gutter + +Creating Gutter +=============== + + - Function: make-gutter-specifier spec-list + Return a new `gutter' specifier object with the given specification + list. SPEC-LIST can be a list of specifications (each of which is + a cons of a locale and a list of instantiators), a single + instantiator, or a list of instantiators. *Note Specifiers::, for + more information about specifiers. + + Gutter specifiers are used to specify the format of a gutter. The + values of the variables `default-gutter', `top-gutter', + `left-gutter', `right-gutter', and `bottom-gutter' are always + gutter specifiers. + + Valid gutter instantiators are called "gutter descriptors" and are + either strings or property-lists of strings. See `default-gutter' + for a description of the exact format. + + - Function: make-gutter-size-specifier spec-list + Return a new `gutter-size' specifier object with the given spec + list. SPEC-LIST can be a list of specifications (each of which is + a cons of a locale and a list of instantiators), a single + instantiator, or a list of instantiators. *Note Specifiers::, for + more information about specifiers. + + Gutter-size specifiers are used to specify the size of a gutter. + The values of the variables `default-gutter-size', + `top-gutter-size', `left-gutter-size', `right-gutter-size', and + `bottom-gutter-size' are always gutter-size specifiers. + + Valid gutter-size instantiators are either integers or the special + symbol `autodetect'. If a gutter-size is set to `autodetect' them + the size of the gutter will be adjusted to just accommodate the + gutters contents. `autodetect' only works for top and bottom + gutters. + + - Function: make-gutter-visible-specifier spec-list + Return a new `gutter-visible' specifier object with the given spec + list. SPEC-LIST can be a list of specifications (each of which is + a cons of a locale and a list of instantiators), a single + instantiator, or a list of instantiators. *Note Specifiers::, for + more information about specifiers. + + Gutter-visible specifiers are used to specify the visibility of a + gutter. The values of the variables `default-gutter-visible-p', + `top-gutter-visible-p', `left-gutter-visible-p', + `right-gutter-visible-p', and `bottom-gutter-visible-p' are always + gutter-visible specifiers. + + Valid gutter-visible instantiators are `t', `nil' or a list of + symbols. If a gutter-visible instantiator is set to a list of + symbols, and the corresponding gutter specification is a + property-list strings, then elements of the gutter specification + will only be visible if the corresponding symbol occurs in the + gutter-visible instantiator. + + +File: lispref.info, Node: Gutter Descriptor Format, Next: Specifying a Gutter, Prev: Creating Gutter, Up: Gutter + +Gutter Descriptor Format +======================== + + The contents of a gutter are specified using a "gutter descriptor". +The format of a gutter descriptor is a list of "gutter button +descriptors". Each gutter button descriptor is a vector in one of the +following formats: + + * `[GLYPH-LIST FUNCTION ENABLED-P HELP]' + + * `[:style 2D-OR-3D]' + + * `[:style 2D-OR-3D :size WIDTH-OR-HEIGHT]' + + * `[:size WIDTH-OR-HEIGHT :style 2D-OR-3D]' + + Optionally, one of the gutter button descriptors may be `nil' +instead of a vector; this signifies the division between the gutter +buttons that are to be displayed flush-left, and the buttons to be +displayed flush-right. + + The first vector format above specifies a normal gutter button; the +others specify blank areas in the gutter. + + For the first vector format: + + * GLYPH-LIST should be a list of one to six glyphs (as created by + `make-glyph') or a symbol whose value is such a list. The first + glyph, which must be provided, is the glyph used to display the + gutter button when it is in the "up" (not pressed) state. The + optional second glyph is for displaying the button when it is in + the "down" (pressed) state. The optional third glyph is for when + the button is disabled. The last three glyphs are for displaying + the button in the "up", "down", and "disabled" states, + respectively, but are used when the user has called for captioned + gutter buttons (using `gutter-buttons-captioned-p'). The function + `gutter-make-button-list' is useful in creating these glyph lists. + + * Even if you do not provide separate down-state and disabled-state + glyphs, the user will still get visual feedback to indicate which + state the button is in. Buttons in the up-state are displayed + with a shadowed border that gives a raised appearance to the + button. Buttons in the down-state are displayed with shadows that + give a recessed appearance. Buttons in the disabled state are + displayed with no shadows, giving a 2-d effect. + + * If some of the gutter glyphs are not provided, they inherit as + follows: + + UP: up + DOWN: down -> up + DISABLED: disabled -> up + CAP-UP: cap-up -> up + CAP-DOWN: cap-down -> cap-up -> down -> up + CAP-DISABLED: cap-disabled -> cap-up -> disabled -> up + + * The second element FUNCTION is a function to be called when the + gutter button is activated (i.e. when the mouse is released over + the gutter button, if the press occurred in the gutter). It can + be any form accepted by `call-interactively', since this is how it + is invoked. + + * The third element ENABLED-P specifies whether the gutter button is + enabled (disabled buttons do nothing when they are activated, and + are displayed differently; see above). It should be either a + boolean or a form that evaluates to a boolean. + + * The fourth element HELP, if non-`nil', should be a string. This + string is displayed in the echo area when the mouse passes over the + gutter button. + + For the other vector formats (specifying blank areas of the gutter): + + * 2D-OR-3D should be one of the symbols `2d' or `3d', indicating + whether the area is displayed with shadows (giving it a raised, + 3-d appearance) or without shadows (giving it a flat appearance). + + * WIDTH-OR-HEIGHT specifies the length, in pixels, of the blank + area. If omitted, it defaults to a device-specific value (8 + pixels for X devices). + + - Function: gutter-make-button-list up &optional down disabled cap-up + cap-down cap-disabled + This function calls `make-glyph' on each arg and returns a list of + the results. This is useful for setting the first argument of a + gutter button descriptor (typically, the result of this function + is assigned to a symbol, which is specified as the first argument + of the gutter button descriptor). + + - Function: check-gutter-button-syntax button &optional noerror + Verify the syntax of entry BUTTON in a gutter description list. + If you want to verify the syntax of a gutter description list as a + whole, use `check-valid-instantiator' with a specifier type of + `gutter'. + + +File: lispref.info, Node: Specifying a Gutter, Next: Other Gutter Variables, Prev: Gutter Descriptor Format, Up: Gutter + +Specifying a Gutter +=================== + + In order to specify the contents of a gutter, set one of the +specifier variables `default-gutter', `top-gutter', `bottom-gutter', +`left-gutter', or `right-gutter'. These are specifiers, which means +you set them with `set-specifier' and query them with `specifier-specs' +or `specifier-instance'. You will get an error if you try to set them +using `setq'. The valid instantiators for these specifiers are gutter +descriptors, as described above. *Note Specifiers::, for more +information. + + Most of the time, you will set `default-gutter', which allows the +user to choose where the gutter should go. + + - Specifier: default-gutter + The position of this gutter is specified in the function + `default-gutter-position'. If the corresponding position-specific + gutter (e.g. `top-gutter' if `default-gutter-position' is `top') + does not specify a gutter in a particular domain, then the value + of `default-gutter' in that domain, of any, will be used instead. + + Note that the gutter at any particular position will not be displayed +unless its thickness (width or height, depending on orientation) is +non-zero and its visibility status is true. The thickness is controlled +by the specifiers `top-gutter-height', `bottom-gutter-height', +`left-gutter-width', and `right-gutter-width', and the visibility +status is controlled by the specifiers `top-gutter-visible-p', +`bottom-gutter-visible-p', `left-gutter-visible-p', and +`right-gutter-visible-p' (*note Other Gutter Variables::). + + - Function: set-default-gutter-position position + This function sets the position that the `default-gutter' will be + displayed at. Valid positions are the symbols `top', `bottom', + `left' and `right'. What this actually does is set the fallback + specifier for the position-specific specifier corresponding to the + given position to `default-gutter', and set the fallbacks for the + other position-specific specifiers to `nil'. It also does the + same thing for the position-specific thickness and visibility + specifiers, which inherit from one of `default-gutter-height' or + `default-gutter-width', and from `default-gutter-visible-p', + respectively (*note Other Gutter Variables::). + + - Function: default-gutter-position + This function returns the position that the `default-gutter' will + be displayed at. + + You can also explicitly set a gutter at a particular position. When +redisplay determines what to display at a particular position in a +particular domain (i.e. window), it first consults the position-specific +gutter. If that does not yield a gutter descriptor, the +`default-gutter' is consulted if `default-gutter-position' indicates +this position. + + - Specifier: top-gutter + Specifier for the gutter at the top of the frame. + + - Specifier: bottom-gutter + Specifier for the gutter at the bottom of the frame. + + - Specifier: left-gutter + Specifier for the gutter at the left edge of the frame. + + - Specifier: right-gutter + Specifier for the gutter at the right edge of the frame. + + - Function: gutter-specifier-p object + This function returns non-`nil' if OBJECT is a gutter specifier. + Gutter specifiers are the actual objects contained in the gutter + variables described above, and their valid instantiators are + gutter descriptors (*note Gutter Descriptor Format::). + + +File: lispref.info, Node: Other Gutter Variables, Next: Common Gutter Widgets, Prev: Specifying a Gutter, Up: Gutter + +Other Gutter Variables +====================== + + The variables to control the gutter thickness, visibility status, and +captioned status are all specifiers. *Note Specifiers::. + + - Specifier: default-gutter-height + This specifies the height of the default gutter, if it's oriented + horizontally. The position of the default gutter is specified by + the function `set-default-gutter-position'. If the corresponding + position-specific gutter thickness specifier (e.g. + `top-gutter-height' if `default-gutter-position' is `top') does + not specify a thickness in a particular domain (a window or a + frame), then the value of `default-gutter-height' or + `default-gutter-width' (depending on the gutter orientation) in + that domain, if any, will be used instead. + + - Specifier: default-gutter-width + This specifies the width of the default gutter, if it's oriented + vertically. This behaves like `default-gutter-height'. + + Note that `default-gutter-height' is only used when +`default-gutter-position' is `top' or `bottom', and +`default-gutter-width' is only used when `default-gutter-position' is +`left' or `right'. + + - Specifier: top-gutter-height + This specifies the height of the top gutter. + + - Specifier: bottom-gutter-height + This specifies the height of the bottom gutter. + + - Specifier: left-gutter-width + This specifies the width of the left gutter. + + - Specifier: right-gutter-width + This specifies the width of the right gutter. + + Note that all of the position-specific gutter thickness specifiers +have a fallback value of zero when they do not correspond to the +default gutter. Therefore, you will have to set a non-zero thickness +value if you want a position-specific gutter to be displayed. + + - Specifier: default-gutter-visible-p + This specifies whether the default gutter is visible. The + position of the default gutter is specified by the function + `set-default-gutter-position'. If the corresponding + position-specific gutter visibility specifier (e.g. + `top-gutter-visible-p' if `default-gutter-position' is `top') does + not specify a visible-p value in a particular domain (a window or + a frame), then the value of `default-gutter-visible-p' in that + domain, if any, will be used instead. + + - Specifier: top-gutter-visible-p + This specifies whether the top gutter is visible. + + - Specifier: bottom-gutter-visible-p + This specifies whether the bottom gutter is visible. + + - Specifier: left-gutter-visible-p + This specifies whether the left gutter is visible. + + - Specifier: right-gutter-visible-p + This specifies whether the right gutter is visible. + + `default-gutter-visible-p' and all of the position-specific gutter +visibility specifiers have a fallback value of true. + + Internally, gutter thickness and visibility specifiers are +instantiated in both window and frame domains, for different purposes. +The value in the domain of a frame's selected window specifies the +actual gutter thickness or visibility that you will see in that frame. +The value in the domain of a frame itself specifies the gutter +thickness or visibility that is used in frame geometry calculations. + + Thus, for example, if you set the frame width to 80 characters and +the left gutter width for that frame to 68 pixels, then the frame will +be sized to fit 80 characters plus a 68-pixel left gutter. If you then +set the left gutter width to 0 for a particular buffer (or if that +buffer does not specify a left gutter or has a `nil' value specified for +`left-gutter-visible-p'), you will find that, when that buffer is +displayed in the selected window, the window will have a width of 86 or +87 characters - the frame is sized for a 68-pixel left gutter but the +selected window specifies that the left gutter is not visible, so it is +expanded to take up the slack. + + - Specifier: gutter-buttons-captioned-p + Whether gutter buttons are captioned. This affects which glyphs + from a gutter button descriptor are chosen. *Note Gutter + Descriptor Format::. + + You can also reset the gutter to what it was when XEmacs started up. + + - Constant: initial-gutter-spec + The gutter descriptor used to initialize `default-gutter' at + startup. + + +File: lispref.info, Node: Common Gutter Widgets, Prev: Other Gutter Variables, Up: Gutter + +Common Gutter Widgets +===================== + + A gutter can contain arbitrary text. So, for example, in an Info +buffer you could put the title of the current node in the top gutter, +and it would not scroll out of view in a long node. (This is an +artificial example, since usually the node name is sufficiently +descriptive, and Info puts that in the mode line.) + + A more common use for the gutter is to hold some kind of active +widget. The buffer-tab facility, available in all XEmacs frames, +creates an array of file-folder-like tabs, which the user can click with +the mouse to switch buffers. W3 uses a progress-bar widget in the +bottom gutter to give a visual indication of the progress of +time-consuming operations like downloading. + +* Menu: + +* Buffer Tabs:: Tabbed divider index metaphor for switching buffers. +* Progress Bars:: Visual indication of operation progress. + + +File: lispref.info, Node: Buffer Tabs, Next: Progress Bars, Up: Common Gutter Widgets + +Buffer Tabs +----------- + + Not documented yet. + + +File: lispref.info, Node: Progress Bars, Prev: Buffer Tabs, Up: Common Gutter Widgets + +Progress Bars +------------- + + Not documented yet. + + +File: lispref.info, Node: Scrollbars, Next: Drag and Drop, Prev: Gutter, Up: Top + +Scrollbars +********** + + Not yet documented. + + +File: lispref.info, Node: Drag and Drop, Next: Modes, Prev: Scrollbars, Up: Top + +Drag and Drop +************* + + _WARNING_: the Drag'n'Drop API is still under development and the +interface may change! The current implementation is considered +experimental. + + Drag'n'drop is a way to transfer information between multiple +applications. To do this several GUIs define their own protocols. +Examples are OffiX, CDE, Motif, KDE, MSWindows, GNOME, and many more. +To catch all these protocols, XEmacs provides a generic API. + + One prime idea behind the API is to use a data interface that is +transparent for all systems. The author thinks that this is best +archived by using URL and MIME data, cause any internet enabled system +must support these for email already. XEmacs also already provides +powerful interfaces to support these types of data (tm and w3). + +* Menu: + +* Supported Protocols:: Which low-level protocols are supported. +* Drop Interface:: How XEmacs handles a drop from another application. +* Drag Interface:: Calls to initiate a drag from XEmacs. + + +File: lispref.info, Node: Supported Protocols, Next: Drop Interface, Up: Drag and Drop + +Supported Protocols +=================== + + The current release of XEmacs only support a small set of Drag'n'drop +protocols. Some of these only support limited options available in the +API. + +* Menu: + +* OffiX DND:: A generic X based protocol. +* CDE dt:: Common Desktop Environment used on suns. +* MSWindows OLE:: Mr. Gates way of live. +* Loose ends:: The other protocols. + + +File: lispref.info, Node: OffiX DND, Next: CDE dt, Up: Supported Protocols + +OffiX DND +--------- + + _WARNING_: If you compile in OffiX, you may not be able to use +multiple X displays successfully. If the two servers are from +different vendors, the results may be unpredictable. + + The OffiX Drag'n'Drop protocol is part of a X API/Widget library +created by Cesar Crusius. It is based on X-Atoms and ClientMessage +events, and works with any X platform supporting them. + + OffiX is supported if 'offix is member of the variable +dragdrop-protocols, or the feature 'offix is defined. + + Unfortunately it uses it's own data types. Examples are: File, Files, +Exe, Link, URL, MIME. The API tries to choose the right type for the +data that is dragged from XEmacs (well, not yet...). + + XEmacs supports both MIME and URL drags and drops using this API. No +application interaction is possible while dragging is in progress. + + For information about the OffiX project have a look at +http://leb.net/~offix/ + + File: lispref.info, Node: CDE dt, Next: MSWindows OLE, Prev: OffiX DND, Up: Supported Protocols CDE dt @@ -660,477 +1151,3 @@ visited. `normal-mode' actually takes place here. The argument FORCE usually comes from the argument FIND-FILE given to `normal-mode'. - -File: lispref.info, Node: Mode Help, Next: Derived Modes, Prev: Auto Major Mode, Up: Major Modes - -Getting Help about a Major Mode -------------------------------- - - The `describe-mode' function is used to provide information about -major modes. It is normally called with `C-h m'. The `describe-mode' -function uses the value of `major-mode', which is why every major mode -function needs to set the `major-mode' variable. - - - Command: describe-mode - This function displays the documentation of the current major mode. - - The `describe-mode' function calls the `documentation' function - using the value of `major-mode' as an argument. Thus, it displays - the documentation string of the major mode function. (*Note - Accessing Documentation::.) - - - Variable: 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 `describe-mode' function uses - the documentation string of the function as the documentation of - the major mode. - - -File: lispref.info, Node: Derived Modes, Prev: Mode Help, Up: Major Modes - -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 `define-derived-mode'. - - - Macro: define-derived-mode variant parent name docstring body... - This construct defines VARIANT as a major mode command, using NAME - as the string form of the mode name. - - The new command VARIANT is defined to call the function PARENT, - then override certain aspects of that parent mode: - - * The new mode has its own keymap, named `VARIANT-map'. - `define-derived-mode' initializes this map to inherit from - `PARENT-map', if it is not already set. - - * The new mode has its own syntax table, kept in the variable - `VARIANT-syntax-table'. `define-derived-mode' initializes - this variable by copying `PARENT-syntax-table', if it is not - already set. - - * The new mode has its own abbrev table, kept in the variable - `VARIANT-abbrev-table'. `define-derived-mode' initializes - this variable by copying `PARENT-abbrev-table', if it is not - already set. - - * The new mode has its own mode hook, `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 PARENT as part of - calling PARENT.) - - In addition, you can specify how to override other aspects of - PARENT with BODY. The command VARIANT evaluates the forms in BODY - after setting up all its usual overrides, just before running - `VARIANT-hook'. - - The argument DOCSTRING specifies the documentation string for the - new mode. If you omit DOCSTRING, `define-derived-mode' generates - a documentation string. - - Here is a hypothetical 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) - - -File: lispref.info, Node: Minor Modes, Next: Modeline Format, Prev: Major Modes, Up: Modes - -Minor Modes -=========== - - A "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 XEmacs. 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. - - -File: lispref.info, Node: Minor Mode Conventions, Next: Keymaps and Minor Modes, Up: Minor Modes - -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. - - * Make a variable whose name ends in `-mode' to represent the minor - mode. Its value should enable or disable the mode (`nil' to - disable; anything else to enable.) We call this the "mode - variable". - - This variable is used in conjunction with the `minor-mode-alist' to - display the minor mode name in the modeline. 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. - - * 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 `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 `nil' or `-', - or a list whose CAR is such an integer or symbol; it should turn - the mode off otherwise. - - Here is an example taken from the definition of - `transient-mark-mode'. It shows the use of `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. - - (setq transient-mark-mode - (if (null arg) (not transient-mark-mode) - (> (prefix-numeric-value arg) 0))) - - * Add an element to `minor-mode-alist' for each minor mode (*note - Modeline Variables::). This element should be a list of the - following form: - - (MODE-VARIABLE STRING) - - Here MODE-VARIABLE is the variable that controls enabling of the - minor mode, and STRING is a short string, starting with a space, - to represent the mode in the modeline. These strings must be - short so that there is room for several of them at once. - - When you add an element to `minor-mode-alist', use `assq' to check - for an existing element, to avoid duplication. For example: - - (or (assq 'leif-mode minor-mode-alist) - (setq minor-mode-alist - (cons '(leif-mode " Leif") minor-mode-alist))) - - -File: lispref.info, Node: Keymaps and Minor Modes, Prev: Minor Mode Conventions, Up: Minor Modes - -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 `minor-mode-map-alist'. *Note Active Keymaps::. - - 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 `self-insert-command' are limited to special -cases (designed for abbrevs and Auto Fill mode). (Do not try -substituting your own definition of `self-insert-command' for the -standard one. The editor command loop handles this function specially.) - - -File: lispref.info, Node: Modeline Format, Next: Hooks, Prev: Minor Modes, Up: Modes - -Modeline Format -=============== - - Each Emacs window (aside from minibuffer windows) includes a -modeline, which displays status information about the buffer displayed -in the window. The modeline 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 modeline are -controlled. It is in the chapter on modes because much of the -information displayed in the modeline relates to the enabled major and -minor modes. - - `modeline-format' is a buffer-local variable that holds a template -used to display the modeline of the current buffer. All windows for -the same buffer use the same `modeline-format' and their modelines -appear the same (except for scrolling percentages and line numbers). - - The modeline of a window is normally updated whenever a different -buffer is shown in the window, or when the buffer's modified-status -changes from `nil' to `t' or vice-versa. If you modify any of the -variables referenced by `modeline-format' (*note Modeline Variables::), -you may want to force an update of the modeline so as to display the -new information. - - - Function: redraw-modeline &optional all - Force redisplay of the current buffer's modeline. If ALL is - non-`nil', then force redisplay of all modelines. - - The modeline is usually displayed in inverse video. This is -controlled using the `modeline' face. *Note Faces::. - -* Menu: - -* Modeline Data:: The data structure that controls the modeline. -* Modeline Variables:: Variables used in that data structure. -* %-Constructs:: Putting information into a modeline. - - -File: lispref.info, Node: Modeline Data, Next: Modeline Variables, Up: Modeline Format - -The Data Structure of the Modeline ----------------------------------- - - The modeline contents are controlled by a data structure of lists, -strings, symbols, and numbers kept in the buffer-local variable -`modeline-format'. The data structure is called a "modeline -construct", and it is built in recursive fashion out of simpler modeline -constructs. The same data structure is used for constructing frame -titles (*note Frame Titles::). - - - Variable: modeline-format - The value of this variable is a modeline construct with overall - responsibility for the modeline format. The value of this variable - controls which other variables are used to form the modeline text, - and where they appear. - - A modeline 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 modeline -constructs as their values. - - The default value of `modeline-format' incorporates the values of -variables such as `mode-name' and `minor-mode-alist'. Because of this, -very few modes need to alter `modeline-format'. For most purposes, it -is sufficient to alter the variables referenced by `modeline-format'. - - A modeline construct may be a string, symbol, glyph, generic -specifier, list or cons cell. - -`STRING' - A string as a modeline construct is displayed verbatim in the mode - line except for "`%'-constructs". Decimal digits after the `%' - specify the field width for space filling on the right (i.e., the - data is left justified). *Note %-Constructs::. - -`SYMBOL' - A symbol as a modeline construct stands for its value. The value - of SYMBOL is processed as a modeline construct, in place of - SYMBOL. However, the symbols `t' and `nil' are ignored; so is any - symbol whose value is void. - - There is one exception: if the value of SYMBOL is a string, it is - displayed verbatim: the `%'-constructs are not recognized. - -`GLYPH' - A glyph is displayed as is. - -`GENERIC-SPECIFIER' - A GENERIC-SPECIFIER (i.e. a specifier of type `generic') stands - for its instance. The instance of GENERIC-SPECIFIER is computed - in the current window using the equivalent of `specifier-instance' - and the value is processed. - -`(STRING REST...) or (LIST REST...)' - 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. - -`(SYMBOL THEN ELSE)' - A list whose first element is a symbol is a conditional. Its - meaning depends on the value of SYMBOL. If the value is non-`nil', - the second element, THEN, is processed recursively as a modeline - element. But if the value of SYMBOL is `nil', the third element, - ELSE, is processed recursively. You may omit ELSE; then the mode - line element displays nothing if the value of SYMBOL is `nil'. - -`(WIDTH REST...)' - A list whose first element is an integer specifies truncation or - padding of the results of REST. The remaining elements REST are - processed recursively as modeline constructs and concatenated - together. Then the result is space filled (if WIDTH is positive) - or truncated (to -WIDTH columns, if 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: `(-3 - "%p")'. - -`(EXTENT REST...)' - A list whose car is an extent means the cdr of the list is - processed normally but the results are displayed using the face of - the extent, and mouse clicks over this section are processed using - the keymap of the extent. (In addition, if the extent has a - help-echo property, that string will be echoed when the mouse - moves over this section.) If extents are nested, all keymaps are - properly consulted when processing mouse clicks, but multiple - faces are not correctly merged (only the first face is used), and - lists of faces are not correctly handled. - - If you do alter `modeline-format' itself, the new value should use -the same variables that appear in the default value (*note Modeline -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 `display-time' and major modes) via -changes to those variables remain effective. - - Here is an example of a `modeline-format' that might be useful for -`shell-mode', since it contains the hostname and default directory. - - (setq modeline-format - (list "" - 'modeline-modified - "%b--" - (getenv "HOST") ; One element is not constant. - ":" - 'default-directory - " " - 'global-mode-string - " %[(" - 'mode-name - 'modeline-process - 'minor-mode-alist - "%n" - ")%]----" - '(line-number-mode "L%l--") - '(-3 . "%p") - "-%-")) - - -File: lispref.info, Node: Modeline Variables, Next: %-Constructs, Prev: Modeline Data, Up: Modeline Format - -Variables Used in the Modeline ------------------------------- - - This section describes variables incorporated by the standard value -of `modeline-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 modeline if `modeline-format' were changed -to use them. - - - Variable: modeline-modified - This variable holds the value of the modeline construct that - displays whether the current buffer is modified. - - The default value of `modeline-modified' is `("--%1*%1+-")'. This - means that the modeline displays `--**-' if the buffer is - modified, `-----' if the buffer is not modified, `--%%-' if the - buffer is read only, and `--%*--' if the buffer is read only and - modified. - - Changing this variable does not force an update of the modeline. - - - Variable: modeline-buffer-identification - This variable identifies the buffer being displayed in the window. - Its default value is `("%F: %17b")', which means that it usually - displays `Emacs:' followed by seventeen characters of the buffer - name. (In a terminal frame, it displays the frame name instead of - `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" XEmacs. - - - Variable: global-mode-string - This variable holds a modeline spec that appears in the mode line - by default, just after the buffer name. The command `display-time' - sets `global-mode-string' to refer to the variable - `display-time-string', which holds a string containing the time and - load information. - - The `%M' construct substitutes the value of `global-mode-string', - but this is obsolete, since the variable is included directly in - the modeline. - - - Variable: 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 modeline. - - - Variable: minor-mode-alist - This variable holds an association list whose elements specify how - the modeline should indicate that a minor mode is active. Each - element of the `minor-mode-alist' should be a two-element list: - - (MINOR-MODE-VARIABLE MODELINE-STRING) - - More generally, MODELINE-STRING can be any mode line spec. It - appears in the mode line when the value of MINOR-MODE-VARIABLE is - non-`nil', and not otherwise. These strings should begin with - spaces so that they don't run together. Conventionally, the - MINOR-MODE-VARIABLE for a specific mode is set to a non-`nil' - value when that minor mode is activated. - - The default value of `minor-mode-alist' is: - - minor-mode-alist - => ((vc-mode vc-mode) - (abbrev-mode " Abbrev") - (overwrite-mode overwrite-mode) - (auto-fill-function " Fill") - (defining-kbd-macro " Def") - (isearch-mode isearch-mode)) - - `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. - - - Variable: modeline-process - This buffer-local variable contains the modeline 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 `*shell*' buffer - is `(": %s")', which allows the shell to display its status along - with the major mode as: `(Shell: run)'. Normally this variable is - `nil'. - - - Variable: default-modeline-format - This variable holds the default `modeline-format' for buffers that - do not override it. This is the same as `(default-value - 'modeline-format)'. - - The default value of `default-modeline-format' is: - - ("" - modeline-modified - modeline-buffer-identification - " " - global-mode-string - " %[(" - mode-name - modeline-process - minor-mode-alist - "%n" - ")%]----" - (line-number-mode "L%l--") - (-3 . "%p") - "-%-") - - - Variable: vc-mode - The variable `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 `nil' for no version control, or a - string that appears in the mode line. - diff --git a/info/lispref.info-22 b/info/lispref.info-22 index c9aa60e..fd881c3 100644 --- a/info/lispref.info-22 +++ b/info/lispref.info-22 @@ -50,6 +50,480 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Mode Help, Next: Derived Modes, Prev: Auto Major Mode, Up: Major Modes + +Getting Help about a Major Mode +------------------------------- + + The `describe-mode' function is used to provide information about +major modes. It is normally called with `C-h m'. The `describe-mode' +function uses the value of `major-mode', which is why every major mode +function needs to set the `major-mode' variable. + + - Command: describe-mode + This function displays the documentation of the current major mode. + + The `describe-mode' function calls the `documentation' function + using the value of `major-mode' as an argument. Thus, it displays + the documentation string of the major mode function. (*Note + Accessing Documentation::.) + + - Variable: 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 `describe-mode' function uses + the documentation string of the function as the documentation of + the major mode. + + +File: lispref.info, Node: Derived Modes, Prev: Mode Help, Up: Major Modes + +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 `define-derived-mode'. + + - Macro: define-derived-mode variant parent name docstring body... + This construct defines VARIANT as a major mode command, using NAME + as the string form of the mode name. + + The new command VARIANT is defined to call the function PARENT, + then override certain aspects of that parent mode: + + * The new mode has its own keymap, named `VARIANT-map'. + `define-derived-mode' initializes this map to inherit from + `PARENT-map', if it is not already set. + + * The new mode has its own syntax table, kept in the variable + `VARIANT-syntax-table'. `define-derived-mode' initializes + this variable by copying `PARENT-syntax-table', if it is not + already set. + + * The new mode has its own abbrev table, kept in the variable + `VARIANT-abbrev-table'. `define-derived-mode' initializes + this variable by copying `PARENT-abbrev-table', if it is not + already set. + + * The new mode has its own mode hook, `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 PARENT as part of + calling PARENT.) + + In addition, you can specify how to override other aspects of + PARENT with BODY. The command VARIANT evaluates the forms in BODY + after setting up all its usual overrides, just before running + `VARIANT-hook'. + + The argument DOCSTRING specifies the documentation string for the + new mode. If you omit DOCSTRING, `define-derived-mode' generates + a documentation string. + + Here is a hypothetical 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) + + +File: lispref.info, Node: Minor Modes, Next: Modeline Format, Prev: Major Modes, Up: Modes + +Minor Modes +=========== + + A "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 XEmacs. 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. + + +File: lispref.info, Node: Minor Mode Conventions, Next: Keymaps and Minor Modes, Up: Minor Modes + +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. + + * Make a variable whose name ends in `-mode' to represent the minor + mode. Its value should enable or disable the mode (`nil' to + disable; anything else to enable.) We call this the "mode + variable". + + This variable is used in conjunction with the `minor-mode-alist' to + display the minor mode name in the modeline. 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. + + * 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 `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 `nil' or `-', + or a list whose CAR is such an integer or symbol; it should turn + the mode off otherwise. + + Here is an example taken from the definition of + `transient-mark-mode'. It shows the use of `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. + + (setq transient-mark-mode + (if (null arg) (not transient-mark-mode) + (> (prefix-numeric-value arg) 0))) + + * Add an element to `minor-mode-alist' for each minor mode (*note + Modeline Variables::). This element should be a list of the + following form: + + (MODE-VARIABLE STRING) + + Here MODE-VARIABLE is the variable that controls enabling of the + minor mode, and STRING is a short string, starting with a space, + to represent the mode in the modeline. These strings must be + short so that there is room for several of them at once. + + When you add an element to `minor-mode-alist', use `assq' to check + for an existing element, to avoid duplication. For example: + + (or (assq 'leif-mode minor-mode-alist) + (setq minor-mode-alist + (cons '(leif-mode " Leif") minor-mode-alist))) + + +File: lispref.info, Node: Keymaps and Minor Modes, Prev: Minor Mode Conventions, Up: Minor Modes + +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 `minor-mode-map-alist'. *Note Active Keymaps::. + + 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 `self-insert-command' are limited to special +cases (designed for abbrevs and Auto Fill mode). (Do not try +substituting your own definition of `self-insert-command' for the +standard one. The editor command loop handles this function specially.) + + +File: lispref.info, Node: Modeline Format, Next: Hooks, Prev: Minor Modes, Up: Modes + +Modeline Format +=============== + + Each Emacs window (aside from minibuffer windows) includes a +modeline, which displays status information about the buffer displayed +in the window. The modeline 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 modeline are +controlled. It is in the chapter on modes because much of the +information displayed in the modeline relates to the enabled major and +minor modes. + + `modeline-format' is a buffer-local variable that holds a template +used to display the modeline of the current buffer. All windows for +the same buffer use the same `modeline-format' and their modelines +appear the same (except for scrolling percentages and line numbers). + + The modeline of a window is normally updated whenever a different +buffer is shown in the window, or when the buffer's modified-status +changes from `nil' to `t' or vice-versa. If you modify any of the +variables referenced by `modeline-format' (*note Modeline Variables::), +you may want to force an update of the modeline so as to display the +new information. + + - Function: redraw-modeline &optional all + Force redisplay of the current buffer's modeline. If ALL is + non-`nil', then force redisplay of all modelines. + + The modeline is usually displayed in inverse video. This is +controlled using the `modeline' face. *Note Faces::. + +* Menu: + +* Modeline Data:: The data structure that controls the modeline. +* Modeline Variables:: Variables used in that data structure. +* %-Constructs:: Putting information into a modeline. + + +File: lispref.info, Node: Modeline Data, Next: Modeline Variables, Up: Modeline Format + +The Data Structure of the Modeline +---------------------------------- + + The modeline contents are controlled by a data structure of lists, +strings, symbols, and numbers kept in the buffer-local variable +`modeline-format'. The data structure is called a "modeline +construct", and it is built in recursive fashion out of simpler modeline +constructs. The same data structure is used for constructing frame +titles (*note Frame Titles::). + + - Variable: modeline-format + The value of this variable is a modeline construct with overall + responsibility for the modeline format. The value of this variable + controls which other variables are used to form the modeline text, + and where they appear. + + A modeline 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 modeline +constructs as their values. + + The default value of `modeline-format' incorporates the values of +variables such as `mode-name' and `minor-mode-alist'. Because of this, +very few modes need to alter `modeline-format'. For most purposes, it +is sufficient to alter the variables referenced by `modeline-format'. + + A modeline construct may be a string, symbol, glyph, generic +specifier, list or cons cell. + +`STRING' + A string as a modeline construct is displayed verbatim in the mode + line except for "`%'-constructs". Decimal digits after the `%' + specify the field width for space filling on the right (i.e., the + data is left justified). *Note %-Constructs::. + +`SYMBOL' + A symbol as a modeline construct stands for its value. The value + of SYMBOL is processed as a modeline construct, in place of + SYMBOL. However, the symbols `t' and `nil' are ignored; so is any + symbol whose value is void. + + There is one exception: if the value of SYMBOL is a string, it is + displayed verbatim: the `%'-constructs are not recognized. + +`GLYPH' + A glyph is displayed as is. + +`GENERIC-SPECIFIER' + A GENERIC-SPECIFIER (i.e. a specifier of type `generic') stands + for its instance. The instance of GENERIC-SPECIFIER is computed + in the current window using the equivalent of `specifier-instance' + and the value is processed. + +`(STRING REST...) or (LIST REST...)' + 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. + +`(SYMBOL THEN ELSE)' + A list whose first element is a symbol is a conditional. Its + meaning depends on the value of SYMBOL. If the value is non-`nil', + the second element, THEN, is processed recursively as a modeline + element. But if the value of SYMBOL is `nil', the third element, + ELSE, is processed recursively. You may omit ELSE; then the mode + line element displays nothing if the value of SYMBOL is `nil'. + +`(WIDTH REST...)' + A list whose first element is an integer specifies truncation or + padding of the results of REST. The remaining elements REST are + processed recursively as modeline constructs and concatenated + together. Then the result is space filled (if WIDTH is positive) + or truncated (to -WIDTH columns, if 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: `(-3 + "%p")'. + +`(EXTENT REST...)' + A list whose car is an extent means the cdr of the list is + processed normally but the results are displayed using the face of + the extent, and mouse clicks over this section are processed using + the keymap of the extent. (In addition, if the extent has a + help-echo property, that string will be echoed when the mouse + moves over this section.) If extents are nested, all keymaps are + properly consulted when processing mouse clicks, but multiple + faces are not correctly merged (only the first face is used), and + lists of faces are not correctly handled. + + If you do alter `modeline-format' itself, the new value should use +the same variables that appear in the default value (*note Modeline +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 `display-time' and major modes) via +changes to those variables remain effective. + + Here is an example of a `modeline-format' that might be useful for +`shell-mode', since it contains the hostname and default directory. + + (setq modeline-format + (list "" + 'modeline-modified + "%b--" + (getenv "HOST") ; One element is not constant. + ":" + 'default-directory + " " + 'global-mode-string + " %[(" + 'mode-name + 'modeline-process + 'minor-mode-alist + "%n" + ")%]----" + '(line-number-mode "L%l--") + '(-3 . "%p") + "-%-")) + + +File: lispref.info, Node: Modeline Variables, Next: %-Constructs, Prev: Modeline Data, Up: Modeline Format + +Variables Used in the Modeline +------------------------------ + + This section describes variables incorporated by the standard value +of `modeline-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 modeline if `modeline-format' were changed +to use them. + + - Variable: modeline-modified + This variable holds the value of the modeline construct that + displays whether the current buffer is modified. + + The default value of `modeline-modified' is `("--%1*%1+-")'. This + means that the modeline displays `--**-' if the buffer is + modified, `-----' if the buffer is not modified, `--%%-' if the + buffer is read only, and `--%*--' if the buffer is read only and + modified. + + Changing this variable does not force an update of the modeline. + + - Variable: modeline-buffer-identification + This variable identifies the buffer being displayed in the window. + Its default value is `("%F: %17b")', which means that it usually + displays `Emacs:' followed by seventeen characters of the buffer + name. (In a terminal frame, it displays the frame name instead of + `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" XEmacs. + + - Variable: global-mode-string + This variable holds a modeline spec that appears in the mode line + by default, just after the buffer name. The command `display-time' + sets `global-mode-string' to refer to the variable + `display-time-string', which holds a string containing the time and + load information. + + The `%M' construct substitutes the value of `global-mode-string', + but this is obsolete, since the variable is included directly in + the modeline. + + - Variable: 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 modeline. + + - Variable: minor-mode-alist + This variable holds an association list whose elements specify how + the modeline should indicate that a minor mode is active. Each + element of the `minor-mode-alist' should be a two-element list: + + (MINOR-MODE-VARIABLE MODELINE-STRING) + + More generally, MODELINE-STRING can be any mode line spec. It + appears in the mode line when the value of MINOR-MODE-VARIABLE is + non-`nil', and not otherwise. These strings should begin with + spaces so that they don't run together. Conventionally, the + MINOR-MODE-VARIABLE for a specific mode is set to a non-`nil' + value when that minor mode is activated. + + The default value of `minor-mode-alist' is: + + minor-mode-alist + => ((vc-mode vc-mode) + (abbrev-mode " Abbrev") + (overwrite-mode overwrite-mode) + (auto-fill-function " Fill") + (defining-kbd-macro " Def") + (isearch-mode isearch-mode)) + + `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. + + - Variable: modeline-process + This buffer-local variable contains the modeline 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 `*shell*' buffer + is `(": %s")', which allows the shell to display its status along + with the major mode as: `(Shell: run)'. Normally this variable is + `nil'. + + - Variable: default-modeline-format + This variable holds the default `modeline-format' for buffers that + do not override it. This is the same as `(default-value + 'modeline-format)'. + + The default value of `default-modeline-format' is: + + ("" + modeline-modified + modeline-buffer-identification + " " + global-mode-string + " %[(" + mode-name + modeline-process + minor-mode-alist + "%n" + ")%]----" + (line-number-mode "L%l--") + (-3 . "%p") + "-%-") + + - Variable: vc-mode + The variable `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 `nil' for no version control, or a + string that appears in the mode line. + + File: lispref.info, Node: %-Constructs, Prev: Modeline Variables, Up: Modeline Format `%'-Constructs in the ModeLine @@ -288,7 +762,7 @@ added with `add-hooks'. difference. - Function: make-local-hook hook - This function makes the hook variable `hook' local to the current + This function makes the hook variable HOOK local to the current buffer. When a hook variable is local, it can have local and global hook functions, and `run-hooks' runs all of them. @@ -489,7 +963,7 @@ more information. Set the current horizontal position as a goal for C-n and C-p. 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 + 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'. @@ -605,14 +1079,14 @@ XEmacs Lisp. (substitute-command-keys "Substrings of the form \\=\\{MAPVAR} are replaced by summaries - \(made by describe-bindings) of the value of MAPVAR, taken as a keymap. + \(made by `describe-bindings') of the value of MAPVAR, taken as a keymap. Substrings of the form \\=\\ specify to use the value of MAPVAR as the keymap for future \\=\\[COMMAND] substrings. \\=\\= quotes the following character and is discarded; thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ into the output.") => "Substrings of the form \{MAPVAR} are replaced by summaries - (made by describe-bindings) of the value of MAPVAR, taken as a keymap. + (made by `describe-bindings') of the value of MAPVAR, taken as a keymap. Substrings of the form \ specify to use the value of MAPVAR as the keymap for future \[COMMAND] substrings. \= quotes the following character and is discarded; @@ -671,440 +1145,3 @@ the character itself. (text-char-description ?\C-\M-m) => "M-^M" - -File: lispref.info, Node: Help Functions, Next: Obsoleteness, Prev: Describing Characters, Up: Documentation - -Help Functions -============== - - XEmacs provides a variety of on-line help functions, all accessible -to the user as subcommands of the prefix `C-h', or on some keyboards, -`help'. For more information about them, see *Note Help: (emacs)Help. -Here we describe some program-level interfaces to the same information. - - - Command: apropos regexp &optional do-all predicate - This function finds all symbols whose names contain a match for the - regular expression REGEXP, and returns a list of them (*note - Regular Expressions::). It also displays the symbols in a buffer - named `*Help*', each with a one-line description. - - If DO-ALL is non-`nil', then `apropos' also shows key bindings for - the functions that are found. - - If PREDICATE is non-`nil', it should be a function to be called on - each symbol that has matched REGEXP. Only symbols for which - PREDICATE returns a non-`nil' value are listed or displayed. - - In the first of the following examples, `apropos' finds all the - symbols with names containing `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 `*Help*' buffer.) - - (apropos "exec") - => (Buffer-menu-execute command-execute exec-directory - exec-path execute-extended-command execute-kbd-macro - executing-kbd-macro executing-macro) - - (apropos "exec" nil 'commandp) - => (Buffer-menu-execute execute-extended-command) - - `apropos' is used by various user-level commands, such as `C-h a' - (`hyper-apropos'), a graphical front-end to `apropos'; and `C-h A' - (`command-apropos'), which does an apropos over only those - functions which are user commands. `command-apropos' calls - `apropos', specifying a PREDICATE to restrict the output to - symbols that are commands. The call to `apropos' looks like this: - - (apropos string t 'commandp) - - - Variable: help-map - The value of this variable is a local keymap for characters - following the Help key, `C-h'. - - - Prefix Command: help-command - This symbol is not a function; its function definition is actually - the keymap known as `help-map'. It is defined in `help.el' as - follows: - - (define-key global-map "\C-h" 'help-command) - (fset 'help-command help-map) - - - Function: 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 FUNCTION to it if FUNCTION is - non-`nil'. Otherwise it calls `message' to display it in the echo - area. - - This function expects to be called inside a - `with-output-to-temp-buffer' special form, and expects - `standard-output' to have the value bound by that special form. - For an example of its use, see the long example in *Note Accessing - Documentation::. - - - Variable: help-char - The value of this variable is the help character--the character - that XEmacs recognizes as meaning Help. By default, it is the - character `?\^H' (ASCII 8), which is `C-h'. When XEmacs reads this - character, if `help-form' is non-`nil' Lisp expression, it - evaluates that expression, and displays the result in a window if - it is a string. - - `help-char' can be a character or a key description such as `help' - or `(meta h)'. - - Usually the value of `help-form''s value is `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 `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 - `describe-prefix-bindings', which displays a list of all the - subcommands of the prefix key. - - - Variable: help-form - If this variable is non-`nil', its value is a form to evaluate - whenever the character `help-char' is read. If evaluating the form - produces a string, that string is displayed. - - A command that calls `next-command-event' or `next-event' probably - should bind `help-form' to a non-`nil' expression while it does - input. (The exception is when `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 - `minibuffer-help-form' (*note Minibuffer Misc::). - - - Variable: 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 - `describe-prefix-bindings'. - - - Function: describe-prefix-bindings - This function calls `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.) - - The following two functions are found in the library `helper'. They -are for modes that want to provide help without relinquishing control, -such as the "electric" modes. You must load that library with -`(require 'helper)' in order to use them. Their names begin with -`Helper' to distinguish them from the ordinary help functions. - - - 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 `describe-bindings'. - - - Command: Helper-help - This command provides help for the current mode. It prompts the - user in the minibuffer with the message `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 `nil'. - - This can be customized by changing the map `Helper-help-map'. - - -File: lispref.info, Node: Obsoleteness, Prev: Help Functions, Up: Documentation - -Obsoleteness -============ - - As you add functionality to a package, you may at times want to -replace an older function with a new one. To preserve compatibility -with existing code, the older function needs to still exist; but users -of that function should be told to use the newer one instead. XEmacs -Lisp lets you mark a function or variable as "obsolete", and indicate -what should be used instead. - - - Function: make-obsolete function new - This function indicates that FUNCTION is an obsolete function, and - the function NEW should be used instead. The byte compiler will - issue a warning to this effect when it encounters a usage of the - older function, and the help system will also note this in the - function's documentation. NEW can also be a string (if there is - not a single function with the same functionality any more), and - should be a descriptive statement, such as "use FOO or BAR - instead" or "this function is unnecessary". - - - Function: make-obsolete-variable variable new - This is like `make-obsolete' but is for variables instead of - functions. - - - Function: define-obsolete-function-alias oldfun newfun - This function combines `make-obsolete' and `define-function', - declaring OLDFUN to be an obsolete variant of NEWFUN and defining - OLDFUN as an alias for NEWFUN. - - - Function: define-obsolete-variable-alias oldvar newvar - This is like `define-obsolete-function-alias' but for variables. - - Note that you should not normally put obsoleteness information -explicitly in a function or variable's doc string. The obsoleteness -information that you specify using the above functions will be displayed -whenever the doc string is displayed, and by adding it explicitly the -result is redundancy. - - Also, if an obsolete function is substantially the same as a newer -one but is not actually an alias, you should consider omitting the doc -string entirely (use a null string `""' as the doc string). That way, -the user is told about the obsoleteness and is forced to look at the -documentation of the new function, making it more likely that he will -use the new function. - - - Function: function-obsoleteness-doc function - If FUNCTION is obsolete, this function returns a string describing - this. This is the message that is printed out during byte - compilation or in the function's documentation. If FUNCTION is - not obsolete, `nil' is returned. - - - Function: variable-obsoleteness-doc variable - This is like `function-obsoleteness-doc' but for variables. - - The obsoleteness information is stored internally by putting a -property `byte-obsolete-info' (for functions) or -`byte-obsolete-variable' (for variables) on the symbol that specifies -the obsolete function or variable. For more information, see the -implementation of `make-obsolete' and `make-obsolete-variable' in -`lisp/bytecomp/bytecomp-runtime.el'. - - -File: lispref.info, Node: Files, Next: Backups and Auto-Saving, Prev: Documentation, Up: Top - -Files -***** - - In XEmacs, you can find, create, view, save, and otherwise work with -files and file directories. This chapter describes most of the -file-related functions of XEmacs Lisp, but a few others are described in -*Note Buffers::, and those related to backups and auto-saving are -described in *Note 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 `expand-file-name', so that `~' is -handled correctly, as are relative file names (including `../'). These -functions don't recognize environment variable substitutions such as -`$HOME'. *Note 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. -* Partial Files:: Treating a section of a buffer as a file. -* Format Conversion:: Conversion to and from various file formats. -* Files and MS-DOS:: Distinguishing text and binary files on MS-DOS. - - -File: lispref.info, Node: Visiting Files, Next: Saving Buffers, Up: Files - -Visiting Files -============== - - Visiting a file means reading a file into a buffer. Once this is -done, we say that the buffer is "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 XEmacs 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 -"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. - - -File: lispref.info, Node: Visiting Functions, Next: Subroutines of Visiting, Up: Visiting Files - -Functions for Visiting Files ----------------------------- - - This section describes the functions normally used to visit files. -For historical reasons, these functions have names starting with -`find-' rather than `visit-'. *Note 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 `insert-file-contents' in a -temporary buffer. Visiting the file is not necessary and takes longer. -*Note Reading from Files::. - - - Command: find-file filename - This command selects a buffer visiting the file 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 `find-file' function is very simple and looks like - this: - - (switch-to-buffer (find-file-noselect filename)) - - (See `switch-to-buffer' in *Note Displaying Buffers::.) - - When `find-file' is called interactively, it prompts for FILENAME - in the minibuffer. - - - Function: find-file-noselect filename &optional nowarn - This function is the guts of all the file-visiting functions. It - finds or creates a buffer visiting the file 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 `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 - `yes', any changes previously made in the buffer are lost. - - If `find-file-noselect' needs to create a buffer, and there is no - file named FILENAME, it displays the message `New file' in the - echo area, and leaves the buffer empty. - - If NO-WARN is non-`nil', various warnings that XEmacs normally - gives (e.g. if another buffer is already visiting FILENAME but - FILENAME has been removed from disk since that buffer was created) - are suppressed. - - The `find-file-noselect' function calls `after-find-file' after - reading the file (*note 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 - `find-file-hooks'. - - The `find-file-noselect' function returns the buffer that is - visiting the file FILENAME. - - (find-file-noselect "/etc/fstab") - => # - - - Command: find-file-other-window filename - This command selects a buffer visiting the file FILENAME, but does - so in a window other than the selected window. It may use another - existing window or split a window; see *Note Displaying Buffers::. - - When this command is called interactively, it prompts for FILENAME. - - - Command: find-file-read-only filename - This command selects a buffer visiting the file FILENAME, like - `find-file', but it marks the buffer as read-only. *Note Read - Only Buffers::, for related functions and variables. - - When this command is called interactively, it prompts for FILENAME. - - - Command: view-file filename - This command visits 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 `view-mode-hook'. *Note Hooks::. - - When `view-file' is called interactively, it prompts for FILENAME. - - - Variable: 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. - - - Variable: find-file-not-found-hooks - The value of this variable is a list of functions to be called when - `find-file' or `find-file-noselect' is passed a nonexistent file - name. `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-`nil'. `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. - - -File: lispref.info, Node: Subroutines of Visiting, Prev: Visiting Functions, Up: Visiting Files - -Subroutines of Visiting ------------------------ - - The `find-file-noselect' function uses the `create-file-buffer' and -`after-find-file' functions as subroutines. Sometimes it is useful to -call them directly. - - - Function: create-file-buffer filename - This function creates a suitably named buffer for visiting - FILENAME, and returns it. It uses FILENAME (sans directory) as - the name if that name is free; otherwise, it appends a string such - as `<2>' to get an unused name. See also *Note Creating Buffers::. - - *Please note:* `create-file-buffer' does _not_ associate the new - buffer with a file and does not select the buffer. It also does - not use the default major mode. - - (create-file-buffer "foo") - => # - (create-file-buffer "foo") - => #> - (create-file-buffer "foo") - => #> - - This function is used by `find-file-noselect'. It uses - `generate-new-buffer' (*note Creating Buffers::). - - - Function: after-find-file &optional error warn noauto - This function sets the buffer major mode, and parses local - variables (*note Auto Major Mode::). It is called by - `find-file-noselect' and by the default revert function (*note - Reverting::). - - If reading the file got an error because the file does not exist, - but its directory does exist, the caller should pass a non-`nil' - value for ERROR. In that case, `after-find-file' issues a warning: - `(New File)'. For more serious errors, the caller should usually - not call `after-find-file'. - - If WARN is non-`nil', then this function issues a warning if an - auto-save file exists and is more recent than the visited file. - - If NOAUTO is non-`nil', then this function does not turn on - auto-save mode; otherwise, it does. - - The last thing `after-find-file' does is call all the functions in - `find-file-hooks'. - diff --git a/info/lispref.info-23 b/info/lispref.info-23 index fa1b689..fa5cce6 100644 --- a/info/lispref.info-23 +++ b/info/lispref.info-23 @@ -50,6 +50,446 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Help Functions, Next: Obsoleteness, Prev: Describing Characters, Up: Documentation + +Help Functions +============== + + XEmacs provides a variety of on-line help functions, all accessible +to the user as subcommands of the prefix `C-h', or on some keyboards, +`help'. For more information about them, see *Note Help: (emacs)Help. +Here we describe some program-level interfaces to the same information. + + - Command: apropos regexp &optional do-all predicate + This function finds all symbols whose names contain a match for the + regular expression REGEXP, and returns a list of them (*note + Regular Expressions::). It also displays the symbols in a buffer + named `*Help*', each with a one-line description. + + If DO-ALL is non-`nil', then `apropos' also shows key bindings for + the functions that are found. + + If PREDICATE is non-`nil', it should be a function to be called on + each symbol that has matched REGEXP. Only symbols for which + PREDICATE returns a non-`nil' value are listed or displayed. + + In the first of the following examples, `apropos' finds all the + symbols with names containing `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 `*Help*' buffer.) + + (apropos "exec") + => (Buffer-menu-execute command-execute exec-directory + exec-path execute-extended-command execute-kbd-macro + executing-kbd-macro executing-macro) + + (apropos "exec" nil 'commandp) + => (Buffer-menu-execute execute-extended-command) + + `apropos' is used by various user-level commands, such as `C-h a' + (`hyper-apropos'), a graphical front-end to `apropos'; and `C-h A' + (`command-apropos'), which does an apropos over only those + functions which are user commands. `command-apropos' calls + `apropos', specifying a PREDICATE to restrict the output to + symbols that are commands. The call to `apropos' looks like this: + + (apropos string t 'commandp) + + - Variable: help-map + The value of this variable is a local keymap for characters + following the Help key, `C-h'. + + - Prefix Command: help-command + This symbol is not a function; its function definition is actually + the keymap known as `help-map'. It is defined in `help.el' as + follows: + + (define-key global-map "\C-h" 'help-command) + (fset 'help-command help-map) + + - Function: 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 FUNCTION to it if FUNCTION is + non-`nil'. Otherwise it calls `message' to display it in the echo + area. + + This function expects to be called inside a + `with-output-to-temp-buffer' special form, and expects + `standard-output' to have the value bound by that special form. + For an example of its use, see the long example in *Note Accessing + Documentation::. + + - Variable: help-char + The value of this variable is the help character--the character + that XEmacs recognizes as meaning Help. By default, it is the + character `?\^H' (ASCII 8), which is `C-h'. When XEmacs reads this + character, if `help-form' is non-`nil' Lisp expression, it + evaluates that expression, and displays the result in a window if + it is a string. + + `help-char' can be a character or a key description such as `help' + or `(meta h)'. + + Usually the value of `help-form''s value is `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 `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 + `describe-prefix-bindings', which displays a list of all the + subcommands of the prefix key. + + - Variable: help-form + If this variable is non-`nil', its value is a form to evaluate + whenever the character `help-char' is read. If evaluating the form + produces a string, that string is displayed. + + A command that calls `next-command-event' or `next-event' probably + should bind `help-form' to a non-`nil' expression while it does + input. (The exception is when `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 + `minibuffer-help-form' (*note Minibuffer Misc::). + + - Variable: 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 + `describe-prefix-bindings'. + + - Command: describe-prefix-bindings + This function calls `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.) + + The following two functions are found in the library `helper'. They +are for modes that want to provide help without relinquishing control, +such as the "electric" modes. You must load that library with +`(require 'helper)' in order to use them. Their names begin with +`Helper' to distinguish them from the ordinary help functions. + + - 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 `describe-bindings'. + + - Command: Helper-help + This command provides help for the current mode. It prompts the + user in the minibuffer with the message `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 `nil'. + + This can be customized by changing the map `Helper-help-map'. + + +File: lispref.info, Node: Obsoleteness, Prev: Help Functions, Up: Documentation + +Obsoleteness +============ + + As you add functionality to a package, you may at times want to +replace an older function with a new one. To preserve compatibility +with existing code, the older function needs to still exist; but users +of that function should be told to use the newer one instead. XEmacs +Lisp lets you mark a function or variable as "obsolete", and indicate +what should be used instead. + + - Command: make-obsolete function new + This function indicates that FUNCTION is an obsolete function, and + the function NEW should be used instead. The byte compiler will + issue a warning to this effect when it encounters a usage of the + older function, and the help system will also note this in the + function's documentation. NEW can also be a string (if there is + not a single function with the same functionality any more), and + should be a descriptive statement, such as "use FOO or BAR + instead" or "this function is unnecessary". + + - Command: make-obsolete-variable variable new + This is like `make-obsolete' but is for variables instead of + functions. + + - Function: define-obsolete-function-alias oldfun newfun + This function combines `make-obsolete' and `define-function', + declaring OLDFUN to be an obsolete variant of NEWFUN and defining + OLDFUN as an alias for NEWFUN. + + - Function: define-obsolete-variable-alias oldvar newvar + This is like `define-obsolete-function-alias' but for variables. + + Note that you should not normally put obsoleteness information +explicitly in a function or variable's doc string. The obsoleteness +information that you specify using the above functions will be displayed +whenever the doc string is displayed, and by adding it explicitly the +result is redundancy. + + Also, if an obsolete function is substantially the same as a newer +one but is not actually an alias, you should consider omitting the doc +string entirely (use a null string `""' as the doc string). That way, +the user is told about the obsoleteness and is forced to look at the +documentation of the new function, making it more likely that he will +use the new function. + + - Function: function-obsoleteness-doc function + If FUNCTION is obsolete, this function returns a string describing + this. This is the message that is printed out during byte + compilation or in the function's documentation. If FUNCTION is + not obsolete, `nil' is returned. + + - Function: variable-obsoleteness-doc variable + This is like `function-obsoleteness-doc' but for variables. + + The obsoleteness information is stored internally by putting a +property `byte-obsolete-info' (for functions) or +`byte-obsolete-variable' (for variables) on the symbol that specifies +the obsolete function or variable. For more information, see the +implementation of `make-obsolete' and `make-obsolete-variable' in +`lisp/bytecomp/bytecomp-runtime.el'. + + +File: lispref.info, Node: Files, Next: Backups and Auto-Saving, Prev: Documentation, Up: Top + +Files +***** + + In XEmacs, you can find, create, view, save, and otherwise work with +files and file directories. This chapter describes most of the +file-related functions of XEmacs Lisp, but a few others are described in +*Note Buffers::, and those related to backups and auto-saving are +described in *Note 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 `expand-file-name', so that `~' is +handled correctly, as are relative file names (including `../'). These +functions don't recognize environment variable substitutions such as +`$HOME'. *Note 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. +* Partial Files:: Treating a section of a buffer as a file. +* Format Conversion:: Conversion to and from various file formats. +* Files and MS-DOS:: Distinguishing text and binary files on MS-DOS. + + +File: lispref.info, Node: Visiting Files, Next: Saving Buffers, Up: Files + +Visiting Files +============== + + Visiting a file means reading a file into a buffer. Once this is +done, we say that the buffer is "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 XEmacs 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 +"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. + + +File: lispref.info, Node: Visiting Functions, Next: Subroutines of Visiting, Up: Visiting Files + +Functions for Visiting Files +---------------------------- + + This section describes the functions normally used to visit files. +For historical reasons, these functions have names starting with +`find-' rather than `visit-'. *Note 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 `insert-file-contents' in a +temporary buffer. Visiting the file is not necessary and takes longer. +*Note Reading from Files::. + + - Command: find-file filename + This command selects a buffer visiting the file 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 `find-file' function is very simple and looks like + this: + + (switch-to-buffer (find-file-noselect filename)) + + (See `switch-to-buffer' in *Note Displaying Buffers::.) + + When `find-file' is called interactively, it prompts for FILENAME + in the minibuffer. + + - Function: find-file-noselect filename &optional nowarn + This function is the guts of all the file-visiting functions. It + finds or creates a buffer visiting the file 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 `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 + `yes', any changes previously made in the buffer are lost. + + If `find-file-noselect' needs to create a buffer, and there is no + file named FILENAME, it displays the message `New file' in the + echo area, and leaves the buffer empty. + + If NOWARN is non-`nil', various warnings that XEmacs normally + gives (e.g. if another buffer is already visiting FILENAME but + FILENAME has been removed from disk since that buffer was created) + are suppressed. + + The `find-file-noselect' function calls `after-find-file' after + reading the file (*note 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 + `find-file-hooks'. + + The `find-file-noselect' function returns the buffer that is + visiting the file FILENAME. + + (find-file-noselect "/etc/fstab") + => # + + - Command: find-file-other-window filename + This command selects a buffer visiting the file FILENAME, but does + so in a window other than the selected window. It may use another + existing window or split a window; see *Note Displaying Buffers::. + + When this command is called interactively, it prompts for FILENAME. + + - Command: find-file-read-only filename + This command selects a buffer visiting the file FILENAME, like + `find-file', but it marks the buffer as read-only. *Note Read + Only Buffers::, for related functions and variables. + + When this command is called interactively, it prompts for FILENAME. + + - Command: view-file filename &optional other-window-p + This command visits 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 `view-mode-hook'. *Note Hooks::. + + When `view-file' is called interactively, it prompts for FILENAME. + + With non-`nil' prefix arg OTHER-WINDOW-P, visit FILENAME in + another window. + + - Variable: 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. + + - Variable: find-file-not-found-hooks + The value of this variable is a list of functions to be called when + `find-file' or `find-file-noselect' is passed a nonexistent file + name. `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-`nil'. `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. + + +File: lispref.info, Node: Subroutines of Visiting, Prev: Visiting Functions, Up: Visiting Files + +Subroutines of Visiting +----------------------- + + The `find-file-noselect' function uses the `create-file-buffer' and +`after-find-file' functions as subroutines. Sometimes it is useful to +call them directly. + + - Function: create-file-buffer filename + This function creates a suitably named buffer for visiting + FILENAME, and returns it. It uses FILENAME (sans directory) as + the name if that name is free; otherwise, it appends a string such + as `<2>' to get an unused name. See also *Note Creating Buffers::. + + *Please note:* `create-file-buffer' does _not_ associate the new + buffer with a file and does not select the buffer. It also does + not use the default major mode. + + (create-file-buffer "foo") + => # + (create-file-buffer "foo") + => #> + (create-file-buffer "foo") + => #> + + This function is used by `find-file-noselect'. It uses + `generate-new-buffer' (*note Creating Buffers::). + + - Function: after-find-file &optional error warn noauto + This function sets the buffer major mode, and parses local + variables (*note Auto Major Mode::). It is called by + `find-file-noselect' and by the default revert function (*note + Reverting::). + + If reading the file got an error because the file does not exist, + but its directory does exist, the caller should pass a non-`nil' + value for ERROR. In that case, `after-find-file' issues a warning: + `(New File)'. For more serious errors, the caller should usually + not call `after-find-file'. + + If WARN is non-`nil', then this function issues a warning if an + auto-save file exists and is more recent than the visited file. + + If NOAUTO is non-`nil', then this function does not turn on + auto-save mode; otherwise, it does. + + The last thing `after-find-file' does is call all the functions in + `find-file-hooks'. + + File: lispref.info, Node: Saving Buffers, Next: Reading from Files, Prev: Visiting Files, Up: Files Saving Buffers @@ -188,7 +628,7 @@ Reading from Files the `insert-file-contents' function. Don't use the user-level command `insert-file' in a Lisp program, as that sets the mark. - - Function: insert-file-contents filename &optional visit beg end + - Function: insert-file-contents filename &optional visit start end replace This function inserts the contents of file FILENAME into the current buffer after point. It returns a list of the absolute @@ -207,7 +647,7 @@ the `insert-file-contents' function. Don't use the user-level command file name and its last save file modtime. This feature is used by `find-file-noselect' and you probably should not use it yourself. - If BEG and END are non-`nil', they should be integers specifying + If START and END are non-`nil', they should be integers specifying the portion of the file to insert. In this case, VISIT must be `nil'. For example, @@ -324,10 +764,10 @@ cases of simultaneous editing; see *Note Modification Time::. the file should not be locked, so this function does nothing. It also does nothing if the current buffer is not visiting a file. - - Function: ask-user-about-lock file other-user - This function is called when the user tries to modify FILE, but it - is locked by another user named OTHER-USER. The value it returns - determines what happens next: + - Function: ask-user-about-lock filename other-user + This function is called when the user tries to modify FILENAME, + but it is locked by another user named OTHER-USER. The value it + returns determines what happens next: * A value of `t' says to grab the lock on the file. Then this user may edit the file and OTHER-USER loses the lock. @@ -341,9 +781,9 @@ cases of simultaneous editing; see *Note Modification Time::. The error message for this error looks like this: - error--> File is locked: FILE OTHER-USER + error--> File is locked: FILENAME OTHER-USER - where `file' is the name of the file and OTHER-USER is the + where FILENAME is the name of the file and OTHER-USER is the name of the user who has locked the file. The default definition of this function asks the user to choose @@ -696,563 +1136,3 @@ and modification. `-32252' is on file system number -32252. - -File: lispref.info, Node: Changing File Attributes, Next: File Names, Prev: Information about Files, Up: Files - -Changing File Names and Attributes -================================== - - The functions in this section rename, copy, delete, link, and set the -modes of files. - - In the functions that have an argument NEWNAME, if a file by the -name of NEWNAME already exists, the actions taken depend on the value -of the argument OK-IF-ALREADY-EXISTS: - - * Signal a `file-already-exists' error if OK-IF-ALREADY-EXISTS is - `nil'. - - * Request confirmation if OK-IF-ALREADY-EXISTS is a number. - - * Replace the old file without confirmation if OK-IF-ALREADY-EXISTS - is any other value. - - - Command: add-name-to-file oldname newname &optional - ok-if-already-exists - This function gives the file named OLDNAME the additional name - NEWNAME. This means that NEWNAME becomes a new "hard link" to - OLDNAME. - - In the first part of the following example, we list two files, - `foo' and `foo3'. - - % 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 - - Then we evaluate the form `(add-name-to-file "~/lewis/foo" - "~/lewis/foo2")'. Again we list the files. This shows two names, - `foo' and `foo2'. - - (add-name-to-file "~/lewis/foo1" "~/lewis/foo2") - => nil - - % 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 - - Finally, we evaluate the following: - - (add-name-to-file "~/lewis/foo" "~/lewis/foo3" t) - - and list the files again. Now there are three names for one file: - `foo', `foo2', and `foo3'. The old contents of `foo3' are lost. - - (add-name-to-file "~/lewis/foo1" "~/lewis/foo3") - => nil - - % 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 - - This function is meaningless on VMS, where multiple names for one - file are not allowed. - - See also `file-nlinks' in *Note File Attributes::. - - - Command: rename-file filename newname &optional ok-if-already-exists - This command renames the file FILENAME as NEWNAME. - - If FILENAME has additional names aside from FILENAME, it continues - to have those names. In fact, adding the name NEWNAME with - `add-name-to-file' and then deleting FILENAME has the same effect - as renaming, aside from momentary intermediate states. - - In an interactive call, this function prompts for FILENAME and - NEWNAME in the minibuffer; also, it requests confirmation if - NEWNAME already exists. - - - Command: copy-file oldname newname &optional ok-if-exists time - This command copies the file OLDNAME to NEWNAME. An error is - signaled if OLDNAME does not exist. - - If TIME is non-`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 FILENAME and - NEWNAME in the minibuffer; also, it requests confirmation if - NEWNAME already exists. - - - Command: delete-file filename - This command deletes the file FILENAME, like the shell command `rm - FILENAME'. If the file has multiple names, it continues to exist - under the other names. - - A suitable kind of `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 `delete-directory' in *Note Create/Delete Dirs::. - - - Command: make-symbolic-link filename newname &optional ok-if-exists - This command makes a symbolic link to FILENAME, named NEWNAME. - This is like the shell command `ln -s FILENAME NEWNAME'. - - In an interactive call, this function prompts for FILENAME and - NEWNAME in the minibuffer; also, it requests confirmation if - NEWNAME already exists. - - - Function: define-logical-name varname string - This function defines the logical name NAME to have the value - STRING. It is available only on VMS. - - - Function: set-file-modes filename mode - This function sets mode bits of FILENAME to MODE (which must be an - integer). Only the low 12 bits of MODE are used. - - - Function: set-default-file-modes mode - This function sets the default file protection for new files - created by XEmacs and its subprocesses. Every file created with - XEmacs initially has this protection. On Unix, the default - protection is the bitwise complement of the "umask" value. - - The argument MODE must be an integer. Only the low 9 bits of 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. - - - Function: default-file-modes - This function returns the current default protection value. - - 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 `.com', `.bat' -or `.exe'. This is reflected in the values returned by `file-modes' -and `file-attributes'. - - -File: lispref.info, Node: File Names, Next: Contents of Directories, Prev: Changing File Attributes, Up: Files - -File Names -========== - - Files are generally referred to by their names, in XEmacs as -elsewhere. File names in XEmacs are represented as strings. The -functions that operate on a file all expect a file name argument. - - In addition to operating on files themselves, XEmacs 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. -* User Name Completion:: Finding the completions for a given user name. - - -File: lispref.info, Node: File Name Components, Next: Directory Names, Up: File Names - -File Name Components --------------------- - - 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, XEmacs considers a file name as having two main -parts: the "directory name" part, and the "nondirectory" part (or "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 "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 XEmacs -omits the version number. Version numbers are found mostly in -directory lists. - - - Function: file-name-directory filename - This function returns the directory part of FILENAME (or `nil' if - 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 `:', `]', or `>'. - - (file-name-directory "lewis/foo") ; Unix example - => "lewis/" - (file-name-directory "foo") ; Unix example - => nil - (file-name-directory "[X]FOO.TMP") ; VMS example - => "[X]" - - - Function: file-name-nondirectory filename - This function returns the nondirectory part of FILENAME. - - (file-name-nondirectory "lewis/foo") - => "foo" - (file-name-nondirectory "foo") - => "foo" - ;; The following example is accurate only on VMS. - (file-name-nondirectory "[X]FOO.TMP") - => "FOO.TMP" - - - Function: file-name-sans-versions filename &optional - keep-backup-version - This function returns FILENAME without any file version numbers, - backup version numbers, or trailing tildes. - - If KEEP-BACKUP-VERSION is non-`nil', we do not remove backup - version numbers, only true file version numbers. - - (file-name-sans-versions "~rms/foo.~1~") - => "~rms/foo" - (file-name-sans-versions "~rms/foo~") - => "~rms/foo" - (file-name-sans-versions "~rms/foo") - => "~rms/foo" - ;; The following example applies to VMS only. - (file-name-sans-versions "foo;23") - => "foo" - - - Function: file-name-sans-extension filename - This function returns FILENAME minus its "extension," if any. The - extension, in a file name, is the part that starts with the last - `.' in the last name component. For example, - - (file-name-sans-extension "foo.lose.c") - => "foo.lose" - (file-name-sans-extension "big.hack/foo") - => "big.hack/foo" - - -File: lispref.info, Node: Directory Names, Next: Relative File Names, Prev: File Name Components, Up: File Names - -Directory Names ---------------- - - A "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 XEmacs 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 `$HOME', and the constructs `~', and `..'. - - - Function: file-name-as-directory filename - This function returns a string representing 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 `[X]Y.DIR.1' to - the form `[X.Y]'. - - (file-name-as-directory "~rms/lewis") - => "~rms/lewis/" - - - Function: directory-file-name dirname - This function returns a string representing 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 `[X.Y]' to `[X]Y.DIR.1'. - - (directory-file-name "~lewis/") - => "~lewis" - - 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, XEmacs shows users the -abbreviation instead. - - If you wish to convert a directory name to its abbreviation, use this -function: - - - Function: abbreviate-file-name dirname &optional hack-homedir - This function applies abbreviations from `directory-abbrev-alist' - to its argument, and substitutes `~' for the user's home directory. - - If HACK-HOMEDIR is non-`nil', then this also substitutes `~' for - the user's home directory. - - - - Variable: directory-abbrev-alist - The variable `directory-abbrev-alist' contains an alist of - abbreviations to use for file directories. Each element has the - form `(FROM . TO)', and says to replace FROM with TO when it - appears in a directory name. The FROM string is actually a - regular expression; it should always start with `^'. The function - `abbreviate-file-name' performs these substitutions. - - You can set this variable in `site-init.el' to describe the - abbreviations appropriate for your site. - - Here's an example, from a system on which file system `/home/fsf' - and so on are normally accessed through symbolic links named `/fsf' - and so on. - - (("^/home/fsf" . "/fsf") - ("^/home/gp" . "/gp") - ("^/home/gd" . "/gd")) - - -File: lispref.info, Node: Relative File Names, Next: File Name Expansion, Prev: Directory Names, Up: File Names - -Absolute and Relative File Names --------------------------------- - - 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 "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 "relative" file -name. On Unix, an absolute file name starts with a slash or a tilde -(`~'), and a relative one does not. The rules on VMS are complicated. - - - Function: file-name-absolute-p filename - This function returns `t' if file FILENAME is an absolute file - name, `nil' otherwise. On VMS, this function understands both - Unix syntax and VMS syntax. - - (file-name-absolute-p "~rms/foo") - => t - (file-name-absolute-p "rms/foo") - => nil - (file-name-absolute-p "/user/rms/foo") - => t - - -File: lispref.info, Node: File Name Expansion, Next: Unique File Names, Prev: Relative File Names, Up: File Names - -Functions that Expand Filenames -------------------------------- - - "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 `./' and `NAME/../'. - - - Function: expand-file-name filename &optional directory - This function converts FILENAME to an absolute file name. If - DIRECTORY is supplied, it is the directory to start with if - FILENAME is relative. (The value of DIRECTORY should itself be an - absolute directory name; it may start with `~'.) Otherwise, the - current buffer's value of `default-directory' is used. For - example: - - (expand-file-name "foo") - => "/xcssun/users/rms/lewis/foo" - (expand-file-name "../foo") - => "/xcssun/users/rms/foo" - (expand-file-name "foo" "/usr/spool/") - => "/usr/spool/foo" - (expand-file-name "$HOME/foo") - => "/xcssun/users/rms/lewis/$HOME/foo" - - Filenames containing `.' or `..' are simplified to their canonical - form: - - (expand-file-name "bar/../foo") - => "/xcssun/users/rms/lewis/foo" - - `~/' at the beginning is expanded into the user's home directory. - A `/' or `~' following a `/'. - - Note that `expand-file-name' does _not_ expand environment - variables; only `substitute-in-file-name' does that. - - - Function: file-relative-name filename &optional directory - This function does the inverse of expansion--it tries to return a - relative name that is equivalent to FILENAME when interpreted - relative to DIRECTORY. - - If DIRECTORY is `nil' or omitted, the value of `default-directory' - is used. - - (file-relative-name "/foo/bar" "/foo/") - => "bar") - (file-relative-name "/foo/bar" "/hack/") - => "../foo/bar") - - - Variable: 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 `~'. This variable is local in every buffer. - - `expand-file-name' uses the default directory when its second - argument is `nil'. - - On Unix systems, the value is always a string ending with a slash. - - default-directory - => "/user/lewis/manual/" - - - Function: substitute-in-file-name filename - This function replaces environment variable references in FILENAME - with the environment variable values. Following standard Unix - shell syntax, `$' is the prefix to substitute an environment - variable value. - - The environment variable name is the series of alphanumeric - characters (including underscores) that follow the `$'. If the - character following the `$' is a `{', then the variable name is - everything up to the matching `}'. - - Here we assume that the environment variable `HOME', which holds - the user's home directory name, has value `/xcssun/users/rms'. - - (substitute-in-file-name "$HOME/foo") - => "/xcssun/users/rms/foo" - - After substitution, a `/' or `~' following a `/' is taken to be - the start of an absolute file name that overrides what precedes - it, so everything before that `/' or `~' is deleted. For example: - - (substitute-in-file-name "bar/~/foo") - => "~/foo" - (substitute-in-file-name "/usr/local/$HOME/foo") - => "/xcssun/users/rms/foo" - - On VMS, `$' substitution is not done, so this function does nothing - on VMS except discard superfluous initial components as shown - above. - - -File: lispref.info, Node: Unique File Names, Next: File Name Completion, Prev: File Name Expansion, Up: File Names - -Generating Unique File Names ----------------------------- - - Some programs need to write temporary files. Here is the usual way -to construct a name for such a file: - - (make-temp-name (expand-file-name NAME-OF-APPLICATION (temp-directory))) - -Here we use `(temp-directory)' to specify a directory for temporary -files--under Unix, it will normally evaluate to `"/tmp/"'. The job of -`make-temp-name' is to prevent two different users or two different -processes from trying to use the same name. - - - Function: temp-directory - This function returns the name of the directory to use for - temporary files. Under Unix, this will be the value of `TMPDIR', - defaulting to `/tmp'. On Windows, this will be obtained from the - `TEMP' or `TMP' environment variables, defaulting to `/'. - - Note that the `temp-directory' function does not exist under FSF - Emacs. - - - Function: make-temp-name prefix - This function generates a temporary file name starting with - PREFIX. The Emacs process number forms part of the result, so - there is no danger of generating a name being used by another - process. - - (make-temp-name "/tmp/foo") - => "/tmp/fooGaAQjC" - - In addition, this function makes an attempt to choose a name that - does not specify an existing file. To make this work, PREFIX - should be an absolute file name. - - To avoid confusion, each Lisp application should preferably use a - unique PREFIX to `make-temp-name'. - - -File: lispref.info, Node: File Name Completion, Next: User Name Completion, Prev: Unique File Names, Up: File Names - -File Name Completion --------------------- - - This section describes low-level subroutines for completing a file -name. For other completion functions, see *Note Completion::. - - - Function: file-name-all-completions partial-filename directory - This function returns a list of all possible completions for a file - whose name starts with PARTIAL-FILENAME in directory 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 PARTIAL-FILENAME must be a file name containing no - directory part and no slash. The current buffer's default - directory is prepended to DIRECTORY, if DIRECTORY is not absolute. - - In the following example, suppose that the current default - directory, `~rms/lewis', has five files whose names begin with `f': - `foo', `file~', `file.c', `file.c.~1~', and `file.c.~2~'. - - (file-name-all-completions "f" "") - => ("foo" "file~" "file.c.~2~" - "file.c.~1~" "file.c") - - (file-name-all-completions "fo" "") - => ("foo") - - - Function: file-name-completion filename directory - This function completes the file name FILENAME in directory - DIRECTORY. It returns the longest prefix common to all file names - in directory DIRECTORY that start with FILENAME. - - If only one match exists and FILENAME matches it exactly, the - function returns `t'. The function returns `nil' if directory - DIRECTORY contains no name starting with FILENAME. - - In the following example, suppose that the current default - directory has five files whose names begin with `f': `foo', - `file~', `file.c', `file.c.~1~', and `file.c.~2~'. - - (file-name-completion "fi" "") - => "file" - - (file-name-completion "file.c.~1" "") - => "file.c.~1~" - - (file-name-completion "file.c.~1~" "") - => t - - (file-name-completion "file.c.~3" "") - => nil - - - User Option: completion-ignored-extensions - `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. - - A typical value might look like this: - - completion-ignored-extensions - => (".o" ".elc" "~" ".dvi") - diff --git a/info/lispref.info-24 b/info/lispref.info-24 index f8d1d65..a777571 100644 --- a/info/lispref.info-24 +++ b/info/lispref.info-24 @@ -50,6 +50,555 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Changing File Attributes, Next: File Names, Prev: Information about Files, Up: Files + +Changing File Names and Attributes +================================== + + The functions in this section rename, copy, delete, link, and set the +modes of files. + + In the functions that have arguments NEWNAME and +OK-IF-ALREADY-EXISTS, if a file by the name of NEWNAME already exists, +the actions taken depend on the value of OK-IF-ALREADY-EXISTS: + + * Signal a `file-already-exists' error if OK-IF-ALREADY-EXISTS is + `nil'. + + * Request confirmation if OK-IF-ALREADY-EXISTS is a number. This is + what happens when the function is invoked interactively. + + * Replace the old file without confirmation if OK-IF-ALREADY-EXISTS + is any other value. + + - Command: add-name-to-file filename newname &optional + ok-if-already-exists + This function gives the file named FILENAME the additional name + NEWNAME. This means that NEWNAME becomes a new "hard link" to + FILENAME. Both these arguments must be strings. + + In the first part of the following example, we list two files, + `foo' and `foo3'. + + % 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 + + Then we evaluate the form `(add-name-to-file "~/lewis/foo" + "~/lewis/foo2")'. Again we list the files. This shows two names, + `foo' and `foo2'. + + (add-name-to-file "~/lewis/foo1" "~/lewis/foo2") + => nil + + % 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 + + Finally, we evaluate the following: + + (add-name-to-file "~/lewis/foo" "~/lewis/foo3" t) + + and list the files again. Now there are three names for one file: + `foo', `foo2', and `foo3'. The old contents of `foo3' are lost. + + (add-name-to-file "~/lewis/foo1" "~/lewis/foo3") + => nil + + % 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 + + This function is meaningless on non-Unix systems, where multiple + names for one file are not allowed. + + See also `file-nlinks' in *Note File Attributes::. + + - Command: rename-file filename newname &optional ok-if-already-exists + This command renames the file FILENAME as NEWNAME. + + If FILENAME has additional names aside from FILENAME, it continues + to have those names. In fact, adding the name NEWNAME with + `add-name-to-file' and then deleting FILENAME has the same effect + as renaming, aside from momentary intermediate states. + + In an interactive call, this function prompts for FILENAME and + NEWNAME in the minibuffer; also, it requests confirmation if + NEWNAME already exists. + + - Command: copy-file filename newname &optional ok-if-already-exists + time + This command copies the file FILENAME to NEWNAME. An error is + signaled if FILENAME does not exist. + + If TIME is non-`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 FILENAME and + NEWNAME in the minibuffer; also, it requests confirmation if + NEWNAME already exists. + + - Command: delete-file filename + This command deletes the file FILENAME, like the shell command `rm + FILENAME'. If the file has multiple names, it continues to exist + under the other names. + + A suitable kind of `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 `delete-directory' in *Note Create/Delete Dirs::. + + - Command: make-symbolic-link filename newname &optional + ok-if-already-exists + This command makes a symbolic link to FILENAME, named NEWNAME. + This is like the shell command `ln -s FILENAME NEWNAME'. + + In an interactive call, this function prompts for FILENAME and + NEWNAME in the minibuffer; also, it requests confirmation if + NEWNAME already exists. + + - Function: set-file-modes filename mode + This function sets mode bits of FILENAME to MODE (which must be an + integer). Only the low 12 bits of MODE are used. + + - Function: set-default-file-modes mode + This function sets the default file protection for new files + created by XEmacs and its subprocesses. Every file created with + XEmacs initially has this protection. On Unix, the default + protection is the bitwise complement of the "umask" value. + + The argument MODE must be an integer. Only the low 9 bits of 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. + + - Function: default-file-modes + This function returns the current default protection value. + + 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 `.com', `.bat' +or `.exe'. This is reflected in the values returned by `file-modes' +and `file-attributes'. + + +File: lispref.info, Node: File Names, Next: Contents of Directories, Prev: Changing File Attributes, Up: Files + +File Names +========== + + Files are generally referred to by their names, in XEmacs as +elsewhere. File names in XEmacs are represented as strings. The +functions that operate on a file all expect a file name argument. + + In addition to operating on files themselves, XEmacs 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 MS-DOS, these functions understand MS-DOS file-name syntax as +well as Unix syntax. This is so that all the standard Lisp libraries +can specify file names in Unix syntax and work properly on all systems +without change. Similarly for other operating systems. + +* 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. +* User Name Completion:: Finding the completions for a given user name. + + +File: lispref.info, Node: File Name Components, Next: Directory Names, Up: File Names + +File Name Components +-------------------- + + 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, XEmacs considers a file name as having two main +parts: the "directory name" part, and the "nondirectory" part (or "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. + + For some purposes, the nondirectory part is further subdivided into +the name proper and the "version number". On Unix, only backup files +have version numbers in their names. + + - Function: file-name-directory filename + This function returns the directory part of FILENAME (or `nil' if + FILENAME does not include a directory part). On Unix, the + function returns a string ending in a slash. + + (file-name-directory "lewis/foo") ; Unix example + => "lewis/" + (file-name-directory "foo") ; Unix example + => nil + + - Function: file-name-nondirectory filename + This function returns the nondirectory part of FILENAME. + + (file-name-nondirectory "lewis/foo") + => "foo" + (file-name-nondirectory "foo") + => "foo" + + - Function: file-name-sans-versions filename &optional + keep-backup-version + This function returns FILENAME without any file version numbers, + backup version numbers, or trailing tildes. + + If KEEP-BACKUP-VERSION is non-`nil', we do not remove backup + version numbers, only true file version numbers. + + (file-name-sans-versions "~rms/foo.~1~") + => "~rms/foo" + (file-name-sans-versions "~rms/foo~") + => "~rms/foo" + (file-name-sans-versions "~rms/foo") + => "~rms/foo" + + - Function: file-name-sans-extension filename + This function returns FILENAME minus its "extension," if any. The + extension, in a file name, is the part that starts with the last + `.' in the last name component. For example, + + (file-name-sans-extension "foo.lose.c") + => "foo.lose" + (file-name-sans-extension "big.hack/foo") + => "big.hack/foo" + + +File: lispref.info, Node: Directory Names, Next: Relative File Names, Prev: File Name Components, Up: File Names + +Directory Names +--------------- + + A "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. + + The difference between a directory name and its name as a file is +subtle but crucial. When an XEmacs 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 `$HOME', and the constructs `~', and `..'. + + - Function: file-name-as-directory filename + This function returns a string representing 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. + + (file-name-as-directory "~rms/lewis") + => "~rms/lewis/" + + - Function: directory-file-name dirname + This function returns a string representing 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. + + (directory-file-name "~lewis/") + => "~lewis" + + 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, XEmacs shows users the +abbreviation instead. + + If you wish to convert a directory name to its abbreviation, use this +function: + + - Function: abbreviate-file-name filename &optional hack-homedir + This function applies abbreviations from `directory-abbrev-alist' + to its argument, and substitutes `~' for the user's home directory. + + If HACK-HOMEDIR is non-`nil', then this also substitutes `~' for + the user's home directory. + + + - Variable: directory-abbrev-alist + The variable `directory-abbrev-alist' contains an alist of + abbreviations to use for file directories. Each element has the + form `(FROM . TO)', and says to replace FROM with TO when it + appears in a directory name. The FROM string is actually a + regular expression; it should always start with `^'. The function + `abbreviate-file-name' performs these substitutions. + + You can set this variable in `site-init.el' to describe the + abbreviations appropriate for your site. + + Here's an example, from a system on which file system `/home/fsf' + and so on are normally accessed through symbolic links named `/fsf' + and so on. + + (("^/home/fsf" . "/fsf") + ("^/home/gp" . "/gp") + ("^/home/gd" . "/gd")) + + +File: lispref.info, Node: Relative File Names, Next: File Name Expansion, Prev: Directory Names, Up: File Names + +Absolute and Relative File Names +-------------------------------- + + 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 "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 "relative" file +name. On Unix, an absolute file name starts with a slash or a tilde +(`~'), and a relative one does not. + + - Function: file-name-absolute-p filename + This function returns `t' if file FILENAME is an absolute file + name, `nil' otherwise. + + (file-name-absolute-p "~rms/foo") + => t + (file-name-absolute-p "rms/foo") + => nil + (file-name-absolute-p "/user/rms/foo") + => t + + +File: lispref.info, Node: File Name Expansion, Next: Unique File Names, Prev: Relative File Names, Up: File Names + +Functions that Expand Filenames +------------------------------- + + "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 `./' and `NAME/../'. + + - Function: expand-file-name filename &optional directory + This function converts FILENAME to an absolute file name. If + DIRECTORY is supplied, it is the directory to start with if + FILENAME is relative. (The value of DIRECTORY should itself be an + absolute directory name; it may start with `~'.) Otherwise, the + current buffer's value of `default-directory' is used. For + example: + + (expand-file-name "foo") + => "/xcssun/users/rms/lewis/foo" + (expand-file-name "../foo") + => "/xcssun/users/rms/foo" + (expand-file-name "foo" "/usr/spool/") + => "/usr/spool/foo" + (expand-file-name "$HOME/foo") + => "/xcssun/users/rms/lewis/$HOME/foo" + + Filenames containing `.' or `..' are simplified to their canonical + form: + + (expand-file-name "bar/../foo") + => "/xcssun/users/rms/lewis/foo" + + `~/' at the beginning is expanded into the user's home directory. + A `/' or `~' following a `/'. + + Note that `expand-file-name' does _not_ expand environment + variables; only `substitute-in-file-name' does that. + + - Function: file-relative-name filename &optional directory + This function does the inverse of expansion--it tries to return a + relative name that is equivalent to FILENAME when interpreted + relative to DIRECTORY. + + If DIRECTORY is `nil' or omitted, the value of `default-directory' + is used. + + (file-relative-name "/foo/bar" "/foo/") + => "bar") + (file-relative-name "/foo/bar" "/hack/") + => "../foo/bar") + + - Variable: 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 `~'. This variable is local in every buffer. + + `expand-file-name' uses the default directory when its second + argument is `nil'. + + On Unix systems, the value is always a string ending with a slash. + + default-directory + => "/user/lewis/manual/" + + - Function: substitute-in-file-name filename + This function replaces environment variable references in FILENAME + with the environment variable values. Following standard Unix + shell syntax, `$' is the prefix to substitute an environment + variable value. + + The environment variable name is the series of alphanumeric + characters (including underscores) that follow the `$'. If the + character following the `$' is a `{', then the variable name is + everything up to the matching `}'. + + Here we assume that the environment variable `HOME', which holds + the user's home directory name, has value `/xcssun/users/rms'. + + (substitute-in-file-name "$HOME/foo") + => "/xcssun/users/rms/foo" + + After substitution, a `/' or `~' following a `/' is taken to be + the start of an absolute file name that overrides what precedes + it, so everything before that `/' or `~' is deleted. For example: + + (substitute-in-file-name "bar/~/foo") + => "~/foo" + (substitute-in-file-name "/usr/local/$HOME/foo") + => "/xcssun/users/rms/foo" + + +File: lispref.info, Node: Unique File Names, Next: File Name Completion, Prev: File Name Expansion, Up: File Names + +Generating Unique File Names +---------------------------- + + Some programs need to write temporary files. Here is the usual way +to construct a name for such a file: + + (make-temp-name (expand-file-name NAME-OF-APPLICATION (temp-directory))) + +Here we use `(temp-directory)' to specify a directory for temporary +files--under Unix, it will normally evaluate to `"/tmp/"'. The job of +`make-temp-name' is to prevent two different users or two different +processes from trying to use the same name. + + - Function: temp-directory + This function returns the name of the directory to use for + temporary files. Under Unix, this will be the value of `TMPDIR', + defaulting to `/tmp'. On Windows, this will be obtained from the + `TEMP' or `TMP' environment variables, defaulting to `/'. + + Note that the `temp-directory' function does not exist under FSF + Emacs. + + - Function: make-temp-name prefix + This function generates a temporary file name starting with + PREFIX. The Emacs process number forms part of the result, so + there is no danger of generating a name being used by another + process. + + (make-temp-name "/tmp/foo") + => "/tmp/fooGaAQjC" + + In addition, this function makes an attempt to choose a name that + does not specify an existing file. To make this work, PREFIX + should be an absolute file name. + + To avoid confusion, each Lisp application should preferably use a + unique PREFIX to `make-temp-name'. + + +File: lispref.info, Node: File Name Completion, Next: User Name Completion, Prev: Unique File Names, Up: File Names + +File Name Completion +-------------------- + + This section describes low-level subroutines for completing a file +name. For other completion functions, see *Note Completion::. + + - Function: file-name-all-completions partial-filename directory + This function returns a list of all possible completions for files + whose name starts with PARTIAL-FILENAME in directory 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 PARTIAL-FILENAME must be a file name containing no + directory part and no slash. The current buffer's default + directory is prepended to DIRECTORY, if DIRECTORY is not absolute. + + File names which end with any member of + `completion-ignored-extensions' are not considered as possible + completions for PARTIAL-FILENAME unless there is no other possible + completion. `completion-ignored-extensions' is not applied to the + names of directories. + + In the following example, suppose that the current default + directory, `~rms/lewis', has five files whose names begin with `f': + `foo', `file~', `file.c', `file.c.~1~', and `file.c.~2~'. + + (file-name-all-completions "f" "") + => ("foo" "file~" "file.c.~2~" + "file.c.~1~" "file.c") + + (file-name-all-completions "fo" "") + => ("foo") + + - Function: file-name-completion partial-filename directory + This function completes the file name PARTIAL-FILENAME in directory + DIRECTORY. It returns the longest prefix common to all file names + in directory DIRECTORY that start with PARTIAL-FILENAME. + + If only one match exists and PARTIAL-FILENAME matches it exactly, + the function returns `t'. The function returns `nil' if directory + DIRECTORY contains no name starting with PARTIAL-FILENAME. + + File names which end with any member of + `completion-ignored-extensions' are not considered as possible + completions for PARTIAL-FILENAME unless there is no other possible + completion. `completion-ignored-extensions' is not applied to the + names of directories. + + In the following example, suppose that the current default + directory has five files whose names begin with `f': `foo', + `file~', `file.c', `file.c.~1~', and `file.c.~2~'. + + (file-name-completion "fi" "") + => "file" + + (file-name-completion "file.c.~1" "") + => "file.c.~1~" + + (file-name-completion "file.c.~1~" "") + => t + + (file-name-completion "file.c.~3" "") + => nil + + - User Option: completion-ignored-extensions + `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. + + A typical value might look like this: + + completion-ignored-extensions + => (".o" ".elc" "~" ".dvi") + + File: lispref.info, Node: User Name Completion, Prev: File Name Completion, Up: File Names User Name Completion @@ -59,25 +608,26 @@ User Name Completion name. For other completion functions, see *Note Completion::. - Function: user-name-all-completions partial-username - This function returns a list of all possible completions for a user - whose name starts with PARTIAL-USERNAME. The order of the + This function returns a list of all possible completions for a + user name starting with PARTIAL-USERNAME. The order of the completions is unpredictable and conveys no useful information. The argument PARTIAL-USERNAME must be a partial user name containing no tilde character and no slash. - - Function: user-name-completion username - This function completes the user name USERNAME. It returns the - longest prefix common to all user names that start with USERNAME. + - Function: user-name-completion partial-username + This function completes a user name from PARTIAL-USERNAME. It + returns the longest prefix common to all user names that start with + PARTIAL-USERNAME. - If only one match exists and USERNAME matches it exactly, the - function returns `t'. The function returns `nil' if no user name - starting with USERNAME exists. + If only one match exists and PARTIAL-USERNAME matches it exactly, + the function returns `t'. The function returns `nil' if no user + name starting with PARTIAL-USERNAME exists. - - Function: user-name-completion-1 username - This function completes the user name USERNAME, like - `user-name-completion', differing only in the return value. This - function returns the cons of the completion returned by + - Function: user-name-completion-1 partial-username + This function completes the partial user name PARTIAL-USERNAME, + like `user-name-completion', differing only in the return value. + This function returns the cons of the completion returned by `user-name-completion', and a boolean indicating whether that completion was unique. @@ -274,9 +824,9 @@ that have two file names that may each have handlers. - Variable: inhibit-file-name-operation The operation for which certain handlers are presently inhibited. - - Function: find-file-name-handler file operation - This function returns the handler function for file name FILE, or - `nil' if there is none. The argument OPERATION should be the + - Function: find-file-name-handler filename &optional operation + This function returns the handler function for file name FILENAME, + or `nil' if there is none. The argument 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 `inhibit-file-name-operation'. @@ -345,7 +895,7 @@ File: lispref.info, Node: Creating a Partial File, Next: Detached Partial File Creating a Partial File ----------------------- - - Function: make-file-part &optional start end name buffer + - Command: make-file-part &optional start end name buffer Make a file part on buffer BUFFER out of the region. Call it NAME. This command creates a new buffer containing the contents of the region and marks the buffer as referring to the specified @@ -357,7 +907,7 @@ Creating a Partial File When called from a function, expects four arguments, START, END, NAME, and BUFFER, all of which are optional and default to the beginning of BUFFER, the end of BUFFER, a name generated from - BUFFER name, and the current buffer, respectively. + BUFFER's name, and the current buffer, respectively.  File: lispref.info, Node: Detached Partial Files, Prev: Creating a Partial File, Up: Partial Files @@ -480,36 +1030,13 @@ buffer-local variable `buffer-file-format'. encoding functions for the formats listed in `buffer-file-format', in the order of appearance in the list. - - Function: format-write-file file format + - Command: format-write-file file format This command writes the current buffer contents into the file FILE in format FORMAT, and makes that format the default for future saves of the buffer. The argument FORMAT is a list of format names. - - Function: format-find-file file format - This command finds the file FILE, converting it according to - format FORMAT. It also makes FORMAT the default if the buffer is - saved later. - - The argument FORMAT is a list of format names. If FORMAT is - `nil', no conversion takes place. Interactively, typing just - for FORMAT specifies `nil'. - - - Function: format-insert-file file format &optional beg end - This command inserts the contents of file FILE, converting it - according to format FORMAT. If BEG and END are non-`nil', they - specify which part of the file to read, as in - `insert-file-contents' (*note Reading from Files::). - - The return value is like what `insert-file-contents' returns: a - list of the absolute file name and the length of the data inserted - (after conversion). - - The argument FORMAT is a list of format names. If FORMAT is - `nil', no conversion takes place. Interactively, typing just - for FORMAT specifies `nil'. - - - Function: format-find-file file format + - Command: format-find-file file format This command finds the file FILE, converting it according to format FORMAT. It also makes FORMAT the default if the buffer is saved later. @@ -518,9 +1045,9 @@ the order of appearance in the list. `nil', no conversion takes place. Interactively, typing just for FORMAT specifies `nil'. - - Function: format-insert-file file format &optional beg end + - Command: format-insert-file file format &optional start end This command inserts the contents of file FILE, converting it - according to format FORMAT. If BEG and END are non-`nil', they + according to format FORMAT. If START and END are non-`nil', they specify which part of the file to read, as in `insert-file-contents' (*note Reading from Files::). @@ -699,483 +1226,3 @@ Making Backup Files not lose its value. Major modes should not set this variable--they should set `make-backup-files' instead. - -File: lispref.info, Node: Rename or Copy, Next: Numbered Backups, Prev: Making Backups, Up: Backup Files - -Backup by Renaming or by Copying? ---------------------------------- - - There are two ways that XEmacs can make a backup file: - - * XEmacs 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. - - * XEmacs 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. - - The first method, renaming, is the default. - - The variable `backup-by-copying', if non-`nil', says to use the -second method, which is to copy the original file and overwrite it with -the new buffer contents. The variable `file-precious-flag', if -non-`nil', also has this effect (as a sideline of its main -significance). *Note Saving Buffers::. - - - Variable: backup-by-copying - If this variable is non-`nil', XEmacs always makes backup files by - copying. - - The following two variables, when non-`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. - - - Variable: backup-by-copying-when-linked - If this variable is non-`nil', XEmacs makes backups by copying for - files with multiple names (hard links). - - This variable is significant only if `backup-by-copying' is `nil', - since copying is always used when that variable is non-`nil'. - - - Variable: backup-by-copying-when-mismatch - If this variable is non-`nil', XEmacs 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 `backup-by-copying' is `nil', - since copying is always used when that variable is non-`nil'. - - -File: lispref.info, Node: Numbered Backups, Next: Backup Names, Prev: Rename or Copy, Up: Backup Files - -Making and Deleting Numbered Backup Files ------------------------------------------ - - If a file's name is `foo', the names of its numbered backup versions -are `foo.~V~', for various integers V, like this: `foo.~1~', `foo.~2~', -`foo.~3~', ..., `foo.~259~', and so on. - - - User Option: version-control - This variable controls whether to make a single non-numbered backup - file or multiple numbered backups. - - `nil' - Make numbered backups if the visited file already has - numbered backups; otherwise, do not. - - `never' - Do not make numbered backups. - - ANYTHING ELSE - Make numbered backups. - - The use of numbered backups ultimately leads to a large number of -backup versions, which must then be deleted. XEmacs can do this -automatically or it can ask the user whether to delete them. - - - User Option: 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. - - - User Option: 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. - - 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 `find-backup-file-name' -(*note Backup Names::) is responsible for determining which backup -versions to delete, but does not delete them itself. - - - User Option: delete-old-versions - If this variable is non-`nil', then saving a file deletes excess - backup versions silently. Otherwise, it asks the user whether to - delete them. - - - User Option: dired-kept-versions - This variable specifies how many of the newest backup versions to - keep in the Dired command `.' (`dired-clean-directory'). That's - the same thing `kept-new-versions' specifies when you make a new - backup file. The default value is 2. - - -File: lispref.info, Node: Backup Names, Prev: Numbered Backups, Up: Backup Files - -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. - - - Function: backup-file-name-p filename - This function returns a non-`nil' value if FILENAME is a possible - name for a backup file. A file with the name FILENAME need not - exist; the function just checks the name. - - (backup-file-name-p "foo") - => nil - (backup-file-name-p "foo~") - => 3 - - The standard definition of this function is as follows: - - (defun backup-file-name-p (file) - "Return non-nil if FILE is a backup file \ - name (numeric or not)..." - (string-match "~$" file)) - - Thus, the function returns a non-`nil' value if the file name ends - with a `~'. (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. - - - Function: make-backup-file-name filename - This function returns a string that is the name to use for a - non-numbered backup file for file FILENAME. On Unix, this is just - FILENAME with a tilde appended. - - The standard definition of this function is as follows: - - (defun make-backup-file-name (file) - "Create the non-numeric backup file name for FILE. - ..." - (concat file "~")) - - You can change the backup-file naming convention by redefining this - function. The following example redefines `make-backup-file-name' - to prepend a `.' in addition to appending a tilde: - - (defun make-backup-file-name (filename) - (concat "." filename "~")) - - (make-backup-file-name "backups.texi") - => ".backups.texi~" - - - Function: find-backup-file-name filename - This function computes the file name for a new backup file for - FILENAME. It may also propose certain existing backup files for - deletion. `find-backup-file-name' returns a list whose CAR is the - name for the new backup file and whose CDR is a list of backup - files whose deletion is proposed. - - Two variables, `kept-old-versions' and `kept-new-versions', - determine which backup versions should be kept. This function - keeps those versions by excluding them from the CDR of the value. - *Note Numbered Backups::. - - In this example, the value says that `~rms/foo.~5~' is the name to - use for the new backup file, and `~rms/foo.~3~' is an "excess" - version that the caller should consider deleting now. - - (find-backup-file-name "~rms/foo") - => ("~rms/foo.~5~" "~rms/foo.~3~") - - - Function: file-newest-backup filename - This function returns the name of the most recent backup file for - FILENAME, or `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. - - -File: lispref.info, Node: Auto-Saving, Next: Reverting, Prev: Backup Files, Up: Backups and Auto-Saving - -Auto-Saving -=========== - - XEmacs periodically saves all files that you are visiting; this is -called "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. -*Note Auto-Save: (emacs)Auto-Save, for information on auto-save for -users. Here we describe the functions used to implement auto-saving -and the variables that control them. - - - Variable: buffer-auto-save-file-name - This buffer-local variable is the name of the file used for - auto-saving the current buffer. It is `nil' if the buffer should - not be auto-saved. - - buffer-auto-save-file-name - => "/xcssun/users/rms/lewis/#files.texi#" - - - 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 ARG, the command turns - auto-saving on if the value of ARG is `t', a nonempty list, or a - positive integer. Otherwise, it turns auto-saving off. - - - Function: auto-save-file-name-p filename - This function returns a non-`nil' value if 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 (`#') is a possible auto-save file - name. The argument FILENAME should not contain a directory part. - - (make-auto-save-file-name) - => "/xcssun/users/rms/lewis/#files.texi#" - (auto-save-file-name-p "#files.texi#") - => 0 - (auto-save-file-name-p "files.texi") - => nil - - The standard definition of this function is as follows: - - (defun auto-save-file-name-p (filename) - "Return non-nil if FILENAME can be yielded by..." - (string-match "^#.*#$" filename)) - - 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 `make-auto-save-file-name' - correspondingly. - - - Function: 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 (`#') - appended and prepended to it. This function does not look at the - variable `auto-save-visited-file-name' (described below); you - should check that before calling this function. - - (make-auto-save-file-name) - => "/xcssun/users/rms/lewis/#backup.texi#" - - The standard definition of this function is as follows: - - (defun make-auto-save-file-name () - "Return file name to use for auto-saves \ - of current buffer. - ..." - (if buffer-file-name - (concat - (file-name-directory buffer-file-name) - "#" - (file-name-nondirectory buffer-file-name) - "#") - (expand-file-name - (concat "#%" (buffer-name) "#")))) - - 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 `auto-save-file-name-p' in a corresponding way. - - - Variable: auto-save-visited-file-name - If this variable is non-`nil', XEmacs 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 `nil', - so auto-save files have distinct names that are created by - `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 `auto-save-mode' is called again. - - - Function: recent-auto-save-p - This function returns `t' if the current buffer has been - auto-saved since the last time it was read in or saved. - - - Function: 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 `nil'. - - - User Option: auto-save-interval - The value of this variable is the number of characters that XEmacs - 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. - - - User Option: 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, XEmacs auto-saves any buffers that need it. (Actually, the - specified timeout is multiplied by a factor depending on the size - of the current buffer.) - - - Variable: auto-save-hook - This normal hook is run whenever an auto-save is about to happen. - - - User Option: auto-save-default - If this variable is non-`nil', buffers that are visiting files - have auto-saving enabled by default. Otherwise, they do not. - - - 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 - `Auto-saving...' is displayed in the echo area while auto-saving is - going on. However, if NO-MESSAGE is non-`nil', the message is - inhibited. - - If CURRENT-ONLY is non-`nil', only the current buffer is - auto-saved. - - - Function: delete-auto-save-file-if-necessary - This function deletes the current buffer's auto-save file if - `delete-auto-save-files' is non-`nil'. It is called every time a - buffer is saved. - - - Variable: delete-auto-save-files - This variable is used by the function - `delete-auto-save-file-if-necessary'. If it is non-`nil', Emacs - deletes auto-save files when a true save is done (in the visited - file). This saves disk space and unclutters your directory. - - - Function: 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. - - - Variable: 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. - - - Variable: auto-save-list-file-name - This variable (if non-`nil') specifies a file for recording the - names of all the auto-save files. Each time XEmacs 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 XEmacs exits normally, it deletes this file. If XEmacs - crashes, you can look in the file to find all the auto-save files - that might contain work that was otherwise lost. The - `recover-session' command uses these files. - - The default name for this file is in your home directory and - starts with `.saves-'. It also contains the XEmacs process ID and - the host name. - - -File: lispref.info, Node: Reverting, Prev: Auto-Saving, Up: Backups and Auto-Saving - -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 `revert-buffer' command. *Note Reverting -a Buffer: (emacs)Reverting. - - - 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 CHECK-AUTO-SAVE is non-`nil', and the latest - auto-save file is more recent than the visited file, - `revert-buffer' asks the user whether to use that instead. - Otherwise, it always uses the text of the visited file itself. - Interactively, CHECK-AUTO-SAVE is set if there is a numeric prefix - argument. - - Normally, `revert-buffer' asks for confirmation before it changes - the buffer; but if the argument NOCONFIRM is non-`nil', - `revert-buffer' does not ask for confirmation. - - Reverting tries to preserve marker positions in the buffer by - using the replacement feature of `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. - - You can customize how `revert-buffer' does its work by setting these -variables--typically, as buffer-local variables. - - - Variable: revert-buffer-function - The value of this variable is the function to use to revert this - buffer. If non-`nil', it is called as a function with no - arguments to do the work of reverting. If the value is `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. - - - Variable: revert-buffer-insert-file-contents-function - The value of this variable, if non-`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, `t' if the user has asked to read the auto-save file. - - - Variable: before-revert-hook - This normal hook is run by `revert-buffer' before actually - inserting the modified contents--but only if - `revert-buffer-function' is `nil'. - - Font Lock mode uses this hook to record that the buffer contents - are no longer fontified. - - - Variable: after-revert-hook - This normal hook is run by `revert-buffer' after actually inserting - the modified contents--but only if `revert-buffer-function' is - `nil'. - - Font Lock mode uses this hook to recompute the fonts for the - updated buffer contents. - - -File: lispref.info, Node: Buffers, Next: Windows, Prev: Backups and Auto-Saving, Up: Top - -Buffers -******* - - A "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 "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 "modified" if it needs to be saved. -* Modification Time:: Determining whether the visited file was changed - ``behind XEmacs'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. - diff --git a/info/lispref.info-25 b/info/lispref.info-25 index a34f51c..793aca3 100644 --- a/info/lispref.info-25 +++ b/info/lispref.info-25 @@ -50,6 +50,491 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Rename or Copy, Next: Numbered Backups, Prev: Making Backups, Up: Backup Files + +Backup by Renaming or by Copying? +--------------------------------- + + There are two ways that XEmacs can make a backup file: + + * XEmacs 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. + + * XEmacs 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. + + The first method, renaming, is the default. + + The variable `backup-by-copying', if non-`nil', says to use the +second method, which is to copy the original file and overwrite it with +the new buffer contents. The variable `file-precious-flag', if +non-`nil', also has this effect (as a sideline of its main +significance). *Note Saving Buffers::. + + - Variable: backup-by-copying + If this variable is non-`nil', XEmacs always makes backup files by + copying. + + The following two variables, when non-`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. + + - Variable: backup-by-copying-when-linked + If this variable is non-`nil', XEmacs makes backups by copying for + files with multiple names (hard links). + + This variable is significant only if `backup-by-copying' is `nil', + since copying is always used when that variable is non-`nil'. + + - Variable: backup-by-copying-when-mismatch + If this variable is non-`nil', XEmacs 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 `backup-by-copying' is `nil', + since copying is always used when that variable is non-`nil'. + + +File: lispref.info, Node: Numbered Backups, Next: Backup Names, Prev: Rename or Copy, Up: Backup Files + +Making and Deleting Numbered Backup Files +----------------------------------------- + + If a file's name is `foo', the names of its numbered backup versions +are `foo.~V~', for various integers V, like this: `foo.~1~', `foo.~2~', +`foo.~3~', ..., `foo.~259~', and so on. + + - User Option: version-control + This variable controls whether to make a single non-numbered backup + file or multiple numbered backups. + + `nil' + Make numbered backups if the visited file already has + numbered backups; otherwise, do not. + + `never' + Do not make numbered backups. + + ANYTHING ELSE + Make numbered backups. + + The use of numbered backups ultimately leads to a large number of +backup versions, which must then be deleted. XEmacs can do this +automatically or it can ask the user whether to delete them. + + - User Option: 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. + + - User Option: 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. + + 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 `find-backup-file-name' +(*note Backup Names::) is responsible for determining which backup +versions to delete, but does not delete them itself. + + - User Option: delete-old-versions + If this variable is non-`nil', then saving a file deletes excess + backup versions silently. Otherwise, it asks the user whether to + delete them. + + - User Option: dired-kept-versions + This variable specifies how many of the newest backup versions to + keep in the Dired command `.' (`dired-clean-directory'). That's + the same thing `kept-new-versions' specifies when you make a new + backup file. The default value is 2. + + +File: lispref.info, Node: Backup Names, Prev: Numbered Backups, Up: Backup Files + +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. + + - Function: backup-file-name-p filename + This function returns a non-`nil' value if FILENAME is a possible + name for a backup file. A file with the name FILENAME need not + exist; the function just checks the name. + + (backup-file-name-p "foo") + => nil + (backup-file-name-p "foo~") + => 3 + + The standard definition of this function is as follows: + + (defun backup-file-name-p (file) + "Return non-nil if FILE is a backup file \ + name (numeric or not)..." + (string-match "~$" file)) + + Thus, the function returns a non-`nil' value if the file name ends + with a `~'. (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. + + - Function: make-backup-file-name filename + This function returns a string that is the name to use for a + non-numbered backup file for file FILENAME. On Unix, this is just + FILENAME with a tilde appended. + + The standard definition of this function is as follows: + + (defun make-backup-file-name (file) + "Create the non-numeric backup file name for FILE. + ..." + (concat file "~")) + + You can change the backup-file naming convention by redefining this + function. The following example redefines `make-backup-file-name' + to prepend a `.' in addition to appending a tilde: + + (defun make-backup-file-name (filename) + (concat "." filename "~")) + + (make-backup-file-name "backups.texi") + => ".backups.texi~" + + - Function: find-backup-file-name filename + This function computes the file name for a new backup file for + FILENAME. It may also propose certain existing backup files for + deletion. `find-backup-file-name' returns a list whose CAR is the + name for the new backup file and whose CDR is a list of backup + files whose deletion is proposed. + + Two variables, `kept-old-versions' and `kept-new-versions', + determine which backup versions should be kept. This function + keeps those versions by excluding them from the CDR of the value. + *Note Numbered Backups::. + + In this example, the value says that `~rms/foo.~5~' is the name to + use for the new backup file, and `~rms/foo.~3~' is an "excess" + version that the caller should consider deleting now. + + (find-backup-file-name "~rms/foo") + => ("~rms/foo.~5~" "~rms/foo.~3~") + + - Function: file-newest-backup filename + This function returns the name of the most recent backup file for + FILENAME, or `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. + + +File: lispref.info, Node: Auto-Saving, Next: Reverting, Prev: Backup Files, Up: Backups and Auto-Saving + +Auto-Saving +=========== + + XEmacs periodically saves all files that you are visiting; this is +called "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. +*Note Auto-Save: (emacs)Auto-Save, for information on auto-save for +users. Here we describe the functions used to implement auto-saving +and the variables that control them. + + - Variable: buffer-auto-save-file-name + This buffer-local variable is the name of the file used for + auto-saving the current buffer. It is `nil' if the buffer should + not be auto-saved. + + buffer-auto-save-file-name + => "/xcssun/users/rms/lewis/#files.texi#" + + - 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 ARG, the command turns + auto-saving on if the value of ARG is `t', a nonempty list, or a + positive integer. Otherwise, it turns auto-saving off. + + - Function: auto-save-file-name-p filename + This function returns a non-`nil' value if 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 (`#') is a possible auto-save file + name. The argument FILENAME should not contain a directory part. + + (make-auto-save-file-name) + => "/xcssun/users/rms/lewis/#files.texi#" + (auto-save-file-name-p "#files.texi#") + => 0 + (auto-save-file-name-p "files.texi") + => nil + + The standard definition of this function is as follows: + + (defun auto-save-file-name-p (filename) + "Return non-nil if FILENAME can be yielded by..." + (string-match "^#.*#$" filename)) + + 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 `make-auto-save-file-name' + correspondingly. + + - Function: make-auto-save-file-name &optional filename + This function returns the file name to use for auto-saving the + current buffer. This is just the file name with hash marks (`#') + appended and prepended to it. This function does not look at the + variable `auto-save-visited-file-name' (described below); you + should check that before calling this function. + + (make-auto-save-file-name) + => "/xcssun/users/rms/lewis/#backup.texi#" + + The standard definition of this function is as follows: + + (defun make-auto-save-file-name () + "Return file name to use for auto-saves \ + of current buffer. + ..." + (if buffer-file-name + (concat + (file-name-directory buffer-file-name) + "#" + (file-name-nondirectory buffer-file-name) + "#") + (expand-file-name + (concat "#%" (buffer-name) "#")))) + + 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 `auto-save-file-name-p' in a corresponding way. + + - Variable: auto-save-visited-file-name + If this variable is non-`nil', XEmacs 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 `nil', + so auto-save files have distinct names that are created by + `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 `auto-save-mode' is called again. + + - Function: recent-auto-save-p + This function returns `t' if the current buffer has been + auto-saved since the last time it was read in or saved. + + - Function: 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 `nil'. + + - User Option: auto-save-interval + The value of this variable is the number of characters that XEmacs + 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. + + - User Option: 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, XEmacs auto-saves any buffers that need it. (Actually, the + specified timeout is multiplied by a factor depending on the size + of the current buffer.) + + - Variable: auto-save-hook + This normal hook is run whenever an auto-save is about to happen. + + - User Option: auto-save-default + If this variable is non-`nil', buffers that are visiting files + have auto-saving enabled by default. Otherwise, they do not. + + - 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 + `Auto-saving...' is displayed in the echo area while auto-saving is + going on. However, if NO-MESSAGE is non-`nil', the message is + inhibited. + + If CURRENT-ONLY is non-`nil', only the current buffer is + auto-saved. + + - Function: delete-auto-save-file-if-necessary + This function deletes the current buffer's auto-save file if + `delete-auto-save-files' is non-`nil'. It is called every time a + buffer is saved. + + - Variable: delete-auto-save-files + This variable is used by the function + `delete-auto-save-file-if-necessary'. If it is non-`nil', Emacs + deletes auto-save files when a true save is done (in the visited + file). This saves disk space and unclutters your directory. + + - Function: 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. + + - Variable: 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. + + - Variable: auto-save-list-file-name + This variable (if non-`nil') specifies a file for recording the + names of all the auto-save files. Each time XEmacs 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 XEmacs exits normally, it deletes this file. If XEmacs + crashes, you can look in the file to find all the auto-save files + that might contain work that was otherwise lost. The + `recover-session' command uses these files. + + The default name for this file is in your home directory and + starts with `.saves-'. It also contains the XEmacs process ID and + the host name. + + +File: lispref.info, Node: Reverting, Prev: Auto-Saving, Up: Backups and Auto-Saving + +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 `revert-buffer' command. *Note Reverting +a Buffer: (emacs)Reverting. + + - Command: revert-buffer &optional check-auto-save noconfirm + preserve-modes + 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 CHECK-AUTO-SAVE is non-`nil', and the latest + auto-save file is more recent than the visited file, + `revert-buffer' asks the user whether to use that instead. + Otherwise, it always uses the text of the visited file itself. + Interactively, CHECK-AUTO-SAVE is set if there is a numeric prefix + argument. + + Normally, `revert-buffer' asks for confirmation before it changes + the buffer; but if the argument NOCONFIRM is non-`nil', + `revert-buffer' does not ask for confirmation. + + Optional third argument PRESERVE-MODES non-`nil' means don't alter + the files modes. Normally we reinitialize them using + `normal-mode'. + + Reverting tries to preserve marker positions in the buffer by + using the replacement feature of `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. + + You can customize how `revert-buffer' does its work by setting these +variables--typically, as buffer-local variables. + + - Variable: revert-buffer-function + The value of this variable is the function to use to revert this + buffer. If non-`nil', it is called as a function with no + arguments to do the work of reverting. If the value is `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. + + - Variable: revert-buffer-insert-file-contents-function + The value of this variable, if non-`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, `t' if the user has asked to read the auto-save file. + + - Variable: before-revert-hook + This normal hook is run by `revert-buffer' before actually + inserting the modified contents--but only if + `revert-buffer-function' is `nil'. + + Font Lock mode uses this hook to record that the buffer contents + are no longer fontified. + + - Variable: after-revert-hook + This normal hook is run by `revert-buffer' after actually inserting + the modified contents--but only if `revert-buffer-function' is + `nil'. + + Font Lock mode uses this hook to recompute the fonts for the + updated buffer contents. + + +File: lispref.info, Node: Buffers, Next: Windows, Prev: Backups and Auto-Saving, Up: Top + +Buffers +******* + + A "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 "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 window. + +* 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 "modified" if it needs to be saved. +* Modification Time:: Determining whether the visited file was changed + ``behind XEmacs'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. + + File: lispref.info, Node: Buffer Basics, Next: Current Buffer, Up: Buffers Buffer Basics @@ -193,9 +678,9 @@ Using `save-excursion', as shown below, handles quitting, errors, and 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 BUFFER-OR-NAME. An - error is signaled if BUFFER-OR-NAME does not identify an existing - buffer. + BUFFER-OR-NAME must be a buffer or the name of an existing + buffer-else an error is signaled. This function returns the buffer + identified by BUFFER-OR-NAME.  File: lispref.info, Node: Buffer Names, Next: Buffer File Name, Prev: Current Buffer, Up: Buffers @@ -248,11 +733,11 @@ also initially disables recording undo information; see *Note Undo::. shell buffer under the name `*shell*'. - Function: get-buffer buffer-or-name - This function returns the buffer specified by BUFFER-OR-NAME. If + This function returns the buffer named BUFFER-OR-NAME. If BUFFER-OR-NAME is a string and there is no buffer with that name, - the value is `nil'. If 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: + the value is `nil'. If BUFFER-OR-NAME is actually a buffer, it is + returned as given. (That is not very useful, so the argument is + usually a name.) For example: (setq b (get-buffer "lewis")) => # @@ -396,9 +881,10 @@ file formerly visited. otherwise. If BUFFER is not supplied, the current buffer is tested. - - Function: set-buffer-modified-p flag - This function marks the current buffer as modified if FLAG is - non-`nil', or as unmodified if the flag is `nil'. + - Function: set-buffer-modified-p flag &optional buffer + This function marks BUFFER as modified if FLAG is non-`nil', or as + unmodified if the flag is `nil'. BUFFER defaults to the current + buffer. Another effect of calling this function is to cause unconditional redisplay of the modeline for the current buffer. In fact, the @@ -531,17 +1017,33 @@ narrowing. `read-only' character properties have no effect if they are members of the list (comparison is done with `eq'). - - 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 `buffer-read-only' - explicitly to the proper value, `t' or `nil'. - - - Function: barf-if-buffer-read-only - This function signals a `buffer-read-only' error if the current - buffer is read-only. *Note Interactive Call::, for another way to - signal an error if the current buffer is read-only. + - Command: toggle-read-only &optional arg + This command changes whether the current buffer is read-only. + Interactively, if a prefix arg ARG is supplied, set the current + buffer read only if and only if ARG is positive. + + This command is intended for interactive use only; 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 + `buffer-read-only' explicitly to the proper value, `t' or `nil'. + + - Function: barf-if-buffer-read-only &optional buffer start end + This function signals a `buffer-read-only' error if BUFFER is + read-only. BUFFER defaults to the current buffer. *Note + Interactive Call::, for another way to signal an error if the + current buffer is read-only. + + If optional argument START is non-`nil', all extents in the buffer + which overlap that part of the buffer are checked to ensure none + has a `read-only' property. (Extents that lie completely within the + range, however, are not checked.) END defaults to the value of + START. + + If START and END are equal, the range checked is [START, END] + (i.e. closed on both ends); otherwise, the range checked is + (START, END) \(open on both ends), except that extents that lie + completely within [START, END] are not checked. See + `extent-in-region-p' for a fuller discussion.  File: lispref.info, Node: The Buffer List, Next: Creating Buffers, Prev: Read Only Buffers, Up: Buffers @@ -619,8 +1121,7 @@ It is only the order of those elements that is different. (and created, if necessary). Note that in FSF Emacs 19, there is no FRAME argument, and - VISIBLE-OK is the second argument instead of the third. FSF Emacs - 19. + VISIBLE-OK is the second argument instead of the third. - Command: list-buffers &optional files-only This function displays a listing of the names of existing buffers. @@ -629,7 +1130,7 @@ It is only the order of those elements that is different. intended for interactive use, and is described fully in `The XEmacs Reference Manual'. It returns `nil'. - - Command: bury-buffer &optional buffer-or-name + - Command: bury-buffer &optional buffer-or-name before This function puts 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 @@ -644,548 +1145,3 @@ It is only the order of those elements that is different. If you wish to replace a buffer in all the windows that display it, use `replace-buffer-in-windows'. *Note Buffers and Windows::. - -File: lispref.info, Node: Creating Buffers, Next: Killing Buffers, Prev: The Buffer List, Up: Buffers - -Creating Buffers -================ - - This section describes the two primitives for creating buffers. -`get-buffer-create' creates a buffer if it finds no existing buffer -with the specified name; `generate-new-buffer' always creates a new -buffer and gives it a unique name. - - Other functions you can use to create buffers include -`with-output-to-temp-buffer' (*note Temporary Displays::) and -`create-file-buffer' (*note Visiting Files::). Starting a subprocess -can also create a buffer (*note Processes::). - - - Function: get-buffer-create name - This function returns a buffer named 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 NAME is not a string. - - (get-buffer-create "foo") - => # - - The major mode for the new buffer is set to Fundamental mode. The - variable `default-major-mode' is handled at a higher level. *Note - Auto Major Mode::. - - - Function: generate-new-buffer name - This function returns a newly created, empty buffer, but does not - make it current. If there is no buffer named NAME, then that is - the name of the new buffer. If that name is in use, this function - adds suffixes of the form `' to NAME, where N is an integer. - It tries successive integers starting with 2 until it finds an - available name. - - An error is signaled if NAME is not a string. - - (generate-new-buffer "bar") - => # - (generate-new-buffer "bar") - => #> - (generate-new-buffer "bar") - => #> - - The major mode for the new buffer is set to Fundamental mode. The - variable `default-major-mode' is handled at a higher level. *Note - Auto Major Mode::. - - See the related function `generate-new-buffer-name' in *Note - Buffer Names::. - - -File: lispref.info, Node: Killing Buffers, Next: Indirect Buffers, Prev: Creating Buffers, Up: Buffers - -Killing Buffers -=============== - - "Killing a buffer" makes its name unknown to XEmacs 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 `eq'. - - If you kill a buffer that is current or displayed in a window, XEmacs -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). *Note 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 `buffer-name' of a killed buffer is `nil'. To test whether a -buffer has been killed, you can either use this feature or the function -`buffer-live-p'. - - - Function: buffer-live-p buffer - This function returns `nil' if BUFFER is deleted, and `t' - otherwise. - - - Command: kill-buffer buffer-or-name - This function kills the buffer 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 `nil'. - - Any processes that have this buffer as the `process-buffer' are - sent the `SIGHUP' signal, which normally causes them to terminate. - (The basic meaning of `SIGHUP' is that a dialup line has been - disconnected.) *Note Deleting Processes::. - - If the buffer is visiting a file and contains unsaved changes, - `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 - `kill-buffer'. *Note Buffer Modification::. - - Killing a buffer that is already dead has no effect. - - (kill-buffer "foo.unchanged") - => nil - (kill-buffer "foo.changed") - - ---------- Buffer: Minibuffer ---------- - Buffer foo.changed modified; kill anyway? (yes or no) yes - ---------- Buffer: Minibuffer ---------- - - => nil - - - Variable: kill-buffer-query-functions - After confirming unsaved changes, `kill-buffer' calls the functions - in the list `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 `nil', `kill-buffer' spares the buffer's life. - - - Variable: kill-buffer-hook - This is a normal hook run by `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. *Note Hooks::. - - - Variable: buffer-offer-save - This variable, if non-`nil' in a particular buffer, tells - `save-buffers-kill-emacs' and `save-some-buffers' to offer to save - that buffer, just as they offer to save file-visiting buffers. The - variable `buffer-offer-save' automatically becomes buffer-local - when set for any reason. *Note Buffer-Local Variables::. - - -File: lispref.info, Node: Indirect Buffers, Prev: Killing 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 among files. The base -buffer may not itself be an indirect buffer. One base buffer may have -several "indirect children". - - 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 and mark, different narrowing, different markers and extents -(though inserting or deleting text in either buffer relocates the -markers and extents for both), different major modes, and different -local variables. Unlike in FSF Emacs, XEmacs indirect buffers do not -automatically share text properties among themselves and their base -buffer. - - 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 kills all its indirect children. - - - Command: make-indirect-buffer base-buffer name - This creates an indirect buffer named NAME whose base buffer is - BASE-BUFFER. The argument BASE-BUFFER may be a buffer or a string. - - If BASE-BUFFER is an indirect buffer, its base buffer is used as - the base for the new buffer. - - (make-indirect-buffer "*scratch*" "indirect") - => # - - - Function: buffer-base-buffer &optional buffer - This function returns the base buffer of BUFFER. If BUFFER is not - indirect, the value is `nil'. Otherwise, the value is another - buffer, which is never an indirect buffer. If BUFFER is not - supplied, it defaults to the current buffer. - - (buffer-base-buffer (get-buffer "indirect")) - => # - - - Function: buffer-indirect-children &optional buffer - This function returns a list of all indirect buffers whose base - buffer is BUFFER. If BUFFER is indirect, the return value will - always be nil; see `make-indirect-buffer'. If BUFFER is not - supplied, it defaults to the current buffer. - - (buffer-indirect-children (get-buffer "*scratch*")) - => (#) - - -File: lispref.info, Node: Windows, Next: Frames, Prev: Buffers, Up: Top - -Windows -******* - - This chapter describes most of the functions and variables related to -Emacs windows. See *Note 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. -* Position of Window:: Accessing the position of a window. -* Resizing Windows:: Changing the size of a window. -* Window Configurations:: Saving and restoring the state of the screen. - - -File: lispref.info, Node: Basic Windows, Next: Splitting Windows, Up: Windows - -Basic Concepts of Emacs Windows -=============================== - - A "window" in XEmacs 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 XEmacs Lisp. It should be clear -from the context which is meant. - - XEmacs groups windows into frames. A frame represents an area of -screen available for XEmacs 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 -"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 "the selected window". The selected -window's buffer is usually the current buffer (except when `set-buffer' -has been used). *Note 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, _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. -(*Note Deleting Windows::.) - - Each window has the following attributes: - - * containing frame - - * window height - - * window width - - * window edges with respect to the frame or screen - - * the buffer it displays - - * position within the buffer at the upper left of the window - - * amount of horizontal scrolling, in columns - - * point - - * the mark - - * how recently the window was selected - - 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 XEmacs 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; XEmacs uses one or -more X windows as frames, and subdivides them into Emacs windows. When -you use XEmacs on a character-only terminal, XEmacs treats the whole -terminal screen as one frame. - - Most window systems support arbitrarily located overlapping windows. -In contrast, Emacs windows are "tiled"; they never overlap, and -together they fill the whole screen or frame. Because of the way in -which XEmacs creates new windows and resizes them, you can't create -every conceivable tiling of windows on an Emacs frame. *Note Splitting -Windows::, and *Note Size of Window::. - - *Note Display::, for information on how the contents of the window's -buffer are displayed in the window. - - - Function: windowp object - This function returns `t' if OBJECT is a window. - - -File: lispref.info, Node: Splitting Windows, Next: Deleting Windows, Prev: Basic Windows, Up: Windows - -Splitting Windows -================= - - 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: `pop-to-buffer' and `display-buffer' (*note -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. - - - Function: one-window-p &optional no-mini all-frames - This function returns non-`nil' if there is only one window. The - argument NO-MINI, if non-`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 ALL-FRAME controls which set of windows are counted. - * If it is `nil' or omitted, then count only the selected - frame, plus the minibuffer it uses (which may be on another - frame). - - * If it is `t', then windows on all frames that currently exist - (including invisible and iconified frames) are counted. - - * If it is the symbol `visible', then windows on all visible - frames are counted. - - * If it is the number 0, then windows on all visible and - iconified frames are counted. - - * If it is any other value, then precisely the windows in - WINDOW's frame are counted, excluding the minibuffer in use - if it lies in some other frame. - - - Command: split-window &optional window size horizontal - This function splits WINDOW into two windows. The original window - 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 HORIZONTAL is non-`nil', then WINDOW splits into two side by - side windows. The original window WINDOW keeps the leftmost SIZE - columns, and gives the rest of the columns to the new window. - Otherwise, it splits into windows one above the other, and WINDOW - keeps the upper 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 WINDOW is omitted or `nil', then the selected window is split. - If SIZE is omitted or `nil', then WINDOW is divided evenly into - two parts. (If there is an odd line, it is allocated to the new - window.) When `split-window' is called interactively, all its - arguments are `nil'. - - The following example starts with one window on a frame that is 50 - lines high by 80 columns wide; then the window is split. - - (setq w (selected-window)) - => # - (window-edges) ; Edges in order: - => (0 0 80 50) ; left-top-right-bottom - - ;; Returns window created - (setq w2 (split-window w 15)) - => # - (window-edges w2) - => (0 15 80 50) ; Bottom window; - ; top is line 15 - (window-edges w) - => (0 0 80 15) ; Top window - - The frame looks like this: - - __________ - | | line 0 - | w | - |__________| - | | line 15 - | w2 | - |__________| - line 50 - column 0 column 80 - - Next, the top window is split horizontally: - - (setq w3 (split-window w 35 t)) - => # - (window-edges w3) - => (35 0 80 15) ; Left edge at column 35 - (window-edges w) - => (0 0 35 15) ; Right edge at column 35 - (window-edges w2) - => (0 15 80 50) ; Bottom window unchanged - - Now, the screen looks like this: - - column 35 - __________ - | | | line 0 - | w | w3 | - |___|______| - | | line 15 - | w2 | - |__________| - line 50 - column 0 column 80 - - Normally, Emacs indicates the border between two side-by-side - windows with a scroll bar (*note Scroll Bars: X Frame Properties.) - or `|' characters. The display table can specify alternative - border characters; see *Note Display Tables::. - - - Command: split-window-vertically &optional size - This function splits the selected window into two windows, one - above the other, leaving the selected window with SIZE lines. - - This function is simply an interface to `split-windows'. Here is - the complete function definition for it: - - (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)))) - - - Command: split-window-horizontally &optional size - This function splits the selected window into two windows - side-by-side, leaving the selected window with SIZE columns. - - This function is simply an interface to `split-windows'. Here is - the complete definition for `split-window-horizontally' (except for - part of the documentation string): - - (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)) - - - Function: one-window-p &optional no-mini all-frames - This function returns non-`nil' if there is only one window. The - argument NO-MINI, if non-`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 ALL-FRAMES specifies which frames to consider. Here - are the possible values and their meanings: - - `nil' - Count the windows in the selected frame, plus the minibuffer - used by that frame even if it lies in some other frame. - - `t' - Count all windows in all existing frames. - - `visible' - Count all windows in all visible frames. - - 0 - Count all windows in all visible or iconified frames. - - anything else - Count precisely the windows in the selected frame, and no - others. - - -File: lispref.info, Node: Deleting Windows, Next: Selecting Windows, Prev: Splitting Windows, Up: Windows - -Deleting Windows -================ - - A window remains visible on its frame unless you "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 (*note -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.) - - - Function: window-live-p window - This function returns `nil' if WINDOW is deleted, and `t' - otherwise. - - *Warning:* Erroneous information or fatal errors may result from - using a deleted window as if it were live. - - - Command: delete-window &optional window - This function removes WINDOW from the display. If WINDOW is - omitted, then the selected window is deleted. An error is signaled - if there is only one window when `delete-window' is called. - - This function returns `nil'. - - When `delete-window' is called interactively, WINDOW defaults to - the selected window. - - - Command: delete-other-windows &optional window - This function makes WINDOW the only window on its frame, by - deleting the other windows in that frame. If WINDOW is omitted or - `nil', then the selected window is used by default. - - The result is `nil'. - - - Command: delete-windows-on buffer &optional frame - This function deletes all windows showing BUFFER. If there are no - windows showing BUFFER, it does nothing. - - `delete-windows-on' operates frame by frame. If a frame has - several windows showing different buffers, then those showing - BUFFER are removed, and the others expand to fill the space. If - all windows in some frame are showing BUFFER (including the case - where there is only one window), then the frame reverts to having a - single window showing another buffer chosen with `other-buffer'. - *Note The Buffer List::. - - The argument FRAME controls which frames to operate on: - - * If it is `nil', operate on the selected frame. - - * If it is `t', operate on all frames. - - * If it is `visible', operate on all visible frames. - - * 0 If it is 0, operate on all visible or iconified frames. - - * If it is a frame, operate on that frame. - - This function always returns `nil'. - diff --git a/info/lispref.info-26 b/info/lispref.info-26 index ea018b1..f5f7bde 100644 --- a/info/lispref.info-26 +++ b/info/lispref.info-26 @@ -50,6 +50,549 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Creating Buffers, Next: Killing Buffers, Prev: The Buffer List, Up: Buffers + +Creating Buffers +================ + + This section describes the two primitives for creating buffers. +`get-buffer-create' creates a buffer if it finds no existing buffer +with the specified name; `generate-new-buffer' always creates a new +buffer and gives it a unique name. + + Other functions you can use to create buffers include +`with-output-to-temp-buffer' (*note Temporary Displays::) and +`create-file-buffer' (*note Visiting Files::). Starting a subprocess +can also create a buffer (*note Processes::). + + - Function: get-buffer-create name + This function returns a buffer named 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 NAME is not a string. + + (get-buffer-create "foo") + => # + + The major mode for the new buffer is set to Fundamental mode. The + variable `default-major-mode' is handled at a higher level. *Note + Auto Major Mode::. + + - Function: generate-new-buffer name + This function returns a newly created, empty buffer, but does not + make it current. If there is no buffer named NAME, then that is + the name of the new buffer. If that name is in use, this function + adds suffixes of the form `' to NAME, where N is an integer. + It tries successive integers starting with 2 until it finds an + available name. + + An error is signaled if NAME is not a string. + + (generate-new-buffer "bar") + => # + (generate-new-buffer "bar") + => #> + (generate-new-buffer "bar") + => #> + + The major mode for the new buffer is set to Fundamental mode. The + variable `default-major-mode' is handled at a higher level. *Note + Auto Major Mode::. + + See the related function `generate-new-buffer-name' in *Note + Buffer Names::. + + +File: lispref.info, Node: Killing Buffers, Next: Indirect Buffers, Prev: Creating Buffers, Up: Buffers + +Killing Buffers +=============== + + "Killing a buffer" makes its name unknown to XEmacs 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 `eq'. + + If you kill a buffer that is current or displayed in a window, XEmacs +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). *Note 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 `buffer-name' of a killed buffer is `nil'. To test whether a +buffer has been killed, you can either use this feature or the function +`buffer-live-p'. + + - Function: buffer-live-p object + This function returns `t' if OBJECT is an editor buffer that has + not been deleted, `nil' otherwise. + + - Command: kill-buffer buffer-or-name + This function kills the buffer 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 `nil'. The argument BUFFER-OR-NAME may be a buffer or + the name of one. + + Any processes that have this buffer as the `process-buffer' are + sent the `SIGHUP' signal, which normally causes them to terminate. + (The basic meaning of `SIGHUP' is that a dialup line has been + disconnected.) *Note Deleting Processes::. + + If the buffer is visiting a file and contains unsaved changes, + `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 + `kill-buffer'. *Note Buffer Modification::. + + Killing a buffer that is already dead has no effect. + + (kill-buffer "foo.unchanged") + => nil + (kill-buffer "foo.changed") + + ---------- Buffer: Minibuffer ---------- + Buffer foo.changed modified; kill anyway? (yes or no) yes + ---------- Buffer: Minibuffer ---------- + + => nil + + - Variable: kill-buffer-query-functions + After confirming unsaved changes, `kill-buffer' calls the functions + in the list `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 `nil', `kill-buffer' spares the buffer's life. + + - Variable: kill-buffer-hook + This is a normal hook run by `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. *Note Hooks::. + + - Variable: buffer-offer-save + This variable, if non-`nil' in a particular buffer, tells + `save-buffers-kill-emacs' and `save-some-buffers' to offer to save + that buffer, just as they offer to save file-visiting buffers. The + variable `buffer-offer-save' automatically becomes buffer-local + when set for any reason. *Note Buffer-Local Variables::. + + +File: lispref.info, Node: Indirect Buffers, Prev: Killing 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 among files. The base +buffer may not itself be an indirect buffer. One base buffer may have +several "indirect children". + + 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 and mark, different narrowing, different markers and extents +(though inserting or deleting text in either buffer relocates the +markers and extents for both), different major modes, and different +local variables. Unlike in FSF Emacs, XEmacs indirect buffers do not +automatically share text properties among themselves and their base +buffer. + + 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 kills all its indirect children. + + - Command: make-indirect-buffer base-buffer name + This creates an indirect buffer named NAME whose base buffer is + BASE-BUFFER. The argument BASE-BUFFER may be a buffer or a string. + + If BASE-BUFFER is an indirect buffer, its base buffer is used as + the base for the new buffer. + + (make-indirect-buffer "*scratch*" "indirect") + => # + + - Function: buffer-base-buffer &optional buffer + This function returns the base buffer of BUFFER. If BUFFER is not + indirect, the value is `nil'. Otherwise, the value is another + buffer, which is never an indirect buffer. If BUFFER is not + supplied, it defaults to the current buffer. + + (buffer-base-buffer (get-buffer "indirect")) + => # + + - Function: buffer-indirect-children &optional buffer + This function returns a list of all indirect buffers whose base + buffer is BUFFER. If BUFFER is indirect, the return value will + always be `nil'; see `make-indirect-buffer'. If BUFFER is not + supplied, it defaults to the current buffer. + + (buffer-indirect-children (get-buffer "*scratch*")) + => (#) + + +File: lispref.info, Node: Windows, Next: Frames, Prev: Buffers, Up: Top + +Windows +******* + + This chapter describes most of the functions and variables related to +Emacs windows. See *Note 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. +* Position of Window:: Accessing the position of a window. +* Resizing Windows:: Changing the size of a window. +* Window Configurations:: Saving and restoring the state of the screen. + + +File: lispref.info, Node: Basic Windows, Next: Splitting Windows, Up: Windows + +Basic Concepts of Emacs Windows +=============================== + + A "window" in XEmacs 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 XEmacs Lisp. It should be clear +from the context which is meant. + + XEmacs groups windows into frames. A frame represents an area of +screen available for XEmacs 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 +"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 "the selected window". The selected +window's buffer is usually the current buffer (except when `set-buffer' +has been used). *Note 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, _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. +(*Note Deleting Windows::.) + + Each window has the following attributes: + + * containing frame + + * window height + + * window width + + * window edges with respect to the frame or screen + + * the buffer it displays + + * position within the buffer at the upper left of the window + + * amount of horizontal scrolling, in columns + + * point + + * the mark + + * how recently the window was selected + + 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 XEmacs 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; XEmacs uses one or +more X windows as frames, and subdivides them into Emacs windows. When +you use XEmacs on a character-only terminal, XEmacs treats the whole +terminal screen as one frame. + + Most window systems support arbitrarily located overlapping windows. +In contrast, Emacs windows are "tiled"; they never overlap, and +together they fill the whole screen or frame. Because of the way in +which XEmacs creates new windows and resizes them, you can't create +every conceivable tiling of windows on an Emacs frame. *Note Splitting +Windows::, and *Note Size of Window::. + + *Note Display::, for information on how the contents of the window's +buffer are displayed in the window. + + - Function: windowp object + This function returns `t' if OBJECT is a window. + + +File: lispref.info, Node: Splitting Windows, Next: Deleting Windows, Prev: Basic Windows, Up: Windows + +Splitting Windows +================= + + 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: `pop-to-buffer' and `display-buffer' (*note +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. + + - Function: one-window-p &optional nomini which-frames which-devices + This function returns non-`nil' if there is only one window. The + argument NOMINI, if non-`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 remaining arguments controls which set of windows are counted, + as with `next-window'. + + - Command: split-window &optional window size horizontal + This function splits WINDOW into two windows. The original window + 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 HORIZONTAL is non-`nil', then WINDOW splits into two side by + side windows. The original window WINDOW keeps the leftmost SIZE + columns, and gives the rest of the columns to the new window. + Otherwise, it splits into windows one above the other, and WINDOW + keeps the upper 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 WINDOW is omitted or `nil', then the selected window is split. + If SIZE is omitted or `nil', then WINDOW is divided evenly into + two parts. (If there is an odd line, it is allocated to the new + window.) When `split-window' is called interactively, all its + arguments are `nil'. + + The following example starts with one window on a frame that is 50 + lines high by 80 columns wide; then the window is split. + + (setq w (selected-window)) + => # + (window-edges) ; Edges in order: + => (0 0 80 50) ; left-top-right-bottom + + ;; Returns window created + (setq w2 (split-window w 15)) + => # + (window-edges w2) + => (0 15 80 50) ; Bottom window; + ; top is line 15 + (window-edges w) + => (0 0 80 15) ; Top window + + The frame looks like this: + + __________ + | | line 0 + | w | + |__________| + | | line 15 + | w2 | + |__________| + line 50 + column 0 column 80 + + Next, the top window is split horizontally: + + (setq w3 (split-window w 35 t)) + => # + (window-edges w3) + => (35 0 80 15) ; Left edge at column 35 + (window-edges w) + => (0 0 35 15) ; Right edge at column 35 + (window-edges w2) + => (0 15 80 50) ; Bottom window unchanged + + Now, the screen looks like this: + + column 35 + __________ + | | | line 0 + | w | w3 | + |___|______| + | | line 15 + | w2 | + |__________| + line 50 + column 0 column 80 + + Normally, Emacs indicates the border between two side-by-side + windows with a scroll bar (*note Scroll Bars: X Frame Properties.) + or `|' characters. The display table can specify alternative + border characters; see *Note Display Tables::. + + - Command: split-window-vertically &optional size + This function splits the selected window into two windows, one + above the other, leaving the selected window with SIZE lines. + + This function is simply an interface to `split-window'. Here is + the complete function definition for it: + + (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)))) + + - Command: split-window-horizontally &optional size + This function splits the selected window into two windows + side-by-side, leaving the selected window with SIZE columns. + + This function is simply an interface to `split-window'. Here is + the complete definition for `split-window-horizontally' (except for + part of the documentation string): + + (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)) + + +File: lispref.info, Node: Deleting Windows, Next: Selecting Windows, Prev: Splitting Windows, Up: Windows + +Deleting Windows +================ + + A window remains visible on its frame unless you "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 (*note +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.) + + - Function: window-live-p window + This function returns `nil' if WINDOW is deleted, and `t' + otherwise. + + *Warning:* Erroneous information or fatal errors may result from + using a deleted window as if it were live. + + - Command: delete-window &optional window force + This function removes WINDOW from the display. If WINDOW is + omitted, then the selected window is deleted. If window is the + only one on its frame, the frame is deleted as well. + + Normally, you cannot delete the last non-minibuffer-only frame + (you must use `save-buffers-kill-emacs' or `kill-emacs'); an error + is signaled instead. However, if optional second argument FORCE is + non-`nil', you can delete the last frame. (This will automatically + call `save-buffers-kill-emacs'.) + + This function returns `nil'. + + When `delete-window' is called interactively, the selected window + is deleted. + + - Command: delete-other-windows &optional window + This function makes WINDOW the only window on its frame, by + deleting the other windows in that frame. If WINDOW is omitted or + `nil', then the selected window is used by default. + + The result is `nil'. + + - Command: delete-windows-on buffer &optional which-frames + which-devices + This function deletes all windows showing BUFFER. If there are no + windows showing BUFFER, it does nothing. + + `delete-windows-on' operates frame by frame. If a frame has + several windows showing different buffers, then those showing + BUFFER are removed, and the others expand to fill the space. If + all windows in some frame are showing BUFFER (including the case + where there is only one window), then the frame reverts to having a + single window showing another buffer chosen with `other-buffer'. + *Note The Buffer List::. + + The argument WHICH-FRAMES controls which frames to operate on: + + `nil' + Delete all windows showing BUFFER in any frame. + + `t' + Delete only windows showing BUFFER in the selected frame. + + `visible' + Delete all windows showing BUFFER in any visible frame. + + `0' + Delete all windows showing BUFFER in any visible frame. + + FRAME + If it is a frame, delete all windows showing BUFFER in that + frame. + + *Warning:* This is similar to, but not identical to, the meaning + of the WHICH-FRAMES argument to `next-window'; the meanings of + `nil' and `t' are reversed. + + The optional argument WHICH-DEVICES further clarifies on which + devices to search for frames as specified by WHICH-FRAMES. This + value is only meaningful if WHICH-FRAMES is not `t'. + + `nil' + Consider all devices on the selected console. + + DEVICE + Consider only the one device DEVICE. + + CONSOLE + Consider all devices on CONSOLE. + + DEVICE-TYPE + Consider all devices with device type DEVICE-TYPE. + + `window-system' + Consider all devices on window system consoles. + + anything else + Consider all devices without restriction. + + This function always returns `nil'. + + File: lispref.info, Node: Selecting Windows, Next: Cyclic Window Ordering, Prev: Deleting Windows, Up: Windows Selecting Windows @@ -81,8 +624,8 @@ current buffer, and the cursor will appear in it. (select-window w) => # - - Macro: save-selected-window forms... - This macro records the selected window, executes FORMS in + - Special Form: save-selected-window forms... + This special form records the selected window, executes 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 FORMS change them, the changes are @@ -91,7 +634,7 @@ current buffer, and the cursor will appear in it. The following functions choose one of the windows on the screen, offering various criteria for the choice. - - Function: get-lru-window &optional frame + - Function: get-lru-window &optional which-frames which-devices This function returns the window least recently "used" (that is, selected). The selected window is always the most recently used window. @@ -101,20 +644,56 @@ offering various criteria for the choice. recently used window until it is selected. A minibuffer window is never a candidate. - The argument FRAME controls which windows are considered. + By default, only the windows in the selected frame are considered. + The optional argument WHICH-FRAMES changes this behavior. Here + are the possible values and their meanings: - * If it is `nil', consider windows on the selected frame. + `nil' + Consider all the windows in the selected windows's frame, + plus the minibuffer used by that frame even if it lies in + some other frame. - * If it is `t', consider windows on all frames. + `t' + Consider all windows in all existing frames. - * If it is `visible', consider windows on all visible frames. + `visible' + Consider all windows in all visible frames. (To get useful + results, you must ensure WINDOW is in a visible frame.) + + `0' + Consider all windows in all visible or iconified frames. + + FRAME + Consider all windows on frame FRAME. + + anything else + Consider precisely the windows in the selected window's + frame, and no others. + + The optional argument WHICH-DEVICES further clarifies on which + devices to search for frames as specified by WHICH-FRAMES. This + value is only meaningful if WHICH-FRAMES is non-`nil'. + + `nil' + Consider all devices on the selected console. + + DEVICE + Consider only the one device DEVICE. - * If it is 0, consider windows on all visible or iconified - frames. + CONSOLE + Consider all devices on CONSOLE. - * If it is a frame, consider windows on that frame. + DEVICE-TYPE + Consider all devices with device type DEVICE-TYPE. - - Function: get-largest-window &optional frame + `window-system' + Consider all devices on window system consoles. + + anything else + Consider all devices without restriction. + + + - Function: get-largest-window &optional which-frames which-devices 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 @@ -124,8 +703,8 @@ offering various criteria for the choice. returns the window that is first in the cyclic ordering of windows (see following section), starting from the selected window. - The argument FRAME controls which set of windows are considered. - See `get-lru-window', above. + The remaining arguments control which set of windows are + considered. See `next-window', above.  File: lispref.info, Node: Cyclic Window Ordering, Next: Buffers and Windows, Prev: Selecting Windows, Up: Windows @@ -150,7 +729,8 @@ 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. - - Function: next-window &optional window minibuf all-frames + - Function: next-window &optional window minibuf which-frames + which-devices This function returns the window following WINDOW in the cyclic ordering of windows. This is the window that `C-x o' would select if typed when WINDOW is selected. If WINDOW is the only window @@ -169,7 +749,8 @@ the order is left to right, or top to bottom. If MINIBUF is neither `t' nor `nil', then the minibuffer window is not included even if it is active. - The argument ALL-FRAMES specifies which frames to consider. Here + By default, only the windows in the selected frame are considered. + The optional argument WHICH-FRAMES changes this behavior. Here are the possible values and their meanings: `nil' @@ -184,13 +765,44 @@ the order is left to right, or top to bottom. Consider all windows in all visible frames. (To get useful results, you must ensure WINDOW is in a visible frame.) - 0 + `0' Consider all windows in all visible or iconified frames. + FRAME + Consider all windows on frame FRAME. + anything else Consider precisely the windows in WINDOW's frame, and no others. + The optional argument WHICH-DEVICES further clarifies on which + devices to search for frames as specified by WHICH-FRAMES. This + value is only meaningful if WHICH-FRAMES is non-`nil'. + + `nil' + Consider all devices on the selected console. + + DEVICE + Consider only the one device DEVICE. + + CONSOLE + Consider all devices on CONSOLE. + + DEVICE-TYPE + Consider all devices with device type DEVICE-TYPE. + + `window-system' + Consider all devices on window system consoles. + + anything else + Consider all devices without restriction. + + If you use consistent values for MINIBUF, WHICH-FRAMES, and + WHICH-DEVICES, you can use `next-window' to iterate through the + entire cycle of acceptable windows, eventually ending up back at + the window you started with. `previous-window' traverses the same + cycle, in the reverse order. + This example assumes there are two windows, both displaying the buffer `windows.texi': @@ -201,42 +813,29 @@ the order is left to right, or top to bottom. (next-window (next-window (selected-window))) => # - - Function: previous-window &optional window minibuf all-frames + - Function: previous-window &optional window minibuf which-frames + which-devices This function returns the window preceding WINDOW in the cyclic ordering of windows. The other arguments specify which windows to include in the cycle, as in `next-window'. - - Command: other-window count &optional frame + - Command: other-window count &optional which-frames which-devices This function selects the COUNTth following window in the cyclic - order. If count is negative, then it selects the -COUNTth + order. If COUNT is negative, then it selects the -COUNTth preceding window. It returns `nil'. In an interactive call, COUNT is the numeric prefix argument. - The argument FRAME controls which set of windows are considered. - * If it is `nil' or omitted, then windows on the selected frame - are considered. - - * If it is a frame, then windows on that frame are considered. + The other arguments specify which windows to include in the cycle, + as in `next-window'. - * If it is `t', then windows on all frames that currently exist - (including invisible and iconified frames) are considered. + - Function: walk-windows function &optional minibuf which-frames + which-devices + This function cycles through all windows, calling `function' once + for each window with the window as its sole argument. - * If it is the symbol `visible', then windows on all visible - frames are considered. - - * If it is the number 0, then windows on all visible and - iconified frames are considered. - - * If it is any other value, then the behavior is undefined. - - - Function: walk-windows proc &optional minibuf all-frames - This function cycles through all windows, calling `proc' once for - each window with the window as its sole argument. - - The optional arguments MINIBUF and ALL-FRAMES specify the set of - windows to include in the scan. See `next-window', above, for - details. + The other arguments specify which windows to cycle through, as in + `next-window'.  File: lispref.info, Node: Buffers and Windows, Next: Displaying Buffers, Prev: Cyclic Window Ordering, Up: Windows @@ -251,9 +850,14 @@ 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. - - Function: set-window-buffer window buffer-or-name + - Function: set-window-buffer window buffer-or-name &optional norecord This function makes WINDOW display BUFFER-OR-NAME as its contents. - It returns `nil'. + BUFFER-OR-NAME can be a buffer or a buffer name. + + With non-`nil' optional argument NORECORD, do not modify the + global or per-frame buffer ordering. + + This function returns `nil'. (set-window-buffer (selected-window) "foo") => nil @@ -266,25 +870,16 @@ window; use these functions when you need complete control. (window-buffer) => # - - Function: get-buffer-window buffer-or-name &optional frame + - Function: get-buffer-window buffer-or-name &optional which-frames + which-devices This function returns a window currently displaying BUFFER-OR-NAME, or `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. *Note Cyclic Window Ordering::. - The argument ALL-FRAMES controls which windows to consider. - - * If it is `nil', consider windows on the selected frame. - - * If it is `t', consider windows on all frames. - - * If it is `visible', consider windows on all visible frames. - - * If it is 0, consider windows on all visible or iconified - frames. - - * If it is a frame, consider windows on that frame. + The remaining arguments control which windows to consider. They + have the same meaning as for `next-window'.  File: lispref.info, Node: Displaying Buffers, Next: Choosing Window, Prev: Buffers and Windows, Up: Windows @@ -383,13 +978,17 @@ without affecting the display of buffers in windows. An example use of this function is found at the end of *Note Filter Functions::. - - Command: replace-buffer-in-windows buffer + - Command: replace-buffer-in-windows buffer &optional which-frames + which-devices This function replaces BUFFER with some other buffer in all windows displaying it. The other buffer used is chosen with `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 BUFFER is no longer displayed. + The optional arguments WHICH-FRAMES and WHICH-DEVICES have the + same meaning as with `delete-windows-on'. + This function returns `nil'.  @@ -404,11 +1003,14 @@ and commands use this subroutine. Here we describe how to use `display-buffer' and how to customize it. - Command: display-buffer buffer-or-name &optional not-this-window + override-frame This command makes BUFFER-OR-NAME appear in some window, like `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. + BUFFER-OR-NAME can be a buffer or the name of one. + If NOT-THIS-WINDOW is non-`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 @@ -416,6 +1018,9 @@ and commands use this subroutine. Here we describe how to use BUFFER-OR-NAME is already being displayed in any window, that is good enough, so this function does nothing. + If OVERRIDE-FRAME is non-`nil', display on that frame instead of + the current frame (or the dedicated frame). + `display-buffer' returns the window chosen to display BUFFER-OR-NAME. @@ -597,14 +1202,14 @@ to have multiple windows showing one buffer. when the user switches to another buffer, the cursor jumps to the position of point in that buffer. - - Function: window-point window + - Function: window-point &optional window This function returns the current position of point in WINDOW. For a non-selected window, this is the value point would have (in that window's buffer) if that window were selected. When WINDOW is the selected window and its buffer is also the - current buffer, the value returned is the same as point in that - buffer. + current buffer, the value returned is the same as the value of + point in that buffer. Strictly speaking, it would be more correct to return the "top-level" value of point, outside of any `save-excursion' forms. @@ -614,483 +1219,3 @@ position of point in that buffer. This function positions point in WINDOW at position POSITION in WINDOW's buffer. - -File: lispref.info, Node: Window Start, Next: Vertical Scrolling, Prev: Window Point, Up: Windows - -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 "display-start" position of the window (or just the -"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. - - - Function: window-start &optional window - This function returns the display-start position of window WINDOW. - If WINDOW is `nil', the selected window is used. For example, - - (window-start) - => 7058 - - 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 `count-lines' in - *Note Text Lines::. - - - Function: window-end &optional window - This function returns the position of the end of the display in - window WINDOW. If WINDOW is `nil', the selected window is used. - - Simply changing the buffer text or moving point does not update the - value that `window-end' returns. The value is updated only when - Emacs redisplays and redisplay actually finishes. - - If the last redisplay of 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, `window-end' will return `nil' in - that case. - - - Function: set-window-start window position &optional noforce - This function sets the display-start position of WINDOW to - POSITION in WINDOW's buffer. It returns 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 `nil' for NOFORCE, it - means you want display to start at 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 is 1 and you set the start of the window - 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: - - ;; Here is what `foo' looks like before executing - ;; the `set-window-start' expression. - - ---------- Buffer: foo ---------- - -!-This is the contents of buffer foo. - 2 - 3 - 4 - 5 - 6 - ---------- Buffer: foo ---------- - - (set-window-start - (selected-window) - (1+ (window-start))) - => 2 - - ;; Here is what `foo' looks like after executing - ;; the `set-window-start' expression. - ---------- Buffer: foo ---------- - his is the contents of buffer foo. - 2 - 3 - -!-4 - 5 - 6 - ---------- Buffer: foo ---------- - - If NOFORCE is non-`nil', and 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 POSITION is not used. - - - Function: pos-visible-in-window-p &optional position window - This function returns `t' if POSITION is within the range of text - currently visible on the screen in WINDOW. It returns `nil' if - POSITION is scrolled vertically out of view. The argument - POSITION defaults to the current position of point; WINDOW, to the - selected window. Here is an example: - - (or (pos-visible-in-window-p - (point) (selected-window)) - (recenter 0)) - - The `pos-visible-in-window-p' function considers only vertical - scrolling. If POSITION is out of view only because WINDOW has - been scrolled horizontally, `pos-visible-in-window-p' returns `t'. - *Note Horizontal Scrolling::. - - -File: lispref.info, Node: Vertical Scrolling, Next: Horizontal Scrolling, Prev: Window Start, Up: Windows - -Vertical Scrolling -================== - - 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 `window-point' to keep it on the screen. - - In the commands `scroll-up' and `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 `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 `scroll-other-window') have -unpredictable results if the current buffer is different from the buffer -that is displayed in the selected window. *Note Current Buffer::. - - - Command: scroll-up &optional count - This function scrolls the text in the selected window upward COUNT - lines. If COUNT is negative, scrolling is actually downward. - - If COUNT is `nil' (or omitted), then the length of scroll is - `next-screen-context-lines' lines less than the usable height of - the window (not counting its modeline). - - `scroll-up' returns `nil'. - - - Command: scroll-down &optional count - This function scrolls the text in the selected window downward - COUNT lines. If COUNT is negative, scrolling is actually upward. - - If COUNT is omitted or `nil', then the length of the scroll is - `next-screen-context-lines' lines less than the usable height of - the window (not counting its mode line). - - `scroll-down' returns `nil'. - - - Command: scroll-other-window &optional count - This function scrolls the text in another window upward COUNT - lines. Negative values of COUNT, or `nil', are handled as in - `scroll-up'. - - You can specify a buffer to scroll with the variable - `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 `minibuffer-scroll-window'. This variable has no effect - when any other window is selected. *Note 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, `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". - - - Variable: other-window-scroll-buffer - If this variable is non-`nil', it tells `scroll-other-window' - which buffer to scroll. - - - User Option: 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 N, then redisplay brings point back on - screen by scrolling N lines in either direction, if possible; - otherwise, it centers point. The default value is zero. - - - User Option: scroll-conservatively - This variable controls how many lines Emacs tries to scroll before - recentering. If you set it to a small number, then when you move - point a short distance off the screen, XEmacs will scroll the - screen just far enough to bring point back on screen, provided - that does not exceed `scroll-conservatively' lines. This variable - overrides the redisplay preemption. - - - User Option: 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, `scroll-up' - with an argument of `nil' scrolls so that this many lines at the - bottom of the window appear instead at the top. The default value - is `2'. - - - Command: recenter &optional count - This function scrolls the selected window to put the text where - point is located at a specified vertical position within the - window. - - If COUNT is a nonnegative number, it puts the line containing - point COUNT lines down from the top of the window. If COUNT is a - negative number, then it counts upward from the bottom of the - window, so that -1 stands for the last usable line in the window. - If COUNT is a non-`nil' list, then it stands for the line in the - middle of the window. - - If COUNT is `nil', `recenter' puts the line containing point in - the middle of the window, then clears and redisplays the entire - selected frame. - - When `recenter' is called interactively, COUNT is the raw prefix - argument. Thus, typing `C-u' as the prefix sets the COUNT to a - non-`nil' list, while typing `C-u 4' sets COUNT to 4, which - positions the current line four lines from the top. - - With an argument of zero, `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, - - (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) - - -File: lispref.info, Node: Horizontal Scrolling, Next: Size of Window, Prev: Vertical Scrolling, Up: Windows - -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 `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. - - - Command: scroll-left count - This function scrolls the selected window COUNT columns to the - left (or to the right if 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 `window-hscroll' - (below). - - - Command: scroll-right count - This function scrolls the selected window COUNT columns to the - right (or to the left if 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 `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. - - - Function: window-hscroll &optional window - This function returns the total leftward horizontal scrolling of - WINDOW--the number of columns by which the text in WINDOW is - scrolled left past the left margin. - - The value is never negative. It is zero when no horizontal - scrolling has been done in WINDOW (which is usually the case). - - If WINDOW is `nil', the selected window is used. - - (window-hscroll) - => 0 - (scroll-left 5) - => 5 - (window-hscroll) - => 5 - - - Function: set-window-hscroll window columns - This function sets the number of columns from the left margin that - WINDOW is scrolled to the value of COLUMNS. The argument COLUMNS - should be zero or positive; if not, it is taken as zero. - - The value returned is COLUMNS. - - (set-window-hscroll (selected-window) 10) - => 10 - - Here is how you can determine whether a given position POSITION is -off the screen due to horizontal scrolling: - - (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))))) - - -File: lispref.info, Node: Size of Window, Next: Position of Window, Prev: Horizontal Scrolling, Up: Windows - -The Size of a Window -==================== - - An Emacs window is rectangular, and its size information consists of -the height (in lines or pixels) and the width (in character positions -or pixels). The modeline is included in the height. The pixel width -and height values include scrollbars and margins, while the -line/character-position values do not. - - Note that the height in lines, and the width in characters, are -determined by dividing the corresponding pixel value by the height or -width of the default font in that window (if this is a variable-width -font, the average width is used). The resulting values may or may not -represent the actual number of lines in the window, or the actual number -of character positions in any particular line, esp. if there are pixmaps -or various different fonts in the window. - - The following functions return size information about a window: - - - Function: window-height &optional window - This function returns the number of lines in WINDOW, including its - modeline but not including the horizontal scrollbar, if any (this - is different from `window-pixel-height'). If WINDOW is `nil', the - function uses the selected window. - - (window-height) - => 40 - (split-window-vertically) - => # - (window-height) - => 20 - - - Function: window-width &optional window - This function returns the number of columns in WINDOW, not - including any left margin, right margin, or vertical scrollbar - (this is different from `window-pixel-width'). If WINDOW is - `nil', the function uses the selected window. - - (window-width) - => 80 - (window-height) - => 40 - (split-window-horizontally) - => # - (window-width) - => 39 - - Note that after splitting the window into two side-by-side windows, -the width of each window is less the half the width of the original -window because a vertical scrollbar appeared between the windows, -occupying two columns worth of space. Also, the height shrunk by one -because horizontal scrollbars appeared that weren't there before. -(Horizontal scrollbars appear only when lines are truncated, not when -they wrap. This is usually the case for horizontally split windows but -not for full-frame windows. You can change this using the variables -`truncate-lines' and `truncate-partial-width-windows'.) - - - Function: window-pixel-height &optional window - This function returns the height of WINDOW in pixels, including - its modeline and horizontal scrollbar, if any. If WINDOW is - `nil', the function uses the selected window. - - (window-pixel-height) - => 600 - (split-window-vertically) - => # - (window-pixel-height) - => 300 - - - Function: window-pixel-width &optional window - This function returns the width of WINDOW in pixels, including any - left margin, right margin, or vertical scrollbar that may be - displayed alongside it. If WINDOW is `nil', the function uses the - selected window. - - (window-pixel-width) - => 735 - (window-pixel-height) - => 600 - (split-window-horizontally) - => # - (window-pixel-width) - => 367 - (window-pixel-height) - => 600 - - - Function: window-text-area-pixel-height &optional window - This function returns the height in pixels of the text displaying - portion of WINDOW, which defaults to the selected window. Unlike - `window-pixel-height', the space occupied by the modeline and - horizontal scrollbar, if any, is not counted. - - - Function: window-text-area-pixel-width &optional window - This function returns the width in pixels of the text displaying - portion of WINDOW, which defaults to the selected window. Unlike - `window-pixel-width', the space occupied by the vertical scrollbar - and divider, if any, is not counted. - - - Function: window-displayed-text-pixel-height &optional window - noclipped - This function returns the height in pixels of the text displayed in - WINDOW, which defaults to the selected window. Unlike - `window-text-area-pixel-height', any blank space below the end of - the buffer is not included. If optional argument NOCLIPPED is - non-`nil', any space occupied by clipped lines will not be - included. - - -File: lispref.info, Node: Position of Window, Next: Resizing Windows, Prev: Size of Window, Up: Windows - -The Position of a Window -======================== - - XEmacs provides functions to determine the absolute location of -windows within a frame, and the relative location of a window in -comparison to other windows in the same frame. - - - Function: window-pixel-edges &optional window - This function returns a list of the pixel edge coordinates of - WINDOW. If WINDOW is `nil', the selected window is used. - - The order of the list is `(LEFT TOP RIGHT BOTTOM)', all elements - relative to 0, 0 at the top left corner of the frame. The element - RIGHT of the value is one more than the rightmost pixel used by - WINDOW (including any left margin, right margin, or vertical - scrollbar displayed alongside it), and BOTTOM is one more than the - bottommost pixel used by WINDOW (including any modeline or - horizontal scrollbar displayed above or below it). The frame area - does not include any frame menubars or toolbars that may be - displayed; thus, for example, if there is only one window on the - frame, the values for LEFT and TOP will always be 0. - - If WINDOW is at the upper left corner of its frame, RIGHT and - BOTTOM are the same as the values returned by - `(window-pixel-width)' and `(window-pixel-height)' respectively, - and TOP and BOTTOM are zero. - - There is no longer a function `window-edges' because it does not -make sense in a world with variable-width and variable-height lines, as -are allowed in XEmacs. - - - Function: window-highest-p window - This function returns non-`nil' if WINDOW is along the top of its - frame. - - - Function: window-lowest-p window - This function returns non-`nil' if WINDOW is along the bottom of - its frame. - - - Function: window-text-area-pixel-edges &optional window - This function allows one to determine the location of the - text-displaying portion of WINDOW, which defaults to the selected - window, with respect to the top left corner of the window. It - returns a list of integer pixel positions `(left top right - bottom)', all relative to `(0,0)' at the top left corner of the - window. - diff --git a/info/lispref.info-27 b/info/lispref.info-27 index c96a385..2c69bce 100644 --- a/info/lispref.info-27 +++ b/info/lispref.info-27 @@ -50,6 +50,493 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Window Start, Next: Vertical Scrolling, Prev: Window Point, Up: Windows + +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 "display-start" position of the window (or just the +"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. + + - Function: window-start &optional window + This function returns the display-start position of window WINDOW. + If WINDOW is `nil', the selected window is used. For example, + + (window-start) + => 7058 + + 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 `count-lines' in + *Note Text Lines::. + + - Function: window-end &optional window guarantee + This function returns the position of the end of the display in + window WINDOW. If WINDOW is `nil', the selected window is used. + + Simply changing the buffer text or setting `window-start' does not + update the value that `window-end' returns. The value is updated + only when Emacs redisplays and redisplay actually finishes. + + If the last redisplay of 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, `window-end' will return `nil' in + that case. + + If optional arg GUARANTEE is non-`nil', the return value is + guaranteed to be the same as `window-end' would return at the end + of the next full redisplay assuming nothing else changes in the + meantime. This function is potentially much slower with this flag + set. + + + - Function: set-window-start window position &optional noforce + This function sets the display-start position of WINDOW to + POSITION in WINDOW's buffer. It returns 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 `nil' for NOFORCE, it + means you want display to start at 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 is 1 and you set the start of the window + 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: + + ;; Here is what `foo' looks like before executing + ;; the `set-window-start' expression. + + ---------- Buffer: foo ---------- + -!-This is the contents of buffer foo. + 2 + 3 + 4 + 5 + 6 + ---------- Buffer: foo ---------- + + (set-window-start + (selected-window) + (1+ (window-start))) + => 2 + + ;; Here is what `foo' looks like after executing + ;; the `set-window-start' expression. + ---------- Buffer: foo ---------- + his is the contents of buffer foo. + 2 + 3 + -!-4 + 5 + 6 + ---------- Buffer: foo ---------- + + If NOFORCE is non-`nil', and 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 POSITION is not used. + + - Function: pos-visible-in-window-p &optional position window + This function returns `t' if POSITION is within the range of text + currently visible on the screen in WINDOW. It returns `nil' if + POSITION is scrolled vertically out of view. The argument + POSITION defaults to the current position of point; WINDOW, to the + selected window. Here is an example: + + (or (pos-visible-in-window-p + (point) (selected-window)) + (recenter 0)) + + The `pos-visible-in-window-p' function considers only vertical + scrolling. If POSITION is out of view only because WINDOW has + been scrolled horizontally, `pos-visible-in-window-p' returns `t'. + *Note Horizontal Scrolling::. + + +File: lispref.info, Node: Vertical Scrolling, Next: Horizontal Scrolling, Prev: Window Start, Up: Windows + +Vertical Scrolling +================== + + 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 `window-point' to keep it on the screen. + + In the commands `scroll-up' and `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 `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 `scroll-other-window') have +unpredictable results if the current buffer is different from the buffer +that is displayed in the selected window. *Note Current Buffer::. + + - Command: scroll-up &optional lines + This function scrolls the text in the selected window upward LINES + lines. If LINES is negative, scrolling is actually downward. + + If LINES is `nil' (or omitted), then the length of scroll is + `next-screen-context-lines' lines less than the usable height of + the window (not counting its modeline). + + `scroll-up' returns `nil'. + + - Command: scroll-down &optional lines + This function scrolls the text in the selected window downward + LINES lines. If LINES is negative, scrolling is actually upward. + + If LINES is omitted or `nil', then the length of the scroll is + `next-screen-context-lines' lines less than the usable height of + the window (not counting its mode line). + + `scroll-down' returns `nil'. + + - Command: scroll-other-window &optional lines + This function scrolls the text in another window upward LINES + lines. Negative values of LINES, or `nil', are handled as in + `scroll-up'. + + You can specify a buffer to scroll with the variable + `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 `minibuffer-scroll-window'. This variable has no effect + when any other window is selected. *Note 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, `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". + + - Variable: other-window-scroll-buffer + If this variable is non-`nil', it tells `scroll-other-window' + which buffer to scroll. + + - User Option: 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 N, then redisplay brings point back on + screen by scrolling N lines in either direction, if possible; + otherwise, it centers point. The default value is zero. + + - User Option: scroll-conservatively + This variable controls how many lines Emacs tries to scroll before + recentering. If you set it to a small number, then when you move + point a short distance off the screen, XEmacs will scroll the + screen just far enough to bring point back on screen, provided + that does not exceed `scroll-conservatively' lines. This variable + overrides the redisplay preemption. + + - User Option: 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, `scroll-up' + with an argument of `nil' scrolls so that this many lines at the + bottom of the window appear instead at the top. The default value + is `2'. + + - Command: recenter &optional location window + This function scrolls WINDOW (which defaults to the selected + window) to put the text where point is located at a specified + vertical position within the window. + + If LOCATION is a nonnegative number, it puts the line containing + point LOCATION lines down from the top of the window. If LOCATION + is a negative number, then it counts upward from the bottom of the + window, so that -1 stands for the last usable line in the window. + If LOCATION is a non-`nil' list, then it stands for the line in + the middle of the window. + + If LOCATION is `nil', `recenter' puts the line containing point in + the middle of the window, then clears and redisplays the entire + selected frame. + + When `recenter' is called interactively, LOCATION is the raw + prefix argument. Thus, typing `C-u' as the prefix sets the + LOCATION to a non-`nil' list, while typing `C-u 4' sets LOCATION + to 4, which positions the current line four lines from the top. + + With an argument of zero, `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, + + (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) + + +File: lispref.info, Node: Horizontal Scrolling, Next: Size of Window, Prev: Vertical Scrolling, Up: Windows + +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 `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. + + - Command: scroll-left &optional count + This function scrolls the selected window COUNT columns to the + left (or to the right if 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 `window-hscroll' + (below). + + - Command: scroll-right &optional count + This function scrolls the selected window COUNT columns to the + right (or to the left if 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 `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. + + - Function: window-hscroll &optional window + This function returns the total leftward horizontal scrolling of + WINDOW--the number of columns by which the text in WINDOW is + scrolled left past the left margin. + + The value is never negative. It is zero when no horizontal + scrolling has been done in WINDOW (which is usually the case). + + If WINDOW is `nil', the selected window is used. + + (window-hscroll) + => 0 + (scroll-left 5) + => 5 + (window-hscroll) + => 5 + + - Function: set-window-hscroll window columns + This function sets the number of columns from the left margin that + WINDOW is scrolled to the value of COLUMNS. The argument COLUMNS + should be zero or positive; if not, it is taken as zero. + + The value returned is COLUMNS. + + (set-window-hscroll (selected-window) 10) + => 10 + + Here is how you can determine whether a given position POSITION is +off the screen due to horizontal scrolling: + + (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))))) + + +File: lispref.info, Node: Size of Window, Next: Position of Window, Prev: Horizontal Scrolling, Up: Windows + +The Size of a Window +==================== + + An Emacs window is rectangular, and its size information consists of +the height (in lines or pixels) and the width (in character positions +or pixels). The modeline is included in the height. The pixel width +and height values include scrollbars and margins, while the +line/character-position values do not. + + Note that the height in lines, and the width in characters, are +determined by dividing the corresponding pixel value by the height or +width of the default font in that window (if this is a variable-width +font, the average width is used). The resulting values may or may not +represent the actual number of lines in the window, or the actual number +of character positions in any particular line, esp. if there are pixmaps +or various different fonts in the window. + + The following functions return size information about a window: + + - Function: window-height &optional window + This function returns the number of lines in WINDOW, including its + modeline but not including the horizontal scrollbar, if any (this + is different from `window-pixel-height'). If WINDOW is `nil', the + function uses the selected window. + + (window-height) + => 40 + (split-window-vertically) + => # + (window-height) + => 20 + + - Function: window-width &optional window + This function returns the number of columns in WINDOW, not + including any left margin, right margin, or vertical scrollbar + (this is different from `window-pixel-width'). If WINDOW is + `nil', the function uses the selected window. + + (window-width) + => 80 + (window-height) + => 40 + (split-window-horizontally) + => # + (window-width) + => 39 + + Note that after splitting the window into two side-by-side windows, +the width of each window is less the half the width of the original +window because a vertical scrollbar appeared between the windows, +occupying two columns worth of space. Also, the height shrunk by one +because horizontal scrollbars appeared that weren't there before. +(Horizontal scrollbars appear only when lines are truncated, not when +they wrap. This is usually the case for horizontally split windows but +not for full-frame windows. You can change this using the variables +`truncate-lines' and `truncate-partial-width-windows'.) + + - Function: window-pixel-height &optional window + This function returns the height of WINDOW in pixels, including + its modeline and horizontal scrollbar, if any. If WINDOW is + `nil', the function uses the selected window. + + (window-pixel-height) + => 600 + (split-window-vertically) + => # + (window-pixel-height) + => 300 + + - Function: window-pixel-width &optional window + This function returns the width of WINDOW in pixels, including any + left margin, right margin, or vertical scrollbar that may be + displayed alongside it. If WINDOW is `nil', the function uses the + selected window. + + (window-pixel-width) + => 735 + (window-pixel-height) + => 600 + (split-window-horizontally) + => # + (window-pixel-width) + => 367 + (window-pixel-height) + => 600 + + - Function: window-text-area-pixel-height &optional window + This function returns the height in pixels of the text displaying + portion of WINDOW, which defaults to the selected window. Unlike + `window-pixel-height', the space occupied by the modeline and + horizontal scrollbar, if any, is not counted. + + - Function: window-text-area-pixel-width &optional window + This function returns the width in pixels of the text displaying + portion of WINDOW, which defaults to the selected window. Unlike + `window-pixel-width', the space occupied by the vertical scrollbar + and divider, if any, is not counted. + + - Function: window-displayed-text-pixel-height &optional window + noclipped + This function returns the height in pixels of the text displayed in + WINDOW, which defaults to the selected window. Unlike + `window-text-area-pixel-height', any blank space below the end of + the buffer is not included. If optional argument NOCLIPPED is + non-`nil', any space occupied by clipped lines will not be + included. + + +File: lispref.info, Node: Position of Window, Next: Resizing Windows, Prev: Size of Window, Up: Windows + +The Position of a Window +======================== + + XEmacs provides functions to determine the absolute location of +windows within a frame, and the relative location of a window in +comparison to other windows in the same frame. + + - Function: window-pixel-edges &optional window + This function returns a list of the pixel edge coordinates of + WINDOW. If WINDOW is `nil', the selected window is used. + + The order of the list is `(LEFT TOP RIGHT BOTTOM)', all elements + relative to 0, 0 at the top left corner of WINDOW's frame. The + element RIGHT of the value is one more than the rightmost pixel + used by WINDOW (including any left margin, right margin, or + vertical scrollbar displayed alongside it), and BOTTOM is one more + than the bottommost pixel used by WINDOW (including any modeline + or horizontal scrollbar displayed above or below it). The frame + area does not include any frame menubars, toolbars, or gutters + that may be displayed; thus, for example, if there is only one + window on the frame, the values for LEFT and TOP will always be 0. + + If WINDOW is at the upper left corner of its frame, RIGHT and + BOTTOM are the same as the values returned by + `(window-pixel-width)' and `(window-pixel-height)' respectively, + and LEFT and TOP are zero. + + There is no longer a function `window-edges' because it does not +make sense in a world with variable-width and variable-height lines, as +are allowed in XEmacs. + + - Function: window-highest-p window + This function returns non-`nil' if WINDOW is along the top of its + frame. + + - Function: window-lowest-p window + This function returns non-`nil' if WINDOW is along the bottom of + its frame. + + - Function: window-text-area-pixel-edges &optional window + This function allows one to determine the location of the + text-displaying portion of WINDOW, which defaults to the selected + window, with respect to the top left corner of the window. It + returns a list of integer pixel positions `(left top right + bottom)', all relative to `(0,0)' at the top left corner of the + window. + + File: lispref.info, Node: Resizing Windows, Next: Window Configurations, Prev: Position of Window, Up: Windows Changing the Size of a Window @@ -60,23 +547,23 @@ that change the size of windows and low-level functions that access window size. XEmacs does not permit overlapping windows or gaps between windows, so resizing one window affects other windows. - - Command: enlarge-window size &optional horizontal window - This function makes the selected window SIZE lines taller, + - Command: enlarge-window count &optional horizontal window + This function makes the selected window COUNT 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 `window-min-height' lines, that window disappears. If HORIZONTAL is non-`nil', this function makes WINDOW wider by - SIZE columns, stealing columns instead of lines. If a window from - which columns are stolen shrinks below `window-min-width' columns, - that window disappears. + COUNT columns, stealing columns instead of lines. If a window + from which columns are stolen shrinks below `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 SIZE is negative, this function shrinks the window by -SIZE + If COUNT is negative, this function shrinks the window by -COUNT lines or columns. If that makes the window smaller than the minimum size (`window-min-height' and `window-min-width'), `enlarge-window' deletes the window. @@ -99,13 +586,13 @@ windows, so resizing one window affects other windows. grow sideways COUNT pixels, and optional third argument WINDOW specifies the window to change instead of the selected window. - - Command: shrink-window size &optional horizontal window + - Command: shrink-window count &optional horizontal window This function is like `enlarge-window' but negates the argument - SIZE, making the selected window smaller by giving lines (or + COUNT, making the selected window smaller by giving lines (or columns) to the other windows. If the window shrinks below `window-min-height' or `window-min-width', then it disappears. - If SIZE is negative, the window is enlarged by -SIZE lines or + If COUNT is negative, the window is enlarged by -COUNT lines or columns. If WINDOW is non-`nil', it specifies a window to change instead of @@ -181,13 +668,15 @@ configuration previously saved. configuration instead of a window configuration. *Note Frame Configurations::. - - Function: current-window-configuration - This function returns a new object representing XEmacs'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. + - Function: current-window-configuration &optional frame + This function returns a new object representing the current current + window configuration of FRAME, 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. + + FRAME defaults to the selected frame. - Function: set-window-configuration configuration This function restores the configuration of XEmacs's windows and @@ -308,7 +797,7 @@ Creating Frames To create a new frame, call the function `make-frame'. - - Function: make-frame &optional props device + - Command: make-frame &optional props device This function creates a new frame on DEVICE, if DEVICE permits creation of frames. (An X server does; an ordinary terminal does not (yet).) DEVICE defaults to the selected device if omitted. @@ -365,16 +854,17 @@ Access to Frame Properties and their values. - Function: frame-property frame property &optional default - This function returns FRAME's value for the property PROPERTY. + This function returns FRAME's value for the property PROPERTY, or + DEFAULT if there is no such property. - Function: set-frame-properties frame plist This function alters the properties of frame FRAME based on the elements of property list PLIST. If you don't mention a property in PLIST, its value doesn't change. - - Function: set-frame-property frame prop val - This function sets the property PROP of frame FRAME to the value - VAL. + - Function: set-frame-property frame property value + This function sets the property PROPERTY of frame FRAME to the + value VALUE.  File: lispref.info, Node: Initial Properties, Next: X Frame Properties, Prev: Property Access, Up: Frame Properties @@ -585,9 +1075,9 @@ in its usual fashion. - Function: set-frame-size frame cols rows &optional pretend This function sets the size of FRAME, measured in characters; COLS and ROWS specify the new width and height. (If PRETEND is - non-nil, it means that redisplay should act as if the frame's size - is COLS by ROWS, but the actual size of the frame should not be - changed. You should not normally use this option.) + non-`nil', it means that redisplay should act as if the frame's + size is COLS by ROWS, but the actual size of the frame should not + be changed. You should not normally use this option.) You can also use the functions `set-frame-height' and `set-frame-width' to set the height and width individually. The frame @@ -670,574 +1160,18 @@ Deleting Frames them. A deleted frame cannot appear on the screen, but continues to exist as a Lisp object until there are no references to it. - - Command: delete-frame &optional frame + - Command: delete-frame &optional frame force This function deletes the frame FRAME. By default, FRAME is the selected frame. + A frame may not be deleted if its minibuffer is used by other + frames. Normally, you cannot delete the last non-minibuffer-only + frame (you must use `save-buffers-kill-emacs' or `kill-emacs'). + However, if optional second argument FORCE is non-`nil', you can + delete the last frame. (This will automatically call + `save-buffers-kill-emacs'.) + - Function: frame-live-p frame The function `frame-live-p' returns non-`nil' if the frame FRAME has not been deleted. - -File: lispref.info, Node: Finding All Frames, Next: Frames and Windows, Prev: Deleting Frames, Up: Frames - -Finding All Frames -================== - - - Function: frame-list - The function `frame-list' returns a list of all the frames that - have not been deleted. It is analogous to `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 XEmacs. - - - Function: device-frame-list &optional device - This function returns a list of all frames on DEVICE. If DEVICE - is `nil', the selected device will be used. - - - Function: visible-frame-list &optional device - This function returns a list of just the currently visible frames. - If DEVICE is specified only frames on that device will be returned. - *Note Visibility of Frames::. (TTY frames always count as - "visible", even though only the selected one is actually - displayed.) - - - Function: next-frame &optional frame minibuf - The function `next-frame' lets you cycle conveniently through all - the frames from an arbitrary starting point. It returns the "next" - frame after FRAME in the cycle. If FRAME is omitted or `nil', it - defaults to the selected frame. - - The second argument, MINIBUF, says which frames to consider: - - `nil' - Exclude minibuffer-only frames. - - `visible' - Consider all visible frames. - - 0 - Consider all visible or iconified frames. - - a window - Consider only the frames using that particular window as their - minibuffer. - - the symbol `visible' - Include all visible frames. - - `0' - Include all visible and iconified frames. - - anything else - Consider all frames. - - - Function: previous-frame &optional frame minibuf - Like `next-frame', but cycles through all frames in the opposite - direction. - - See also `next-window' and `previous-window', in *Note Cyclic Window -Ordering::. - - -File: lispref.info, Node: Frames and Windows, Next: Minibuffers and Frames, Prev: Finding All Frames, Up: Frames - -Frames and Windows -================== - - Each window is part of one and only one frame; you can get the frame -with `window-frame'. - - - Function: frame-root-window &optional frame - This returns the root window of frame FRAME. FRAME defaults to - the selected frame if not specified. - - - Function: window-frame &optional window - This function returns the frame that WINDOW is on. WINDOW - defaults to the selected window if omitted. - - 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. - - - Function: frame-top-window frame - This returns the topmost, leftmost window of frame FRAME. - - At any time, exactly one window on any frame is "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 `frame-selected-window'. - - - Function: frame-selected-window &optional frame - This function returns the window on FRAME that is selected within - FRAME. FRAME defaults to the selected frame if not specified. - - Conversely, selecting a window for XEmacs with `select-window' also -makes that window selected within its frame. *Note Selecting Windows::. - - Another function that (usually) returns one of the windows in a -frame is `minibuffer-window'. *Note Minibuffer Misc::. - - -File: lispref.info, Node: Minibuffers and Frames, Next: Input Focus, Prev: Frames and Windows, Up: Frames - -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 `minibuffer-window' (*note 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 -`default-minibuffer-frame'. Its value should be a frame which does -have a minibuffer. - - - Variable: default-minibuffer-frame - This variable specifies the frame to use for the minibuffer - window, by default. - - -File: lispref.info, Node: Input Focus, Next: Visibility of Frames, Prev: Minibuffers and Frames, Up: Frames - -Input Focus -=========== - - At any time, one frame in XEmacs is the "selected frame". The -selected window always resides on the selected frame. As the focus -moves from device to device, the selected frame on each device is -remembered and restored when the focus moves back to that device. - - - Function: selected-frame &optional device - This function returns the selected frame on DEVICE. If DEVICE is - not specified, the selected device will be used. If no frames - exist on the device, `nil' is returned. - - 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 "shift the focus" to various X windows, overriding the normal -behavior of the server. - - Lisp programs can switch frames "temporarily" by calling the -function `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, `select-frame' is the only way to switch frames, and the -effect lasts until overridden by a subsequent call to `select-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 -`XEmacs' (*note Modeline Variables::). - - - Function: select-frame frame - This function selects frame FRAME, temporarily disregarding the - focus of the X server if any. The selection of FRAME lasts until - the next time the user does something to select a different frame, - or until the next time this function is called. - - Note that `select-frame' does not actually cause the window-system - focus to be set to this frame, or the `select-frame-hook' or - `deselect-frame-hook' to be run, until the next time that XEmacs is - waiting for an event. - - Also note that when the variable `focus-follows-mouse' is - non-`nil', the frame selection is temporary and is reverted when - the current command terminates, much like the buffer selected by - `set-buffer'. In order to effect a permanent focus change use - `focus-frame'. - - - Function: focus-frame frame - This function selects FRAME and gives it the window system focus. - The operation of `focus-frame' is not affected by the value of - `focus-follows-mouse'. - - - Macro: save-selected-frame forms... - This macro records the selected frame, executes FORMS in sequence, - then restores the earlier selected frame. The value returned is - the value of the last form. - - - Macro: with-selected-frame frame forms... - This macro records the selected frame, then selects FRAME and - executes FORMS in sequence. After the last form is finished, the - earlier selected frame is restored. The value returned is the - value of the last form. - - -File: lispref.info, Node: Visibility of Frames, Next: Raising and Lowering, Prev: Input Focus, Up: Frames - -Visibility of Frames -==================== - - An X window frame may be "visible", "invisible", or "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 TTY frames, since only the selected -one is actually displayed in any case. - - - Command: make-frame-visible &optional frame - This function makes frame FRAME visible. If you omit FRAME, it - makes the selected frame visible. - - - Command: make-frame-invisible &optional frame - This function makes frame FRAME invisible. - - - Command: iconify-frame &optional frame - This function iconifies frame FRAME. - - - Command: deiconify-frame &optional frame - This function de-iconifies frame FRAME. Under X, this is - equivalent to `make-frame-visible'. - - - Function: frame-visible-p frame - This returns whether FRAME is currently "visible" (actually in use - for display). A frame that is not visible is not updated, and, if - it works through a window system, may not show at all. - - - Function: frame-iconified-p frame - This returns whether FRAME is iconified. Not all window managers - use icons; some merely unmap the window, so this function is not - the inverse of `frame-visible-p'. It is possible for a frame to - not be visible and not be iconified either. However, if the frame - is iconified, it will not be visible. (Under FSF Emacs, the - functionality of this function is obtained through - `frame-visible-p'.) - - - Function: frame-totally-visible-p frame - This returns whether FRAME is not obscured by any other X windows. - On TTY frames, this is the same as `frame-visible-p'. - - -File: lispref.info, Node: Raising and Lowering, Next: Frame Configurations, Prev: Visibility of Frames, Up: Frames - -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. - - A window's place in this ordering is not fixed; in fact, users tend -to change the order frequently. "Raising" a window means moving it -"up", to the top of the stack. "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 XEmacs's X windows with these functions: - - - Command: raise-frame &optional frame - This function raises frame FRAME. - - - Command: lower-frame &optional frame - This function lowers frame FRAME. - - You can also specify auto-raise (raising automatically when a frame -is selected) or auto-lower (lowering automatically when it is -deselected). Under X, most ICCCM-compliant window managers will have -an option to do this for you, but the following variables are provided -in case you're using a broken WM. (Under FSF Emacs, the same -functionality is provided through the `auto-raise' and `auto-lower' -frame properties.) - - - Variable: auto-raise-frame - This variable's value is `t' if frames will be raised to the top - when selected. - - - Variable: auto-lower-frame - This variable's value is `t' if frames will be lowered to the - bottom when no longer selected. - - Auto-raising and auto-lowering is implemented through functions -attached to `select-frame-hook' and `deselect-frame-hook' (*note Frame -Hooks::). Under normal circumstances, you should not call these -functions directly. - - - Function: default-select-frame-hook - This hook function implements the `auto-raise-frame' variable; it - is for use as the value of `select-frame-hook'. - - - Function: default-deselect-frame-hook - This hook function implements the `auto-lower-frame' variable; it - is for use as the value of `deselect-frame-hook'. - - -File: lispref.info, Node: Frame Configurations, Next: Frame Hooks, Prev: Raising and Lowering, Up: Frames - -Frame Configurations -==================== - - A "frame configuration" records the current arrangement of frames, -all their properties, and the window configuration of each one. - - - Function: current-frame-configuration - This function returns a frame configuration list that describes - the current arrangement of frames and their contents. - - - Function: set-frame-configuration configuration - This function restores the state of frames described in - CONFIGURATION. - - -File: lispref.info, Node: Frame Hooks, Prev: Frame Configurations, Up: Frames - -Hooks for Customizing Frame Behavior -==================================== - - XEmacs provides many hooks that are called at various times during a -frame's lifetime. *Note Hooks::. - - - Variable: create-frame-hook - This hook is called each time a frame is created. The functions - are called with one argument, the newly-created frame. - - - Variable: delete-frame-hook - This hook is called each time a frame is deleted. The functions - are called with one argument, the about-to-be-deleted frame. - - - Variable: select-frame-hook - This is a normal hook that is run just after a frame is selected. - The function `default-select-frame-hook', which implements - auto-raising (*note Raising and Lowering::), is normally attached - to this hook. - - Note that calling `select-frame' does not necessarily set the - focus: The actual window-system focus will not be changed until - the next time that XEmacs is waiting for an event, and even then, - the window manager may refuse the focus-change request. - - - Variable: deselect-frame-hook - This is a normal hook that is run just before a frame is deselected - (and another frame is selected). The function - `default-deselect-frame-hook', which implements auto-lowering - (*note Raising and Lowering::), is normally attached to this hook. - - - Variable: map-frame-hook - This hook is called each time a frame is mapped (i.e. made - visible). The functions are called with one argument, the newly - mapped frame. - - - Variable: unmap-frame-hook - This hook is called each time a frame is unmapped (i.e. made - invisible or iconified). The functions are called with one - argument, the newly unmapped frame. - - -File: lispref.info, Node: Consoles and Devices, Next: Positions, Prev: Frames, Up: Top - -Consoles and Devices -******************** - - A "console" is an object representing a single input connection to -XEmacs, such as an X display or a TTY connection. It is possible for -XEmacs to have frames on multiple consoles at once (even on -heterogeneous types--you can simultaneously have a frame on an X -display and a TTY connection). Normally, there is only one console in -existence. - - A "device" is an object representing a single output device, such as -a particular screen on an X display. (Usually there is exactly one -device per X console connection, but there may be more than one if you -have a multi-headed X display. For TTY connections, there is always -exactly one device per console.) - - Each device has one or more "frames" in which text can be displayed. -For X displays and the like, a frame corresponds to the normal -window-system concept of a window. Frames can overlap, be displayed at -various locations within the display, be resized, etc. For TTY, only -one frame can be displayed at a time, and it occupies the entire TTY -display area. - - However, you can still define multiple frames and switch between -them. Their contents are entirely separate from each other. These -sorts of frames resemble the "virtual console" capability provided -under Linux or the multiple screens provided by the multiplexing program -`screen' under Unix. - - When you start up XEmacs, an initial console and device are created -to receive input and display frames on. This will either be an X -display or a TTY connection, depending on what mode you started XEmacs -in (this is determined by the `DISPLAY' environment variable, the -`-nw', `-t' and `-display' command-line options, etc.). - - You can connect to other X displays and TTY connections by creating -new console objects, and to other X screens on an existing display by -creating new device objects, as described below. Many functions (for -example the frame-creation functions) take an optional device argument -specifying which device the function pertains to. If the argument is -omitted, it defaults to the selected device (see below). - - - Function: consolep object - This returns non-`nil' if OBJECT is a console. - - - Function: devicep object - This returns non-`nil' if OBJECT is a device. - -* Menu: - -* Basic Console Functions:: Functions for working with consoles. -* Basic Device Functions:: Functions for working with devices. -* Console Types and Device Classes:: - I/O and color characteristics. -* Connecting to a Console or Device:: -* The Selected Console and Device:: -* Console and Device I/O:: Controlling input and output. - - -File: lispref.info, Node: Basic Console Functions, Next: Basic Device Functions, Up: Consoles and Devices - -Basic Console Functions -======================= - - - Function: console-list - This function returns a list of all existing consoles. - - - Function: console-device-list &optional console - This function returns a list of all devices on CONSOLE. If - CONSOLE is `nil', the selected console will be used. - - -File: lispref.info, Node: Basic Device Functions, Next: Console Types and Device Classes, Prev: Basic Console Functions, Up: Consoles and Devices - -Basic Device Functions -====================== - - - Function: device-list - This function returns a list of all existing devices. - - - Function: device-or-frame-p object - This function returns non-`nil' if OBJECT is a device or frame. - This function is useful because devices and frames are similar in - many respects and many functions can operate on either one. - - - Function: device-frame-list device - This function returns a list of all frames on DEVICE. - - - Function: frame-device frame - This function returns the device that FRAME is on. - - -File: lispref.info, Node: Console Types and Device Classes, Next: Connecting to a Console or Device, Prev: Basic Device Functions, Up: Consoles and Devices - -Console Types and Device Classes -================================ - - Every device is of a particular "type", which describes how the -connection to that device is made and how the device operates, and a -particular "class", which describes other characteristics of the device -(currently, the color capabilities of the device). - - The currently-defined device types are - -`x' - A connection to an X display (such as `willow:0'). - -`tty' - A connection to a tty (such as `/dev/ttyp3'). - -`stream' - A stdio connection. This describes a device for which input and - output is only possible in a stream-like fashion, such as when - XEmacs in running in batch mode. The very first device created by - XEmacs is a terminal device and is used to print out messages of - various sorts (for example, the help message when you use the - `-help' command-line option). - - The currently-defined device classes are -`color' - A color device. - -`grayscale' - A grayscale device (a device that can display multiple shades of - gray, but no color). - -`mono' - A device that can only display two colors (e.g. black and white). - - - Function: device-type device - This function returns the type of DEVICE. This is a symbol whose - name is one of the device types mentioned above. - - - Function: device-or-frame-type device-or-frame - This function returns the type of DEVICE-OR-FRAME. - - - Function: device-class device - This function returns the class (color behavior) of DEVICE. This - is a symbol whose name is one of the device classes mentioned - above. - - - Function: valid-device-type-p device-type - This function returns whether DEVICE-TYPE (which should be a - symbol) specifies a valid device type. - - - Function: valid-device-class-p device-class - This function returns whether DEVICE-CLASS (which should be a - symbol) specifies a valid device class. - - - Variable: terminal-device - This variable holds the initial terminal device object, which - represents XEmacs's stdout. - - -File: lispref.info, Node: Connecting to a Console or Device, Next: The Selected Console and Device, Prev: Console Types and Device Classes, Up: Consoles and Devices - -Connecting to a Console or Device -================================= - - - Function: make-device &optional type device-data - This function creates a new device. - - The following two functions create devices of specific types and are -written in terms of `make-device'. - - - Function: make-tty-device &optional tty terminal-type - This function creates a new tty device on TTY. This also creates - the tty's first frame. TTY should be a string giving the name of - a tty device file (e.g. `/dev/ttyp3' under SunOS et al.), as - returned by the `tty' command issued from the Unix shell. A value - of `nil' means use the stdin and stdout as passed to XEmacs from - the shell. If TERMINAL-TYPE is non-`nil', it should be a string - specifying the type of the terminal attached to the specified tty. - If it is `nil', the terminal type will be inferred from the - `TERM' environment variable. - - - Function: make-x-device &optional display argv-list - This function creates a new device connected to DISPLAY. Optional - argument ARGV-LIST is a list of strings describing command line - options. - - - Function: delete-device device - This function deletes DEVICE, permanently eliminating it from use. - This disconnects XEmacs's connection to the device. - - - Variable: create-device-hook - This variable, if non-`nil', should contain a list of functions, - which are called when a device is created. - - - Variable: delete-device-hook - This variable, if non-`nil', should contain a list of functions, - which are called when a device is deleted. - - - Function: console-live-p object - This function returns non-`nil' if OBJECT is a console that has - not been deleted. - - - Function: device-live-p object - This function returns non-`nil' if OBJECT is a device that has not - been deleted. - - - Function: device-x-display device - This function returns the X display which DEVICE is connected to, - if DEVICE is an X device. - diff --git a/info/lispref.info-28 b/info/lispref.info-28 index 51c114c..02d67fe 100644 --- a/info/lispref.info-28 +++ b/info/lispref.info-28 @@ -50,6 +50,650 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Finding All Frames, Next: Frames and Windows, Prev: Deleting Frames, Up: Frames + +Finding All Frames +================== + + - Function: frame-list + The function `frame-list' returns a list of all the frames that + have not been deleted. It is analogous to `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 XEmacs. + + - Function: device-frame-list &optional device + This function returns a list of all frames on DEVICE. If DEVICE + is `nil', the selected device will be used. + + - Function: visible-frame-list &optional device + This function returns a list of just the currently visible frames. + If DEVICE is specified only frames on that device will be returned. + *Note Visibility of Frames::. (TTY frames always count as + "visible", even though only the selected one is actually + displayed.) + + - Function: next-frame &optional frame which-frames which-devices + The function `next-frame' lets you cycle conveniently through all + the frames from an arbitrary starting point. It returns the "next" + frame after FRAME in the cycle. If FRAME defaults to the selected + frame. + + The second argument, WHICH-FRAMES, says which frames to consider: + + `visible' + Consider only frames that are visible. + + `iconic' + Consider only frames that are iconic. + + `invisible' + Consider only frames that are invisible (this is different + from iconic). + + `visible-iconic' + Consider frames that are visible or iconic. + + `invisible-iconic' + Consider frames that are invisible or iconic. + + `nomini' + Consider all frames except minibuffer-only ones. + + `visible-nomini' + Like `visible' but omits minibuffer-only frames. + + `iconic-nomini' + Like `iconic' but omits minibuffer-only frames. + + `invisible-nomini' + Like `invisible' but omits minibuffer-only frames. + + `visible-iconic-nomini' + Like `visible-iconic' but omits minibuffer-only frames. + + `invisible-iconic-nomini' + Like `invisible-iconic' but omits minibuffer-only frames. + + `nil' + Identical to `nomini'. + + WINDOW + Consider only the window WINDOW's frame and any frame now + using WINDOW as the minibuffer. + + any other value + Consider all frames. + + The optional argument WHICH-DEVICES further clarifies on which + devices to search for frames as specified by WHICH-FRAMES. + + `nil' + Consider all devices on the selected console. + + DEVICE + Consider only the one device DEVICE. + + CONSOLE + Consider all devices on CONSOLE. + + DEVICE-TYPE + Consider all devices with device type DEVICE-TYPE. + + `window-system' + Consider all devices on window system consoles. + + anything else + Consider all devices without restriction. + + - Function: previous-frame &optional frame which-frames which-devices + Like `next-frame', but cycles through all frames in the opposite + direction. + + See also `next-window' and `previous-window', in *Note Cyclic Window +Ordering::. + + +File: lispref.info, Node: Frames and Windows, Next: Minibuffers and Frames, Prev: Finding All Frames, Up: Frames + +Frames and Windows +================== + + Each window is part of one and only one frame; you can get the frame +with `window-frame'. + + - Function: frame-root-window &optional frame + This returns the root window of frame FRAME. FRAME defaults to + the selected frame if not specified. + + - Function: window-frame &optional window + This function returns the frame that WINDOW is on. WINDOW + defaults to the selected window if omitted. + + 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. + + - Function: frame-highest-window &optional frame position + This function returns the topmost, leftmost window of frame FRAME + at position POSITION. + + If omitted, FRAME defaults to the currently selected frame. + + POSITION is used to distinguish between multiple windows that abut + the top of the frame: 0 means the leftmost window abutting the top + of the frame, 1 the next-leftmost, etc. POSITION can also be less + than zero: -1 means the rightmost window abutting the top of the + frame, -2 the next-rightmost, etc. If omitted, POSITION defaults + to 0, i.e. the leftmost highest window. If there is no window at + the given POSITION, `nil' is returned. + + The following three functions work similarly. + + - Function: frame-lowest-window &optional frame position + This function returns the lowest window on FRAME which is at + POSITION. + + - Function: frame-leftmost-window &optional frame position + This function returns the leftmost window on FRAME which is at + POSITION. + + - Function: frame-rightmost-window &optional frame position + This function returns the rightmost window on FRAME which is at + POSITION. + + At any time, exactly one window on any frame is "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 `frame-selected-window'. + + - Function: frame-selected-window &optional frame + This function returns the window on FRAME that is selected within + FRAME. FRAME defaults to the selected frame if not specified. + + Conversely, selecting a window for XEmacs with `select-window' also +makes that window selected within its frame. *Note Selecting Windows::. + + Another function that (usually) returns one of the windows in a +frame is `minibuffer-window'. *Note Minibuffer Misc::. + + +File: lispref.info, Node: Minibuffers and Frames, Next: Input Focus, Prev: Frames and Windows, Up: Frames + +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 `minibuffer-window' (*note 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 +`default-minibuffer-frame'. Its value should be a frame which does +have a minibuffer. + + - Variable: default-minibuffer-frame + This variable specifies the frame to use for the minibuffer + window, by default. + + +File: lispref.info, Node: Input Focus, Next: Visibility of Frames, Prev: Minibuffers and Frames, Up: Frames + +Input Focus +=========== + + At any time, one frame in XEmacs is the "selected frame". The +selected window always resides on the selected frame. As the focus +moves from device to device, the selected frame on each device is +remembered and restored when the focus moves back to that device. + + - Function: selected-frame &optional device + This function returns the selected frame on DEVICE. If DEVICE is + not specified, the selected device will be used. If no frames + exist on the device, `nil' is returned. + + 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 "shift the focus" to various X windows, overriding the normal +behavior of the server. + + Lisp programs can switch frames "temporarily" by calling the +function `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, `select-frame' is the only way to switch frames, and the +effect lasts until overridden by a subsequent call to `select-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 +`XEmacs' (*note Modeline Variables::). + + - Function: select-frame frame + This function selects frame FRAME, temporarily disregarding the + focus of the X server if any. The selection of FRAME lasts until + the next time the user does something to select a different frame, + or until the next time this function is called. + + Note that `select-frame' does not actually cause the window-system + focus to be set to this frame, or the `select-frame-hook' or + `deselect-frame-hook' to be run, until the next time that XEmacs is + waiting for an event. + + Also note that when the variable `focus-follows-mouse' is + non-`nil', the frame selection is temporary and is reverted when + the current command terminates, much like the buffer selected by + `set-buffer'. In order to effect a permanent focus change use + `focus-frame'. + + - Function: focus-frame frame + This function selects FRAME and gives it the window system focus. + The operation of `focus-frame' is not affected by the value of + `focus-follows-mouse'. + + - Special Form: save-selected-frame forms... + This special form records the selected frame, executes FORMS in + sequence, then restores the earlier selected frame. The value + returned is the value of the last form. + + - Special Form: with-selected-frame frame forms... + This special form records the selected frame, then selects FRAME + and executes FORMS in sequence. After the last form is finished, + the earlier selected frame is restored. The value returned is the + value of the last form. + + +File: lispref.info, Node: Visibility of Frames, Next: Raising and Lowering, Prev: Input Focus, Up: Frames + +Visibility of Frames +==================== + + An frame on a window system may be "visible", "invisible", or +"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 TTY frames, since only the selected +one is actually displayed in any case. + + - Function: make-frame-visible &optional frame + This function makes frame FRAME visible. If you omit FRAME, it + makes the selected frame visible. + + - Function: make-frame-invisible &optional frame force + This function makes frame FRAME invisible. + + - Command: iconify-frame &optional frame + This function iconifies frame FRAME. + + - Function: Command deiconify-frame &optional frame + This function de-iconifies frame FRAME. Under a window system, + this is equivalent to `make-frame-visible'. + + - Function: frame-visible-p &optional frame + This returns whether FRAME is currently "visible" (actually in use + for display). A frame that is not visible is not updated, and, if + it works through a window system, may not show at all. + + - Function: frame-iconified-p &optional frame + This returns whether FRAME is iconified. Not all window managers + use icons; some merely unmap the window, so this function is not + the inverse of `frame-visible-p'. It is possible for a frame to + not be visible and not be iconified either. However, if the frame + is iconified, it will not be visible. (Under FSF Emacs, the + functionality of this function is obtained through + `frame-visible-p'.) + + - Function: frame-totally-visible-p &optional frame + This returns whether FRAME is not obscured by any other X windows. + On TTY frames, this is the same as `frame-visible-p'. + + +File: lispref.info, Node: Raising and Lowering, Next: Frame Configurations, Prev: Visibility of Frames, Up: Frames + +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. + + A window's place in this ordering is not fixed; in fact, users tend +to change the order frequently. "Raising" a window means moving it +"up", to the top of the stack. "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 XEmacs's X windows with these functions: + + - Command: raise-frame &optional frame + This function raises frame FRAME. + + - Command: lower-frame &optional frame + This function lowers frame FRAME. + + You can also specify auto-raise (raising automatically when a frame +is selected) or auto-lower (lowering automatically when it is +deselected). Under X, most ICCCM-compliant window managers will have +an option to do this for you, but the following variables are provided +in case you're using a broken WM. (Under FSF Emacs, the same +functionality is provided through the `auto-raise' and `auto-lower' +frame properties.) + + - Variable: auto-raise-frame + This variable's value is `t' if frames will be raised to the top + when selected. + + - Variable: auto-lower-frame + This variable's value is `t' if frames will be lowered to the + bottom when no longer selected. + + Auto-raising and auto-lowering is implemented through functions +attached to `select-frame-hook' and `deselect-frame-hook' (*note Frame +Hooks::). Under normal circumstances, you should not call these +functions directly. + + - Function: default-select-frame-hook + This hook function implements the `auto-raise-frame' variable; it + is for use as the value of `select-frame-hook'. + + - Function: default-deselect-frame-hook + This hook function implements the `auto-lower-frame' variable; it + is for use as the value of `deselect-frame-hook'. + + +File: lispref.info, Node: Frame Configurations, Next: Frame Hooks, Prev: Raising and Lowering, Up: Frames + +Frame Configurations +==================== + + A "frame configuration" records the current arrangement of frames, +all their properties, and the window configuration of each one. + + - Function: current-frame-configuration + This function returns a frame configuration list that describes + the current arrangement of frames and their contents. + + - Function: set-frame-configuration configuration &optional nodelete + This function restores the state of frames described by + CONFIGURATION, which should be the return value from a previous + call to `current-frame-configuration'. + + Each frame listed in CONFIGURATION has its position, size, window + configuration, and other properties set as specified in + CONFIGURATION. + + Ordinarily, this function deletes all existing frames not listed in + CONFIGURATION. But if optional second argument NODELETE is + non-`nil', the unwanted frames are iconified instead. + + +File: lispref.info, Node: Frame Hooks, Prev: Frame Configurations, Up: Frames + +Hooks for Customizing Frame Behavior +==================================== + + XEmacs provides many hooks that are called at various times during a +frame's lifetime. *Note Hooks::. + + - Variable: create-frame-hook + This hook is called each time a frame is created. The functions + are called with one argument, the newly-created frame. + + - Variable: delete-frame-hook + This hook is called each time a frame is deleted. The functions + are called with one argument, the about-to-be-deleted frame. + + - Variable: select-frame-hook + This is a normal hook that is run just after a frame is selected. + The function `default-select-frame-hook', which implements + auto-raising (*note Raising and Lowering::), is normally attached + to this hook. + + Note that calling `select-frame' does not necessarily set the + focus: The actual window-system focus will not be changed until + the next time that XEmacs is waiting for an event, and even then, + the window manager may refuse the focus-change request. + + - Variable: deselect-frame-hook + This is a normal hook that is run just before a frame is deselected + (and another frame is selected). The function + `default-deselect-frame-hook', which implements auto-lowering + (*note Raising and Lowering::), is normally attached to this hook. + + - Variable: map-frame-hook + This hook is called each time a frame is mapped (i.e. made + visible). The functions are called with one argument, the newly + mapped frame. + + - Variable: unmap-frame-hook + This hook is called each time a frame is unmapped (i.e. made + invisible or iconified). The functions are called with one + argument, the newly unmapped frame. + + +File: lispref.info, Node: Consoles and Devices, Next: Positions, Prev: Frames, Up: Top + +Consoles and Devices +******************** + + A "console" is an object representing a single input connection to +XEmacs, such as an X display or a TTY connection. It is possible for +XEmacs to have frames on multiple consoles at once (even on +heterogeneous types--you can simultaneously have a frame on an X +display and a TTY connection). Normally, there is only one console in +existence. + + A "device" is an object representing a single output device, such as +a particular screen on an X display. (Usually there is exactly one +device per X console connection, but there may be more than one if you +have a multi-headed X display. For TTY connections, there is always +exactly one device per console.) + + Each device has one or more "frames" in which text can be displayed. +For X displays and the like, a frame corresponds to the normal +window-system concept of a window. Frames can overlap, be displayed at +various locations within the display, be resized, etc. For TTY, only +one frame can be displayed at a time, and it occupies the entire TTY +display area. + + However, you can still define multiple frames and switch between +them. Their contents are entirely separate from each other. These +sorts of frames resemble the "virtual console" capability provided +under Linux or the multiple screens provided by the multiplexing program +`screen' under Unix. + + When you start up XEmacs, an initial console and device are created +to receive input and display frames on. This will either be an X +display or a TTY connection, depending on what mode you started XEmacs +in (this is determined by the `DISPLAY' environment variable, the +`-nw', `-t' and `-display' command-line options, etc.). + + You can connect to other X displays and TTY connections by creating +new console objects, and to other X screens on an existing display by +creating new device objects, as described below. Many functions (for +example the frame-creation functions) take an optional device argument +specifying which device the function pertains to. If the argument is +omitted, it defaults to the selected device (see below). + + - Function: consolep object + This returns non-`nil' if OBJECT is a console. + + - Function: devicep object + This returns non-`nil' if OBJECT is a device. + +* Menu: + +* Basic Console Functions:: Functions for working with consoles. +* Basic Device Functions:: Functions for working with devices. +* Console Types and Device Classes:: + I/O and color characteristics. +* Connecting to a Console or Device:: +* The Selected Console and Device:: +* Console and Device I/O:: Controlling input and output. + + +File: lispref.info, Node: Basic Console Functions, Next: Basic Device Functions, Up: Consoles and Devices + +Basic Console Functions +======================= + + - Function: console-list + This function returns a list of all existing consoles. + + - Function: console-device-list &optional console + This function returns a list of all devices on CONSOLE. If + CONSOLE is `nil', the selected console will be used. + + +File: lispref.info, Node: Basic Device Functions, Next: Console Types and Device Classes, Prev: Basic Console Functions, Up: Consoles and Devices + +Basic Device Functions +====================== + + - Function: device-list + This function returns a list of all existing devices. + + - Function: device-or-frame-p object + This function returns non-`nil' if OBJECT is a device or frame. + This function is useful because devices and frames are similar in + many respects and many functions can operate on either one. + + - Function: device-frame-list &optional device + This function returns a list of all frames on DEVICE. DEVICE + defaults to the currently selected device. + + - Function: frame-device &optional frame + This function returns the device that FRAME is on. FRAME defaults + to the currently selected frame. + + +File: lispref.info, Node: Console Types and Device Classes, Next: Connecting to a Console or Device, Prev: Basic Device Functions, Up: Consoles and Devices + +Console Types and Device Classes +================================ + + Every device is of a particular "type", which describes how the +connection to that device is made and how the device operates, and a +particular "class", which describes other characteristics of the device +(currently, the color capabilities of the device). + + The currently-defined device types are + +`x' + A connection to an X display (such as `willow:0'). + +`tty' + A connection to a tty (such as `/dev/ttyp3'). + +`stream' + A stdio connection. This describes a device for which input and + output is only possible in a stream-like fashion, such as when + XEmacs in running in batch mode. The very first device created by + XEmacs is a terminal device and is used to print out messages of + various sorts (for example, the help message when you use the + `-help' command-line option). + + The currently-defined device classes are +`color' + A color device. + +`grayscale' + A grayscale device (a device that can display multiple shades of + gray, but no color). + +`mono' + A device that can only display two colors (e.g. black and white). + + - Function: device-type &optional device + This function returns the type of DEVICE. This is a symbol whose + name is one of the device types mentioned above. DEVICE defaults + to the selected device. + + - Function: device-or-frame-type device-or-frame + This function returns the type of DEVICE-OR-FRAME. + + - Function: device-class &optional device + This function returns the class (color behavior) of DEVICE. This + is a symbol whose name is one of the device classes mentioned + above. + + - Function: valid-device-type-p device-type + This function returns whether DEVICE-TYPE (which should be a + symbol) specifies a valid device type. + + - Function: valid-device-class-p device-class + This function returns whether DEVICE-CLASS (which should be a + symbol) specifies a valid device class. + + - Variable: terminal-device + This variable holds the initial terminal device object, which + represents XEmacs's stdout. + + +File: lispref.info, Node: Connecting to a Console or Device, Next: The Selected Console and Device, Prev: Console Types and Device Classes, Up: Consoles and Devices + +Connecting to a Console or Device +================================= + + - Function: make-device type connection &optional props + This function creates a new device. + + The following two functions create devices of specific types and are +written in terms of `make-device'. + + - Function: make-tty-device &optional tty terminal-type + This function creates a new tty device on TTY. This also creates + the tty's first frame. TTY should be a string giving the name of + a tty device file (e.g. `/dev/ttyp3' under SunOS et al.), as + returned by the `tty' command issued from the Unix shell. A value + of `nil' means use the stdin and stdout as passed to XEmacs from + the shell. If TERMINAL-TYPE is non-`nil', it should be a string + specifying the type of the terminal attached to the specified tty. + If it is `nil', the terminal type will be inferred from the + `TERM' environment variable. + + - Function: make-x-device &optional display argv-list + This function creates a new device connected to DISPLAY. Optional + argument ARGV-LIST is a list of strings describing command line + options. + + - Function: delete-device device &optional force + This function deletes DEVICE, permanently eliminating it from use. + This disconnects XEmacs's connection to the device. + + - Variable: create-device-hook + This variable, if non-`nil', should contain a list of functions, + which are called when a device is created. + + - Variable: delete-device-hook + This variable, if non-`nil', should contain a list of functions, + which are called when a device is deleted. + + - Function: console-live-p object + This function returns non-`nil' if OBJECT is a console that has + not been deleted. + + - Function: device-live-p object + This function returns non-`nil' if OBJECT is a device that has not + been deleted. + + - Function: device-x-display device + This function returns the X display which DEVICE is connected to, + if DEVICE is an X device. + + File: lispref.info, Node: The Selected Console and Device, Next: Console and Device I/O, Prev: Connecting to a Console or Device, Up: Consoles and Devices The Selected Console and Device @@ -318,26 +962,26 @@ Likewise, to move to the end of the buffer, use: documented here to warn you not to use them in Lisp programs, because they set the mark and display messages in the echo area. - - Command: beginning-of-buffer &optional n + - Command: beginning-of-buffer &optional count 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 N is non-`nil', - then it puts point N tenths of the way from the beginning of the - buffer. + setting the mark at the previous position. If COUNT is non-`nil', + then it puts point COUNT tenths of the way from the beginning of + the buffer. - In an interactive call, N is the numeric prefix argument, if - provided; otherwise N defaults to `nil'. + In an interactive call, COUNT is the numeric prefix argument, if + provided; otherwise COUNT defaults to `nil'. Don't use this function in Lisp programs! - - Command: end-of-buffer &optional n + - Command: end-of-buffer &optional count 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 N is non-`nil', then it puts - point N tenths of the way from the end of the buffer. + the mark at the previous position. If COUNT is non-`nil', then it + puts point COUNT tenths of the way from the end of the buffer. - In an interactive call, N is the numeric prefix argument, if - provided; otherwise N defaults to `nil'. + In an interactive call, COUNT is the numeric prefix argument, if + provided; otherwise COUNT defaults to `nil'. Don't use this function in Lisp programs! @@ -418,7 +1062,7 @@ tabs and control characters are displayed. In an interactive call, COUNT is the numeric prefix argument. - - Function: count-lines start end + - Function: count-lines start end &optional ignore-invisible-lines-flag This function returns the number of lines between the positions START and END in the current buffer. If START and END are equal, then it returns 0. Otherwise it returns at least 1, even if START @@ -426,6 +1070,14 @@ tabs and control characters are displayed. them, considered in isolation, must contain at least one line unless it is empty. + With optional IGNORE-INVISIBLE-LINES-FLAG non-`nil', lines + collapsed with selective-display are excluded from the line count. + + *Note:* The expression to return the current line number is not + obvious: + + (1+ (count-lines 1 (point-at-bol))) + Here is an example of using `count-lines': (defun current-line () @@ -518,671 +1170,3 @@ performance of your code. *Note cache-long-line-scans: Text Lines. The value returned is the window line number point has moved to, with the top line in the window numbered 0. - -File: lispref.info, Node: List Motion, Next: Skipping Characters, Prev: Screen Lines, Up: Motion - -Moving over Balanced Expressions --------------------------------- - - Here are several functions concerned with balanced-parenthesis -expressions (also called "sexps" in connection with moving across them -in XEmacs). The syntax table controls how these functions interpret -various characters; see *Note Syntax Tables::. *Note Parsing -Expressions::, for lower-level primitives for scanning sexps or parts of -sexps. For user-level commands, see *Note Lists and Sexps: -(emacs)Lists and Sexps. - - - Command: forward-list &optional arg - This function moves forward across ARG balanced groups of - parentheses. (Other syntactic entities such as words or paired - string quotes are ignored.) ARG defaults to 1 if omitted. If ARG - is negative, move backward across that many groups of parentheses. - - - Command: backward-list &optional arg - This function moves backward across ARG balanced groups of - parentheses. (Other syntactic entities such as words or paired - string quotes are ignored.) ARG defaults to 1 if omitted. If ARG - is negative, move forward across that many groups of parentheses. - - - Command: up-list arg - This function moves forward out of ARG levels of parentheses. A - negative argument means move backward but still to a less deep - spot. - - - Command: down-list arg - This function moves forward into ARG levels of parentheses. A - negative argument means move backward but still go deeper in - parentheses (-ARG levels). - - - Command: forward-sexp &optional arg - This function moves forward across ARG balanced expressions. - Balanced expressions include both those delimited by parentheses - and other kinds, such as words and string constants. ARG defaults - to 1 if omitted. If ARG is negative, move backward across that - many balanced expressions. For example, - - ---------- Buffer: foo ---------- - (concat-!- "foo " (car x) y z) - ---------- Buffer: foo ---------- - - (forward-sexp 3) - => nil - - ---------- Buffer: foo ---------- - (concat "foo " (car x) y-!- z) - ---------- Buffer: foo ---------- - - - Command: backward-sexp &optional arg - This function moves backward across ARG balanced expressions. ARG - defaults to 1 if omitted. If ARG is negative, move forward across - that many balanced expressions. - - - Command: beginning-of-defun &optional arg - This function moves back to the ARGth beginning of a defun. If - ARG is negative, this actually moves forward, but it still moves - to the beginning of a defun, not to the end of one. ARG defaults - to 1 if omitted. - - - Command: end-of-defun &optional arg - This function moves forward to the ARGth end of a defun. If ARG - is negative, this actually moves backward, but it still moves to - the end of a defun, not to the beginning of one. ARG defaults to - 1 if omitted. - - - User Option: defun-prompt-regexp - If non-`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. - - -File: lispref.info, Node: Skipping Characters, Prev: List Motion, Up: Motion - -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 *Note Motion and Syntax::. - - - Function: skip-chars-forward character-set &optional limit buffer - This function moves point in BUFFER forward, skipping over a given - set of characters. It examines the character following point, - then advances point if the character matches CHARACTER-SET. This - continues until it reaches a character that does not match. The - function returns `nil'. BUFFER defaults to the current buffer if - omitted. - - The argument CHARACTER-SET is like the inside of a `[...]' in a - regular expression except that `]' is never special and `\' quotes - `^', `-' or `\'. Thus, `"a-zA-Z"' skips over all letters, - stopping before the first non-letter, and `"^a-zA-Z'" skips - non-letters stopping before the first letter. *Note Regular - Expressions::. - - If 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 LIMIT. - - In the following example, point is initially located directly - before the `T'. After the form is evaluated, point is located at - the end of that line (between the `t' of `hat' and the newline). - The function skips all letters and spaces, but not newlines. - - ---------- Buffer: foo ---------- - I read "-!-The cat in the hat - comes back" twice. - ---------- Buffer: foo ---------- - - (skip-chars-forward "a-zA-Z ") - => nil - - ---------- Buffer: foo ---------- - I read "The cat in the hat-!- - comes back" twice. - ---------- Buffer: foo ---------- - - - Function: skip-chars-backward character-set &optional limit buffer - This function moves point backward, skipping characters that match - CHARACTER-SET, until LIMIT. It just like `skip-chars-forward' - except for the direction of motion. - - -File: lispref.info, Node: Excursions, Next: Narrowing, Prev: Motion, Up: Positions - -Excursions -========== - - It is often useful to move point "temporarily" within a localized -portion of the program, or to switch buffers temporarily. This is -called an "excursion", and it is done with the `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 *Note Window Configurations:: and *note Frame -Configurations::). - - - Special Form: save-excursion forms... - The `save-excursion' special form saves the identity of the current - buffer and the values of point and the mark in it, evaluates - 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 `throw' or error (*note Nonlocal - Exits::). - - The `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 XEmacs. - - `save-excursion' does not save the values of point and the mark for - other buffers, so changes in other buffers remain in effect after - `save-excursion' exits. - - Likewise, `save-excursion' does not restore window-buffer - correspondences altered by functions such as `switch-to-buffer'. - One way to restore these correspondences, and the selected window, - is to use `save-window-excursion' inside `save-excursion' (*note - Window Configurations::). - - The value returned by `save-excursion' is the result of the last of - FORMS, or `nil' if no FORMS are given. - - (save-excursion - FORMS) - == - (let ((old-buf (current-buffer)) - (old-pnt (point-marker)) - (old-mark (copy-marker (mark-marker)))) - (unwind-protect - (progn FORMS) - (set-buffer old-buf) - (goto-char old-pnt) - (set-marker (mark-marker) old-mark))) - - - Special Form: save-current-buffer forms... - This special form is similar to `save-excursion' but it only saves - and restores the current buffer. Beginning with XEmacs 20.3, - `save-current-buffer' is a primitive. - - - Special Form: with-current-buffer buffer forms... - This special form evaluates FORMS with BUFFER as the current - buffer. It returns the value of the last form. - - - Special Form: with-temp-file file forms... - This special form creates a new buffer, evaluates FORMS there, and - writes the buffer to FILE. It returns the value of the last form - evaluated. - - - Special Form: save-selected-window forms... - This special form is similar to `save-excursion' but it saves and - restores the selected window and nothing else. - - -File: lispref.info, Node: Narrowing, Prev: Excursions, Up: Positions - -Narrowing -========= - - "Narrowing" means limiting the text addressable by XEmacs editing -commands to a limited range of characters in a buffer. The text that -remains addressable is called the "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. - - - Command: narrow-to-region start end &optional buffer - This function sets the accessible portion of BUFFER to start at - START and end at END. Both arguments should be character - positions. BUFFER defaults to the current buffer if omitted. - - In an interactive call, START and END are set to the bounds of the - current region (point and the mark, with the smallest first). - - - Command: narrow-to-page &optional move-count - This function sets the accessible portion of the current buffer to - include just the current page. An optional first argument - MOVE-COUNT non-`nil' means to move forward or backward by - MOVE-COUNT pages and then narrow. The variable `page-delimiter' - specifies where pages start and end (*note Standard Regexps::). - - In an interactive call, MOVE-COUNT is set to the numeric prefix - argument. - - - Command: widen &optional buffer - This function cancels any narrowing in BUFFER, so that the entire - contents are accessible. This is called "widening". It is - equivalent to the following expression: - - (narrow-to-region 1 (1+ (buffer-size))) - - BUFFER defaults to the current buffer if omitted. - - - Special Form: save-restriction body... - This special form saves the current bounds of the accessible - portion, evaluates the 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 `throw' or error (*note - Nonlocal Exits::). Therefore, this construct is a clean way to - narrow a buffer temporarily. - - The value returned by `save-restriction' is that returned by the - last form in BODY, or `nil' if no body forms were given. - - *Caution:* it is easy to make a mistake when using the - `save-restriction' construct. Read the entire description here - before you try it. - - If BODY changes the current buffer, `save-restriction' still - restores the restrictions on the original buffer (the buffer whose - restrictions it saved from), but it does not restore the identity - of the current buffer. - - `save-restriction' does _not_ restore point and the mark; use - `save-excursion' for that. If you use both `save-restriction' and - `save-excursion' together, `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 `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 BODY does further narrowing. - However, `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, `save-restriction' is not the - right tool for the job. Here is what you must use instead: - - (let ((beg (point-min-marker)) - (end (point-max-marker))) - (unwind-protect - (progn BODY) - (save-excursion - (set-buffer (marker-buffer beg)) - (narrow-to-region beg end)))) - - Here is a simple example of correct use of `save-restriction': - - ---------- Buffer: foo ---------- - This is the contents of foo - This is the contents of foo - This is the contents of foo-!- - ---------- Buffer: foo ---------- - - (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-!- - ---------- Buffer: foo ---------- - - -File: lispref.info, Node: Markers, Next: Text, Prev: Positions, Up: Top - -Markers -******* - - A "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''. - - -File: lispref.info, Node: Overview of Markers, Next: Predicates on Markers, Up: Markers - -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. *Note 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. - - 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 `insert-before-markers' (*note -Insertion::). - - 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. - - Because it is common to perform arithmetic operations on a marker -position, most of the arithmetic operations (including `+' and `-') -accept markers as arguments. In such cases, the marker stands for its -current position. - - Note that you can use extents to achieve the same functionality, and -more, as markers. (Markers were defined before extents, which is why -they both continue to exist.) A zero-length extent with the -`detachable' property removed is almost identical to a marker. (*Note -Extent Endpoints::, for more information on zero-length extents.) - - In particular: - - * In order to get marker-like behavior in a zero-length extent, the - `detachable' property must be removed (otherwise, the extent will - disappear when text near it is deleted) and exactly one endpoint - must be closed (if both endpoints are closed, the extent will - expand to contain text inserted where it is located). - - * If a zero-length extent has the `end-open' property but not the - `start-open' property (this is the default), text inserted at the - extent's location causes the extent to move forward, just like a - marker. - - * If a zero-length extent has the `start-open' property but not the - `end-open' property, text inserted at the extent's location causes - the extent to remain before the text, like what happens to markers - when `insert-before-markers' is used. - - * Markers end up after or before inserted text depending on whether - `insert' or `insert-before-markers' was called. These functions - do not affect zero-length extents differently; instead, the - presence or absence of the `start-open' and `end-open' extent - properties determines this, as just described. - - * Markers are automatically removed from a buffer when they are no - longer in use. Extents remain around until explicitly removed - from a buffer. - - * Many functions are provided for listing the extents in a buffer or - in a region of a buffer. No such functions exist for markers. - - Here are examples of creating markers, setting markers, and moving -point to markers: - - ;; Make a new marker that initially does not point anywhere: - (setq m1 (make-marker)) - => # - - ;; Set `m1' to point between the 99th and 100th characters - ;; in the current buffer: - (set-marker m1 100) - => # - - ;; Now insert one character at the beginning of the buffer: - (goto-char (point-min)) - => 1 - (insert "Q") - => nil - - ;; `m1' is updated appropriately. - m1 - => # - - ;; Two markers that point to the same position - ;; are not `eq', but they are `equal'. - (setq m2 (copy-marker m1)) - => # - (eq m1 m2) - => nil - (equal m1 m2) - => t - - ;; When you are finished using a marker, make it point nowhere. - (set-marker m1 nil) - => # - - -File: lispref.info, Node: Predicates on Markers, Next: Creating Markers, Prev: Overview of Markers, Up: Markers - -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 or either an integer, a character, or a -marker. The latter tests are useful in connection with the arithmetic -functions that work with any of markers, integers, or characters. - - - Function: markerp object - This function returns `t' if OBJECT is a marker, `nil' otherwise. - Note that integers are not markers, even though many functions - will accept either a marker or an integer. - - - Function: integer-or-marker-p object - This function returns `t' if OBJECT is an integer or a marker, - `nil' otherwise. - - - Function: integer-char-or-marker-p object - This function returns `t' if OBJECT is an integer, a character, or - a marker, `nil' otherwise. - - - Function: number-or-marker-p object - This function returns `t' if OBJECT is a number (either kind) or a - marker, `nil' otherwise. - - - Function: number-char-or-marker-p object - This function returns `t' if OBJECT is a number (either kind), a - character, or a marker, `nil' otherwise. - - -File: lispref.info, Node: Creating Markers, Next: Information from Markers, Prev: Predicates on Markers, Up: Markers - -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. - - - Function: make-marker - This functions returns a newly created marker that does not point - anywhere. - - (make-marker) - => # - - - Function: point-marker &optional dont-copy-p buffer - This function returns a marker that points to the present position - of point in BUFFER, which defaults to the current buffer. *Note - Point::. For an example, see `copy-marker', below. - - Internally, a marker corresponding to point is always maintained. - Normally the marker returned by `point-marker' is a copy; you may - modify it with reckless abandon. However, if optional argument - DONT-COPY-P is non-`nil', then the real point-marker is returned; - modifying the position of this marker will move point. It is - illegal to change the buffer of it, or make it point nowhere. - - - Function: point-min-marker &optional buffer - This function returns a new marker that points to the beginning of - the accessible portion of BUFFER, which defaults to the current - buffer. This will be the beginning of the buffer unless narrowing - is in effect. *Note Narrowing::. - - - Function: point-max-marker &optional buffer - This function returns a new marker that points to the end of the - accessible portion of BUFFER, which defaults to the current - buffer. This will be the end of the buffer unless narrowing is in - effect. *Note Narrowing::. - - Here are examples of this function and `point-min-marker', shown in - a buffer containing a version of the source file for the text of - this chapter. - - (point-min-marker) - => # - (point-max-marker) - => # - - (narrow-to-region 100 200) - => nil - (point-min-marker) - => # - (point-max-marker) - => # - - - Function: copy-marker marker-or-integer - If passed a marker as its argument, `copy-marker' returns a new - marker that points to the same place and the same buffer as does - MARKER-OR-INTEGER. If passed an integer as its argument, - `copy-marker' returns a new marker that points to position - MARKER-OR-INTEGER in the current buffer. - - If passed an integer argument less than 1, `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, - `copy-marker' returns a new marker that points to the end of the - buffer. - - An error is signaled if MARKER is neither a marker nor an integer. - - (setq p (point-marker)) - => # - - (setq q (copy-marker p)) - => # - - (eq p q) - => nil - - (equal p q) - => t - - (point) - => 2139 - - (set-marker p 3000) - => # - - (point) - => 2139 - - (setq p (point-marker t)) - => # - - (set-marker p 3000) - => # - - (point) - => 3000 - - (copy-marker 0) - => # - - (copy-marker 20000) - => # - - -File: lispref.info, Node: Information from Markers, Next: Changing Markers, Prev: Creating Markers, Up: Markers - -Information from Markers -======================== - - This section describes the functions for accessing the components of -a marker object. - - - Function: marker-position marker - This function returns the position that MARKER points to, or `nil' - if it points nowhere. - - - Function: marker-buffer marker - This function returns the buffer that MARKER points into, or `nil' - if it points nowhere. - - (setq m (make-marker)) - => # - (marker-position m) - => nil - (marker-buffer m) - => nil - - (set-marker m 3770 (current-buffer)) - => # - (marker-buffer m) - => # - (marker-position m) - => 3770 - - Two distinct markers are considered `equal' (even though not `eq') -to each other if they have the same position and buffer, or if they -both point nowhere. - - -File: lispref.info, Node: Changing Markers, Next: The Mark, Prev: Information from Markers, Up: Markers - -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. - - - Function: set-marker marker position &optional buffer - This function moves MARKER to POSITION in BUFFER. If BUFFER is - not provided, it defaults to the current buffer. - - If POSITION is less than 1, `set-marker' moves MARKER to the - beginning of the buffer. If POSITION is greater than the size of - the buffer, `set-marker' moves marker to the end of the buffer. - If POSITION is `nil' or a marker that points nowhere, then MARKER - is set to point nowhere. - - The value returned is MARKER. - - (setq m (point-marker)) - => # - (set-marker m 55) - => # - (setq b (get-buffer "foo")) - => # - (set-marker m 0 b) - => # - - - Function: move-marker marker position &optional buffer - This is another name for `set-marker'. - diff --git a/info/lispref.info-29 b/info/lispref.info-29 index 07d9698..d9b7423 100644 --- a/info/lispref.info-29 +++ b/info/lispref.info-29 @@ -50,6 +50,681 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: List Motion, Next: Skipping Characters, Prev: Screen Lines, Up: Motion + +Moving over Balanced Expressions +-------------------------------- + + Here are several functions concerned with balanced-parenthesis +expressions (also called "sexps" in connection with moving across them +in XEmacs). The syntax table controls how these functions interpret +various characters; see *Note Syntax Tables::. *Note Parsing +Expressions::, for lower-level primitives for scanning sexps or parts of +sexps. For user-level commands, see *Note Lists and Sexps: +(emacs)Lists and Sexps. + + - Command: forward-list &optional arg + This function moves forward across ARG balanced groups of + parentheses. (Other syntactic entities such as words or paired + string quotes are ignored.) ARG defaults to 1 if omitted. If ARG + is negative, move backward across that many groups of parentheses. + + - Command: backward-list &optional count + This function moves backward across COUNT balanced groups of + parentheses. (Other syntactic entities such as words or paired + string quotes are ignored.) COUNT defaults to 1 if omitted. If + COUNT is negative, move forward across that many groups of + parentheses. + + - Command: up-list &optional count + This function moves forward out of COUNT levels of parentheses. A + negative argument means move backward but still to a less deep + spot. + + - Command: down-list &optional count + This function moves forward into COUNT levels of parentheses. A + negative argument means move backward but still go deeper in + parentheses (-COUNT levels). + + - Command: forward-sexp &optional count + This function moves forward across COUNT balanced expressions. + Balanced expressions include both those delimited by parentheses + and other kinds, such as words and string constants. COUNT + defaults to 1 if omitted. If COUNT is negative, move backward + across that many balanced expressions. For example, + + ---------- Buffer: foo ---------- + (concat-!- "foo " (car x) y z) + ---------- Buffer: foo ---------- + + (forward-sexp 3) + => nil + + ---------- Buffer: foo ---------- + (concat "foo " (car x) y-!- z) + ---------- Buffer: foo ---------- + + - Command: backward-sexp &optional count + This function moves backward across COUNT balanced expressions. + COUNT defaults to 1 if omitted. If COUNT is negative, move + forward across that many balanced expressions. + + - Command: beginning-of-defun &optional count + This function moves back to the COUNTth beginning of a defun. If + COUNT is negative, this actually moves forward, but it still moves + to the beginning of a defun, not to the end of one. COUNT + defaults to 1 if omitted. + + - Command: end-of-defun &optional count + This function moves forward to the COUNTth end of a defun. If + COUNT is negative, this actually moves backward, but it still + moves to the end of a defun, not to the beginning of one. COUNT + defaults to 1 if omitted. + + - User Option: defun-prompt-regexp + If non-`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. + + +File: lispref.info, Node: Skipping Characters, Prev: List Motion, Up: Motion + +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 *Note Motion and Syntax::. + + - Function: skip-chars-forward character-set &optional limit buffer + This function moves point in BUFFER forward, skipping over a given + set of characters. It examines the character following point, + then advances point if the character matches CHARACTER-SET. This + continues until it reaches a character that does not match. The + function returns `nil'. BUFFER defaults to the current buffer if + omitted. + + The argument CHARACTER-SET is like the inside of a `[...]' in a + regular expression except that `]' is never special and `\' quotes + `^', `-' or `\'. Thus, `"a-zA-Z"' skips over all letters, + stopping before the first non-letter, and `"^a-zA-Z'" skips + non-letters stopping before the first letter. *Note Regular + Expressions::. + + If 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 LIMIT. + + In the following example, point is initially located directly + before the `T'. After the form is evaluated, point is located at + the end of that line (between the `t' of `hat' and the newline). + The function skips all letters and spaces, but not newlines. + + ---------- Buffer: foo ---------- + I read "-!-The cat in the hat + comes back" twice. + ---------- Buffer: foo ---------- + + (skip-chars-forward "a-zA-Z ") + => nil + + ---------- Buffer: foo ---------- + I read "The cat in the hat-!- + comes back" twice. + ---------- Buffer: foo ---------- + + - Function: skip-chars-backward character-set &optional limit buffer + This function moves point backward, skipping characters that match + CHARACTER-SET, until LIMIT. It just like `skip-chars-forward' + except for the direction of motion. + + +File: lispref.info, Node: Excursions, Next: Narrowing, Prev: Motion, Up: Positions + +Excursions +========== + + It is often useful to move point "temporarily" within a localized +portion of the program, or to switch buffers temporarily. This is +called an "excursion", and it is done with the `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 *Note Window Configurations:: and *note Frame +Configurations::). + + - Special Form: save-excursion forms... + The `save-excursion' special form saves the identity of the current + buffer and the values of point and the mark in it, evaluates + 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 `throw' or error (*note Nonlocal + Exits::). + + The `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 XEmacs. + + `save-excursion' does not save the values of point and the mark for + other buffers, so changes in other buffers remain in effect after + `save-excursion' exits. + + Likewise, `save-excursion' does not restore window-buffer + correspondences altered by functions such as `switch-to-buffer'. + One way to restore these correspondences, and the selected window, + is to use `save-window-excursion' inside `save-excursion' (*note + Window Configurations::). + + The value returned by `save-excursion' is the result of the last of + FORMS, or `nil' if no FORMS are given. + + (save-excursion + FORMS) + == + (let ((old-buf (current-buffer)) + (old-pnt (point-marker)) + (old-mark (copy-marker (mark-marker)))) + (unwind-protect + (progn FORMS) + (set-buffer old-buf) + (goto-char old-pnt) + (set-marker (mark-marker) old-mark))) + + - Special Form: save-current-buffer forms... + This special form is similar to `save-excursion' but it only saves + and restores the current buffer. Beginning with XEmacs 20.3, + `save-current-buffer' is a primitive. + + - Special Form: with-current-buffer buffer forms... + This special form evaluates FORMS with BUFFER as the current + buffer. It returns the value of the last form. + + - Special Form: with-temp-file filename forms... + This special form creates a new buffer, evaluates FORMS there, and + writes the buffer to FILENAME. It returns the value of the last + form evaluated. + + - Special Form: save-selected-window forms... + This special form is similar to `save-excursion' but it saves and + restores the selected window and nothing else. + + +File: lispref.info, Node: Narrowing, Prev: Excursions, Up: Positions + +Narrowing +========= + + "Narrowing" means limiting the text addressable by XEmacs editing +commands to a limited range of characters in a buffer. The text that +remains addressable is called the "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. + + - Command: narrow-to-region start end &optional buffer + This function sets the accessible portion of BUFFER to start at + START and end at END. Both arguments should be character + positions. BUFFER defaults to the current buffer if omitted. + + In an interactive call, START and END are set to the bounds of the + current region (point and the mark, with the smallest first). + + - Command: narrow-to-page &optional move-count + This function sets the accessible portion of the current buffer to + include just the current page. An optional first argument + MOVE-COUNT non-`nil' means to move forward or backward by + MOVE-COUNT pages and then narrow. The variable `page-delimiter' + specifies where pages start and end (*note Standard Regexps::). + + In an interactive call, MOVE-COUNT is set to the numeric prefix + argument. + + - Command: widen &optional buffer + This function cancels any narrowing in BUFFER, so that the entire + contents are accessible. This is called "widening". It is + equivalent to the following expression: + + (narrow-to-region 1 (1+ (buffer-size))) + + BUFFER defaults to the current buffer if omitted. + + - Special Form: save-restriction body... + This special form saves the current bounds of the accessible + portion, evaluates the 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 `throw' or error (*note + Nonlocal Exits::). Therefore, this construct is a clean way to + narrow a buffer temporarily. + + The value returned by `save-restriction' is that returned by the + last form in BODY, or `nil' if no body forms were given. + + *Caution:* it is easy to make a mistake when using the + `save-restriction' construct. Read the entire description here + before you try it. + + If BODY changes the current buffer, `save-restriction' still + restores the restrictions on the original buffer (the buffer whose + restrictions it saved from), but it does not restore the identity + of the current buffer. + + `save-restriction' does _not_ restore point and the mark; use + `save-excursion' for that. If you use both `save-restriction' and + `save-excursion' together, `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 `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 BODY does further narrowing. + However, `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, `save-restriction' is not the + right tool for the job. Here is what you must use instead: + + (let ((start (point-min-marker)) + (end (point-max-marker))) + (unwind-protect + (progn BODY) + (save-excursion + (set-buffer (marker-buffer start)) + (narrow-to-region start end)))) + + Here is a simple example of correct use of `save-restriction': + + ---------- Buffer: foo ---------- + This is the contents of foo + This is the contents of foo + This is the contents of foo-!- + ---------- Buffer: foo ---------- + + (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-!- + ---------- Buffer: foo ---------- + + +File: lispref.info, Node: Markers, Next: Text, Prev: Positions, Up: Top + +Markers +******* + + A "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''. + + +File: lispref.info, Node: Overview of Markers, Next: Predicates on Markers, Up: Markers + +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. *Note 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. + + 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 `insert-before-markers' (*note +Insertion::). + + 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. + + Because it is common to perform arithmetic operations on a marker +position, most of the arithmetic operations (including `+' and `-') +accept markers as arguments. In such cases, the marker stands for its +current position. + + Note that you can use extents to achieve the same functionality, and +more, as markers. (Markers were defined before extents, which is why +they both continue to exist.) A zero-length extent with the +`detachable' property removed is almost identical to a marker. (*Note +Extent Endpoints::, for more information on zero-length extents.) + + In particular: + + * In order to get marker-like behavior in a zero-length extent, the + `detachable' property must be removed (otherwise, the extent will + disappear when text near it is deleted) and exactly one endpoint + must be closed (if both endpoints are closed, the extent will + expand to contain text inserted where it is located). + + * If a zero-length extent has the `end-open' property but not the + `start-open' property (this is the default), text inserted at the + extent's location causes the extent to move forward, just like a + marker. + + * If a zero-length extent has the `start-open' property but not the + `end-open' property, text inserted at the extent's location causes + the extent to remain before the text, like what happens to markers + when `insert-before-markers' is used. + + * Markers end up after or before inserted text depending on whether + `insert' or `insert-before-markers' was called. These functions + do not affect zero-length extents differently; instead, the + presence or absence of the `start-open' and `end-open' extent + properties determines this, as just described. + + * Markers are automatically removed from a buffer when they are no + longer in use. Extents remain around until explicitly removed + from a buffer. + + * Many functions are provided for listing the extents in a buffer or + in a region of a buffer. No such functions exist for markers. + + Here are examples of creating markers, setting markers, and moving +point to markers: + + ;; Make a new marker that initially does not point anywhere: + (setq m1 (make-marker)) + => # + + ;; Set `m1' to point between the 99th and 100th characters + ;; in the current buffer: + (set-marker m1 100) + => # + + ;; Now insert one character at the beginning of the buffer: + (goto-char (point-min)) + => 1 + (insert "Q") + => nil + + ;; `m1' is updated appropriately. + m1 + => # + + ;; Two markers that point to the same position + ;; are not `eq', but they are `equal'. + (setq m2 (copy-marker m1)) + => # + (eq m1 m2) + => nil + (equal m1 m2) + => t + + ;; When you are finished using a marker, make it point nowhere. + (set-marker m1 nil) + => # + + +File: lispref.info, Node: Predicates on Markers, Next: Creating Markers, Prev: Overview of Markers, Up: Markers + +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 or either an integer, a character, or a +marker. The latter tests are useful in connection with the arithmetic +functions that work with any of markers, integers, or characters. + + - Function: markerp object + This function returns `t' if OBJECT is a marker, `nil' otherwise. + Note that integers are not markers, even though many functions + will accept either a marker or an integer. + + - Function: integer-or-marker-p object + This function returns `t' if OBJECT is an integer or a marker, + `nil' otherwise. + + - Function: integer-char-or-marker-p object + This function returns `t' if OBJECT is an integer, a character, or + a marker, `nil' otherwise. + + - Function: number-or-marker-p object + This function returns `t' if OBJECT is a number (either kind) or a + marker, `nil' otherwise. + + - Function: number-char-or-marker-p object + This function returns `t' if OBJECT is a number (either kind), a + character, or a marker, `nil' otherwise. + + +File: lispref.info, Node: Creating Markers, Next: Information from Markers, Prev: Predicates on Markers, Up: Markers + +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. + + - Function: make-marker + This functions returns a newly created marker that does not point + anywhere. + + (make-marker) + => # + + - Function: point-marker &optional dont-copy-p buffer + This function returns a marker that points to the present position + of point in BUFFER, which defaults to the current buffer. *Note + Point::. For an example, see `copy-marker', below. + + Internally, a marker corresponding to point is always maintained. + Normally the marker returned by `point-marker' is a copy; you may + modify it with reckless abandon. However, if optional argument + DONT-COPY-P is non-`nil', then the real point-marker is returned; + modifying the position of this marker will move point. It is + illegal to change the buffer of it, or make it point nowhere. + + - Function: point-min-marker &optional buffer + This function returns a new marker that points to the beginning of + the accessible portion of BUFFER, which defaults to the current + buffer. This will be the beginning of the buffer unless narrowing + is in effect. *Note Narrowing::. + + - Function: point-max-marker &optional buffer + This function returns a new marker that points to the end of the + accessible portion of BUFFER, which defaults to the current + buffer. This will be the end of the buffer unless narrowing is in + effect. *Note Narrowing::. + + Here are examples of this function and `point-min-marker', shown in + a buffer containing a version of the source file for the text of + this chapter. + + (point-min-marker) + => # + (point-max-marker) + => # + + (narrow-to-region 100 200) + => nil + (point-min-marker) + => # + (point-max-marker) + => # + + - Function: copy-marker marker-or-integer &optional marker-type + If passed a marker as its argument, `copy-marker' returns a new + marker that points to the same place and the same buffer as does + MARKER-OR-INTEGER. If passed an integer as its argument, + `copy-marker' returns a new marker that points to position + MARKER-OR-INTEGER in the current buffer. + + If passed an integer argument less than 1, `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, + `copy-marker' returns a new marker that points to the end of the + buffer. + + An error is signaled if MARKER-OR-INTEGER is neither a marker nor + an integer. + + Optional second argument MARKER-TYPE specifies the insertion type + of the new marker; see `marker-insertion-type'. + + (setq p (point-marker)) + => # + + (setq q (copy-marker p)) + => # + + (eq p q) + => nil + + (equal p q) + => t + + (point) + => 2139 + + (set-marker p 3000) + => # + + (point) + => 2139 + + (setq p (point-marker t)) + => # + + (set-marker p 3000) + => # + + (point) + => 3000 + + (copy-marker 0) + => # + + (copy-marker 20000) + => # + + +File: lispref.info, Node: Information from Markers, Next: Changing Markers, Prev: Creating Markers, Up: Markers + +Information from Markers +======================== + + This section describes the functions for accessing the components of +a marker object. + + - Function: marker-position marker + This function returns the position that MARKER points to, or `nil' + if it points nowhere. + + - Function: marker-buffer marker + This function returns the buffer that MARKER points into, or `nil' + if it points nowhere. + + (setq m (make-marker)) + => # + (marker-position m) + => nil + (marker-buffer m) + => nil + + (set-marker m 3770 (current-buffer)) + => # + (marker-buffer m) + => # + (marker-position m) + => 3770 + + Two distinct markers are considered `equal' (even though not `eq') +to each other if they have the same position and buffer, or if they +both point nowhere. + + +File: lispref.info, Node: Changing Markers, Next: The Mark, Prev: Information from Markers, Up: Markers + +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. + + - Function: set-marker marker position &optional buffer + This function moves MARKER to POSITION in BUFFER. If BUFFER is + not provided, it defaults to the current buffer. + + POSITION can be a marker, an integer or `nil'. If POSITION is an + integer, `set-marker' moves MARKER to point before the POSITIONth + character in BUFFER. If POSITION is `nil', MARKER is made to + point nowhere. Then it no longer slows down editing in any + buffer. If POSITION is less than 1, MARKER is moved to the + beginning of BUFFER. If POSITION is greater than the size of + BUFFER, MARKER is moved to the end of BUFFER. + + The value returned is MARKER. + + (setq m (point-marker)) + => # + (set-marker m 55) + => # + (setq b (get-buffer "foo")) + => # + (set-marker m 0 b) + => # + + - Function: move-marker marker position &optional buffer + This is another name for `set-marker'. + + File: lispref.info, Node: The Mark, Next: The Region, Prev: Changing Markers, Up: Markers The Mark @@ -124,7 +799,7 @@ long, adding a new element deletes the last element. If you are using this in an editing command, you are most likely making a mistake; see the documentation of `set-mark' below. - - Function: mark-marker inactive-p buffer + - Function: mark-marker &optional force buffer This function returns BUFFER's mark. BUFFER defaults to the current buffer if omitted. This is the very marker that records the mark location inside XEmacs, not a copy. Therefore, changing @@ -165,9 +840,9 @@ long, adding a new element deletes the last element. To remember a location for internal use in the Lisp program, store it in a Lisp variable. For example: - (let ((beg (point))) + (let ((start (point))) (forward-line 1) - (delete-region beg (point))). + (delete-region start (point))). - Command: exchange-point-and-mark &optional dont-activate-region This function exchanges the positions of point and the mark. It @@ -491,639 +1166,3 @@ operated on the current buffer.) The end of the buffer (or of its accessible portion) is always considered the end of a line. - -File: lispref.info, Node: Buffer Contents, Next: Comparing Text, Prev: Near Point, Up: Text - -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. - - - Function: buffer-substring start end &optional buffer - - Function: buffer-string start end &optional buffer - These functions are equivalent and return a string containing a - copy of the text of the region defined by positions START and END - in the buffer. If the arguments are not positions in the - accessible portion of the buffer, `buffer-substring' signals an - `args-out-of-range' error. If optional argument BUFFER is `nil', - the current buffer is assumed. - - If the region delineated by START and END contains duplicable - extents, they will be remembered in the string. *Note Duplicable - Extents::. - - It is not necessary for START to be less than END; the arguments - can be given in either order. But most often the smaller argument - is written first. - - ---------- Buffer: foo ---------- - This is the contents of buffer foo - - ---------- Buffer: foo ---------- - - (buffer-substring 1 10) - => "This is t" - (buffer-substring (point-max) 10) - => "he contents of buffer foo - " - - -File: lispref.info, Node: Comparing Text, Next: Insertion, Prev: Buffer Contents, Up: Text - -Comparing Text -============== - - This function lets you compare portions of the text in a buffer, -without copying them into strings first. - - - Function: 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 `nil' for BUFFER1, 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 - `case-fold-search' is non-`nil'. It always ignores text - properties. - - Suppose the current buffer contains the text `foobarbar - haha!rara!'; then in this example the two substrings are `rbar ' - and `rara!'. The value is 2 because the first substring is greater - at the second character. - - (compare-buffer-substring nil 6 11 nil 16 21) - => 2 - - -File: lispref.info, Node: Insertion, Next: Commands for Insertion, Prev: Comparing Text, Up: Text - -Inserting Text -============== - - "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 (*note -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 `insert-before-markers' relocate such markers to point after the -inserted text. - - Some insertion functions leave point before the inserted text, while -other functions leave it after. We call the former insertion "after -point" and the latter insertion "before point". - - If a string with non-`nil' extent data is inserted, the remembered -extents will also be inserted. *Note Duplicable Extents::. - - 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. - - - Function: insert &rest args - This function inserts the strings and/or characters 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 - ARGS are either strings or characters. The value is `nil'. - - - Function: insert-before-markers &rest args - This function inserts the strings and/or characters ARGS into the - current buffer, at point, moving point forward. An error is - signaled unless all ARGS are either strings or characters. The - value is `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. - - - Function: insert-string string &optional buffer - This function inserts STRING into BUFFER before point. BUFFER - defaults to the current buffer if omitted. This function is - chiefly useful if you want to insert a string in a buffer other - than the current one (otherwise you could just use `insert'). - - - Function: insert-char character count &optional buffer - This function inserts COUNT instances of CHARACTER into BUFFER - before point. COUNT must be a number, and CHARACTER must be a - character. The value is `nil'. If optional argument BUFFER is - `nil', the current buffer is assumed. (In FSF Emacs, the third - argument is called INHERIT and refers to text properties.) - - - Function: insert-buffer-substring from-buffer-or-name &optional - start end - This function inserts a portion of buffer FROM-BUFFER-OR-NAME - (which must already exist) into the current buffer before point. - The text inserted is the region from START and END. (These - arguments default to the beginning and end of the accessible - portion of that buffer.) This function returns `nil'. - - In this example, the form is executed with buffer `bar' as the - current buffer. We assume that buffer `bar' is initially empty. - - ---------- Buffer: foo ---------- - We hold these truths to be self-evident, that all - ---------- Buffer: foo ---------- - - (insert-buffer-substring "foo" 1 20) - => nil - - ---------- Buffer: bar ---------- - We hold these truth-!- - ---------- Buffer: bar ---------- - - -File: lispref.info, Node: Commands for Insertion, Next: Deletion, Prev: Insertion, Up: Text - -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. - - - Command: insert-buffer from-buffer-or-name - This command inserts the entire contents of FROM-BUFFER-OR-NAME - (which must exist) into the current buffer after point. It leaves - the mark after the inserted text. The value is `nil'. - - - Command: self-insert-command count - This command inserts the last character typed; it does so COUNT - times, before point, and returns `nil'. Most printing characters - are bound to this command. In routine use, `self-insert-command' - is the most frequently called function in XEmacs, but programs - rarely use it except to install it on a keymap. - - In an interactive call, COUNT is the numeric prefix argument. - - This command calls `auto-fill-function' whenever that is non-`nil' - and the character inserted is a space or a newline (*note Auto - Filling::). - - This command performs abbrev expansion if Abbrev mode is enabled - and the inserted character does not have word-constituent syntax. - (*Note Abbrevs::, and *Note Syntax Class Table::.) - - This is also responsible for calling `blink-paren-function' when - the inserted character has close parenthesis syntax (*note - Blinking::). - - - Command: newline &optional number-of-newlines - This command inserts newlines into the current buffer before point. - If NUMBER-OF-NEWLINES is supplied, that many newline characters - are inserted. - - This function calls `auto-fill-function' if the current column - number is greater than the value of `fill-column' and - NUMBER-OF-NEWLINES is `nil'. Typically what `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. `newline' does not auto-fill if - NUMBER-OF-NEWLINES is non-`nil'. - - This command indents to the left margin if that is not zero. - *Note Margins::. - - The value returned is `nil'. In an interactive call, COUNT is the - numeric prefix argument. - - - 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 `indent-to' - function. `split-line' returns the position of point. - - Programs hardly ever use this function. - - - Variable: overwrite-mode - This variable controls whether overwrite mode is in effect: a - non-`nil' value enables the mode. It is automatically made - buffer-local when set in any fashion. - - -File: lispref.info, Node: Deletion, Next: User-Level Deletion, Prev: Commands for Insertion, Up: Text - -Deleting Text -============= - - Deletion means removing part of the text in a buffer, without saving -it in the kill ring (*note The Kill Ring::). Deleted text can't be -yanked, but can be reinserted using the undo mechanism (*note 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 `nil'. - - - Function: erase-buffer &optional buffer - This function deletes the entire text of BUFFER, leaving it empty. - If the buffer is read-only, it signals a `buffer-read-only' - error. Otherwise, it deletes the text without asking for any - confirmation. It returns `nil'. BUFFER defaults to the current - buffer if omitted. - - Normally, deleting a large amount of text from a buffer inhibits - further auto-saving of that buffer "because it has shrunk". - However, `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. - - - Command: delete-region start end &optional buffer - This command deletes the text in BUFFER in the region defined by - START and END. The value is `nil'. If optional argument BUFFER - is `nil', the current buffer is assumed. - - - Command: delete-char count &optional killp - This command deletes COUNT characters directly after point, or - before point if COUNT is negative. If KILLP is non-`nil', then it - saves the deleted characters in the kill ring. - - In an interactive call, COUNT is the numeric prefix argument, and - 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 `nil'. - - - Command: delete-backward-char count &optional killp - This command deletes COUNT characters directly before point, or - after point if COUNT is negative. If KILLP is non-`nil', then it - saves the deleted characters in the kill ring. - - In an interactive call, COUNT is the numeric prefix argument, and - 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 `nil'. - - - Command: backward-delete-char-untabify count &optional killp - This command deletes 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 KILLP is non-`nil', then the command saves the deleted - characters in the kill ring. - - Conversion of tabs to spaces happens only if COUNT is positive. - If it is negative, exactly -COUNT characters after point are - deleted. - - In an interactive call, COUNT is the numeric prefix argument, and - 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 `nil'. - - -File: lispref.info, Node: User-Level Deletion, Next: The Kill Ring, Prev: Deletion, Up: Text - -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. - - - Command: delete-horizontal-space - This function deletes all spaces and tabs around point. It returns - `nil'. - - In the following examples, we call `delete-horizontal-space' four - times, once on each line, with point between the second and third - characters on the line each time. - - ---------- Buffer: foo ---------- - I -!-thought - I -!- thought - We-!- thought - Yo-!-u thought - ---------- Buffer: foo ---------- - - (delete-horizontal-space) ; Four times. - => nil - - ---------- Buffer: foo ---------- - Ithought - Ithought - Wethought - You thought - ---------- Buffer: foo ---------- - - - 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 JOIN-FOLLOWING-P is non-`nil', - `delete-indentation' joins this line to the following line - instead. The value is `nil'. - - If there is a fill prefix, and the second of the lines being joined - starts with the prefix, then `delete-indentation' deletes the fill - prefix before joining the lines. *Note Margins::. - - In the example below, point is located on the line starting - `events', and it makes no difference if there are trailing spaces - in the preceding line. - - ---------- Buffer: foo ---------- - When in the course of human - -!- events, it becomes necessary - ---------- Buffer: foo ---------- - - (delete-indentation) - => nil - - ---------- Buffer: foo ---------- - When in the course of human-!- events, it becomes necessary - ---------- Buffer: foo ---------- - - After the lines are joined, the function `fixup-whitespace' is - responsible for deciding whether to leave a space at the junction. - - - Function: fixup-whitespace - This function replaces all the white space surrounding point with - either one space or no space, according to the context. It - returns `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. *Note Syntax Class Table::. - - In the example below, `fixup-whitespace' is called the first time - with point before the word `spaces' in the first line. For the - second invocation, point is directly after the `('. - - ---------- Buffer: foo ---------- - This has too many -!-spaces - This has too many spaces at the start of (-!- this list) - ---------- Buffer: foo ---------- - - (fixup-whitespace) - => nil - (fixup-whitespace) - => nil - - ---------- Buffer: foo ---------- - This has too many spaces - This has too many spaces at the start of (this list) - ---------- Buffer: foo ---------- - - - Command: just-one-space - This command replaces any spaces and tabs around point with a - single space. It returns `nil'. - - - 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. - - `delete-blank-lines' returns `nil'. - - -File: lispref.info, Node: The Kill Ring, Next: Undo, Prev: User-Level Deletion, Up: Text - -The Kill Ring -============= - - "Kill" functions delete text like the deletion functions, but save -it so that the user can reinsert it by "yanking". Most of these -functions have `kill-' in their name. By contrast, the functions whose -names start with `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. *Note -Deletion::. - - Killed text is saved for later yanking in the "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 -`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 _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. - - -File: lispref.info, Node: Kill Ring Concepts, Next: Kill Functions, Up: The Kill Ring - -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: - - ("some text" "a different piece of text" "even older text") - -When the list reaches `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. - - -File: lispref.info, Node: Kill Functions, Next: Yank Commands, Prev: Kill Ring Concepts, Up: The Kill Ring - -Functions for Killing ---------------------- - - `kill-region' is the usual subroutine for killing text. Any command -that calls this function is a "kill command" (and should probably have -`kill' in its name). `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 `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. - - - Command: kill-region start end - This function kills the text in the region defined by START and - END. The text is deleted but saved in the kill ring, along with - its text properties. The value is always `nil'. - - In an interactive call, START and END are point and the mark. - - If the buffer is read-only, `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. - - - Command: copy-region-as-kill start end - This command saves the region defined by START and END on the kill - ring (including text properties), but does not delete the text - from the buffer. It returns `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 `this-command' to `kill-region', so a - subsequent kill command does not append to the same kill ring - entry. - - Don't call `copy-region-as-kill' in Lisp programs unless you aim to - support Emacs 18. For Emacs 19, it is better to use `kill-new' or - `kill-append' instead. *Note Low-Level Kill Ring::. - - -File: lispref.info, Node: Yank Commands, Next: Low-Level Kill Ring, Prev: Kill Functions, Up: The Kill Ring - -Functions for Yanking ---------------------- - - "Yanking" means reinserting an entry of previously killed text from -the kill ring. The text properties are copied too. - - - Command: yank &optional arg - 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 ARG is a list (which occurs interactively when the user types - `C-u' with no digits), then `yank' inserts the text as described - above, but puts point before the yanked text and puts the mark - after it. - - If ARG is a number, then `yank' inserts the ARGth most recently - killed text--the ARGth element of the kill ring list. - - `yank' does not alter the contents of the kill ring or rotate it. - It returns `nil'. - - - 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 `yank' or another - `yank-pop'. At such a time, the region contains text that was just - inserted by yanking. `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 ARG is `nil', then the replacement text is the previous element - of the kill ring. If ARG is numeric, the replacement is the ARGth - previous kill. If 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 `nil'. - - -File: lispref.info, Node: Low-Level Kill Ring, Next: Internals of Kill Ring, Prev: Yank Commands, Up: The Kill Ring - -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. - - - Function: current-kill n &optional do-not-move - The function `current-kill' rotates the yanking pointer which - designates the "front" of the kill ring by N places (from newer - kills to older ones), and returns the text at that place in the - ring. - - If the optional second argument DO-NOT-MOVE is non-`nil', then - `current-kill' doesn't alter the yanking pointer; it just returns - the Nth kill, counting from the current yanking pointer. - - If N is zero, indicating a request for the latest kill, - `current-kill' calls the value of `interprogram-paste-function' - (documented below) before consulting the kill ring. - - - Function: kill-new string - This function puts the text 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 - `interprogram-cut-function' (see below). - - - Function: kill-append string before-p - This function appends the text STRING to the first entry in the - kill ring. Normally STRING goes at the end of the entry, but if - BEFORE-P is non-`nil', it goes at the beginning. This function - also invokes the value of `interprogram-cut-function' (see below). - - - Variable: 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 - `nil' or a function of no arguments. - - If the value is a function, `current-kill' calls it to get the - "most recent kill". If the function returns a non-`nil' value, - then that value is used as the "most recent kill". If it returns - `nil', then the first element of `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. *Note X Selections::. - - - Variable: 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 - `nil' or a function of one argument. - - If the value is a function, `kill-new' and `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. - diff --git a/info/lispref.info-30 b/info/lispref.info-30 index 5ca45e7..982442c 100644 --- a/info/lispref.info-30 +++ b/info/lispref.info-30 @@ -50,6 +50,650 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Buffer Contents, Next: Comparing Text, Prev: Near Point, Up: Text + +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. + + - Function: buffer-substring start end &optional buffer + - Function: buffer-string start end &optional buffer + These functions are equivalent and return a string containing a + copy of the text of the region defined by positions START and END + in the buffer. If the arguments are not positions in the + accessible portion of the buffer, `buffer-substring' signals an + `args-out-of-range' error. If optional argument BUFFER is `nil', + the current buffer is assumed. + + If the region delineated by START and END contains duplicable + extents, they will be remembered in the string. *Note Duplicable + Extents::. + + It is not necessary for START to be less than END; the arguments + can be given in either order. But most often the smaller argument + is written first. + + ---------- Buffer: foo ---------- + This is the contents of buffer foo + + ---------- Buffer: foo ---------- + + (buffer-substring 1 10) + => "This is t" + (buffer-substring (point-max) 10) + => "he contents of buffer foo + " + + +File: lispref.info, Node: Comparing Text, Next: Insertion, Prev: Buffer Contents, Up: Text + +Comparing Text +============== + + This function lets you compare portions of the text in a buffer, +without copying them into strings first. + + - Function: 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 `nil' for BUFFER1, 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 + `case-fold-search' is non-`nil'. It always ignores text + properties. + + Suppose the current buffer contains the text `foobarbar + haha!rara!'; then in this example the two substrings are `rbar ' + and `rara!'. The value is 2 because the first substring is greater + at the second character. + + (compare-buffer-substring nil 6 11 nil 16 21) + => 2 + + +File: lispref.info, Node: Insertion, Next: Commands for Insertion, Prev: Comparing Text, Up: Text + +Inserting Text +============== + + "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 (*note +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 `insert-before-markers' relocate such markers to point after the +inserted text. + + Some insertion functions leave point before the inserted text, while +other functions leave it after. We call the former insertion "after +point" and the latter insertion "before point". + + If a string with non-`nil' extent data is inserted, the remembered +extents will also be inserted. *Note Duplicable Extents::. + + 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. + + - Function: insert &rest args + This function inserts the strings and/or characters 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 + ARGS are either strings or characters. The value is `nil'. + + - Function: insert-before-markers &rest args + This function inserts the strings and/or characters ARGS into the + current buffer, at point, moving point forward. An error is + signaled unless all ARGS are either strings or characters. The + value is `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. + + - Function: insert-string string &optional buffer + This function inserts STRING into BUFFER before point. BUFFER + defaults to the current buffer if omitted. This function is + chiefly useful if you want to insert a string in a buffer other + than the current one (otherwise you could just use `insert'). + + - Function: insert-char character &optional count ignored buffer + This function inserts COUNT instances of CHARACTER into BUFFER + before point. COUNT must be a number, and CHARACTER must be a + character. + + If optional argument BUFFER is `nil', the current buffer is + assumed. (In FSF Emacs, the third argument is called INHERIT and + refers to text properties. In XEmacs, it is always ignored.) + + This function always returns `nil'. + + - Function: insert-buffer-substring from-buffer-or-name &optional + start end + This function inserts a portion of buffer FROM-BUFFER-OR-NAME + (which must already exist) into the current buffer before point. + The text inserted is the region from START and END. (These + arguments default to the beginning and end of the accessible + portion of that buffer.) This function returns `nil'. + + In this example, the form is executed with buffer `bar' as the + current buffer. We assume that buffer `bar' is initially empty. + + ---------- Buffer: foo ---------- + We hold these truths to be self-evident, that all + ---------- Buffer: foo ---------- + + (insert-buffer-substring "foo" 1 20) + => nil + + ---------- Buffer: bar ---------- + We hold these truth-!- + ---------- Buffer: bar ---------- + + +File: lispref.info, Node: Commands for Insertion, Next: Deletion, Prev: Insertion, Up: Text + +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. + + - Command: insert-buffer from-buffer-or-name + This command inserts the entire contents of FROM-BUFFER-OR-NAME + (which must exist) into the current buffer after point. It leaves + the mark after the inserted text. The value is `nil'. + + - Command: self-insert-command count + This command inserts the last character typed; it does so COUNT + times, before point, and returns `nil'. Most printing characters + are bound to this command. In routine use, `self-insert-command' + is the most frequently called function in XEmacs, but programs + rarely use it except to install it on a keymap. + + In an interactive call, COUNT is the numeric prefix argument. + + This command calls `auto-fill-function' whenever that is non-`nil' + and the character inserted is a space or a newline (*note Auto + Filling::). + + This command performs abbrev expansion if Abbrev mode is enabled + and the inserted character does not have word-constituent syntax. + (*Note Abbrevs::, and *Note Syntax Class Table::.) + + This is also responsible for calling `blink-paren-function' when + the inserted character has close parenthesis syntax (*note + Blinking::). + + - Command: newline &optional count + This command inserts newlines into the current buffer before point. + If COUNT is supplied, that many newline characters are inserted. + + This function calls `auto-fill-function' if the current column + number is greater than the value of `fill-column' and COUNT is + `nil'. Typically what `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. `newline' does not auto-fill if COUNT is non-`nil'. + + This command indents to the left margin if that is not zero. + *Note Margins::. + + The value returned is `nil'. In an interactive call, COUNT is the + numeric prefix argument. + + - 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 `indent-to' + function. `split-line' returns the position of point. + + Programs hardly ever use this function. + + - Variable: overwrite-mode + This variable controls whether overwrite mode is in effect: a + non-`nil' value enables the mode. It is automatically made + buffer-local when set in any fashion. + + +File: lispref.info, Node: Deletion, Next: User-Level Deletion, Prev: Commands for Insertion, Up: Text + +Deleting Text +============= + + Deletion means removing part of the text in a buffer, without saving +it in the kill ring (*note The Kill Ring::). Deleted text can't be +yanked, but can be reinserted using the undo mechanism (*note 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 `nil'. + + - Command: erase-buffer &optional buffer + This function deletes the entire text of BUFFER, leaving it empty. + If the buffer is read-only, it signals a `buffer-read-only' + error. Otherwise, it deletes the text without asking for any + confirmation. It returns `nil'. BUFFER defaults to the current + buffer if omitted. + + Normally, deleting a large amount of text from a buffer inhibits + further auto-saving of that buffer "because it has shrunk". + However, `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. + + - Command: delete-region start end &optional buffer + This command deletes the text in BUFFER in the region defined by + START and END. The value is `nil'. If optional argument BUFFER + is `nil', the current buffer is assumed. + + - Command: delete-char count &optional killp + This command deletes COUNT characters directly after point, or + before point if COUNT is negative. If KILLP is non-`nil', then it + saves the deleted characters in the kill ring. + + In an interactive call, COUNT is the numeric prefix argument, and + 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 `nil'. + + - Command: delete-backward-char count &optional killp + This command deletes COUNT characters directly before point, or + after point if COUNT is negative. If KILLP is non-`nil', then it + saves the deleted characters in the kill ring. + + In an interactive call, COUNT is the numeric prefix argument, and + 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 `nil'. + + - Command: backward-delete-char-untabify count &optional killp + This command deletes 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 KILLP is non-`nil', then the command saves the deleted + characters in the kill ring. + + Conversion of tabs to spaces happens only if COUNT is positive. + If it is negative, exactly -COUNT characters after point are + deleted. + + In an interactive call, COUNT is the numeric prefix argument, and + 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 `nil'. + + +File: lispref.info, Node: User-Level Deletion, Next: The Kill Ring, Prev: Deletion, Up: Text + +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. + + - Command: delete-horizontal-space + This function deletes all spaces and tabs around point. It returns + `nil'. + + In the following examples, we call `delete-horizontal-space' four + times, once on each line, with point between the second and third + characters on the line each time. + + ---------- Buffer: foo ---------- + I -!-thought + I -!- thought + We-!- thought + Yo-!-u thought + ---------- Buffer: foo ---------- + + (delete-horizontal-space) ; Four times. + => nil + + ---------- Buffer: foo ---------- + Ithought + Ithought + Wethought + You thought + ---------- Buffer: foo ---------- + + - 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 JOIN-FOLLOWING-P is non-`nil', + `delete-indentation' joins this line to the following line + instead. The value is `nil'. + + If there is a fill prefix, and the second of the lines being joined + starts with the prefix, then `delete-indentation' deletes the fill + prefix before joining the lines. *Note Margins::. + + In the example below, point is located on the line starting + `events', and it makes no difference if there are trailing spaces + in the preceding line. + + ---------- Buffer: foo ---------- + When in the course of human + -!- events, it becomes necessary + ---------- Buffer: foo ---------- + + (delete-indentation) + => nil + + ---------- Buffer: foo ---------- + When in the course of human-!- events, it becomes necessary + ---------- Buffer: foo ---------- + + After the lines are joined, the function `fixup-whitespace' is + responsible for deciding whether to leave a space at the junction. + + - Command: fixup-whitespace + This function replaces all the white space surrounding point with + either one space or no space, according to the context. It + returns `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. *Note Syntax Class Table::. + + In the example below, `fixup-whitespace' is called the first time + with point before the word `spaces' in the first line. For the + second invocation, point is directly after the `('. + + ---------- Buffer: foo ---------- + This has too many -!-spaces + This has too many spaces at the start of (-!- this list) + ---------- Buffer: foo ---------- + + (fixup-whitespace) + => nil + (fixup-whitespace) + => nil + + ---------- Buffer: foo ---------- + This has too many spaces + This has too many spaces at the start of (this list) + ---------- Buffer: foo ---------- + + - Command: just-one-space + This command replaces any spaces and tabs around point with a + single space. It returns `nil'. + + - 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. + + `delete-blank-lines' returns `nil'. + + +File: lispref.info, Node: The Kill Ring, Next: Undo, Prev: User-Level Deletion, Up: Text + +The Kill Ring +============= + + "Kill" functions delete text like the deletion functions, but save +it so that the user can reinsert it by "yanking". Most of these +functions have `kill-' in their name. By contrast, the functions whose +names start with `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. *Note +Deletion::. + + Killed text is saved for later yanking in the "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 +`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 _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. + + +File: lispref.info, Node: Kill Ring Concepts, Next: Kill Functions, Up: The Kill Ring + +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: + + ("some text" "a different piece of text" "even older text") + +When the list reaches `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. + + +File: lispref.info, Node: Kill Functions, Next: Yank Commands, Prev: Kill Ring Concepts, Up: The Kill Ring + +Functions for Killing +--------------------- + + `kill-region' is the usual subroutine for killing text. Any command +that calls this function is a "kill command" (and should probably have +`kill' in its name). `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 `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. + + - Command: kill-region start end &optional verbose + This function kills the text in the region defined by START and + END. The text is deleted but saved in the kill ring, along with + its text properties. The value is always `nil'. + + In an interactive call, START and END are point and the mark. + + If the buffer is read-only, `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. + + - Command: copy-region-as-kill start end + This command saves the region defined by START and END on the kill + ring (including text properties), but does not delete the text + from the buffer. It returns `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 `this-command' to `kill-region', so a + subsequent kill command does not append to the same kill ring + entry. + + Don't call `copy-region-as-kill' in Lisp programs unless you aim to + support Emacs 18. For Emacs 19, it is better to use `kill-new' or + `kill-append' instead. *Note Low-Level Kill Ring::. + + +File: lispref.info, Node: Yank Commands, Next: Low-Level Kill Ring, Prev: Kill Functions, Up: The Kill Ring + +Functions for Yanking +--------------------- + + "Yanking" means reinserting an entry of previously killed text from +the kill ring. The text properties are copied too. + + - Command: yank &optional arg + 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 ARG is a list (which occurs interactively when the user types + `C-u' with no digits), then `yank' inserts the text as described + above, but puts point before the yanked text and puts the mark + after it. + + If ARG is a number, then `yank' inserts the ARGth most recently + killed text--the ARGth element of the kill ring list. + + `yank' does not alter the contents of the kill ring or rotate it. + It returns `nil'. + + - 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 `yank' or another + `yank-pop'. At such a time, the region contains text that was just + inserted by yanking. `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 ARG is `nil', then the replacement text is the previous element + of the kill ring. If ARG is numeric, the replacement is the ARGth + previous kill. If 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 `nil'. + + +File: lispref.info, Node: Low-Level Kill Ring, Next: Internals of Kill Ring, Prev: Yank Commands, Up: The Kill Ring + +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. + + - Function: current-kill count &optional do-not-move + The function `current-kill' rotates the yanking pointer which + designates the "front" of the kill ring by COUNT places (from newer + kills to older ones), and returns the text at that place in the + ring. + + If the optional second argument DO-NOT-MOVE is non-`nil', then + `current-kill' doesn't alter the yanking pointer; it just returns + the COUNTth kill, counting from the current yanking pointer. + + If COUNT is zero, indicating a request for the latest kill, + `current-kill' calls the value of `interprogram-paste-function' + (documented below) before consulting the kill ring. + + - Function: kill-new string &optional replace + This function makes the text STRING the latest entry in the kill + ring, and sets `kill-ring-yank-pointer' to point to it. + + Normally, STRING is added to the front of the kill ring as a new + entry. However, if optional argument REPLACE is non-`nil', the + entry previously at the front of the kill ring is discarded, and + STRING replaces it. + + This function runs the functions on `kill-hooks', and also invokes + the value of `interprogram-cut-function' (see below). + + - Function: kill-append string before-p + This function appends the text STRING to the first entry in the + kill ring. Normally STRING goes at the end of the entry, but if + BEFORE-P is non-`nil', it goes at the beginning. This function + also invokes the value of `interprogram-cut-function' (see below). + + - Variable: 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 + `nil' or a function of no arguments. + + If the value is a function, `current-kill' calls it to get the + "most recent kill". If the function returns a non-`nil' value, + then that value is used as the "most recent kill". If it returns + `nil', then the first element of `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. *Note X Selections::. + + - Variable: 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 + `nil' or a function of one argument. + + If the value is a function, `kill-new' and `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. + + File: lispref.info, Node: Internals of Kill Ring, Prev: Low-Level Kill Ring, Up: The Kill Ring Internals of the Kill Ring @@ -138,10 +782,10 @@ which is in the variable `buffer-undo-list'. commands use these entries to record where point was before the command. -`(BEG . END)' +`(START . END)' This kind of element indicates how to delete text that was - inserted. Upon insertion, the text occupied the range BEG-END in - the buffer. + inserted. Upon insertion, the text occupied the range START-END + in the buffer. `(TEXT . POSITION)' This kind of element indicates how to reinsert text that was @@ -157,11 +801,11 @@ which is in the variable `buffer-undo-list'. once again; it does so only if the file's modification time matches those numbers. -`(nil PROPERTY VALUE BEG . END)' +`(nil PROPERTY VALUE START . END)' This kind of element records a change in a text property. Here's how you might undo the change: - (put-text-property BEG END PROPERTY VALUE) + (put-text-property START END PROPERTY VALUE) `POSITION' This element indicates where point was at an earlier time. @@ -237,8 +881,8 @@ disable undo recording with the following two functions, or by setting In an interactive call, BUFFER-OR-NAME is the current buffer. You cannot specify any other buffer. - - Function: buffer-disable-undo &optional buffer - - Function: buffer-flush-undo &optional buffer + - Command: buffer-disable-undo &optional buffer + - Command: buffer-flush-undo &optional buffer This function discards the undo list of BUFFER, and disables further recording of undo information. As a result, it is no longer possible to undo either previous changes or any subsequent @@ -469,12 +1113,15 @@ Margins for Filling If FORCE is non-`nil', that says to fix the line's indentation if that doesn't match the left margin value. - - Function: delete-to-left-margin from to + - Function: delete-to-left-margin &optional from to This function removes left margin indentation from the text between FROM and TO. The amount of indentation to delete is determined by calling `current-left-margin'. In no case does this function delete non-whitespace. + The arguments FROM and TO are optional; the default is the whole + buffer. + - Function: indent-to-left-margin This is the default `indent-line-function', used in Fundamental mode, Text mode, etc. Its effect is to adjust the indentation at @@ -515,662 +1162,3 @@ justification style to refill portions of the text. *Note Margins::. standard convention for hooks, it was renamed to `auto-fill-function' in version 19. - -File: lispref.info, Node: Sorting, Next: Columns, Prev: Auto Filling, Up: Text - -Sorting Text -============ - - The sorting functions described in this section all rearrange text in -a buffer. This is in contrast to the function `sort', which rearranges -the order of the elements of a list (*note Rearrangement::). The -values returned by these functions are not meaningful. - - - Function: 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 `sort-subr' works, consider the whole accessible - portion of the buffer as being divided into disjoint pieces called - "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 `sort-subr' function, REVERSE, is - non-`nil', the sort records are rearranged in order of descending - sort key. - - The next four arguments to `sort-subr' are functions that are - called to move point across a sort record. They are called many - times from within `sort-subr'. - - 1. 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 `sort-subr' is called. Therefore, you should usually - move point to the beginning of the buffer before calling - `sort-subr'. - - This function can indicate there are no more sort records by - leaving point at the end of the buffer. - - 2. ENDRECFUN is called with point within a record. It moves - point to the end of the record. - - 3. 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-`nil' - value to be used as the sort key, or return `nil' to indicate - that the sort key is in the buffer starting at point. In the - latter case, ENDKEYFUN is called to find the end of the sort - key. - - 4. 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 STARTKEYFUN returns `nil' and this argument is omitted (or - `nil'), then the sort key extends to the end of the record. - There is no need for ENDKEYFUN if STARTKEYFUN returns a - non-`nil' value. - - As an example of `sort-subr', here is the complete function - definition for `sort-lines': - - ;; Note that the first two lines of doc string - ;; 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: - 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))) - - Here `forward-line' moves point to the start of the next record, - and `end-of-line' moves point to the end of record. We do not pass - the arguments STARTKEYFUN and ENDKEYFUN, because the entire record - is used as the sort key. - - The `sort-paragraphs' function is very much the same, except that - its `sort-subr' call looks like this: - - (sort-subr reverse - (function - (lambda () - (skip-chars-forward "\n \t\f"))) - 'forward-paragraph) - - - Command: sort-regexp-fields reverse record-regexp key-regexp start - end - This command sorts the region between START and END alphabetically - as specified by RECORD-REGEXP and KEY-REGEXP. If 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 ASCII character set, the ordering in that set - determines alphabetical order. - - The value of the 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 `^.+$', - which matches lines with at least one character besides a newline, - would make each such line into a sort record. *Note Regular - Expressions::, for a description of the syntax and meaning of - regular expressions. - - The value of the KEY-REGEXP argument specifies what part of each - record is the sort key. The 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 KEY-REGEXP argument can refer to the text matched by a - subexpression of RECORD-REGEXP, or it can be a regular expression - on its own. - - If KEY-REGEXP is: - - `\DIGIT' - then the text matched by the DIGITth `\(...\)' parenthesis - grouping in RECORD-REGEXP is the sort key. - - `\&' - then the whole record is the sort key. - - a regular expression - then `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 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.) - - For example, if you plan to sort all the lines in the region by the - first word on each line starting with the letter `f', you should - set RECORD-REGEXP to `^.*$' and set KEY-REGEXP to `\'. The - resulting expression looks like this: - - (sort-regexp-fields nil "^.*$" "\\" - (region-beginning) - (region-end)) - - If you call `sort-regexp-fields' interactively, it prompts for - RECORD-REGEXP and KEY-REGEXP in the minibuffer. - - - Command: sort-lines reverse start end - This command alphabetically sorts lines in the region between - START and END. If REVERSE is non-`nil', the sort is in reverse - order. - - - Command: sort-paragraphs reverse start end - This command alphabetically sorts paragraphs in the region between - START and END. If REVERSE is non-`nil', the sort is in reverse - order. - - - Command: sort-pages reverse start end - This command alphabetically sorts pages in the region between - START and END. If REVERSE is non-`nil', the sort is in reverse - order. - - - Command: sort-fields field start end - This command sorts lines in the region between START and END, - comparing them alphabetically by the FIELDth field of each line. - Fields are separated by whitespace and numbered starting from 1. - If FIELD is negative, sorting is by the -FIELDth field from the - end of the line. This command is useful for sorting tables. - - - Command: sort-numeric-fields field start end - This command sorts lines in the region between START and END, - comparing them numerically by the FIELDth 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 FIELD is negative, sorting is by the -FIELDth field from the - end of the line. This command is useful for sorting tables. - - - Command: sort-columns reverse &optional beg end - This command sorts the lines in the region between BEG and END, - comparing them alphabetically by a certain range of columns. The - column positions of BEG and END bound the range of columns to sort - on. - - If REVERSE is non-`nil', the sort is in reverse order. - - One unusual thing about this command is that the entire line - containing position BEG, and the entire line containing position - END, are included in the region sorted. - - Note that `sort-columns' uses the `sort' utility program, and so - cannot work properly on text containing tab characters. Use `M-x - `untabify'' to convert tabs to spaces before sorting. - - -File: lispref.info, Node: Columns, Next: Indentation, Prev: Sorting, Up: Text - -Counting Columns -================ - - 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 `ctl-arrow', and tabs count as -occupying a number of columns that depends on the value of `tab-width' -and on the column where the tab begins. *Note 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. - - - Function: 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 `current-column', see the description of - `count-lines' in *Note Text Lines::. - - - Function: move-to-column column &optional force - This function moves point to COLUMN in the current line. The - calculation of COLUMN takes into account the widths of the - displayed representations of the characters between the start of - the line and point. - - If column COLUMN is beyond the end of the line, point moves to the - end of the line. If COLUMN is negative, point moves to the - beginning of the line. - - If it is impossible to move to column 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 FORCE is non-`nil', and - COLUMN is in the middle of a tab, then `move-to-column' converts - the tab into spaces so that it can move precisely to column - COLUMN. Other multicolumn characters can cause anomalies despite - FORCE, since there is no way to split them. - - The argument FORCE also has an effect if the line isn't long - enough to reach column COLUMN; in that case, it says to add - whitespace at the end of the line to reach that column. - - If COLUMN is not an integer, an error is signaled. - - The return value is the column number actually moved to. - - -File: lispref.info, Node: Indentation, Next: Case Changes, Prev: Columns, Up: Text - -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. - - -File: lispref.info, Node: Primitive Indent, Next: Mode-Specific Indent, Up: Indentation - -Indentation Primitives ----------------------- - - This section describes the primitive functions used to count and -insert indentation. The functions in the following sections use these -primitives. - - - Function: current-indentation - 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. - - - Command: indent-to column &optional minimum - This function indents from point with tabs and spaces until COLUMN - is reached. If MINIMUM is specified and non-`nil', then at least - that many spaces are inserted even if this requires going beyond - COLUMN. Otherwise the function does nothing if point is already - beyond COLUMN. The value is the column at which the inserted - indentation ends. - - - User Option: indent-tabs-mode - If this variable is non-`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. - - -File: lispref.info, Node: Mode-Specific Indent, Next: Region Indent, Prev: Primitive Indent, Up: Indentation - -Indentation Controlled by Major Mode ------------------------------------- - - An important function of each major mode is to customize the -key to indent properly for the language being edited. This section -describes the mechanism of the key and how to control it. The -functions in this section return unpredictable values. - - - Variable: indent-line-function - This variable's value is the function to be used by (and - various commands) to indent the current line. The command - `indent-according-to-mode' does no more than call this function. - - In Lisp mode, the value is the symbol `lisp-indent-line'; in C - mode, `c-indent-line'; in Fortran mode, `fortran-indent-line'. In - Fundamental mode, Text mode, and many other modes with no standard - for indentation, the value is `indent-to-left-margin' (which is the - default value). - - - Command: indent-according-to-mode - This command calls the function in `indent-line-function' to - indent the current line in a way appropriate for the current major - mode. - - - Command: indent-for-tab-command - This command calls the function in `indent-line-function' to indent - the current line; except that if that function is - `indent-to-left-margin', it calls `insert-tab' instead. (That is - a trivial command that inserts a tab character.) - - - Command: newline-and-indent - 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 `indent-line-function'. - In programming language modes, this is the same thing does, - but in some text modes, where inserts a tab, - `newline-and-indent' indents to the column specified by - `left-margin'. - - - Command: reindent-then-newline-and-indent - 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 - `indent-line-function'. In programming language modes, this is - the same thing does, but in some text modes, where - inserts a tab, `reindent-then-newline-and-indent' indents to the - column specified by `left-margin'. - - -File: lispref.info, Node: Region Indent, Next: Relative Indent, Prev: Mode-Specific Indent, Up: Indentation - -Indenting an Entire Region --------------------------- - - This section describes commands that indent all the lines in the -region. They return unpredictable values. - - - Command: indent-region start end to-column - This command indents each nonblank line starting between START - (inclusive) and END (exclusive). If TO-COLUMN is `nil', - `indent-region' indents each nonblank line by calling the current - mode's indentation function, the value of `indent-line-function'. - - If TO-COLUMN is non-`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, `indent-region' indents each line by - making it start with the fill prefix. - - - Variable: indent-region-function - The value of this variable is a function that can be used by - `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 `nil', there is no short cut, and `indent-region' - actually works line by line. - - A short-cut function is useful in modes such as C mode and Lisp - mode, where the `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. - - `indent-region' with a non-`nil' argument TO-COLUMN has a - different meaning and does not use this variable. - - - Command: indent-rigidly start end count - This command indents all lines starting between START (inclusive) - and END (exclusive) sideways by 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 COUNT is 3, this command adds 3 columns of - indentation to each of the lines beginning in the region specified. - - In Mail mode, `C-c C-y' (`mail-yank-original') uses - `indent-rigidly' to indent the text copied from the message being - replied to. - - - Function: indent-code-rigidly start end columns &optional - nochange-regexp - This is like `indent-rigidly', except that it doesn't alter lines - that start within strings or comments. - - In addition, it doesn't alter a line if NOCHANGE-REGEXP matches at - the beginning of the line (if NOCHANGE-REGEXP is non-`nil'). - - -File: lispref.info, Node: Relative Indent, Next: Indent Tabs, Prev: Region Indent, Up: Indentation - -Indentation Relative to Previous Lines --------------------------------------- - - This section describes two commands that indent the current line -based on the contents of previous lines. - - - Command: indent-relative &optional unindented-ok - This command inserts whitespace at point, extending to the same - column as the next "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), `indent-relative' either does - nothing (if UNINDENTED-OK is non-`nil') or calls - `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 `indent-relative' is unpredictable. - - In the following example, point is at the beginning of the second - line: - - This line is indented twelve spaces. - -!-The quick brown fox jumped. - - Evaluation of the expression `(indent-relative nil)' produces the - following: - - This line is indented twelve spaces. - -!-The quick brown fox jumped. - - In this example, point is between the `m' and `p' of `jumped': - - This line is indented twelve spaces. - The quick brown fox jum-!-ped. - - Evaluation of the expression `(indent-relative nil)' produces the - following: - - This line is indented twelve spaces. - The quick brown fox jum -!-ped. - - - Command: indent-relative-maybe - This command indents the current line like the previous nonblank - line. It calls `indent-relative' with `t' as the 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. - - -File: lispref.info, Node: Indent Tabs, Next: Motion by Indent, Prev: Relative Indent, Up: Indentation - -Adjustable "Tab Stops" ----------------------- - - 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 (*note Usual -Display::). Note that the character as input uses this tab stop -feature only in a few major modes, such as Text mode. - - - Command: tab-to-tab-stop - This command inserts spaces or tabs up to the next tab stop column - defined by `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. - - - User Option: tab-stop-list - This variable is the list of tab stop columns used by - `tab-to-tab-stops'. The elements should be integers in increasing - order. The tab stop columns need not be evenly spaced. - - Use `M-x edit-tab-stops' to edit the location of tab stops - interactively. - - -File: lispref.info, Node: Motion by Indent, Prev: Indent Tabs, Up: Indentation - -Indentation-Based Motion Commands ---------------------------------- - - These commands, primarily for interactive use, act based on the -indentation in the text. - - - Command: back-to-indentation - 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 `nil'. - - - Command: backward-to-indentation arg - This command moves point backward ARG lines and then to the first - nonblank character on that line. It returns `nil'. - - - Command: forward-to-indentation arg - This command moves point forward ARG lines and then to the first - nonblank character on that line. It returns `nil'. - - -File: lispref.info, Node: Case Changes, Next: Text Properties, Prev: Indentation, Up: Text - -Case Changes -============ - - The case change commands described here work on text in the current -buffer. *Note Character Case::, for case conversion commands that work -on strings and characters. *Note Case Tables::, for how to customize -which characters are upper or lower case and how to convert them. - - - Command: capitalize-region start end - This function capitalizes all words in the region defined by START - and 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 `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 `capitalize-region' is called interactively, START and END - are point and the mark, with the smallest first. - - ---------- Buffer: foo ---------- - This is the contents of the 5th foo. - ---------- Buffer: foo ---------- - - (capitalize-region 1 44) - => nil - - ---------- Buffer: foo ---------- - This Is The Contents Of The 5th Foo. - ---------- Buffer: foo ---------- - - - Command: downcase-region start end - This function converts all of the letters in the region defined by - START and END to lower case. The function returns `nil'. - - When `downcase-region' is called interactively, START and END are - point and the mark, with the smallest first. - - - Command: upcase-region start end - This function converts all of the letters in the region defined by - START and END to upper case. The function returns `nil'. - - When `upcase-region' is called interactively, START and END are - point and the mark, with the smallest first. - - - Command: capitalize-word count - This function capitalizes 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 COUNT is negative, the function capitalizes the -COUNT - previous words but does not move point. The value is `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 `capitalize-word' is called interactively, COUNT is set to - the numeric prefix argument. - - - Command: downcase-word count - This function converts the COUNT words after point to all lower - case, moving point over as it does. If COUNT is negative, it - converts the -COUNT previous words but does not move point. The - value is `nil'. - - When `downcase-word' is called interactively, COUNT is set to the - numeric prefix argument. - - - Command: upcase-word count - This function converts the COUNT words after point to all upper - case, moving point over as it does. If COUNT is negative, it - converts the -COUNT previous words but does not move point. The - value is `nil'. - - When `upcase-word' is called interactively, COUNT is set to the - numeric prefix argument. - - -File: lispref.info, Node: Text Properties, Next: Substitution, Prev: Case Changes, Up: Text - -Text Properties -=============== - - Text properties are an alternative interface to extents (*note -Extents::), and are built on top of them. They are useful when you -want to view textual properties as being attached to the characters -themselves rather than to intervals of characters. The text property -interface is compatible with FSF Emacs. - - Each character position in a buffer or a string can have a "text -property list", much like the property list of a symbol (*note Property -Lists::). The properties belong to a particular character at a -particular place, such as, the letter `T' at the beginning of this -sentence or the first `o' in `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. - - Note that FSF Emacs also looks at the `category' property to find -defaults for text properties. We consider this too bogus to implement. - - Copying text between strings and buffers preserves the properties -along with the characters; this includes such diverse functions as -`substring', `insert', and `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. -* Saving Properties:: Saving text properties in files, and reading - them back. - diff --git a/info/lispref.info-31 b/info/lispref.info-31 index 56e71ee..e1a79f9 100644 --- a/info/lispref.info-31 +++ b/info/lispref.info-31 @@ -50,6 +50,680 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Sorting, Next: Columns, Prev: Auto Filling, Up: Text + +Sorting Text +============ + + The sorting functions described in this section all rearrange text in +a buffer. This is in contrast to the function `sort', which rearranges +the order of the elements of a list (*note Rearrangement::). The +values returned by these functions are not meaningful. + + - Function: 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 `sort-subr' works, consider the whole accessible + portion of the buffer as being divided into disjoint pieces called + "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 `sort-subr' function, REVERSE, is + non-`nil', the sort records are rearranged in order of descending + sort key. + + The next four arguments to `sort-subr' are functions that are + called to move point across a sort record. They are called many + times from within `sort-subr'. + + 1. 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 `sort-subr' is called. Therefore, you should usually + move point to the beginning of the buffer before calling + `sort-subr'. + + This function can indicate there are no more sort records by + leaving point at the end of the buffer. + + 2. ENDRECFUN is called with point within a record. It moves + point to the end of the record. + + 3. 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-`nil' + value to be used as the sort key, or return `nil' to indicate + that the sort key is in the buffer starting at point. In the + latter case, ENDKEYFUN is called to find the end of the sort + key. + + 4. 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 STARTKEYFUN returns `nil' and this argument is omitted (or + `nil'), then the sort key extends to the end of the record. + There is no need for ENDKEYFUN if STARTKEYFUN returns a + non-`nil' value. + + As an example of `sort-subr', here is the complete function + definition for `sort-lines': + + ;; Note that the first two lines of doc string + ;; are effectively one line when viewed by a user. + (defun sort-lines (reverse start end) + "Sort lines in region alphabetically. + Called from a program, there are three arguments: + REVERSE (non-nil means reverse order), + and START and END (the region to sort)." + (interactive "P\nr") + (save-restriction + (narrow-to-region start end) + (goto-char (point-min)) + (sort-subr reverse + 'forward-line + 'end-of-line))) + + Here `forward-line' moves point to the start of the next record, + and `end-of-line' moves point to the end of record. We do not pass + the arguments STARTKEYFUN and ENDKEYFUN, because the entire record + is used as the sort key. + + The `sort-paragraphs' function is very much the same, except that + its `sort-subr' call looks like this: + + (sort-subr reverse + (function + (lambda () + (skip-chars-forward "\n \t\f"))) + 'forward-paragraph) + + - Command: sort-regexp-fields reverse record-regexp key-regexp start + end + This command sorts the region between START and END alphabetically + as specified by RECORD-REGEXP and KEY-REGEXP. If 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 ASCII character set, the ordering in that set + determines alphabetical order. + + The value of the 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 `^.+$', + which matches lines with at least one character besides a newline, + would make each such line into a sort record. *Note Regular + Expressions::, for a description of the syntax and meaning of + regular expressions. + + The value of the KEY-REGEXP argument specifies what part of each + record is the sort key. The 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 KEY-REGEXP argument can refer to the text matched by a + subexpression of RECORD-REGEXP, or it can be a regular expression + on its own. + + If KEY-REGEXP is: + + `\DIGIT' + then the text matched by the DIGITth `\(...\)' parenthesis + grouping in RECORD-REGEXP is the sort key. + + `\&' + then the whole record is the sort key. + + a regular expression + then `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 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.) + + For example, if you plan to sort all the lines in the region by the + first word on each line starting with the letter `f', you should + set RECORD-REGEXP to `^.*$' and set KEY-REGEXP to `\'. The + resulting expression looks like this: + + (sort-regexp-fields nil "^.*$" "\\" + (region-beginning) + (region-end)) + + If you call `sort-regexp-fields' interactively, it prompts for + RECORD-REGEXP and KEY-REGEXP in the minibuffer. + + - Command: sort-lines reverse start end + This command alphabetically sorts lines in the region between + START and END. If REVERSE is non-`nil', the sort is in reverse + order. + + - Command: sort-paragraphs reverse start end + This command alphabetically sorts paragraphs in the region between + START and END. If REVERSE is non-`nil', the sort is in reverse + order. + + - Command: sort-pages reverse start end + This command alphabetically sorts pages in the region between + START and END. If REVERSE is non-`nil', the sort is in reverse + order. + + - Command: sort-fields field start end + This command sorts lines in the region between START and END, + comparing them alphabetically by the FIELDth field of each line. + Fields are separated by whitespace and numbered starting from 1. + If FIELD is negative, sorting is by the -FIELDth field from the + end of the line. This command is useful for sorting tables. + + - Command: sort-numeric-fields field start end + This command sorts lines in the region between START and END, + comparing them numerically by the FIELDth 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 FIELD is negative, sorting is by the -FIELDth field from the + end of the line. This command is useful for sorting tables. + + - Command: sort-columns reverse &optional start end + This command sorts the lines in the region between START and END, + comparing them alphabetically by a certain range of columns. The + column positions of START and END bound the range of columns to + sort on. + + If REVERSE is non-`nil', the sort is in reverse order. + + One unusual thing about this command is that the entire line + containing position START, and the entire line containing position + END, are included in the region sorted. + + Note that `sort-columns' uses the `sort' utility program, and so + cannot work properly on text containing tab characters. Use `M-x + `untabify'' to convert tabs to spaces before sorting. + + +File: lispref.info, Node: Columns, Next: Indentation, Prev: Sorting, Up: Text + +Counting Columns +================ + + 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 `ctl-arrow', and tabs count as +occupying a number of columns that depends on the value of `tab-width' +and on the column where the tab begins. *Note 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. + + - Function: current-column &optional buffer + This function returns the horizontal position of point, measured in + columns, counting from 0 at the left margin. + + This is calculated by adding together the widths of all the + displayed representations of the character between the start of + the previous line and point. (e.g. control characters will have a + width of 2 or 4, tabs will have a variable width.) + + Ignores the finite width of frame displaying the buffer, which + means that this function may return values greater than + `(frame-width)'. + + Whether the line is visible (if `selective-display' is t) has no + effect; however, ^M is treated as end of line when + `selective-display' is t. + + If BUFFER is nil, the current buffer is assumed. + + For an example of using `current-column', see the description of + `count-lines' in *Note Text Lines::. + + - Function: move-to-column column &optional force buffer + This function moves point to COLUMN in the current line. The + calculation of COLUMN takes into account the widths of the + displayed representations of the characters between the start of + the line and point. + + If column COLUMN is beyond the end of the line, point moves to the + end of the line. If COLUMN is negative, point moves to the + beginning of the line. + + If it is impossible to move to column 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 FORCE is non-`nil', and + COLUMN is in the middle of a tab, then `move-to-column' converts + the tab into spaces so that it can move precisely to column + COLUMN. Other multicolumn characters can cause anomalies despite + FORCE, since there is no way to split them. + + The argument FORCE also has an effect if the line isn't long + enough to reach column COLUMN; in that case, unless the value of + FORCE is the special value `coerce', it says to add whitespace at + the end of the line to reach that column. + + If COLUMN is not a non-negative integer, an error is signaled. + + The return value is the column number actually moved to. + + +File: lispref.info, Node: Indentation, Next: Case Changes, Prev: Columns, Up: Text + +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. + + +File: lispref.info, Node: Primitive Indent, Next: Mode-Specific Indent, Up: Indentation + +Indentation Primitives +---------------------- + + This section describes the primitive functions used to count and +insert indentation. The functions in the following sections use these +primitives. + + - Function: current-indentation &optional buffer + 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. + + - Command: indent-to column &optional minimum buffer + This function indents from point with tabs and spaces until COLUMN + is reached. If MINIMUM is specified and non-`nil', then at least + that many spaces are inserted even if this requires going beyond + COLUMN. Otherwise the function does nothing if point is already + beyond COLUMN. The value is the column at which the inserted + indentation ends. If BUFFER is `nil', the current buffer is + assumed. + + - User Option: indent-tabs-mode + If this variable is non-`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. + + +File: lispref.info, Node: Mode-Specific Indent, Next: Region Indent, Prev: Primitive Indent, Up: Indentation + +Indentation Controlled by Major Mode +------------------------------------ + + An important function of each major mode is to customize the +key to indent properly for the language being edited. This section +describes the mechanism of the key and how to control it. The +functions in this section return unpredictable values. + + - Variable: indent-line-function + This variable's value is the function to be used by (and + various commands) to indent the current line. The command + `indent-according-to-mode' does no more than call this function. + + In Lisp mode, the value is the symbol `lisp-indent-line'; in C + mode, `c-indent-line'; in Fortran mode, `fortran-indent-line'. In + Fundamental mode, Text mode, and many other modes with no standard + for indentation, the value is `indent-to-left-margin' (which is the + default value). + + - Command: indent-according-to-mode + This command calls the function in `indent-line-function' to + indent the current line in a way appropriate for the current major + mode. + + - Command: indent-for-tab-command &optional prefix-arg + This command calls the function in `indent-line-function' to indent + the current line; except that if that function is + `indent-to-left-margin', it calls `insert-tab' instead. (That is + a trivial command that inserts a tab character.) + + - Command: newline-and-indent + 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 `indent-line-function'. + In programming language modes, this is the same thing does, + but in some text modes, where inserts a tab, + `newline-and-indent' indents to the column specified by + `left-margin'. + + - Command: reindent-then-newline-and-indent + 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 + `indent-line-function'. In programming language modes, this is + the same thing does, but in some text modes, where + inserts a tab, `reindent-then-newline-and-indent' indents to the + column specified by `left-margin'. + + +File: lispref.info, Node: Region Indent, Next: Relative Indent, Prev: Mode-Specific Indent, Up: Indentation + +Indenting an Entire Region +-------------------------- + + This section describes commands that indent all the lines in the +region. They return unpredictable values. + + - Command: indent-region start end to-column + This command indents each nonblank line starting between START + (inclusive) and END (exclusive). If TO-COLUMN is `nil', + `indent-region' indents each nonblank line by calling the current + mode's indentation function, the value of `indent-line-function'. + + If TO-COLUMN is non-`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, `indent-region' indents each line by + making it start with the fill prefix. + + - Variable: indent-region-function + The value of this variable is a function that can be used by + `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 `nil', there is no short cut, and `indent-region' + actually works line by line. + + A short-cut function is useful in modes such as C mode and Lisp + mode, where the `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. + + `indent-region' with a non-`nil' argument TO-COLUMN has a + different meaning and does not use this variable. + + - Command: indent-rigidly start end count + This command indents all lines starting between START (inclusive) + and END (exclusive) sideways by 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 COUNT is 3, this command adds 3 columns of + indentation to each of the lines beginning in the region specified. + + In Mail mode, `C-c C-y' (`mail-yank-original') uses + `indent-rigidly' to indent the text copied from the message being + replied to. + + - Command: indent-code-rigidly start end columns &optional + nochange-regexp + This is like `indent-rigidly', except that it doesn't alter lines + that start within strings or comments. + + In addition, it doesn't alter a line if NOCHANGE-REGEXP matches at + the beginning of the line (if NOCHANGE-REGEXP is non-`nil'). + + +File: lispref.info, Node: Relative Indent, Next: Indent Tabs, Prev: Region Indent, Up: Indentation + +Indentation Relative to Previous Lines +-------------------------------------- + + This section describes two commands that indent the current line +based on the contents of previous lines. + + - Command: indent-relative &optional unindented-ok + This command inserts whitespace at point, extending to the same + column as the next "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), `indent-relative' either does + nothing (if UNINDENTED-OK is non-`nil') or calls + `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 `indent-relative' is unpredictable. + + In the following example, point is at the beginning of the second + line: + + This line is indented twelve spaces. + -!-The quick brown fox jumped. + + Evaluation of the expression `(indent-relative nil)' produces the + following: + + This line is indented twelve spaces. + -!-The quick brown fox jumped. + + In this example, point is between the `m' and `p' of `jumped': + + This line is indented twelve spaces. + The quick brown fox jum-!-ped. + + Evaluation of the expression `(indent-relative nil)' produces the + following: + + This line is indented twelve spaces. + The quick brown fox jum -!-ped. + + - Command: indent-relative-maybe + This command indents the current line like the previous nonblank + line. It calls `indent-relative' with `t' as the 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. + + +File: lispref.info, Node: Indent Tabs, Next: Motion by Indent, Prev: Relative Indent, Up: Indentation + +Adjustable "Tab Stops" +---------------------- + + 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 (*note Usual +Display::). Note that the character as input uses this tab stop +feature only in a few major modes, such as Text mode. + + - Command: tab-to-tab-stop + This command inserts spaces or tabs up to the next tab stop column + defined by `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. + + - User Option: tab-stop-list + This variable is the list of tab stop columns used by + `tab-to-tab-stops'. The elements should be integers in increasing + order. The tab stop columns need not be evenly spaced. + + Use `M-x edit-tab-stops' to edit the location of tab stops + interactively. + + +File: lispref.info, Node: Motion by Indent, Prev: Indent Tabs, Up: Indentation + +Indentation-Based Motion Commands +--------------------------------- + + These commands, primarily for interactive use, act based on the +indentation in the text. + + - Command: back-to-indentation + 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 `nil'. + + - Command: backward-to-indentation arg + This command moves point backward ARG lines and then to the first + nonblank character on that line. It returns `nil'. + + - Command: forward-to-indentation arg + This command moves point forward ARG lines and then to the first + nonblank character on that line. It returns `nil'. + + +File: lispref.info, Node: Case Changes, Next: Text Properties, Prev: Indentation, Up: Text + +Case Changes +============ + + The case change commands described here work on text in the current +buffer. *Note Character Case::, for case conversion commands that work +on strings and characters. *Note Case Tables::, for how to customize +which characters are upper or lower case and how to convert them. + + - Command: capitalize-region start end &optional buffer + This function capitalizes all words in the region defined by START + and 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 `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 `capitalize-region' is called interactively, START and END + are point and the mark, with the smallest first. + + ---------- Buffer: foo ---------- + This is the contents of the 5th foo. + ---------- Buffer: foo ---------- + + (capitalize-region 1 44) + => nil + + ---------- Buffer: foo ---------- + This Is The Contents Of The 5th Foo. + ---------- Buffer: foo ---------- + + - Command: downcase-region start end &optional buffer + This function converts all of the letters in the region defined by + START and END to lower case. The function returns `nil'. + + When `downcase-region' is called interactively, START and END are + point and the mark, with the smallest first. + + - Command: upcase-region start end &optional buffer + This function converts all of the letters in the region defined by + START and END to upper case. The function returns `nil'. + + When `upcase-region' is called interactively, START and END are + point and the mark, with the smallest first. + + - Command: capitalize-word count &optional buffer + This function capitalizes 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 COUNT is negative, the function capitalizes the -COUNT + previous words but does not move point. The value is `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 `capitalize-word' is called interactively, COUNT is set to + the numeric prefix argument. + + - Command: downcase-word count &optional buffer + This function converts the COUNT words after point to all lower + case, moving point over as it does. If COUNT is negative, it + converts the -COUNT previous words but does not move point. The + value is `nil'. + + When `downcase-word' is called interactively, COUNT is set to the + numeric prefix argument. + + - Command: upcase-word count &optional buffer + This function converts the COUNT words after point to all upper + case, moving point over as it does. If COUNT is negative, it + converts the -COUNT previous words but does not move point. The + value is `nil'. + + When `upcase-word' is called interactively, COUNT is set to the + numeric prefix argument. + + +File: lispref.info, Node: Text Properties, Next: Substitution, Prev: Case Changes, Up: Text + +Text Properties +=============== + + Text properties are an alternative interface to extents (*note +Extents::), and are built on top of them. They are useful when you +want to view textual properties as being attached to the characters +themselves rather than to intervals of characters. The text property +interface is compatible with FSF Emacs. + + Each character position in a buffer or a string can have a "text +property list", much like the property list of a symbol (*note Property +Lists::). The properties belong to a particular character at a +particular place, such as, the letter `T' at the beginning of this +sentence or the first `o' in `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. + + Note that FSF Emacs also looks at the `category' property to find +defaults for text properties. We consider this too bogus to implement. + + Copying text between strings and buffers preserves the properties +along with the characters; this includes such diverse functions as +`substring', `insert', and `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. +* Saving Properties:: Saving text properties in files, and reading + them back. + + File: lispref.info, Node: Examining Properties, Next: Changing Properties, Up: Text Properties Examining Text Properties @@ -65,12 +739,12 @@ to examine the properties of a number of characters at once. positions in a string start from 0, whereas positions in a buffer start from 1.) - - Function: get-text-property pos prop &optional object + - Function: get-text-property pos prop &optional object at-flag This function returns the value of the PROP property of the character after position POS in OBJECT (a buffer or string). The argument OBJECT is optional and defaults to the current buffer. - - Function: get-char-property pos prop &optional object + - Function: get-char-property pos prop &optional object at-flag This function is like `get-text-property', except that it checks all extents, not just text-property extents. @@ -244,13 +918,13 @@ different properties. if LIMIT equals POS. - Function: previous-property-change pos &optional object limit - This is like `next-property-change', but scans back from POS + This is like `next-property-change', but scans backward from POS instead of forward. If the value is non-`nil', it is a position less than or equal to POS; it equals POS only if LIMIT equals POS. - Function: previous-single-property-change pos prop &optional object limit - This is like `next-single-property-change', but scans back from + This is like `next-single-property-change', but scans backward from POS instead of forward. If the value is non-`nil', it is a position less than or equal to POS; it equals POS only if LIMIT equals POS. @@ -462,20 +1136,20 @@ otherwise stated. represents a rectangle; its elements are strings, one per line of the rectangle. - - Function: get-register reg - This function returns the contents of the register REG, or `nil' - if it has no contents. + - Function: get-register register + This function returns the contents of the register REGISTER, or + `nil' if it has no contents. - - Function: set-register reg value - This function sets the contents of register REG to VALUE. A + - Function: set-register register value + This function sets the contents of register REGISTER to VALUE. A register can be set to any value, but the other register functions expect only certain data types. The return value is VALUE. - - Command: view-register reg - This command displays what is contained in register REG. + - Command: view-register register + This command displays what is contained in register REGISTER. - - Command: insert-register reg &optional beforep - This command inserts contents of register REG into the current + - Command: insert-register register &optional beforep + This command inserts contents of register REGISTER into the current buffer. Normally, this command puts point before the inserted text, and the @@ -514,653 +1188,3 @@ Transposition of Text if LEAVE-MARKERS is non-`nil', `transpose-regions' does not do this--it leaves all markers unrelocated. - -File: lispref.info, Node: Change Hooks, Next: Transformations, Prev: Transposition, Up: Text - -Change Hooks -============ - - 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). - - 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. - - Buffer changes made while executing the following hooks don't -themselves cause any change hooks to be invoked. - - - Variable: 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. - - - Variable: 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. - - - Variable: before-change-function - This obsolete variable holds one function to call before any buffer - modification (or `nil' for no function). It is called just like - the functions in `before-change-functions'. - - - Variable: after-change-function - This obsolete variable holds one function to call after any buffer - modification (or `nil' for no function). It is called just like - the functions in `after-change-functions'. - - - Variable: first-change-hook - This variable is a normal hook that is run whenever a buffer is - changed that was previously in the unmodified state. - - -File: lispref.info, Node: Transformations, Prev: Change Hooks, Up: Text - -Textual transformations--MD5 and base64 support -=============================================== - - Some textual operations inherently require examining each character -in turn, and performing arithmetic operations on them. Such operations -can, of course, be implemented in Emacs Lisp, but tend to be very slow -for large portions of text or data. This is why some of them are -implemented in C, with an appropriate interface for Lisp programmers. -Examples of algorithms thus provided are MD5 and base64 support. - - MD5 is an algorithm for calculating message digests, as described in -rfc1321. Given a message of arbitrary length, MD5 produces an 128-bit -"fingerprint" ("message digest") corresponding to that message. It is -considered computationally infeasible to produce two messages having -the same MD5 digest, or to produce a message having a prespecified -target digest. MD5 is used heavily by various authentication schemes. - - Emacs Lisp interface to MD5 consists of a single function `md5': - - - Function: md5 object &optional start end - This function returns the MD5 message digest of OBJECT, a buffer - or string. - - Optional arguments START and END denote positions for computing - the digest of a portion of OBJECT. - - Some examples of usage: - - ;; Calculate the digest of the entire buffer - (md5 (current-buffer)) - => "8842b04362899b1cda8d2d126dc11712" - - ;; Calculate the digest of the current line - (md5 (current-buffer) (point-at-bol) (point-at-eol)) - => "60614d21e9dee27dfdb01fa4e30d6d00" - - ;; Calculate the digest of your name and email address - (md5 (concat (format "%s <%s>" (user-full-name) user-mail-address))) - => "0a2188c40fd38922d941fe6032fce516" - - Base64 is a portable encoding for arbitrary sequences of octets, in a -form that need not be readable by humans. It uses a 65-character subset -of US-ASCII, as described in rfc2045. Base64 is used by MIME to encode -binary bodies, and to encode binary characters in message headers. - - The Lisp interface to base64 consists of four functions: - - - Function: base64-encode-region beg end &optional no-line-break - This function encodes the region between BEG and END of the - current buffer to base64 format. This means that the original - region is deleted, and replaced with its base64 equivalent. - - Normally, encoded base64 output is multi-line, with 76-character - lines. If NO-LINE-BREAK is non-`nil', newlines will not be - inserted, resulting in single-line output. - - Mule note: you should make sure that you convert the multibyte - characters (those that do not fit into 0-255 range) to something - else, because they cannot be meaningfully converted to base64. If - the `base64-encode-region' encounters such characters, it will - signal an error. - - `base64-encode-region' returns the length of the encoded text. - - ;; Encode the whole buffer in base64 - (base64-encode-region (point-min) (point-max)) - - The function can also be used interactively, in which case it - works on the currently active region. - - - Function: base64-encode-string string - This function encodes STRING to base64, and returns the encoded - string. - - For Mule, the same considerations apply as for - `base64-encode-region'. - - (base64-encode-string "fubar") - => "ZnViYXI=" - - - Function: base64-decode-region beg end - This function decodes the region between BEG and END of the - current buffer. The region should be in base64 encoding. - - If the region was decoded correctly, `base64-decode-region' returns - the length of the decoded region. If the decoding failed, `nil' is - returned. - - ;; Decode a base64 buffer, and replace it with the decoded version - (base64-decode-region (point-min) (point-max)) - - - Function: base64-decode-string string - This function decodes STRING to base64, and returns the decoded - string. STRING should be valid base64-encoded text. - - If encoding was not possible, `nil' is returned. - - (base64-decode-string "ZnViYXI=") - => "fubar" - - (base64-decode-string "totally bogus") - => nil - - -File: lispref.info, Node: Searching and Matching, Next: Syntax Tables, Prev: Text, Up: Top - -Searching and Matching -********************** - - XEmacs 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 "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 `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,... - - The `skip-chars...' functions also perform a kind of searching. -*Note Skipping Characters::. - - -File: lispref.info, Node: String Search, Next: Regular Expressions, Up: Searching and Matching - -Searching for Strings -===================== - - 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; LIMIT -and NOERROR are set to `nil', and REPEAT is set to 1. - - - Command: search-forward string &optional limit noerror repeat - This function searches forward from point for an exact match for - 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 NOERROR (see below). - - In the following example, point is initially at the beginning of - the line. Then `(search-forward "fox")' moves point after the last - letter of `fox': - - ---------- Buffer: foo ---------- - -!-The quick brown fox jumped over the lazy dog. - ---------- Buffer: foo ---------- - - (search-forward "fox") - => 20 - - ---------- Buffer: foo ---------- - The quick brown fox-!- jumped over the lazy dog. - ---------- Buffer: foo ---------- - - The argument 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 LIMIT is omitted or `nil', it - defaults to the end of the accessible portion of the buffer. - - What happens when the search fails depends on the value of - NOERROR. If NOERROR is `nil', a `search-failed' error is - signaled. If NOERROR is `t', `search-forward' returns `nil' and - does nothing. If NOERROR is neither `nil' nor `t', then - `search-forward' moves point to the upper bound and returns `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 - `nil'.) - - If 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. - - - Command: search-backward string &optional limit noerror repeat - This function searches backward from point for STRING. It is just - like `search-forward' except that it searches backwards and leaves - point at the beginning of the match. - - - Command: word-search-forward string &optional limit noerror repeat - This function searches forward from point for a "word" match for - STRING. If it finds a match, it sets point to the end of the - match found, and returns the new value of point. - - Word matching regards 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 `ball' does not match the word `balls'), - but the details of punctuation and spacing are ignored (searching - for `ball boy' does match `ball. Boy!'). - - In this example, point is initially at the beginning of the - buffer; the search leaves it between the `y' and the `!'. - - ---------- Buffer: foo ---------- - -!-He said "Please! Find - the ball boy!" - ---------- Buffer: foo ---------- - - (word-search-forward "Please find the ball, boy.") - => 35 - - ---------- Buffer: foo ---------- - He said "Please! Find - the ball boy-!-!" - ---------- Buffer: foo ---------- - - If LIMIT is non-`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 NOERROR is `nil', then `word-search-forward' signals an error - if the search fails. If NOERROR is `t', then it returns `nil' - instead of signaling an error. If NOERROR is neither `nil' nor - `t', it moves point to LIMIT (or the end of the buffer) and - returns `nil'. - - If REPEAT is non-`nil', then the search is repeated that many - times. Point is positioned at the end of the last match. - - - Command: word-search-backward string &optional limit noerror repeat - This function searches backward from point for a word match to - STRING. This function is just like `word-search-forward' except - that it searches backward and normally leaves point at the - beginning of the match. - - -File: lispref.info, Node: Regular Expressions, Next: Regexp Search, Prev: String Search, Up: Searching and Matching - -Regular Expressions -=================== - - A "regular expression" ("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. - - To gain a thorough understanding of regular expressions and how to -use them to best advantage, we recommend that you study `Mastering -Regular Expressions, by Jeffrey E.F. Friedl, O'Reilly and Associates, -1997'. (It's known as the "Hip Owls" book, because of the picture on its -cover.) You might also read the manuals to *Note (gawk)Top::, *Note -(ed)Top::, `sed', `grep', *Note (perl)Top::, *Note (regex)Top::, *Note -(rx)Top::, `pcre', and *Note (flex)Top::, which also make good use of -regular expressions. - - The XEmacs regular expression syntax most closely resembles that of -`ed', or `grep', the GNU versions of which all utilize the GNU `regex' -library. XEmacs' version of `regex' has recently been extended with -some Perl-like capabilities, described in the next section. - -* Menu: - -* Syntax of Regexps:: Rules for writing regular expressions. -* Regexp Example:: Illustrates regular expression syntax. - - -File: lispref.info, Node: Syntax of Regexps, Next: Regexp Example, Up: Regular Expressions - -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 that matches that character and nothing -else. The special characters are `.', `*', `+', `?', `[', `]', `^', -`$', and `\'; no new special characters will be defined in the future. -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'. - - Any two regular expressions A and B can be concatenated. The result -is a regular expression that 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 more powerful, 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 that begins - with `a' and ends with `b'. - -`*' - is not a construct by itself; it is a quantifying suffix operator - that means to repeat the preceding regular expression as many - times as possible. In `fo*', the `*' applies to the `o', so `fo*' - matches one `f' followed by any number of `o's. The case of zero - `o's is allowed: `fo*' does match `f'. - - `*' always applies to the _smallest_ possible preceding - expression. Thus, `fo*' has a repeating `o', not a repeating `fo'. - - The matcher processes a `*' construct by matching, immediately, as - many repetitions as can be found; it is "greedy". 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, in 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. - - Nested repetition operators can be extremely slow if they specify - backtracking loops. For example, it could take hours for the - regular expression `\(x+y*\)*a' to match the sequence - `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz'. The slowness is because - Emacs must try each imaginable way of grouping the 35 `x''s before - concluding that none of them can work. To make sure your regular - expressions run fast, check nested repetitions carefully. - -`+' - is a quantifying suffix operator similar to `*' except that the - preceding expression must match at least once. It is also - "greedy". 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 quantifying suffix operator similar to `*', except that the - preceding expression can match either once or not at all. For - example, `ca?r' matches `car' or `cr', but does not match anything - else. - -`*?' - works just like `*', except that rather than matching the longest - match, it matches the shortest match. `*?' is known as a - "non-greedy" quantifier, a regexp construct borrowed from Perl. - - This construct is very useful for when you want to match the text - inside a pair of delimiters. For instance, `/\*.*?\*/' will match - C comments in a string. This could not easily be achieved without - the use of a non-greedy quantifier. - - This construct has not been available prior to XEmacs 20.4. It is - not available in FSF Emacs. - -`+?' - is the non-greedy version of `+'. - -`??' - is the non-greedy version of `?'. - -`\{n,m\}' - serves as an interval quantifier, analogous to `*' or `+', but - specifies that the expression must match at least N times, but no - more than M times. This syntax is supported by most Unix regexp - utilities, and has been introduced to XEmacs for the version 20.3. - - Unfortunately, the non-greedy version of this quantifier does not - exist currently, although it does in Perl. - -`[ ... ]' - `[' begins a "character set", which is terminated by a `]'. In - the simplest case, the characters between the two brackets form - the set. 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. - - The usual regular expression special characters are not special - inside a character set. A completely different set of special - characters exists inside character sets: `]', `-' and `^'. - - `-' is used for ranges of characters. To write a range, write 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 a period. - - To include a `]' in a character set, make it the first character. - For example, `[]a]' matches `]' or `a'. To include a `-', write - `-' as the first character in the set, or put it immediately after - a range. (You can replace one individual character C with the - range `C-C' to make a place to put the `-'.) There is no way to - write a set containing just `-' and `]'. - - To include `^' in a set, put it anywhere but at the beginning of - the set. - -`[^ ... ]' - `[^' begins a "complement 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 (thus, `-' and `]' 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. - -`^' - 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' that occurs - at the beginning of a line. - - When matching a string instead of a buffer, `^' matches at the - beginning of the string or after a newline character `\n'. - -`$' - is similar to `^' but matches only at the end of a line. Thus, - `x+$' matches a string of one `x' or more at the end of a line. - - When matching a string instead of a buffer, `$' matches at the end - of the string or before a newline character `\n'. - -`\' - has two functions: it quotes the special characters (including - `\'), and it introduces additional special constructs. - - Because `\' quotes special characters, `\$' is a regular - expression that matches only `$', and `\[' is a regular expression - that matches only `[', and so on. - - Note that `\' also has special meaning in the read syntax of Lisp - strings (*note String Type::), and must be quoted with `\'. For - example, the regular expression that matches the `\' character is - `\\'. To write a Lisp string that contains the characters `\\', - Lisp syntax requires you to quote each `\' with another `\'. - Therefore, the read syntax for a regular expression matching `\' - is `"\\\\"'. - - *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, `*foo' treats `*' as ordinary -since there is no preceding expression on which the `*' can act. It is -poor practice to depend on this behavior; quote the special character -anyway, regardless of where it appears. - - For the most part, `\' followed by any character matches only that -character. However, there are several exceptions: characters that, -when preceded by `\', are special constructs. Such characters are -always ordinary when encountered 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 grouping - power 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 an expression for a suffix operator such as `*' to - act on. Thus, `ba\(na\)*' matches `bananana', etc., with any - (zero or more) number of `na' strings. - - 3. To record 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 that happens to be - assigned as a second meaning to the same `\( ... \)' construct - because there is no conflict in practice between the two meanings. - Here is an explanation of this feature: - -`\DIGIT' - matches the same text that matched the DIGITth occurrence of a `\( - ... \)' construct. - - In other words, 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 DIGIT to match that same text, whatever it may - have been. - - The strings matching the first nine `\( ... \)' 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 `\1' through `\9' to refer to the text - matched by the corresponding `\( ... \)' constructs. - - 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. - -`\(?: ... \)' - is called a "shy" grouping operator, and it is used just like `\( - ... \)', except that it does not cause the matched substring to be - recorded for future reference. - - This is useful when you need a lot of grouping `\( ... \)' - constructs, but only want to remember one or two - or if you have - more than nine groupings and need to use backreferences to refer to - the groupings at the end. - - Using `\(?: ... \)' rather than `\( ... \)' when you don't need - the captured substrings ought to speed up your programs some, - since it shortens the code path followed by the regular expression - engine, as well as the amount of memory allocation and string - copying it must do. The actual performance gain to be observed - has not been measured or quantified as of this writing. - - The shy grouping operator has been borrowed from Perl, and has not - been available prior to XEmacs 20.3, nor is it available in FSF - Emacs. - -`\w' - matches any word-constituent character. The editor syntax table - determines which characters these are. *Note Syntax Tables::. - -`\W' - matches any character that is not a word constituent. - -`\sCODE' - matches any character whose syntax is CODE. Here CODE is a - character that represents a syntax code: thus, `w' for word - constituent, `-' for whitespace, `(' for open parenthesis, etc. - *Note Syntax Tables::, for a list of syntax codes and the - characters that stand for them. - -`\SCODE' - matches any character whose syntax is not CODE. - - 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. - -`\`' - matches the empty string, but only at the beginning of the buffer - or string being matched against. - -`\'' - matches the empty string, but only at the end of the buffer or - string being matched against. - -`\=' - matches the empty string, but only at point. (This construct is - not defined when matching against a string.) - -`\b' - matches the empty string, but only 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 the empty string, but _not_ at the beginning or end of a - word. - -`\<' - matches the empty string, but only at the beginning of a word. - -`\>' - matches the empty string, but only at the end of a word. - - Not every string is a valid regular expression. For example, a -string with unbalanced square brackets is invalid (with a few -exceptions, such as `[]]'), and so is a string that ends with a single -`\'. If an invalid regular expression is passed to any of the search -functions, an `invalid-regexp' error is signaled. - - - Function: regexp-quote string - This function returns a regular expression string that matches - exactly STRING and nothing else. This allows you to request an - exact string match when calling a function that wants a regular - expression. - - (regexp-quote "^The cat$") - => "\\^The cat\\$" - - One use of `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 `string', surrounded - by whitespace: - - (re-search-forward - (concat "\\s-" (regexp-quote string) "\\s-")) - diff --git a/info/lispref.info-32 b/info/lispref.info-32 index fd9588b..2153849 100644 --- a/info/lispref.info-32 +++ b/info/lispref.info-32 @@ -50,6 +50,679 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Change Hooks, Next: Transformations, Prev: Transposition, Up: Text + +Change Hooks +============ + + 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). + + 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. + + Buffer changes made while executing the following hooks don't +themselves cause any change hooks to be invoked. + + - Variable: 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. + + - Variable: 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. + + - Variable: before-change-function + This obsolete variable holds one function to call before any buffer + modification (or `nil' for no function). It is called just like + the functions in `before-change-functions'. + + - Variable: after-change-function + This obsolete variable holds one function to call after any buffer + modification (or `nil' for no function). It is called just like + the functions in `after-change-functions'. + + - Variable: first-change-hook + This variable is a normal hook that is run whenever a buffer is + changed that was previously in the unmodified state. + + +File: lispref.info, Node: Transformations, Prev: Change Hooks, Up: Text + +Textual transformations--MD5 and base64 support +=============================================== + + Some textual operations inherently require examining each character +in turn, and performing arithmetic operations on them. Such operations +can, of course, be implemented in Emacs Lisp, but tend to be very slow +for large portions of text or data. This is why some of them are +implemented in C, with an appropriate interface for Lisp programmers. +Examples of algorithms thus provided are MD5 and base64 support. + + MD5 is an algorithm for calculating message digests, as described in +rfc1321. Given a message of arbitrary length, MD5 produces an 128-bit +"fingerprint" ("message digest") corresponding to that message. It is +considered computationally infeasible to produce two messages having +the same MD5 digest, or to produce a message having a prespecified +target digest. MD5 is used heavily by various authentication schemes. + + Emacs Lisp interface to MD5 consists of a single function `md5': + + - Function: md5 object &optional start end coding noerror + This function returns the MD5 message digest of OBJECT, a buffer + or string. + + Optional arguments START and END denote positions for computing + the digest of a portion of OBJECT. + + The optional CODING argument specifies the coding system the text + is to be represented in while computing the digest. If + unspecified, it defaults to the current format of the data, or is + guessed. + + If NOERROR is non-`nil', silently assume binary coding if the + guesswork fails. Normally, an error is signaled in such case. + + CODING and NOERROR arguments are meaningful only in XEmacsen with + file-coding or Mule support. Otherwise, they are ignored. Some + examples of usage: + + ;; Calculate the digest of the entire buffer + (md5 (current-buffer)) + => "8842b04362899b1cda8d2d126dc11712" + + ;; Calculate the digest of the current line + (md5 (current-buffer) (point-at-bol) (point-at-eol)) + => "60614d21e9dee27dfdb01fa4e30d6d00" + + ;; Calculate the digest of your name and email address + (md5 (concat (format "%s <%s>" (user-full-name) user-mail-address))) + => "0a2188c40fd38922d941fe6032fce516" + + Base64 is a portable encoding for arbitrary sequences of octets, in a +form that need not be readable by humans. It uses a 65-character subset +of US-ASCII, as described in rfc2045. Base64 is used by MIME to encode +binary bodies, and to encode binary characters in message headers. + + The Lisp interface to base64 consists of four functions: + + - Command: base64-encode-region start end &optional no-line-break + This function encodes the region between START and END of the + current buffer to base64 format. This means that the original + region is deleted, and replaced with its base64 equivalent. + + Normally, encoded base64 output is multi-line, with 76-character + lines. If NO-LINE-BREAK is non-`nil', newlines will not be + inserted, resulting in single-line output. + + Mule note: you should make sure that you convert the multibyte + characters (those that do not fit into 0-255 range) to something + else, because they cannot be meaningfully converted to base64. If + the `base64-encode-region' encounters such characters, it will + signal an error. + + `base64-encode-region' returns the length of the encoded text. + + ;; Encode the whole buffer in base64 + (base64-encode-region (point-min) (point-max)) + + The function can also be used interactively, in which case it + works on the currently active region. + + - Function: base64-encode-string string &optional no-line-break + This function encodes STRING to base64, and returns the encoded + string. + + Normally, encoded base64 output is multi-line, with 76-character + lines. If NO-LINE-BREAK is non-`nil', newlines will not be + inserted, resulting in single-line output. + + For Mule, the same considerations apply as for + `base64-encode-region'. + + (base64-encode-string "fubar") + => "ZnViYXI=" + + - Command: base64-decode-region start end + This function decodes the region between START and END of the + current buffer. The region should be in base64 encoding. + + If the region was decoded correctly, `base64-decode-region' returns + the length of the decoded region. If the decoding failed, `nil' is + returned. + + ;; Decode a base64 buffer, and replace it with the decoded version + (base64-decode-region (point-min) (point-max)) + + - Function: base64-decode-string string + This function decodes STRING to base64, and returns the decoded + string. STRING should be valid base64-encoded text. + + If encoding was not possible, `nil' is returned. + + (base64-decode-string "ZnViYXI=") + => "fubar" + + (base64-decode-string "totally bogus") + => nil + + +File: lispref.info, Node: Searching and Matching, Next: Syntax Tables, Prev: Text, Up: Top + +Searching and Matching +********************** + + XEmacs 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 "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 `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,... + + The `skip-chars...' functions also perform a kind of searching. +*Note Skipping Characters::. + + +File: lispref.info, Node: String Search, Next: Regular Expressions, Up: Searching and Matching + +Searching for Strings +===================== + + 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; LIMIT +and NOERROR are set to `nil', and COUNT is set to 1. + + - Command: search-forward string &optional limit noerror count buffer + This function searches forward from point for an exact match for + 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 NOERROR (see below). + + In the following example, point is initially at the beginning of + the line. Then `(search-forward "fox")' moves point after the last + letter of `fox': + + ---------- Buffer: foo ---------- + -!-The quick brown fox jumped over the lazy dog. + ---------- Buffer: foo ---------- + + (search-forward "fox") + => 20 + + ---------- Buffer: foo ---------- + The quick brown fox-!- jumped over the lazy dog. + ---------- Buffer: foo ---------- + + The argument 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 LIMIT is omitted or `nil', it + defaults to the end of the accessible portion of the buffer. + + What happens when the search fails depends on the value of + NOERROR. If NOERROR is `nil', a `search-failed' error is + signaled. If NOERROR is `t', `search-forward' returns `nil' and + does nothing. If NOERROR is neither `nil' nor `t', then + `search-forward' moves point to the upper bound and returns `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 + `nil'.) + + If COUNT is supplied (it must be an integer), then the search is + repeated that many times (each time starting at the end of the + previous time's match). If COUNT is negative, the search + direction is backward. If the successive searches succeed, the + function succeeds, moving point and returning its new value. + Otherwise the search fails. + + BUFFER is the buffer to search in, and defaults to the current + buffer. + + - Command: search-backward string &optional limit noerror count buffer + This function searches backward from point for STRING. It is just + like `search-forward' except that it searches backwards and leaves + point at the beginning of the match. + + - Command: word-search-forward string &optional limit noerror count + buffer + This function searches forward from point for a "word" match for + STRING. If it finds a match, it sets point to the end of the + match found, and returns the new value of point. + + Word matching regards 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 `ball' does not match the word `balls'), + but the details of punctuation and spacing are ignored (searching + for `ball boy' does match `ball. Boy!'). + + In this example, point is initially at the beginning of the + buffer; the search leaves it between the `y' and the `!'. + + ---------- Buffer: foo ---------- + -!-He said "Please! Find + the ball boy!" + ---------- Buffer: foo ---------- + + (word-search-forward "Please find the ball, boy.") + => 35 + + ---------- Buffer: foo ---------- + He said "Please! Find + the ball boy-!-!" + ---------- Buffer: foo ---------- + + If LIMIT is non-`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 NOERROR is `nil', then `word-search-forward' signals an error + if the search fails. If NOERROR is `t', then it returns `nil' + instead of signaling an error. If NOERROR is neither `nil' nor + `t', it moves point to LIMIT (or the end of the buffer) and + returns `nil'. + + If COUNT is non-`nil', then the search is repeated that many + times. Point is positioned at the end of the last match. + + BUFFER is the buffer to search in, and defaults to the current + buffer. + + - Command: word-search-backward string &optional limit noerror count + buffer + This function searches backward from point for a word match to + STRING. This function is just like `word-search-forward' except + that it searches backward and normally leaves point at the + beginning of the match. + + +File: lispref.info, Node: Regular Expressions, Next: Regexp Search, Prev: String Search, Up: Searching and Matching + +Regular Expressions +=================== + + A "regular expression" ("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. + + To gain a thorough understanding of regular expressions and how to +use them to best advantage, we recommend that you study `Mastering +Regular Expressions, by Jeffrey E.F. Friedl, O'Reilly and Associates, +1997'. (It's known as the "Hip Owls" book, because of the picture on its +cover.) You might also read the manuals to *Note (gawk)Top::, *Note +(ed)Top::, `sed', `grep', *Note (perl)Top::, *Note (regex)Top::, *Note +(rx)Top::, `pcre', and *Note (flex)Top::, which also make good use of +regular expressions. + + The XEmacs regular expression syntax most closely resembles that of +`ed', or `grep', the GNU versions of which all utilize the GNU `regex' +library. XEmacs' version of `regex' has recently been extended with +some Perl-like capabilities, described in the next section. + +* Menu: + +* Syntax of Regexps:: Rules for writing regular expressions. +* Regexp Example:: Illustrates regular expression syntax. + + +File: lispref.info, Node: Syntax of Regexps, Next: Regexp Example, Up: Regular Expressions + +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 that matches that character and nothing +else. The special characters are `.', `*', `+', `?', `[', `]', `^', +`$', and `\'; no new special characters will be defined in the future. +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'. + + Any two regular expressions A and B can be concatenated. The result +is a regular expression that 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 more powerful, 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 that begins + with `a' and ends with `b'. + +`*' + is not a construct by itself; it is a quantifying suffix operator + that means to repeat the preceding regular expression as many + times as possible. In `fo*', the `*' applies to the `o', so `fo*' + matches one `f' followed by any number of `o's. The case of zero + `o's is allowed: `fo*' does match `f'. + + `*' always applies to the _smallest_ possible preceding + expression. Thus, `fo*' has a repeating `o', not a repeating `fo'. + + The matcher processes a `*' construct by matching, immediately, as + many repetitions as can be found; it is "greedy". 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, in 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. + + Nested repetition operators can be extremely slow if they specify + backtracking loops. For example, it could take hours for the + regular expression `\(x+y*\)*a' to match the sequence + `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz'. The slowness is because + Emacs must try each imaginable way of grouping the 35 `x''s before + concluding that none of them can work. To make sure your regular + expressions run fast, check nested repetitions carefully. + +`+' + is a quantifying suffix operator similar to `*' except that the + preceding expression must match at least once. It is also + "greedy". 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 quantifying suffix operator similar to `*', except that the + preceding expression can match either once or not at all. For + example, `ca?r' matches `car' or `cr', but does not match anything + else. + +`*?' + works just like `*', except that rather than matching the longest + match, it matches the shortest match. `*?' is known as a + "non-greedy" quantifier, a regexp construct borrowed from Perl. + + This construct is very useful for when you want to match the text + inside a pair of delimiters. For instance, `/\*.*?\*/' will match + C comments in a string. This could not easily be achieved without + the use of a non-greedy quantifier. + + This construct has not been available prior to XEmacs 20.4. It is + not available in FSF Emacs. + +`+?' + is the non-greedy version of `+'. + +`??' + is the non-greedy version of `?'. + +`\{n,m\}' + serves as an interval quantifier, analogous to `*' or `+', but + specifies that the expression must match at least N times, but no + more than M times. This syntax is supported by most Unix regexp + utilities, and has been introduced to XEmacs for the version 20.3. + + Unfortunately, the non-greedy version of this quantifier does not + exist currently, although it does in Perl. + +`[ ... ]' + `[' begins a "character set", which is terminated by a `]'. In + the simplest case, the characters between the two brackets form + the set. 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. + + The usual regular expression special characters are not special + inside a character set. A completely different set of special + characters exists inside character sets: `]', `-' and `^'. + + `-' is used for ranges of characters. To write a range, write 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 a period. + + To include a `]' in a character set, make it the first character. + For example, `[]a]' matches `]' or `a'. To include a `-', write + `-' as the first character in the set, or put it immediately after + a range. (You can replace one individual character C with the + range `C-C' to make a place to put the `-'.) There is no way to + write a set containing just `-' and `]'. + + To include `^' in a set, put it anywhere but at the beginning of + the set. + +`[^ ... ]' + `[^' begins a "complement 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 (thus, `-' and `]' 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. + +`^' + 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' that occurs + at the beginning of a line. + + When matching a string instead of a buffer, `^' matches at the + beginning of the string or after a newline character `\n'. + +`$' + is similar to `^' but matches only at the end of a line. Thus, + `x+$' matches a string of one `x' or more at the end of a line. + + When matching a string instead of a buffer, `$' matches at the end + of the string or before a newline character `\n'. + +`\' + has two functions: it quotes the special characters (including + `\'), and it introduces additional special constructs. + + Because `\' quotes special characters, `\$' is a regular + expression that matches only `$', and `\[' is a regular expression + that matches only `[', and so on. + + Note that `\' also has special meaning in the read syntax of Lisp + strings (*note String Type::), and must be quoted with `\'. For + example, the regular expression that matches the `\' character is + `\\'. To write a Lisp string that contains the characters `\\', + Lisp syntax requires you to quote each `\' with another `\'. + Therefore, the read syntax for a regular expression matching `\' + is `"\\\\"'. + + *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, `*foo' treats `*' as ordinary +since there is no preceding expression on which the `*' can act. It is +poor practice to depend on this behavior; quote the special character +anyway, regardless of where it appears. + + For the most part, `\' followed by any character matches only that +character. However, there are several exceptions: characters that, +when preceded by `\', are special constructs. Such characters are +always ordinary when encountered 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 grouping + power 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 an expression for a suffix operator such as `*' to + act on. Thus, `ba\(na\)*' matches `bananana', etc., with any + (zero or more) number of `na' strings. + + 3. To record 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 that happens to be + assigned as a second meaning to the same `\( ... \)' construct + because there is no conflict in practice between the two meanings. + Here is an explanation of this feature: + +`\DIGIT' + matches the same text that matched the DIGITth occurrence of a `\( + ... \)' construct. + + In other words, 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 DIGIT to match that same text, whatever it may + have been. + + The strings matching the first nine `\( ... \)' 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 `\1' through `\9' to refer to the text + matched by the corresponding `\( ... \)' constructs. + + 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. + +`\(?: ... \)' + is called a "shy" grouping operator, and it is used just like `\( + ... \)', except that it does not cause the matched substring to be + recorded for future reference. + + This is useful when you need a lot of grouping `\( ... \)' + constructs, but only want to remember one or two - or if you have + more than nine groupings and need to use backreferences to refer to + the groupings at the end. + + Using `\(?: ... \)' rather than `\( ... \)' when you don't need + the captured substrings ought to speed up your programs some, + since it shortens the code path followed by the regular expression + engine, as well as the amount of memory allocation and string + copying it must do. The actual performance gain to be observed + has not been measured or quantified as of this writing. + + The shy grouping operator has been borrowed from Perl, and has not + been available prior to XEmacs 20.3, nor is it available in FSF + Emacs. + +`\w' + matches any word-constituent character. The editor syntax table + determines which characters these are. *Note Syntax Tables::. + +`\W' + matches any character that is not a word constituent. + +`\sCODE' + matches any character whose syntax is CODE. Here CODE is a + character that represents a syntax code: thus, `w' for word + constituent, `-' for whitespace, `(' for open parenthesis, etc. + *Note Syntax Tables::, for a list of syntax codes and the + characters that stand for them. + +`\SCODE' + matches any character whose syntax is not CODE. + + 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. + +`\`' + matches the empty string, but only at the beginning of the buffer + or string being matched against. + +`\'' + matches the empty string, but only at the end of the buffer or + string being matched against. + +`\=' + matches the empty string, but only at point. (This construct is + not defined when matching against a string.) + +`\b' + matches the empty string, but only 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 the empty string, but _not_ at the beginning or end of a + word. + +`\<' + matches the empty string, but only at the beginning of a word. + +`\>' + matches the empty string, but only at the end of a word. + + Not every string is a valid regular expression. For example, a +string with unbalanced square brackets is invalid (with a few +exceptions, such as `[]]'), and so is a string that ends with a single +`\'. If an invalid regular expression is passed to any of the search +functions, an `invalid-regexp' error is signaled. + + - Function: regexp-quote string + This function returns a regular expression string that matches + exactly STRING and nothing else. This allows you to request an + exact string match when calling a function that wants a regular + expression. + + (regexp-quote "^The cat$") + => "\\^The cat\\$" + + One use of `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 `string', surrounded + by whitespace: + + (re-search-forward + (concat "\\s-" (regexp-quote string) "\\s-")) + + File: lispref.info, Node: Regexp Example, Prev: Syntax of Regexps, Up: Regular Expressions Complex Regexp Example @@ -117,7 +790,8 @@ incrementally or not. Incremental search commands are described in the (emacs)Regexp Search. Here we describe only the search functions useful in programs. The principal one is `re-search-forward'. - - Command: re-search-forward regexp &optional limit noerror repeat + - Command: re-search-forward regexp &optional limit noerror count + buffer This function searches forward in the current buffer for a string of text that is matched by the regular expression REGEXP. The function skips over any amount of text that is not matched by @@ -135,7 +809,7 @@ useful in programs. The principal one is `re-search-forward'. `re-search-forward' moves point to LIMIT (or the end of the buffer) and returns `nil'. - If REPEAT is supplied (it must be a positive number), then the + If COUNT 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 @@ -158,7 +832,8 @@ useful in programs. The principal one is `re-search-forward'. comes back" twice. ---------- Buffer: foo ---------- - - Command: re-search-backward regexp &optional limit noerror repeat + - Command: re-search-backward regexp &optional limit noerror count + buffer This function searches backward in the current buffer for a string of text that is matched by the regular expression REGEXP, leaving point at the beginning of the first text found. @@ -177,12 +852,16 @@ useful in programs. The principal one is `re-search-forward'. feature for matching regexps from end to beginning. It's not worth the trouble of implementing that. - - Function: string-match regexp string &optional start + - Function: string-match regexp string &optional start buffer This function returns the index of the start of the first match for the regular expression REGEXP in STRING, or `nil' if there is no match. If START is non-`nil', the search starts at that index in STRING. + Optional arg BUFFER controls how case folding is done (according + to the value of `case-fold-search' in BUFFER and BUFFER's case + tables) and defaults to the current buffer. + For example, (string-match @@ -230,7 +909,7 @@ useful in programs. The principal one is `re-search-forward'. `path-separator'. Under Unix, `path-separator' will normally be `:', while under Windows, it will be `;'. - - Function: looking-at regexp + - Function: looking-at regexp &optional buffer This function determines whether the text in the current buffer directly following point matches the regular expression REGEXP. "Directly following" means precisely that: the search is @@ -274,26 +953,32 @@ 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. - - Function: posix-search-forward regexp &optional limit noerror repeat + - Command: posix-search-forward regexp &optional limit noerror count + buffer This is like `re-search-forward' except that it performs the full backtracking specified by the POSIX standard for regular expression matching. - - Function: posix-search-backward regexp &optional limit noerror repeat + - Command: posix-search-backward regexp &optional limit noerror count + buffer This is like `re-search-backward' except that it performs the full backtracking specified by the POSIX standard for regular expression matching. - - Function: posix-looking-at regexp + - Function: posix-looking-at regexp &optional buffer This is like `looking-at' except that it performs the full backtracking specified by the POSIX standard for regular expression matching. - - Function: posix-string-match regexp string &optional start + - Function: posix-string-match regexp string &optional start buffer This is like `string-match' except that it performs the full backtracking specified by the POSIX standard for regular expression matching. + Optional arg BUFFER controls how case folding is done (according + to the value of `case-fold-search' in BUFFER and BUFFER's case + tables) and defaults to the current buffer. +  File: lispref.info, Node: Search and Replace, Next: Match Data, Prev: POSIX Regexps, Up: Searching and Matching @@ -512,696 +1197,3 @@ subexpression is at the 13th character (`c'). (In this case, the index returned is a buffer position; the first character of the buffer counts as 1.) - -File: lispref.info, Node: Replacing Match, Next: Entire Match Data, Prev: Simple Match Data, Up: Match Data - -Replacing the Text That Matched -------------------------------- - - This function replaces the text matched by the last search with -REPLACEMENT. - - - Function: replace-match replacement &optional fixedcase literal - string - This function replaces the text in the buffer (or in STRING) that - was matched by the last search. It replaces that text with - REPLACEMENT. - - If you did the last search in a buffer, you should specify `nil' - for STRING. Then `replace-match' does the replacement by editing - the buffer; it leaves point at the end of the replacement text, - and returns `t'. - - If you did the search in a string, pass the same string as STRING. - Then `replace-match' does the replacement by constructing and - returning a new string. - - If FIXEDCASE is non-`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, `replace-match' - considers this a capitalized first word rather than all upper case. - - If `case-replace' is `nil', then case conversion is not done, - regardless of the value of FIXED-CASE. *Note Searching and Case::. - - If LITERAL is non-`nil', then REPLACEMENT is inserted exactly as - it is, the only alterations being case changes as needed. If it - is `nil' (the default), then the character `\' is treated - specially. If a `\' appears in REPLACEMENT, then it must be part - of one of the following sequences: - - `\&' - `\&' stands for the entire text being replaced. - - `\N' - `\N', where N is a digit, stands for the text that matched - the Nth subexpression in the original regexp. Subexpressions - are those expressions grouped inside `\(...\)'. - - `\\' - `\\' stands for a single `\' in the replacement text. - - -File: lispref.info, Node: Entire Match Data, Next: Saving Match Data, Prev: Replacing Match, Up: Match Data - -Accessing the Entire Match Data -------------------------------- - - The functions `match-data' and `set-match-data' read or write the -entire match data, all at once. - - - Function: 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 number 2N corresponds to - `(match-beginning N)'; and element number 2N + 1 corresponds to - `(match-end N)'. - - All the elements are markers or `nil' if matching was done on a - buffer, and all are integers or `nil' if matching was done on a - string with `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 `match-data' - that is intended to access the match data for that search. - - (match-data) - => (# - # - # - #) - - - Function: set-match-data match-list - This function sets the match data from the elements of MATCH-LIST, - which should be a list that was the value of a previous call to - `match-data'. - - If 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. - - `store-match-data' is an alias for `set-match-data'. - - -File: lispref.info, Node: Saving Match Data, Prev: Entire Match Data, Up: Match Data - -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: - - (re-search-forward "The \\(cat \\)") - => 48 - (foo) ; Perhaps `foo' does - ; more searching. - (match-end 0) - => 61 ; Unexpected result--not 48! - - You can save and restore the match data with `save-match-data': - - - Macro: save-match-data body... - This special form executes BODY, saving and restoring the match - data around it. - - You can use `set-match-data' together with `match-data' to imitate -the effect of the special form `save-match-data'. This is useful for -writing code that can run in Emacs 18. Here is how: - - (let ((data (match-data))) - (unwind-protect - ... ; May change the original match data. - (set-match-data data))) - - Emacs automatically saves and restores the match data when it runs -process filter functions (*note Filter Functions::) and process -sentinels (*note Sentinels::). - - -File: lispref.info, Node: Searching and Case, Next: Standard Regexps, Prev: Match Data, Up: Searching and Matching - -Searching and Case -================== - - By default, searches in Emacs ignore the case of the text they are -searching through; if you specify searching for `FOO', then `Foo' or -`foo' is also considered a match. Regexps, and in particular character -sets, are included: thus, `[aB]' would match `a' or `A' or `b' or `B'. - - If you do not want this feature, set the variable `case-fold-search' -to `nil'. Then all letters must match exactly, including case. This -is a buffer-local variable; altering the variable affects only the -current buffer. (*Note Intro to Buffer-Local::.) Alternatively, you -may change the value of `default-case-fold-search', which is the -default value of `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. - - - User Option: case-replace - This variable determines whether the replacement functions should - preserve case. If the variable is `nil', that means to use the - replacement text verbatim. A non-`nil' value means to convert the - case of the replacement text according to the text being replaced. - - The function `replace-match' is where this variable actually has - its effect. *Note Replacing Match::. - - - User Option: case-fold-search - This buffer-local variable determines whether searches should - ignore case. If the variable is `nil' they do not ignore case; - otherwise they do ignore case. - - - Variable: default-case-fold-search - The value of this variable is the default value for - `case-fold-search' in buffers that do not override it. This is the - same as `(default-value 'case-fold-search)'. - - -File: lispref.info, Node: Standard Regexps, Prev: Searching and Case, Up: Searching and Matching - -Standard Regular Expressions Used in Editing -============================================ - - This section describes some variables that hold regular expressions -used for certain purposes in editing: - - - Variable: page-delimiter - This is the regexp describing line-beginnings that separate pages. - The default value is `"^\014"' (i.e., `"^^L"' or `"^\C-l"'); this - matches a line that starts with a formfeed character. - - The following two regular expressions should _not_ assume the match -always starts at the beginning of a line; they should not use `^' to -anchor the match. Most often, the paragraph commands do check for a -match only at the beginning of a line, which means that `^' would be -superfluous. When there is a nonzero left margin, they accept matches -that start after the left margin. In that case, a `^' would be -incorrect. However, a `^' is harmless in modes where a left margin is -never used. - - - Variable: 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 `paragraph-start' also.) The default value is - `"[ \t\f]*$"', which matches a line that consists entirely of - spaces, tabs, and form feeds (after its left margin). - - - Variable: paragraph-start - This is the regular expression for recognizing the beginning of a - line that starts _or_ separates paragraphs. The default value is - `"[ \t\n\f]"', which matches a line starting with a space, tab, - newline, or form feed (after its left margin). - - - Variable: sentence-end - This is the regular expression describing the end of a sentence. - (All paragraph boundaries also end sentences, regardless.) The - default value is: - - "[.?!][]\"')}]*\\($\\| $\\|\t\\| \\)[ \t\n]*" - - 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 *Note - Regexp Example::. - - -File: lispref.info, Node: Syntax Tables, Next: Abbrevs, Prev: Searching and Matching, Up: Top - -Syntax Tables -************* - - A "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 (*note Word Motion::) -and the list motion functions (*note 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. - - -File: lispref.info, Node: Syntax Basics, Next: Syntax Descriptors, Up: Syntax Tables - -Syntax Table Concepts -===================== - - A "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 (*note Word Motion::) and the list motion functions -(*note List Motion::) as well as the functions in this chapter. - - Under XEmacs 20, a syntax table is a particular subtype of the -primitive char table type (*note Char Tables::), and each element of the -char table is an integer that encodes the syntax of the character in -question, or a cons of such an integer and a matching character (for -characters with parenthesis syntax). - - Under XEmacs 19, 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. (The matching character, if any, is embedded in -the bits of this integer.) - - Syntax tables are used only for moving across text, not for the Emacs -Lisp reader. XEmacs 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 `;' begins a comment, but in C mode, it terminates -a statement. To support these variations, XEmacs 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. *Note 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. - - - Function: syntax-table-p object - This function returns `t' if 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. - - -File: lispref.info, Node: Syntax Descriptors, Next: Syntax Table Functions, Prev: Syntax Basics, Up: Syntax Tables - -Syntax Descriptors -================== - - This section describes the syntax classes and flags that denote the -syntax of a character, and how they are represented as a "syntax -descriptor", which is a Lisp string that you pass to -`modify-syntax-entry' to specify the desired syntax. - - XEmacs defines a number of "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. - - 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 `*' in C mode is -`. 23' (i.e., punctuation, matching character slot unused, second -character of a comment-starter, first character of an comment-ender), -and the entry for `/' is `. 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. - - -File: lispref.info, Node: Syntax Class Table, Next: Syntax Flags, Up: Syntax Descriptors - -Table of Syntax Classes ------------------------ - - Here is a table of syntax classes, the characters that stand for -them, their meanings, and examples of their use. - - - Syntax class: whitespace character - "Whitespace characters" (designated with ` ' or `-') 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. - - - Syntax class: word constituent - "Word constituents" (designated with `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. - - - Syntax class: symbol constituent - "Symbol constituents" (designated with `_') 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 `$&*+-_<>'. In standard C, the only - non-word-constituent character that is valid in symbols is - underscore (`_'). - - - Syntax class: punctuation character - "Punctuation characters" (`.') 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. - - - Syntax class: open parenthesis character - - Syntax class: close parenthesis character - Open and close "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, XEmacs indicates momentarily the matching open - parenthesis when you insert a close parenthesis. *Note Blinking::. - - The class of open parentheses is designated with `(', and that of - close parentheses with `)'. - - In English text, and in C code, the parenthesis pairs are `()', - `[]', and `{}'. In XEmacs Lisp, the delimiters for lists and - vectors (`()' and `[]') are classified as parenthesis characters. - - - Syntax class: string quote - "String quote characters" (designated with `"') 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 XEmacs 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 (`"') - and vertical bar (`|'). `|' is not used in XEmacs Lisp, but it is - used in Common Lisp. C also has two string quote characters: - double-quote for strings, and single-quote (`'') 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. - - - Syntax class: escape - An "escape character" (designated with `\') starts an escape - sequence such as is used in C string and character constants. The - character `\' 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 - `words-include-escapes' is non-`nil'. *Note Word Motion::. - - - Syntax class: character quote - A "character quote character" (designated with `/') 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 - `words-include-escapes' is non-`nil'. *Note Word Motion::. - - This class is used for backslash in TeX mode. - - - Syntax class: paired delimiter - "Paired delimiter characters" (designated with `$') 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 `$' that both enters - and leaves math mode. - - - Syntax class: expression prefix - An "expression prefix operator" (designated with `'') is used for - syntactic operators that are part of an expression if they appear - next to one. These characters in Lisp include the apostrophe, `'' - (used for quoting), the comma, `,' (used in macros), and `#' (used - in the read syntax for certain data types). - - - Syntax class: comment starter - - Syntax class: comment ender - The "comment starter" and "comment ender" characters are used in - various languages to delimit comments. These classes are - designated with `<' and `>', respectively. - - English text has no comment characters. In Lisp, the semicolon - (`;') starts a comment and a newline or formfeed ends one. - - - Syntax class: 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 `@'. - - -File: lispref.info, Node: Syntax Flags, Prev: Syntax Class Table, Up: Syntax Descriptors - -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 `1', `2', `3', `4', `b' and `p'. - - All the flags except `p' are used to describe multi-character -comment delimiters. The digit flags indicate that a character can -_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 `*' in C mode, which is a punctuation character, _and_ the second -character of a start-of-comment sequence (`/*'), _and_ the first -character of an end-of-comment sequence (`*/'). - - The flags for a character C are: - - * `1' means C is the start of a two-character comment-start sequence. - - * `2' means C is the second character of such a sequence. - - * `3' means C is the start of a two-character comment-end sequence. - - * `4' means C is the second character of such a sequence. - - * `b' means that 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 `b' - flag. - - A comment-end sequence (one or two characters) applies to the "b" - style if its first character has the `b' flag set; otherwise, it - applies to the "a" style. - - The appropriate comment syntax settings for C++ are as follows: - - `/' - `124b' - - `*' - `23' - - newline - `>b' - - This defines four comment-delimiting sequences: - - `/*' - This is a comment-start sequence for "a" style because the - second character, `*', does not have the `b' flag. - - `//' - This is a comment-start sequence for "b" style because the - second character, `/', does have the `b' flag. - - `*/' - This is a comment-end sequence for "a" style because the first - character, `*', does not have the `b' flag - - newline - This is a comment-end sequence for "b" style, because the - newline character has the `b' flag. - - * `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 `backward-prefix-chars' moves back over these - characters, as well as over characters whose primary syntax class - is prefix (`''). *Note Motion and Syntax::. - - -File: lispref.info, Node: Syntax Table Functions, Next: Motion and Syntax, Prev: Syntax Descriptors, Up: Syntax Tables - -Syntax Table Functions -====================== - - In this section we describe functions for creating, accessing and -altering syntax tables. - - - Function: make-syntax-table &optional 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. - - - Function: copy-syntax-table &optional table - This function constructs a copy of TABLE and returns it. If TABLE - is not supplied (or is `nil'), it returns a copy of the current - syntax table. Otherwise, an error is signaled if TABLE is not a - syntax table. - - - Command: modify-syntax-entry char syntax-descriptor &optional table - This function sets the syntax entry for CHAR according to - SYNTAX-DESCRIPTOR. The syntax is changed only for TABLE, which - defaults to the current buffer's syntax table, and not in any - other syntax table. The argument 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. *Note Syntax Descriptors::. - - This function always returns `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 CHAR is not a character. - - Examples: - - ;; Put the space character in class whitespace. - (modify-syntax-entry ?\ " ") - => nil - - ;; Make `$' an open parenthesis character, - ;; with `^' as its matching close. - (modify-syntax-entry ?$ "(^") - => nil - - ;; Make `^' a close parenthesis character, - ;; with `$' as its matching open. - (modify-syntax-entry ?^ ")$") - => nil - - ;; Make `/' a punctuation character, - ;; the first character of a start-comment sequence, - ;; and the second character of an end-comment sequence. - ;; This is used in C mode. - (modify-syntax-entry ?/ ". 14") - => nil - - - Function: char-syntax character - This function returns the syntax class of CHARACTER, represented - by its mnemonic designator character. This _only_ returns the - class, not any matching parenthesis or flags. - - An error is signaled if 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 `/' 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, `)'. - - (char-to-string (char-syntax ?\ )) - => " " - - (char-to-string (char-syntax ?/)) - => "." - - (char-to-string (char-syntax ?\()) - => "(" - - - Function: set-syntax-table table &optional buffer - This function makes TABLE the syntax table for BUFFER, which - defaults to the current buffer if omitted. It returns TABLE. - - - Function: syntax-table &optional buffer - This function returns the syntax table for BUFFER, which defaults - to the current buffer if omitted. - - -File: lispref.info, Node: Motion and Syntax, Next: Parsing Expressions, Prev: Syntax Table Functions, Up: Syntax Tables - -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. - - - Function: skip-syntax-forward syntaxes &optional limit buffer - This function moves point forward across characters having syntax - classes mentioned in SYNTAXES. It stops when it encounters the - end of the buffer, or position LIMIT (if specified), or a - character it is not supposed to skip. Optional argument BUFFER - defaults to the current buffer if omitted. - - - Function: skip-syntax-backward syntaxes &optional limit buffer - This function moves point backward across characters whose syntax - classes are mentioned in SYNTAXES. It stops when it encounters - the beginning of the buffer, or position LIMIT (if specified), or a - character it is not supposed to skip. Optional argument BUFFER - defaults to the current buffer if omitted. - - - - Function: backward-prefix-chars &optional buffer - 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 `p' - flag. Optional argument BUFFER defaults to the current buffer if - omitted. - diff --git a/info/lispref.info-33 b/info/lispref.info-33 index 826fca3..0124e25 100644 --- a/info/lispref.info-33 +++ b/info/lispref.info-33 @@ -50,6 +50,719 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Replacing Match, Next: Entire Match Data, Prev: Simple Match Data, Up: Match Data + +Replacing the Text That Matched +------------------------------- + + This function replaces the text matched by the last search with +REPLACEMENT. + + - Function: replace-match replacement &optional fixedcase literal + string strbuffer + This function replaces the text in the buffer (or in STRING) that + was matched by the last search. It replaces that text with + REPLACEMENT. + + If you did the last search in a buffer, you should specify `nil' + for STRING. Then `replace-match' does the replacement by editing + the buffer; it leaves point at the end of the replacement text, + and returns `t'. + + If you did the search in a string, pass the same string as STRING. + Then `replace-match' does the replacement by constructing and + returning a new string. + + If the fourth argument STRING is a string, fifth argument + STRBUFFER specifies the buffer to be used for syntax-table and + case-table lookup and defaults to the current buffer. When STRING + is not a string, the buffer that the match occurred in has + automatically been remembered and you do not need to specify it. + + If FIXEDCASE is non-`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, `replace-match' + considers this a capitalized first word rather than all upper case. + + If `case-replace' is `nil', then case conversion is not done, + regardless of the value of FIXEDCASE. *Note Searching and Case::. + + If LITERAL is non-`nil', then REPLACEMENT is inserted exactly as + it is, the only alterations being case changes as needed. If it + is `nil' (the default), then the character `\' is treated + specially. If a `\' appears in REPLACEMENT, then it must be part + of one of the following sequences: + + `\&' + `\&' stands for the entire text being replaced. + + `\N' + `\N', where N is a digit, stands for the text that matched + the Nth subexpression in the original regexp. Subexpressions + are those expressions grouped inside `\(...\)'. + + `\\' + `\\' stands for a single `\' in the replacement text. + + +File: lispref.info, Node: Entire Match Data, Next: Saving Match Data, Prev: Replacing Match, Up: Match Data + +Accessing the Entire Match Data +------------------------------- + + The functions `match-data' and `set-match-data' read or write the +entire match data, all at once. + + - Function: match-data &optional integers reuse + 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 number 2N corresponds to + `(match-beginning N)'; and element number 2N + 1 corresponds to + `(match-end N)'. + + All the elements are markers or `nil' if matching was done on a + buffer, and all are integers or `nil' if matching was done on a + string with `string-match'. However, if the optional first + argument INTEGERS is non-`nil', always use integers (rather than + markers) to represent buffer positions. + + If the optional second argument REUSE is a list, reuse it as part + of the value. If REUSE is long enough to hold all the values, and + if INTEGERS is non-`nil', no new lisp objects are created. + + As always, there must be no possibility of intervening searches + between the call to a search function and the call to `match-data' + that is intended to access the match data for that search. + + (match-data) + => (# + # + # + #) + + - Function: set-match-data match-list + This function sets the match data from the elements of MATCH-LIST, + which should be a list that was the value of a previous call to + `match-data'. + + If 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. + + `store-match-data' is an alias for `set-match-data'. + + +File: lispref.info, Node: Saving Match Data, Prev: Entire Match Data, Up: Match Data + +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: + + (re-search-forward "The \\(cat \\)") + => 48 + (foo) ; Perhaps `foo' does + ; more searching. + (match-end 0) + => 61 ; Unexpected result--not 48! + + You can save and restore the match data with `save-match-data': + + - Special Form: save-match-data body... + This special form executes BODY, saving and restoring the match + data around it. + + You can use `set-match-data' together with `match-data' to imitate +the effect of the special form `save-match-data'. This is useful for +writing code that can run in Emacs 18. Here is how: + + (let ((data (match-data))) + (unwind-protect + ... ; May change the original match data. + (set-match-data data))) + + Emacs automatically saves and restores the match data when it runs +process filter functions (*note Filter Functions::) and process +sentinels (*note Sentinels::). + + +File: lispref.info, Node: Searching and Case, Next: Standard Regexps, Prev: Match Data, Up: Searching and Matching + +Searching and Case +================== + + By default, searches in Emacs ignore the case of the text they are +searching through; if you specify searching for `FOO', then `Foo' or +`foo' is also considered a match. Regexps, and in particular character +sets, are included: thus, `[aB]' would match `a' or `A' or `b' or `B'. + + If you do not want this feature, set the variable `case-fold-search' +to `nil'. Then all letters must match exactly, including case. This +is a buffer-local variable; altering the variable affects only the +current buffer. (*Note Intro to Buffer-Local::.) Alternatively, you +may change the value of `default-case-fold-search', which is the +default value of `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. + + - User Option: case-replace + This variable determines whether the replacement functions should + preserve case. If the variable is `nil', that means to use the + replacement text verbatim. A non-`nil' value means to convert the + case of the replacement text according to the text being replaced. + + The function `replace-match' is where this variable actually has + its effect. *Note Replacing Match::. + + - User Option: case-fold-search + This buffer-local variable determines whether searches should + ignore case. If the variable is `nil' they do not ignore case; + otherwise they do ignore case. + + - Variable: default-case-fold-search + The value of this variable is the default value for + `case-fold-search' in buffers that do not override it. This is the + same as `(default-value 'case-fold-search)'. + + +File: lispref.info, Node: Standard Regexps, Prev: Searching and Case, Up: Searching and Matching + +Standard Regular Expressions Used in Editing +============================================ + + This section describes some variables that hold regular expressions +used for certain purposes in editing: + + - Variable: page-delimiter + This is the regexp describing line-beginnings that separate pages. + The default value is `"^\014"' (i.e., `"^^L"' or `"^\C-l"'); this + matches a line that starts with a formfeed character. + + The following two regular expressions should _not_ assume the match +always starts at the beginning of a line; they should not use `^' to +anchor the match. Most often, the paragraph commands do check for a +match only at the beginning of a line, which means that `^' would be +superfluous. When there is a nonzero left margin, they accept matches +that start after the left margin. In that case, a `^' would be +incorrect. However, a `^' is harmless in modes where a left margin is +never used. + + - Variable: 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 `paragraph-start' also.) The default value is + `"[ \t\f]*$"', which matches a line that consists entirely of + spaces, tabs, and form feeds (after its left margin). + + - Variable: paragraph-start + This is the regular expression for recognizing the beginning of a + line that starts _or_ separates paragraphs. The default value is + `"[ \t\n\f]"', which matches a line starting with a space, tab, + newline, or form feed (after its left margin). + + - Variable: sentence-end + This is the regular expression describing the end of a sentence. + (All paragraph boundaries also end sentences, regardless.) The + default value is: + + "[.?!][]\"')}]*\\($\\| $\\|\t\\| \\)[ \t\n]*" + + 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 *Note + Regexp Example::. + + +File: lispref.info, Node: Syntax Tables, Next: Abbrevs, Prev: Searching and Matching, Up: Top + +Syntax Tables +************* + + A "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 (*note Word Motion::) +and the list motion functions (*note 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. + + +File: lispref.info, Node: Syntax Basics, Next: Syntax Descriptors, Up: Syntax Tables + +Syntax Table Concepts +===================== + + A "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 (*note Word Motion::) and the list motion functions +(*note List Motion::) as well as the functions in this chapter. + + Under XEmacs 20, a syntax table is a particular subtype of the +primitive char table type (*note Char Tables::), and each element of the +char table is an integer that encodes the syntax of the character in +question, or a cons of such an integer and a matching character (for +characters with parenthesis syntax). + + Under XEmacs 19, 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. (The matching character, if any, is embedded in +the bits of this integer.) + + Syntax tables are used only for moving across text, not for the Emacs +Lisp reader. XEmacs 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 `;' begins a comment, but in C mode, it terminates +a statement. To support these variations, XEmacs 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. *Note 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. + + - Function: syntax-table-p object + This function returns `t' if 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. + + +File: lispref.info, Node: Syntax Descriptors, Next: Syntax Table Functions, Prev: Syntax Basics, Up: Syntax Tables + +Syntax Descriptors +================== + + This section describes the syntax classes and flags that denote the +syntax of a character, and how they are represented as a "syntax +descriptor", which is a Lisp string that you pass to +`modify-syntax-entry' to specify the desired syntax. + + XEmacs defines a number of "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. + + 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 `*' in C mode is +`. 23' (i.e., punctuation, matching character slot unused, second +character of a comment-starter, first character of an comment-ender), +and the entry for `/' is `. 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. + + +File: lispref.info, Node: Syntax Class Table, Next: Syntax Flags, Up: Syntax Descriptors + +Table of Syntax Classes +----------------------- + + Here is a table of syntax classes, the characters that stand for +them, their meanings, and examples of their use. + + - Syntax class: whitespace character + "Whitespace characters" (designated with ` ' or `-') 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. + + - Syntax class: word constituent + "Word constituents" (designated with `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. + + - Syntax class: symbol constituent + "Symbol constituents" (designated with `_') 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 `$&*+-_<>'. In standard C, the only + non-word-constituent character that is valid in symbols is + underscore (`_'). + + - Syntax class: punctuation character + "Punctuation characters" (`.') 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. + + - Syntax class: open parenthesis character + - Syntax class: close parenthesis character + Open and close "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, XEmacs indicates momentarily the matching open + parenthesis when you insert a close parenthesis. *Note Blinking::. + + The class of open parentheses is designated with `(', and that of + close parentheses with `)'. + + In English text, and in C code, the parenthesis pairs are `()', + `[]', and `{}'. In XEmacs Lisp, the delimiters for lists and + vectors (`()' and `[]') are classified as parenthesis characters. + + - Syntax class: string quote + "String quote characters" (designated with `"') 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 XEmacs 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 (`"') + and vertical bar (`|'). `|' is not used in XEmacs Lisp, but it is + used in Common Lisp. C also has two string quote characters: + double-quote for strings, and single-quote (`'') 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. + + - Syntax class: escape + An "escape character" (designated with `\') starts an escape + sequence such as is used in C string and character constants. The + character `\' 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 + `words-include-escapes' is non-`nil'. *Note Word Motion::. + + - Syntax class: character quote + A "character quote character" (designated with `/') 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 + `words-include-escapes' is non-`nil'. *Note Word Motion::. + + This class is used for backslash in TeX mode. + + - Syntax class: paired delimiter + "Paired delimiter characters" (designated with `$') 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 `$' that both enters + and leaves math mode. + + - Syntax class: expression prefix + An "expression prefix operator" (designated with `'') is used for + syntactic operators that are part of an expression if they appear + next to one. These characters in Lisp include the apostrophe, `'' + (used for quoting), the comma, `,' (used in macros), and `#' (used + in the read syntax for certain data types). + + - Syntax class: comment starter + - Syntax class: comment ender + The "comment starter" and "comment ender" characters are used in + various languages to delimit comments. These classes are + designated with `<' and `>', respectively. + + English text has no comment characters. In Lisp, the semicolon + (`;') starts a comment and a newline or formfeed ends one. + + - Syntax class: 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 `@'. + + +File: lispref.info, Node: Syntax Flags, Prev: Syntax Class Table, Up: Syntax Descriptors + +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 `1', `2', `3', `4', `b' and `p'. + + All the flags except `p' are used to describe multi-character +comment delimiters. The digit flags indicate that a character can +_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 `*' in C mode, which is a punctuation character, _and_ the second +character of a start-of-comment sequence (`/*'), _and_ the first +character of an end-of-comment sequence (`*/'). + + The flags for a character C are: + + * `1' means C is the start of a two-character comment-start sequence. + + * `2' means C is the second character of such a sequence. + + * `3' means C is the start of a two-character comment-end sequence. + + * `4' means C is the second character of such a sequence. + + * `b' means that 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 `b' + flag. + + A comment-end sequence (one or two characters) applies to the "b" + style if its first character has the `b' flag set; otherwise, it + applies to the "a" style. + + The appropriate comment syntax settings for C++ are as follows: + + `/' + `124b' + + `*' + `23' + + newline + `>b' + + This defines four comment-delimiting sequences: + + `/*' + This is a comment-start sequence for "a" style because the + second character, `*', does not have the `b' flag. + + `//' + This is a comment-start sequence for "b" style because the + second character, `/', does have the `b' flag. + + `*/' + This is a comment-end sequence for "a" style because the first + character, `*', does not have the `b' flag + + newline + This is a comment-end sequence for "b" style, because the + newline character has the `b' flag. + + * `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 `backward-prefix-chars' moves back over these + characters, as well as over characters whose primary syntax class + is prefix (`''). *Note Motion and Syntax::. + + +File: lispref.info, Node: Syntax Table Functions, Next: Motion and Syntax, Prev: Syntax Descriptors, Up: Syntax Tables + +Syntax Table Functions +====================== + + In this section we describe functions for creating, accessing and +altering syntax tables. + + - Function: make-syntax-table &optional oldtable + 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. + + - Function: copy-syntax-table &optional syntax-table + This function constructs a copy of SYNTAX-TABLE and returns it. + If SYNTAX-TABLE is not supplied (or is `nil'), it returns a copy + of the current syntax table. Otherwise, an error is signaled if + SYNTAX-TABLE is not a syntax table. + + - Command: modify-syntax-entry char-range syntax-descriptor &optional + syntax-table + This function sets the syntax entry for CHAR-RANGE according to + SYNTAX-DESCRIPTOR. CHAR-RANGE is either a single character or a + range of characters, as used with `put-char-table'. The syntax is + changed only for SYNTAX-TABLE, which defaults to the current + buffer's syntax table, and not in any other syntax table. The + argument 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. *Note Syntax + Descriptors::. + + This function always returns `nil'. The old syntax information in + the table for CHAR-RANGE is discarded. + + An error is signaled if the first character of the syntax + descriptor is not one of the twelve syntax class designator + characters. + + Examples: + + ;; Put the space character in class whitespace. + (modify-syntax-entry ?\ " ") + => nil + + ;; Make `$' an open parenthesis character, + ;; with `^' as its matching close. + (modify-syntax-entry ?$ "(^") + => nil + + ;; Make `^' a close parenthesis character, + ;; with `$' as its matching open. + (modify-syntax-entry ?^ ")$") + => nil + + ;; Make `/' a punctuation character, + ;; the first character of a start-comment sequence, + ;; and the second character of an end-comment sequence. + ;; This is used in C mode. + (modify-syntax-entry ?/ ". 14") + => nil + + - Function: char-syntax character &optional syntax-table + This function returns the syntax class of CHARACTER, represented + by its mnemonic designator character. This _only_ returns the + class, not any matching parenthesis or flags. + + An error is signaled if CHARACTER is not a character. + + The characters that correspond to various syntax codes are listed + in the documentation of `modify-syntax-entry'. + + Optional second argument SYNTAX-TABLE is the syntax table to be + used, and defaults to the current buffer's syntax table. + + 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 `/' 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, `)'. + + (char-to-string (char-syntax ?\ )) + => " " + + (char-to-string (char-syntax ?/)) + => "." + + (char-to-string (char-syntax ?\()) + => "(" + + - Function: set-syntax-table syntax-table &optional buffer + This function makes SYNTAX-TABLE the syntax table for BUFFER, which + defaults to the current buffer if omitted. It returns + SYNTAX-TABLE. + + - Function: syntax-table &optional buffer + This function returns the syntax table for BUFFER, which defaults + to the current buffer if omitted. + + +File: lispref.info, Node: Motion and Syntax, Next: Parsing Expressions, Prev: Syntax Table Functions, Up: Syntax Tables + +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. + + - Function: skip-syntax-forward syntaxes &optional limit buffer + This function moves point forward across characters having syntax + classes mentioned in SYNTAXES. It stops when it encounters the + end of the buffer, or position LIMIT (if specified), or a + character it is not supposed to skip. Optional argument BUFFER + defaults to the current buffer if omitted. + + - Function: skip-syntax-backward syntaxes &optional limit buffer + This function moves point backward across characters whose syntax + classes are mentioned in SYNTAXES. It stops when it encounters + the beginning of the buffer, or position LIMIT (if specified), or a + character it is not supposed to skip. Optional argument BUFFER + defaults to the current buffer if omitted. + + + - Function: backward-prefix-chars &optional buffer + 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 `p' + flag. Optional argument BUFFER defaults to the current buffer if + omitted. + + File: lispref.info, Node: Parsing Expressions, Next: Standard Syntax Tables, Prev: Motion and Syntax, Up: Syntax Tables Parsing Balanced Expressions @@ -351,12 +1064,12 @@ Abbrev Tables This function undefines all the abbrevs in abbrev table TABLE, leaving it empty. The function returns `nil'. - - Function: define-abbrev-table tabname definitions - This function defines 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 DEFINITIONS, a list of elements - of the form `(ABBREVNAME EXPANSION HOOK USECOUNT)'. The value is - always `nil'. + - Function: define-abbrev-table table-name definitions + This function defines TABLE-NAME (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 DEFINITIONS, a list of + elements of the form `(ABBREVNAME EXPANSION HOOK USECOUNT)'. The + value is always `nil'. - Variable: abbrev-table-name-list This is a list of symbols whose values are abbrev tables. @@ -393,7 +1106,7 @@ used by commands that ask for information from the user. abbrev, or `nil' if the user declines to confirm redefining an existing abbrev. - - Function: define-abbrev table name expansion hook + - Function: define-abbrev table name &optional expansion hook count This function defines an abbrev in TABLE named NAME, to expand to EXPANSION, and call HOOK. The return value is an uninterned symbol that represents the abbrev inside XEmacs; its name is NAME. @@ -433,7 +1146,7 @@ in a file automatically, under the control of variables described here. - User Option: abbrev-file-name This is the default file name for reading and saving abbrevs. - - Function: quietly-read-abbrev-file filename + - Function: quietly-read-abbrev-file &optional filename This function reads abbrev definitions from a file named FILENAME, previously written with `write-abbrev-file'. If FILENAME is `nil', the file specified in `abbrev-file-name' is used. @@ -456,564 +1169,3 @@ in a file automatically, under the control of variables described here. FILENAME, in the form of a Lisp program that when loaded will define the same abbrevs. This function returns `nil'. - -File: lispref.info, Node: Abbrev Expansion, Next: Standard Abbrev Tables, Prev: Abbrev Files, Up: Abbrevs - -Looking Up and Expanding Abbreviations -====================================== - - Abbrevs are usually expanded by commands for interactive use, -including `self-insert-command'. This section describes the -subroutines used in writing such functions, as well as the variables -they use for communication. - - - Function: abbrev-symbol abbrev &optional table - This function returns the symbol representing the abbrev named - ABBREV. The value returned is `nil' if that abbrev is not - defined. The optional second argument TABLE is the abbrev table - to look it up in. If TABLE is `nil', this function tries first - the current buffer's local abbrev table, and second the global - abbrev table. - - - Function: abbrev-expansion abbrev &optional table - This function returns the string that ABBREV would expand into (as - defined by the abbrev tables used for the current buffer). The - optional argument TABLE specifies the abbrev table to use, as in - `abbrev-symbol'. - - - 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 `t' if it did expansion, `nil' otherwise. - - - Command: abbrev-prefix-mark &optional arg - Mark current point as the beginning of an abbrev. The next call to - `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. - - - User Option: abbrev-all-caps - When this is set non-`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. - - - Variable: abbrev-start-location - This is the buffer position for `expand-abbrev' to use as the start - of the next abbrev to be expanded. (`nil' means use the word - before point instead.) `abbrev-start-location' is set to `nil' - each time `expand-abbrev' is called. This variable is also set by - `abbrev-prefix-mark'. - - - Variable: abbrev-start-location-buffer - The value of this variable is the buffer for which - `abbrev-start-location' has been set. Trying to expand an abbrev - in any other buffer clears `abbrev-start-location'. This variable - is set by `abbrev-prefix-mark'. - - - Variable: last-abbrev - This is the `abbrev-symbol' of the last abbrev expanded. This - information is left by `expand-abbrev' for the sake of the - `unexpand-abbrev' command. - - - Variable: last-abbrev-location - This is the location of the last abbrev expanded. This contains - information left by `expand-abbrev' for the sake of the - `unexpand-abbrev' command. - - - Variable: last-abbrev-text - This is the exact expansion text of the last abbrev expanded, - after case conversion (if any). Its value is `nil' if the abbrev - has already been unexpanded. This contains information left by - `expand-abbrev' for the sake of the `unexpand-abbrev' command. - - - Variable: pre-abbrev-expand-hook - This is a normal hook whose functions are executed, in sequence, - just before any expansion of an abbrev. *Note 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. - - The following sample code shows a simple use of -`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. - - (add-hook 'pre-abbrev-expand-hook 'query-if-not-space) - - ;; This is the function invoked by `pre-abbrev-expand-hook'. - - ;; If the user terminated the abbrev with a space, the function does - ;; nothing (that is, it returns so that the abbrev can expand). If the - ;; user entered some other character, this function asks whether - ;; expansion should continue. - - ;; If the user answers the prompt with `y', the function returns - ;; `nil' (because of the `not' function), but that is - ;; 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")))) - - -File: lispref.info, Node: Standard Abbrev Tables, Prev: Abbrev Expansion, Up: Abbrevs - -Standard Abbrev Tables -====================== - - Here we list the variables that hold the abbrev tables for the -preloaded major modes of XEmacs. - - - Variable: 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. - - - Variable: local-abbrev-table - The value of this buffer-local variable is the (mode-specific) - abbreviation table of the current buffer. - - - Variable: 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. - - - Variable: text-mode-abbrev-table - This is the local abbrev table used in Text mode. - - - Variable: c-mode-abbrev-table - This is the local abbrev table used in C mode. - - - Variable: lisp-mode-abbrev-table - This is the local abbrev table used in Lisp mode and Emacs Lisp - mode. - - -File: lispref.info, Node: Extents, Next: Specifiers, Prev: Abbrevs, Up: Top - -Extents -******* - - An "extent" is a region of text (a start position and an end -position) that is displayed in a particular face and can have certain -other properties such as being read-only. Extents can overlap each -other. XEmacs efficiently handles buffers with large numbers of -extents in them. - - - Function: extentp object - This returns `t' if OBJECT is an extent. - -* Menu: - -* Intro to Extents:: Extents are regions over a buffer or string. -* Creating and Modifying Extents:: - Basic extent functions. -* Extent Endpoints:: Accessing and setting the bounds of an extent. -* Finding Extents:: Determining which extents are in an object. -* Mapping Over Extents:: More sophisticated functions for extent scanning. -* Extent Properties:: Extents have built-in and user-definable properties. -* Detached Extents:: Extents that are not in a buffer. -* Extent Parents:: Inheriting properties from another extent. -* Duplicable Extents:: Extents can be marked to be copied into strings. -* Extents and Events:: Extents can interact with the keyboard and mouse. -* Atomic Extents:: Treating a block of text as a single entity. - - -File: lispref.info, Node: Intro to Extents, Next: Creating and Modifying Extents, Up: Extents - -Introduction to Extents -======================= - - An extent is a region of text within a buffer or string that has -certain properties associated with it. The properties of an extent -primarily affect the way the text contained in the extent is displayed. -Extents can freely overlap each other in a buffer or string. Extents -are invisible to functions that merely examine the text of a buffer or -string. - - _Please note:_ An alternative way to add properties to a buffer or -string is to use text properties. *Note Text Properties::. - - An extent is logically a Lisp object consisting of a start position, -an end position, a buffer or string to which these positions refer, and -a property list. As text is inserted into a buffer, the start and end -positions of the extent are automatically adjusted as necessary to keep -the extent referring to the same text in the buffer. If text is -inserted at the boundary of an extent, the extent's `start-open' and -`end-open' properties control whether the text is included as part of -the extent. If the text bounded by an extent is deleted, the extent -becomes "detached"; its start and end positions are no longer -meaningful, but it maintains all its other properties and can later be -reinserted into a buffer. (None of these considerations apply to -strings, because text cannot be inserted into or deleted from a string.) - - Each extent has a face or list of faces associated with it, which -controls the way in which the text bounded by the extent is displayed. -If an extent's face is `nil' or its properties are partially undefined, -the corresponding properties from the default face for the frame is -used. If two or more extents overlap, or if a list of more than one -face is specified for a particular extent, the corresponding faces are -merged to determine the text's displayed properties. Every extent has -a "priority" that determines which face takes precedence if the faces -conflict. (If two extents have the same priority, the one that comes -later in the display order takes precedence. *Note display order: -Extent Endpoints.) Higher-numbered priority values correspond to a -higher priority, and priority values can be negative. Every extent is -created with a priority of 0, but this can be changed with -`set-extent-priority'. Within a single extent with a list of faces, -faces earlier in the list have a higher priority than faces later in -the list. - - Extents can be set to respond specially to key and mouse events -within the extent. An extent's `keymap' property controls the effect of -key and mouse strokes within the extent's text, and the `mouse-face' -property controls whether the extent is highlighted when the mouse moves -over it. *Note Extents and Events::. - - An extent can optionally have a "begin-glyph" or "end-glyph" -associated with it. A begin-glyph or end-glyph is a pixmap or string -that will be displayed either at the start or end of an extent or in the -margin of the line that the start or end of the extent lies in, -depending on the extent's layout policy. Begin-glyphs and end-glyphs -are used to implement annotations, and you should use the annotation API -functions in preference to the lower-level extent functions. For more -information, *Note Annotations::. - - If an extent has its `detachable' property set, it will become -"detached" (i.e. no longer in the buffer) when all its text is deleted. -Otherwise, it will simply shrink down to zero-length and sit in the -same place in the buffer. By default, the `detachable' property is set -on newly-created extents. *Note Detached Extents::. - - If an extent has its `duplicable' property set, it will be -remembered when a string is created from text bounded by the extent. -When the string is re-inserted into a buffer, the extent will also be -re-inserted. This mechanism is used in the kill, yank, and undo -commands. *Note Duplicable Extents::. - - -File: lispref.info, Node: Creating and Modifying Extents, Next: Extent Endpoints, Prev: Intro to Extents, Up: Extents - -Creating and Modifying Extents -============================== - - - Function: make-extent from to &optional object - This function makes an extent for the range [FROM, TO) in OBJECT - (a buffer or string). OBJECT defaults to the current buffer. - Insertions at point TO will be outside of the extent; insertions - at FROM will be inside the extent, causing the extent to grow - (*note Extent Endpoints::). This is the same way that markers - behave. The extent is initially detached if both FROM and TO are - `nil', and in this case OBJECT defaults to `nil', meaning the - extent is in no buffer or string (*note Detached Extents::). - - - Function: delete-extent extent - This function removes EXTENT from its buffer and destroys it. - This does not modify the buffer's text, only its display - properties. The extent cannot be used thereafter. To remove an - extent in such a way that it can be re-inserted later, use - `detach-extent'. *Note Detached Extents::. - - - Function: extent-object extent - This function returns the buffer or string that EXTENT is in. If - the return value is `nil', this means that the extent is detached; - however, a detached extent will not necessarily return a value of - `nil'. - - - Function: extent-live-p extent - This function returns `nil' if EXTENT is deleted, and `t' - otherwise. - - -File: lispref.info, Node: Extent Endpoints, Next: Finding Extents, Prev: Creating and Modifying Extents, Up: Extents - -Extent Endpoints -================ - - Every extent has a start position and an end position, and logically -affects the characters between those positions. Normally the start and -end positions must both be valid positions in the extent's buffer or -string. However, both endpoints can be `nil', meaning the extent is -detached. *Note Detached Extents::. - - Whether the extent overlaps its endpoints is governed by its -`start-open' and `end-open' properties. Insertion of a character at a -closed endpoint will expand the extent to include that character; -insertion at an open endpoint will not. Similarly, functions such as -`extent-at' that scan over all extents overlapping a particular -position will include extents with a closed endpoint at that position, -but not extents with an open endpoint. - - Note that the `start-closed' and `end-closed' properties are -equivalent to `start-open' and `end-open' with the opposite sense. - - Both endpoints can be equal, in which case the extent includes no -characters but still exists in the buffer or string. Zero-length -extents are used to represent annotations (*note Annotations::) and can -be used as a more powerful form of a marker. Deletion of all the -characters in an extent may or may not result in a zero-length extent; -this depends on the `detachable' property (*note Detached Extents::). -Insertion at the position of a zero-length extent expands the extent if -both endpoints are closed; goes before the extent if it has the -`start-open' property; and goes after the extent if it has the -`end-open' property. Zero-length extents with both the `start-open' -and `end-open' properties are treated as if their starting point were -closed. Deletion of a character on a side of a zero-length extent -whose corresponding endpoint is closed causes the extent to be detached -if its `detachable' property is set; if the corresponding endpoint is -open, the extent remains in the buffer, moving as necessary. - - Extents are ordered within a buffer or string by increasing start -position, and then by decreasing end position (this is called the -"display order"). - - - Function: extent-start-position extent - This function returns the start position of EXTENT. - - - Function: extent-end-position extent - This function returns the end position of EXTENT. - - - Function: extent-length extent - This function returns the length of EXTENT in characters. If the - extent is detached, this returns `0'. If the extent is not - detached, this is equivalent to - (- (extent-end-position EXTENT) (extent-start-position EXTENT)) - - - Function: set-extent-endpoints extent start end &optional - buffer-or-string - This function sets the start and end position of EXTENT to START - and END. If both are `nil', this is equivalent to `detach-extent'. - - BUFFER-OR-STRING specifies the new buffer or string that the - extent should be in, and defaults to EXTENT's buffer or string. - (If `nil', and EXTENT is in no buffer and no string, it defaults - to the current buffer.) - - See documentation on `detach-extent' for a discussion of undo - recording. - - -File: lispref.info, Node: Finding Extents, Next: Mapping Over Extents, Prev: Extent Endpoints, Up: Extents - -Finding Extents -=============== - - The following functions provide a simple way of determining the -extents in a buffer or string. A number of more sophisticated -primitives for mapping over the extents in a range of a buffer or string -are also provided (*note Mapping Over Extents::). When reading through -this section, keep in mind the way that extents are ordered (*note -Extent Endpoints::). - - - Function: extent-list &optional buffer-or-string from to flags - This function returns a list of the extents in BUFFER-OR-STRING. - BUFFER-OR-STRING defaults to the current buffer if omitted. FROM - and TO can be used to limit the range over which extents are - returned; if omitted, all extents in the buffer or string are - returned. - - More specifically, if a range is specified using FROM and TO, only - extents that overlap the range (i.e. begin or end inside of the - range) are included in the list. FROM and TO default to the - beginning and end of BUFFER-OR-STRING, respectively. - - FLAGS controls how end cases are treated. For a discussion of - this, and exactly what "overlap" means, see `map-extents'. - - Functions that create extents must be prepared for the possibility -that there are other extents in the same area, created by other -functions. To deal with this, functions typically mark their own -extents by setting a particular property on them. The following -function makes it easier to locate those extents. - - - Function: extent-at pos &optional object property before at-flag - This function finds the "smallest" extent (i.e., the last one in - the display order) at (i.e., overlapping) POS in OBJECT (a buffer - or string) having PROPERTY set. OBJECT defaults to the current - buffer. PROPERTY defaults to `nil', meaning that any extent will - do. Returns `nil' if there is no matching extent at POS. If the - fourth argument BEFORE is not `nil', it must be an extent; any - returned extent will precede that extent. This feature allows - `extent-at' to be used by a loop over extents. - - AT-FLAG controls how end cases are handled (i.e. what "at" really - means), and should be one of: - - `nil' - - `after' - An extent is at POS if it covers the character after POS. - This is consistent with the way that text properties work. - - `before' - An extent is at POS if it covers the character before POS. - - `at' - An extent is at POS if it overlaps or abuts POS. This - includes all zero-length extents at POS. - - Note that in all cases, the start-openness and end-openness of the - extents considered is ignored. If you want to pay attention to - those properties, you should use `map-extents', which gives you - more control. - - The following low-level functions are provided for explicitly -traversing the extents in a buffer according to the display order. -These functions are mostly intended for debugging--in normal operation, -you should probably use `mapcar-extents' or `map-extents', or loop -using the BEFORE argument to `extent-at', rather than creating a loop -using `next-extent'. - - - Function: next-extent extent - Given an extent EXTENT, this function returns the next extent in - the buffer or string's display order. If EXTENT is a buffer or - string, this returns the first extent in the buffer or string. - - - Function: previous-extent extent - Given an extent EXTENT, this function returns the previous extent - in the buffer or string's display order. If EXTENT is a buffer or - string, this returns the last extent in the buffer or string. - - -File: lispref.info, Node: Mapping Over Extents, Next: Extent Properties, Prev: Finding Extents, Up: Extents - -Mapping Over Extents -==================== - - The most basic and general function for mapping over extents is -called `map-extents'. You should read through the definition of this -function to familiarize yourself with the concepts and optional -arguments involved. However, in practice you may find it more -convenient to use the function `mapcar-extents' or to create a loop -using the `before' argument to `extent-at' (*note Finding Extents::). - - - Function: map-extents function &optional object from to maparg flags - property value - This function maps FUNCTION over the extents which overlap a - region in OBJECT. OBJECT is normally a buffer or string but could - be an extent (see below). The region is normally bounded by - [FROM, TO) (i.e. the beginning of the region is closed and the end - of the region is open), but this can be changed with the FLAGS - argument (see below for a complete discussion). - - FUNCTION is called with the arguments (extent, MAPARG). The - arguments OBJECT, FROM, TO, MAPARG, and FLAGS are all optional and - default to the current buffer, the beginning of OBJECT, the end of - OBJECT, NIL, and NIL, respectively. `map-extents' returns the - first non-`nil' result produced by FUNCTION, and no more calls to - FUNCTION are made after it returns non-`nil'. - - If OBJECT is an extent, FROM and TO default to the extent's - endpoints, and the mapping omits that extent and its predecessors. - This feature supports restarting a loop based on `map-extents'. - Note: OBJECT must be attached to a buffer or string, and the - mapping is done over that buffer or string. - - An extent overlaps the region if there is any point in the extent - that is also in the region. (For the purpose of overlap, - zero-length extents and regions are treated as closed on both ends - regardless of their endpoints' specified open/closedness.) Note - that the endpoints of an extent or region are considered to be in - that extent or region if and only if the corresponding end is - closed. For example, the extent [5,7] overlaps the region [2,5] - because 5 is in both the extent and the region. However, (5,7] - does not overlap [2,5] because 5 is not in the extent, and neither - [5,7] nor (5,7] overlaps the region [2,5) because 5 is not in the - region. - - The optional FLAGS can be a symbol or a list of one or more - symbols, modifying the behavior of `map-extents'. Allowed symbols - are: - - `end-closed' - The region's end is closed. - - `start-open' - The region's start is open. - - `all-extents-closed' - Treat all extents as closed on both ends for the purpose of - determining whether they overlap the region, irrespective of - their actual open- or closedness. - - `all-extents-open' - Treat all extents as open on both ends. - - `all-extents-closed-open' - Treat all extents as start-closed, end-open. - - `all-extents-open-closed' - Treat all extents as start-open, end-closed. - - `start-in-region' - In addition to the above conditions for extent overlap, the - extent's start position must lie within the specified region. - Note that, for this condition, open start positions are - treated as if 0.5 was added to the endpoint's value, and open - end positions are treated as if 0.5 was subtracted from the - endpoint's value. - - `end-in-region' - The extent's end position must lie within the region. - - `start-and-end-in-region' - Both the extent's start and end positions must lie within the - region. - - `start-or-end-in-region' - Either the extent's start or end position must lie within the - region. - - `negate-in-region' - The condition specified by a `*-in-region' flag must _not_ - hold for the extent to be considered. - - At most one of `all-extents-closed', `all-extents-open', - `all-extents-closed-open', and `all-extents-open-closed' may be - specified. - - At most one of `start-in-region', `end-in-region', - `start-and-end-in-region', and `start-or-end-in-region' may be - specified. - - If optional arg PROPERTY is non-`nil', only extents with that - property set on them will be visited. If optional arg VALUE is - non-`nil', only extents whose value for that property is `eq' to - VALUE will be visited. - - If you want to map over extents and accumulate a list of results, -the following function may be more convenient than `map-extents'. - - - Function: mapcar-extents function &optional predicate - buffer-or-string from to flags property value - This function applies FUNCTION to all extents which overlap a - region in BUFFER-OR-STRING. The region is delimited by FROM and - TO. FUNCTION is called with one argument, the extent. A list of - the values returned by FUNCTION is returned. An optional - PREDICATE may be used to further limit the extents over which - FUNCTION is mapped. The optional arguments FLAGS, PROPERTY, and - VALUE may also be used to control the extents passed to PREDICATE - or FUNCTION, and have the same meaning as in `map-extents'. - - - Function: map-extent-children function &optional object from to - maparg flags property value - This function is similar to `map-extents', but differs in that: - - * It only visits extents which start in the given region. - - * After visiting an extent E, it skips all other extents which - start inside E but end before E's end. - - Thus, this function may be used to walk a tree of extents in a - buffer: - (defun walk-extents (buffer &optional ignore) - (map-extent-children 'walk-extents buffer)) - - - Function: extent-in-region-p extent &optional from to flags - This function returns T if `map-extents' would visit EXTENT if - called with the given arguments. - diff --git a/info/lispref.info-34 b/info/lispref.info-34 index fb64927..aec041b 100644 --- a/info/lispref.info-34 +++ b/info/lispref.info-34 @@ -50,6 +50,578 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Abbrev Expansion, Next: Standard Abbrev Tables, Prev: Abbrev Files, Up: Abbrevs + +Looking Up and Expanding Abbreviations +====================================== + + Abbrevs are usually expanded by commands for interactive use, +including `self-insert-command'. This section describes the +subroutines used in writing such functions, as well as the variables +they use for communication. + + - Function: abbrev-symbol abbrev &optional table + This function returns the symbol representing the abbrev named + ABBREV. The value returned is `nil' if that abbrev is not + defined. The optional second argument TABLE is the abbrev table + to look it up in. If TABLE is `nil', this function tries first + the current buffer's local abbrev table, and second the global + abbrev table. + + - Function: abbrev-expansion abbrev &optional table + This function returns the string that ABBREV would expand into (as + defined by the abbrev tables used for the current buffer). The + optional argument TABLE specifies the abbrev table to use, as in + `abbrev-symbol'. + + - 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 `t' if it did expansion, `nil' otherwise. + + - Command: abbrev-prefix-mark &optional arg + Mark current point as the beginning of an abbrev. The next call to + `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. + + - User Option: abbrev-all-caps + When this is set non-`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. + + - Variable: abbrev-start-location + This is the buffer position for `expand-abbrev' to use as the start + of the next abbrev to be expanded. (`nil' means use the word + before point instead.) `abbrev-start-location' is set to `nil' + each time `expand-abbrev' is called. This variable is also set by + `abbrev-prefix-mark'. + + - Variable: abbrev-start-location-buffer + The value of this variable is the buffer for which + `abbrev-start-location' has been set. Trying to expand an abbrev + in any other buffer clears `abbrev-start-location'. This variable + is set by `abbrev-prefix-mark'. + + - Variable: last-abbrev + This is the `abbrev-symbol' of the last abbrev expanded. This + information is left by `expand-abbrev' for the sake of the + `unexpand-abbrev' command. + + - Variable: last-abbrev-location + This is the location of the last abbrev expanded. This contains + information left by `expand-abbrev' for the sake of the + `unexpand-abbrev' command. + + - Variable: last-abbrev-text + This is the exact expansion text of the last abbrev expanded, + after case conversion (if any). Its value is `nil' if the abbrev + has already been unexpanded. This contains information left by + `expand-abbrev' for the sake of the `unexpand-abbrev' command. + + - Variable: pre-abbrev-expand-hook + This is a normal hook whose functions are executed, in sequence, + just before any expansion of an abbrev. *Note 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. + + The following sample code shows a simple use of +`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. + + (add-hook 'pre-abbrev-expand-hook 'query-if-not-space) + + ;; This is the function invoked by `pre-abbrev-expand-hook'. + + ;; If the user terminated the abbrev with a space, the function does + ;; nothing (that is, it returns so that the abbrev can expand). If the + ;; user entered some other character, this function asks whether + ;; expansion should continue. + + ;; If the user answers the prompt with `y', the function returns + ;; `nil' (because of the `not' function), but that is + ;; 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")))) + + +File: lispref.info, Node: Standard Abbrev Tables, Prev: Abbrev Expansion, Up: Abbrevs + +Standard Abbrev Tables +====================== + + Here we list the variables that hold the abbrev tables for the +preloaded major modes of XEmacs. + + - Variable: 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. + + - Variable: local-abbrev-table + The value of this buffer-local variable is the (mode-specific) + abbreviation table of the current buffer. + + - Variable: 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. + + - Variable: text-mode-abbrev-table + This is the local abbrev table used in Text mode. + + - Variable: c-mode-abbrev-table + This is the local abbrev table used in C mode. + + - Variable: lisp-mode-abbrev-table + This is the local abbrev table used in Lisp mode and Emacs Lisp + mode. + + +File: lispref.info, Node: Extents, Next: Specifiers, Prev: Abbrevs, Up: Top + +Extents +******* + + An "extent" is a region of text (a start position and an end +position) that is displayed in a particular face and can have certain +other properties such as being read-only. Extents can overlap each +other. XEmacs efficiently handles buffers with large numbers of +extents in them. + + - Function: extentp object + This returns `t' if OBJECT is an extent. + +* Menu: + +* Intro to Extents:: Extents are regions over a buffer or string. +* Creating and Modifying Extents:: + Basic extent functions. +* Extent Endpoints:: Accessing and setting the bounds of an extent. +* Finding Extents:: Determining which extents are in an object. +* Mapping Over Extents:: More sophisticated functions for extent scanning. +* Extent Properties:: Extents have built-in and user-definable properties. +* Detached Extents:: Extents that are not in a buffer. +* Extent Parents:: Inheriting properties from another extent. +* Duplicable Extents:: Extents can be marked to be copied into strings. +* Extents and Events:: Extents can interact with the keyboard and mouse. +* Atomic Extents:: Treating a block of text as a single entity. + + +File: lispref.info, Node: Intro to Extents, Next: Creating and Modifying Extents, Up: Extents + +Introduction to Extents +======================= + + An extent is a region of text within a buffer or string that has +certain properties associated with it. The properties of an extent +primarily affect the way the text contained in the extent is displayed. +Extents can freely overlap each other in a buffer or string. Extents +are invisible to functions that merely examine the text of a buffer or +string. + + _Please note:_ An alternative way to add properties to a buffer or +string is to use text properties. *Note Text Properties::. + + An extent is logically a Lisp object consisting of a start position, +an end position, a buffer or string to which these positions refer, and +a property list. As text is inserted into a buffer, the start and end +positions of the extent are automatically adjusted as necessary to keep +the extent referring to the same text in the buffer. If text is +inserted at the boundary of an extent, the extent's `start-open' and +`end-open' properties control whether the text is included as part of +the extent. If the text bounded by an extent is deleted, the extent +becomes "detached"; its start and end positions are no longer +meaningful, but it maintains all its other properties and can later be +reinserted into a buffer. (None of these considerations apply to +strings, because text cannot be inserted into or deleted from a string.) + + Each extent has a face or list of faces associated with it, which +controls the way in which the text bounded by the extent is displayed. +If an extent's face is `nil' or its properties are partially undefined, +the corresponding properties from the default face for the frame is +used. If two or more extents overlap, or if a list of more than one +face is specified for a particular extent, the corresponding faces are +merged to determine the text's displayed properties. Every extent has +a "priority" that determines which face takes precedence if the faces +conflict. (If two extents have the same priority, the one that comes +later in the display order takes precedence. *Note display order: +Extent Endpoints.) Higher-numbered priority values correspond to a +higher priority, and priority values can be negative. Every extent is +created with a priority of 0, but this can be changed with +`set-extent-priority'. Within a single extent with a list of faces, +faces earlier in the list have a higher priority than faces later in +the list. + + Extents can be set to respond specially to key and mouse events +within the extent. An extent's `keymap' property controls the effect of +key and mouse strokes within the extent's text, and the `mouse-face' +property controls whether the extent is highlighted when the mouse moves +over it. *Note Extents and Events::. + + An extent can optionally have a "begin-glyph" or "end-glyph" +associated with it. A begin-glyph or end-glyph is a pixmap or string +that will be displayed either at the start or end of an extent or in the +margin of the line that the start or end of the extent lies in, +depending on the extent's layout policy. Begin-glyphs and end-glyphs +are used to implement annotations, and you should use the annotation API +functions in preference to the lower-level extent functions. For more +information, *Note Annotations::. + + If an extent has its `detachable' property set, it will become +"detached" (i.e. no longer in the buffer) when all its text is deleted. +Otherwise, it will simply shrink down to zero-length and sit in the +same place in the buffer. By default, the `detachable' property is set +on newly-created extents. *Note Detached Extents::. + + If an extent has its `duplicable' property set, it will be +remembered when a string is created from text bounded by the extent. +When the string is re-inserted into a buffer, the extent will also be +re-inserted. This mechanism is used in the kill, yank, and undo +commands. *Note Duplicable Extents::. + + +File: lispref.info, Node: Creating and Modifying Extents, Next: Extent Endpoints, Prev: Intro to Extents, Up: Extents + +Creating and Modifying Extents +============================== + + - Function: make-extent from to &optional buffer-or-string + This function makes an extent for the range [FROM, TO) in + BUFFER-OR-STRING (a buffer or string). BUFFER-OR-STRING defaults + to the current buffer. Insertions at point TO will be outside of + the extent; insertions at FROM will be inside the extent, causing + the extent to grow (*note Extent Endpoints::). This is the same + way that markers behave. The extent is initially detached if both + FROM and TO are `nil', and in this case BUFFER-OR-STRING defaults + to `nil', meaning the extent is in no buffer or string (*note + Detached Extents::). + + - Function: delete-extent extent + This function removes EXTENT from its buffer and destroys it. + This does not modify the buffer's text, only its display + properties. The extent cannot be used thereafter. To remove an + extent in such a way that it can be re-inserted later, use + `detach-extent'. *Note Detached Extents::. + + - Function: extent-object extent + This function returns the buffer or string that EXTENT is in. If + the return value is `nil', this means that the extent is detached; + however, a detached extent will not necessarily return a value of + `nil'. + + - Function: extent-live-p object + This function returns `t' if OBJECT is an extent that has not been + deleted, and `nil' otherwise. + + +File: lispref.info, Node: Extent Endpoints, Next: Finding Extents, Prev: Creating and Modifying Extents, Up: Extents + +Extent Endpoints +================ + + Every extent has a start position and an end position, and logically +affects the characters between those positions. Normally the start and +end positions must both be valid positions in the extent's buffer or +string. However, both endpoints can be `nil', meaning the extent is +detached. *Note Detached Extents::. + + Whether the extent overlaps its endpoints is governed by its +`start-open' and `end-open' properties. Insertion of a character at a +closed endpoint will expand the extent to include that character; +insertion at an open endpoint will not. Similarly, functions such as +`extent-at' that scan over all extents overlapping a particular +position will include extents with a closed endpoint at that position, +but not extents with an open endpoint. + + Note that the `start-closed' and `end-closed' properties are +equivalent to `start-open' and `end-open' with the opposite sense. + + Both endpoints can be equal, in which case the extent includes no +characters but still exists in the buffer or string. Zero-length +extents are used to represent annotations (*note Annotations::) and can +be used as a more powerful form of a marker. Deletion of all the +characters in an extent may or may not result in a zero-length extent; +this depends on the `detachable' property (*note Detached Extents::). +Insertion at the position of a zero-length extent expands the extent if +both endpoints are closed; goes before the extent if it has the +`start-open' property; and goes after the extent if it has the +`end-open' property. Zero-length extents with both the `start-open' +and `end-open' properties are treated as if their starting point were +closed. Deletion of a character on a side of a zero-length extent +whose corresponding endpoint is closed causes the extent to be detached +if its `detachable' property is set; if the corresponding endpoint is +open, the extent remains in the buffer, moving as necessary. + + Extents are ordered within a buffer or string by increasing start +position, and then by decreasing end position (this is called the +"display order"). + + - Function: extent-start-position extent + This function returns the start position of EXTENT. + + - Function: extent-end-position extent + This function returns the end position of EXTENT. + + - Function: extent-length extent + This function returns the length of EXTENT in characters. If the + extent is detached, this returns `0'. If the extent is not + detached, this is equivalent to + (- (extent-end-position EXTENT) (extent-start-position EXTENT)) + + - Function: set-extent-endpoints extent start end &optional + buffer-or-string + This function sets the start and end position of EXTENT to START + and END. If both are `nil', this is equivalent to `detach-extent'. + + BUFFER-OR-STRING specifies the new buffer or string that the + extent should be in, and defaults to EXTENT's buffer or string. + (If `nil', and EXTENT is in no buffer and no string, it defaults + to the current buffer.) + + See documentation on `detach-extent' for a discussion of undo + recording. + + +File: lispref.info, Node: Finding Extents, Next: Mapping Over Extents, Prev: Extent Endpoints, Up: Extents + +Finding Extents +=============== + + The following functions provide a simple way of determining the +extents in a buffer or string. A number of more sophisticated +primitives for mapping over the extents in a range of a buffer or string +are also provided (*note Mapping Over Extents::). When reading through +this section, keep in mind the way that extents are ordered (*note +Extent Endpoints::). + + - Function: extent-list &optional buffer-or-string from to flags + property value + This function returns a list of the extents in BUFFER-OR-STRING. + BUFFER-OR-STRING defaults to the current buffer if omitted. FROM + and TO can be used to limit the range over which extents are + returned; if omitted, all extents in the buffer or string are + returned. + + More specifically, if a range is specified using FROM and TO, only + extents that overlap the range (i.e. begin or end inside of the + range) are included in the list. FROM and TO default to the + beginning and end of BUFFER-OR-STRING, respectively. + + FLAGS controls how end cases are treated. For a discussion of + this, and exactly what "overlap" means, see `map-extents'. + + The optional arguments PROPERTY and VALUE can be used to further + restrict which extents are returned. They have the same meaning + as for `map-extents'. + + If you want to map a function over the extents in a buffer or + string, consider using `map-extents' or `mapcar-extents' instead. + + See also the function `extents-at'. + + Functions that create extents must be prepared for the possibility +that there are other extents in the same area, created by other +functions. To deal with this, functions typically mark their own +extents by setting a particular property on them. The following +function makes it easier to locate those extents. + + - Function: extent-at pos &optional object property before at-flag + This function finds the "smallest" extent (i.e., the last one in + the display order) at (i.e., overlapping) POS in OBJECT (a buffer + or string) having PROPERTY set. OBJECT defaults to the current + buffer. PROPERTY defaults to `nil', meaning that any extent will + do. Returns `nil' if there is no matching extent at POS. If the + fourth argument BEFORE is not `nil', it must be an extent; any + returned extent will precede that extent. This feature allows + `extent-at' to be used by a loop over extents. + + AT-FLAG controls how end cases are handled (i.e. what "at" really + means), and should be one of: + + `nil' + + `after' + An extent is at POS if it covers the character after POS. + This is consistent with the way that text properties work. + + `before' + An extent is at POS if it covers the character before POS. + + `at' + An extent is at POS if it overlaps or abuts POS. This + includes all zero-length extents at POS. + + Note that in all cases, the start-openness and end-openness of the + extents considered is ignored. If you want to pay attention to + those properties, you should use `map-extents', which gives you + more control. + + The following low-level functions are provided for explicitly +traversing the extents in a buffer according to the display order. +These functions are mostly intended for debugging--in normal operation, +you should probably use `mapcar-extents' or `map-extents', or loop +using the BEFORE argument to `extent-at', rather than creating a loop +using `next-extent'. + + - Function: next-extent extent + Given an extent EXTENT, this function returns the next extent in + the buffer or string's display order. If EXTENT is a buffer or + string, this returns the first extent in the buffer or string. + + - Function: previous-extent extent + Given an extent EXTENT, this function returns the previous extent + in the buffer or string's display order. If EXTENT is a buffer or + string, this returns the last extent in the buffer or string. + + +File: lispref.info, Node: Mapping Over Extents, Next: Extent Properties, Prev: Finding Extents, Up: Extents + +Mapping Over Extents +==================== + + The most basic and general function for mapping over extents is +called `map-extents'. You should read through the definition of this +function to familiarize yourself with the concepts and optional +arguments involved. However, in practice you may find it more +convenient to use the function `mapcar-extents' or to create a loop +using the `before' argument to `extent-at' (*note Finding Extents::). + + - Function: map-extents function &optional object from to maparg flags + property value + This function maps FUNCTION over the extents which overlap a + region in OBJECT. OBJECT is normally a buffer or string but could + be an extent (see below). The region is normally bounded by + [FROM, TO) (i.e. the beginning of the region is closed and the end + of the region is open), but this can be changed with the FLAGS + argument (see below for a complete discussion). + + FUNCTION is called with the arguments (extent, MAPARG). The + arguments OBJECT, FROM, TO, MAPARG, and FLAGS are all optional and + default to the current buffer, the beginning of OBJECT, the end of + OBJECT, `nil', and `nil', respectively. `map-extents' returns the + first non-`nil' result produced by FUNCTION, and no more calls to + FUNCTION are made after it returns non-`nil'. + + If OBJECT is an extent, FROM and TO default to the extent's + endpoints, and the mapping omits that extent and its predecessors. + This feature supports restarting a loop based on `map-extents'. + Note: OBJECT must be attached to a buffer or string, and the + mapping is done over that buffer or string. + + An extent overlaps the region if there is any point in the extent + that is also in the region. (For the purpose of overlap, + zero-length extents and regions are treated as closed on both ends + regardless of their endpoints' specified open/closedness.) Note + that the endpoints of an extent or region are considered to be in + that extent or region if and only if the corresponding end is + closed. For example, the extent [5,7] overlaps the region [2,5] + because 5 is in both the extent and the region. However, (5,7] + does not overlap [2,5] because 5 is not in the extent, and neither + [5,7] nor (5,7] overlaps the region [2,5) because 5 is not in the + region. + + The optional FLAGS can be a symbol or a list of one or more + symbols, modifying the behavior of `map-extents'. Allowed symbols + are: + + `end-closed' + The region's end is closed. + + `start-open' + The region's start is open. + + `all-extents-closed' + Treat all extents as closed on both ends for the purpose of + determining whether they overlap the region, irrespective of + their actual open- or closedness. + + `all-extents-open' + Treat all extents as open on both ends. + + `all-extents-closed-open' + Treat all extents as start-closed, end-open. + + `all-extents-open-closed' + Treat all extents as start-open, end-closed. + + `start-in-region' + In addition to the above conditions for extent overlap, the + extent's start position must lie within the specified region. + Note that, for this condition, open start positions are + treated as if 0.5 was added to the endpoint's value, and open + end positions are treated as if 0.5 was subtracted from the + endpoint's value. + + `end-in-region' + The extent's end position must lie within the region. + + `start-and-end-in-region' + Both the extent's start and end positions must lie within the + region. + + `start-or-end-in-region' + Either the extent's start or end position must lie within the + region. + + `negate-in-region' + The condition specified by a `*-in-region' flag must _not_ + hold for the extent to be considered. + + At most one of `all-extents-closed', `all-extents-open', + `all-extents-closed-open', and `all-extents-open-closed' may be + specified. + + At most one of `start-in-region', `end-in-region', + `start-and-end-in-region', and `start-or-end-in-region' may be + specified. + + If optional arg PROPERTY is non-`nil', only extents with that + property set on them will be visited. If optional arg VALUE is + non-`nil', only extents whose value for that property is `eq' to + VALUE will be visited. + + If you want to map over extents and accumulate a list of results, +the following function may be more convenient than `map-extents'. + + - Function: mapcar-extents function &optional predicate + buffer-or-string from to flags property value + This function applies FUNCTION to all extents which overlap a + region in BUFFER-OR-STRING. The region is delimited by FROM and + TO. FUNCTION is called with one argument, the extent. A list of + the values returned by FUNCTION is returned. An optional + PREDICATE may be used to further limit the extents over which + FUNCTION is mapped. The optional arguments FLAGS, PROPERTY, and + VALUE may also be used to control the extents passed to PREDICATE + or FUNCTION, and have the same meaning as in `map-extents'. + + - Function: map-extent-children function &optional object from to + maparg flags property value + This function is similar to `map-extents', but differs in that: + + * It only visits extents which start in the given region. + + * After visiting an extent E, it skips all other extents which + start inside E but end before E's end. + + Thus, this function may be used to walk a tree of extents in a + buffer: + (defun walk-extents (buffer &optional ignore) + (map-extent-children 'walk-extents buffer)) + + - Function: extent-in-region-p extent &optional from to flags + This function returns `t' if `map-extents' would visit EXTENT if + called with the given arguments. + + File: lispref.info, Node: Extent Properties, Next: Detached Extents, Prev: Mapping Over Extents, Up: Extents Properties of Extents @@ -72,9 +644,9 @@ from that parent (or from the root ancestor if the parent in turn has a parent), and setting a property of the extent actually sets that property on the parent. *Note Extent Parents::. - - Function: extent-property extent property - This function returns the value of PROPERTY in EXTENT. If - PROPERTY is undefined, `nil' is returned. + - Function: extent-property extent property &optional default + This function returns EXTENT's value for PROPERTY, or DEFAULT if + no such property exists. - Function: extent-properties extent This function returns a list of all of EXTENT's properties that do @@ -259,8 +831,8 @@ particular properties of an extent. The following convenience functions are provided for setting particular properties of an extent. - - Function: set-extent-priority extent pri - This function sets the `priority' property of EXTENT to PRI. + - Function: set-extent-priority extent priority + This function sets the `priority' property of EXTENT to PRIORITY. - Function: set-extent-face extent face This function sets the `face' property of EXTENT to FACE. @@ -584,487 +1156,3 @@ of the default face be * white for all other buffers - -File: lispref.info, Node: Specifiers In-Depth, Next: Specifier Instancing, Prev: Introduction to Specifiers, Up: Specifiers - -In-Depth Overview of a Specifier -================================ - - A specifier object encapsulates a set of "specifications", each of -which says what its value should be if a particular condition applies. -For example, one specification might be "The value should be -darkseagreen2 on X devices" another might be "The value should be blue -in the *Help* buffer". In specifier terminology, these conditions are -called "locales" and the values are called "instantiators". Given a -specifier, a logical question is "What is its value in a particular -situation?" This involves looking through the specifications to see -which ones apply to this particular situation, and perhaps preferring -one over another if more than one applies. In specifier terminology, a -"particular situation" is called a "domain", and determining its value -in a particular domain is called "instancing". Most of the time, a -domain is identified by a particular window. For example, if the -redisplay engine is drawing text in the default face in a particular -window, it retrieves the specifier for the foreground color of the -default face and "instances" it in the domain given by that window; in -other words, it asks the specifier, "What is your value in this -window?". - - More specifically, a specifier contains a set of "specifications", -each of which associates a "locale" (a window object, a buffer object, -a frame object, a device object, or the symbol `global') with an -"inst-list", which is a list of one or more "inst-pairs". (For each -possible locale, there can be at most one specification containing that -locale.) Each inst-pair is a cons of a "tag set" (an unordered list of -zero or more symbols, or "tags") and an "instantiator" (the allowed -form of this varies depending on the type of specifier). In a given -specification, there may be more than one inst-pair with the same tag -set; this is unlike for locales. - - The tag set is used to restrict the sorts of devices over which the -instantiator is valid and to uniquely identify instantiators added by a -particular application, so that different applications can work on the -same specifier and not interfere with each other. Each tag can have a -"predicate" associated with it, which is a function of one argument (a -device) that specifies whether the tag matches that particular device. -(If a tag does not have a predicate, it matches all devices.) All tags -in a tag set must match a device for the associated inst-pair to be -instantiable over that device. (A null tag set is perfectly valid.) - - The valid device types (normally `x', `tty', and `stream') and -device classes (normally `color', `grayscale', and `mono') can always -be used as tags, and match devices of the associated type or class -(*note Consoles and Devices::). User-defined tags may be defined, with -an optional predicate specified. An application can create its own -tag, use it to mark all its instantiators, and be fairly confident that -it will not interfere with other applications that modify the same -specifier--Functions that add a specification to a specifier usually -only overwrite existing inst-pairs with the same tag set as was given, -and a particular tag or tag set can be specified when removing -instantiators. - - When a specifier is instanced in a domain, both the locale and the -tag set can be viewed as specifying necessary conditions that must -apply in that domain for an instantiator to be considered as a possible -result of the instancing. More specific locales always override more -general locales (thus, there is no particular ordering of the -specifications in a specifier); however, the tag sets are simply -considered in the order that the inst-pairs occur in the -specification's inst-list. - - Note also that the actual object that results from the instancing -(called an "instance object") may not be the same as the instantiator -from which it was derived. For some specifier types (such as integer -specifiers and boolean specifiers), the instantiator will be returned -directly as the instance object. For other types, however, this is not -the case. For example, for font specifiers, the instantiator is a -font-description string and the instance object is a font-instance -object, which describes how the font is displayed on a particular -device. A font-instance object encapsulates such things as the actual -font name used to display the font on that device (a font-description -string under X is usually a wildcard specification that may resolve to -different font names, with possibly different foundries, widths, etc., -on different devices), the extra properties of that font on that -device, etc. Furthermore, this conversion (called "instantiation") -might fail--a font or color might not exist on a particular device, for -example. - - -File: lispref.info, Node: Specifier Instancing, Next: Specifier Types, Prev: Specifiers In-Depth, Up: Specifiers - -How a Specifier Is Instanced -============================ - - Instancing of a specifier in a particular window domain proceeds as -follows: - - * First, XEmacs searches for a specification whose locale is the - same as the window. If that fails, the search is repeated, - looking for a locale that is the same as the window's buffer. If - that fails, the search is repeated using the window's frame, then - using the device that frame is on. Finally, the specification - whose locale is the symbol `global' (if there is such a - specification) is considered. - - * The inst-pairs contained in the specification that was found are - considered in their order in the inst-list, looking for one whose - tag set matches the device that is derived from the window domain. - (The tag set is an unordered list of zero or more tag symbols. - For all tags that have predicates associated with them, the - predicate must match the device.) - - * If a matching tag set is found, the corresponding instantiator is - passed to the specifier's instantiation method, which is specific - to the type of the specifier. If it succeeds, the resulting - instance object is returned as the result of the instancing and - the instancing is done. Otherwise, the operation continues, - looking for another matching inst-pair in the current - specification. - - * When there are no more inst-pairs to be considered in the current - specification, the search starts over, looking for another - specification as in the first step above. - - * If all specifications are exhausted and no instance object can be - derived, the instancing fails. (Actually, this is not completely - true. Some specifier objects for built-in properties have a - "fallback" value, which is either an inst-list or another - specifier object, that is consulted if the instancing is about to - fail. If it is an inst-list, the searching proceeds using the - inst-pairs in that list. If it is a specifier, the entire - instancing starts over using that specifier instead of the given - one. Fallback values are set by the C code and cannot be - modified, except perhaps indirectly, using any Lisp functions. - The purpose of them is to supply some values to make sure that - instancing of built-in properties can't fail and to implement some - basic specifier inheritance, such as the fact that faces inherit - their properties from the `default' face.) - - It is also possible to instance a specifier over a frame domain or -device domain instead of over a window domain. The C code, for example, -instances the `top-toolbar-height' variable over a frame domain in -order to determine the height of a frame's top toolbar. Instancing over -a frame or device is similar to instancing over a window except that -specifications for locales that cannot be derived from the domain are -ignored. Specifically, instancing over a frame looks first for frame -locales, then device locales, then the `global' locale. Instancing -over a device domain looks only for device locales and the `global' -locale. - - -File: lispref.info, Node: Specifier Types, Next: Adding Specifications, Prev: Specifier Instancing, Up: Specifiers - -Specifier Types -=============== - - There are various different types of specifiers. The type of a -specifier controls what sorts of instantiators are valid, how an -instantiator is instantiated, etc. Here is a list of built-in specifier -types: - -`boolean' - The valid instantiators are the symbols `t' and `nil'. Instance - objects are the same as instantiators so no special instantiation - function is needed. - -`integer' - The valid instantiators are integers. Instance objects are the - same as instantiators so no special instantiation function is - needed. `modeline-shadow-thickness' is an example of an integer - specifier (negative thicknesses indicate that the shadow is drawn - recessed instead of raised). - -`natnum' - The valid instantiators are natnums (non-negative integers). - Instance objects are the same as instantiators so no special - instantiation function is needed. Natnum specifiers are used for - dimension variables such as `top-toolbar-height'. - -`generic' - All Lisp objects are valid instantiators. Instance objects are - the same as instantiators so no special instantiation function is - needed. - -`font' - The valid instantiators are strings describing fonts or vectors - indicating inheritance from the font of some face. Instance - objects are font-instance objects, which are specific to a - particular device. The instantiation method for font specifiers - can fail, unlike for integer, natnum, boolean, and generic - specifiers. - -`color' - The valid instantiators are strings describing colors or vectors - indicating inheritance from the foreground or background of some - face. Instance objects are color-instance objects, which are - specific to a particular device. The instantiation method for - color specifiers can fail, as for font specifiers. - -`image' - Images are perhaps the most complicated type of built-in - specifier. The valid instantiators are strings (a filename, - inline data for a pixmap, or text to be displayed in a text glyph) - or vectors describing inline data of various sorts or indicating - inheritance from the background-pixmap property of some face. - Instance objects are either strings (for text images), - image-instance objects (for pixmap images), or subwindow objects - (for subwindow images). The instantiation method for image - specifiers can fail, as for font and color specifiers. - -`face-boolean' - The valid instantiators are the symbols `t' and `nil' and vectors - indicating inheritance from a boolean property of some face. - Specifiers of this sort are used for all of the built-in boolean - properties of faces. Instance objects are either the symbol `t' - or the symbol `nil'. - -`toolbar' - The valid instantiators are toolbar descriptors, which are lists - of toolbar-button descriptors (each of which is a vector of two or - four elements). *Note Toolbar::, for more information. - - Color and font instance objects can also be used in turn as -instantiators for a new color or font instance object. Since these -instance objects are device-specific, the instantiator can be used -directly as the new instance object, but only if they are of the same -device. If the devices differ, the base color or font of the -instantiating object is effectively used instead as the instantiator. - - *Note Faces and Window-System Objects::, for more information on -fonts, colors, and face-boolean specifiers. *Note Glyphs::, for more -information about image specifiers. *Note Toolbar::, for more -information on toolbar specifiers. - - - Function: specifier-type specifier - This function returns the type of SPECIFIER. The returned value - will be a symbol: one of `integer', `boolean', etc., as listed in - the above table. - - Functions are also provided to query whether an object is a -particular kind of specifier: - - - Function: boolean-specifier-p object - This function returns non-`nil' if OBJECT is a boolean specifier. - - - Function: integer-specifier-p object - This function returns non-`nil' if OBJECT is an integer specifier. - - - Function: natnum-specifier-p object - This function returns non-`nil' if OBJECT is a natnum specifier. - - - Function: generic-specifier-p object - This function returns non-`nil' if OBJECT is a generic specifier. - - - Function: face-boolean-specifier-p object - This function returns non-`nil' if OBJECT is a face-boolean - specifier. - - - Function: toolbar-specifier-p object - This function returns non-`nil' if OBJECT is a toolbar specifier. - - - Function: font-specifier-p object - This function returns non-`nil' if OBJECT is a font specifier. - - - Function: color-specifier-p object - This function returns non-`nil' if OBJECT is a color specifier. - - - Function: image-specifier-p object - This function returns non-`nil' if OBJECT is an image specifier. - - -File: lispref.info, Node: Adding Specifications, Next: Retrieving Specifications, Prev: Specifier Types, Up: Specifiers - -Adding specifications to a Specifier -==================================== - - - Function: add-spec-to-specifier specifier instantiator &optional - locale tag-set how-to-add - This function adds a specification to SPECIFIER. The - specification maps from LOCALE (which should be a window, buffer, - frame, device, or the symbol `global', and defaults to `global') - to INSTANTIATOR, whose allowed values depend on the type of the - specifier. Optional argument TAG-SET limits the instantiator to - apply only to the specified tag set, which should be a list of - tags all of which must match the device being instantiated over - (tags are a device type, a device class, or tags defined with - `define-specifier-tag'). Specifying a single symbol for TAG-SET - is equivalent to specifying a one-element list containing that - symbol. Optional argument HOW-TO-ADD specifies what to do if - there are already specifications in the specifier. It should be - one of - - `prepend' - Put at the beginning of the current list of instantiators for - LOCALE. - - `append' - Add to the end of the current list of instantiators for - LOCALE. - - `remove-tag-set-prepend' - This is the default. Remove any existing instantiators whose - tag set is the same as TAG-SET; then put the new instantiator - at the beginning of the current list. - - `remove-tag-set-append' - Remove any existing instantiators whose tag set is the same as - TAG-SET; then put the new instantiator at the end of the - current list. - - `remove-locale' - Remove all previous instantiators for this locale before - adding the new spec. - - `remove-locale-type' - Remove all specifications for all locales of the same type as - LOCALE (this includes LOCALE itself) before adding the new - spec. - - `remove-all' - Remove all specifications from the specifier before adding - the new spec. - - `remove-tag-set-prepend' is the default. - - You can retrieve the specifications for a particular locale or - locale type with the function `specifier-spec-list' or - `specifier-specs'. - - - Function: add-spec-list-to-specifier specifier spec-list &optional - how-to-add - This function adds a "spec-list" (a list of specifications) to - SPECIFIER. The format of a spec-list is - - `((LOCALE (TAG-SET . INSTANTIATOR) ...) ...)' - - where - - * LOCALE := a window, a buffer, a frame, a device, or `global' - - * TAG-SET := an unordered list of zero or more TAGS, each of - which is a symbol - - * TAG := a device class (*note Consoles and Devices::), a - device type, or a tag defined with `define-specifier-tag' - - * INSTANTIATOR := format determined by the type of specifier - - The pair `(TAG-SET . INSTANTIATOR)' is called an "inst-pair". A - list of inst-pairs is called an "inst-list". The pair `(LOCALE . - INST-LIST)' is called a "specification". A spec-list, then, can - be viewed as a list of specifications. - - HOW-TO-ADD specifies how to combine the new specifications with - the existing ones, and has the same semantics as for - `add-spec-to-specifier'. - - In many circumstances, the higher-level function `set-specifier' is - more convenient and should be used instead. - - - Macro: let-specifier specifier-list &rest body - This special form temporarily adds specifications to specifiers, - evaluates forms in BODY and restores the specifiers to their - previous states. The specifiers and their temporary - specifications are listed in SPECIFIER-LIST. - - The format of SPECIFIER-LIST is - - ((SPECIFIER VALUE &optional LOCALE TAG-SET HOW-TO-ADD) ...) - - SPECIFIER is the specifier to be temporarily modified. VALUE is - the instantiator to be temporarily added to specifier in LOCALE. - LOCALE, TAG-SET and HOW-TO-ADD have the same meaning as in - `add-spec-to-specifier'. - - This special form is implemented as a macro; the code resulting - from macro expansion will add specifications to specifiers using - `add-spec-to-specifier'. After forms in BODY are evaluated, the - temporary specifications are removed and old specifier spec-lists - are restored. - - LOCALE, TAG-SET and HOW-TO-ADD may be omitted, and default to - `nil'. The value of the last form in BODY is returned. - - NOTE: If you want the specifier's instance to change in all - circumstances, use `(selected-window)' as the LOCALE. If LOCALE - is `nil' or omitted, it defaults to `global'. - - The following example removes the 3D modeline effect in the - currently selected window for the duration of a second: - - (let-specifier ((modeline-shadow-thickness 0 (selected-window))) - (sit-for 1)) - - - Function: set-specifier specifier value &optional how-to-add - This function adds some specifications to SPECIFIER. VALUE can be - a single instantiator or tagged instantiator (added as a global - specification), a list of tagged and/or untagged instantiators - (added as a global specification), a cons of a locale and - instantiator or locale and instantiator list, a list of such - conses, or nearly any other reasonable form. More specifically, - VALUE can be anything accepted by `canonicalize-spec-list'. - - HOW-TO-ADD is the same as in `add-spec-to-specifier'. - - Note that `set-specifier' is exactly complementary to - `specifier-specs' except in the case where SPECIFIER has no specs - at all in it but `nil' is a valid instantiator (in that case, - `specifier-specs' will return `nil' (meaning no specs) and - `set-specifier' will interpret the `nil' as meaning "I'm adding a - global instantiator and its value is `nil'"), or in strange cases - where there is an ambiguity between a spec-list and an inst-list, - etc. (The built-in specifier types are designed in such a way as - to avoid any such ambiguities.) - - If you want to work with spec-lists, you should probably not use - these functions, but should use the lower-level functions - `specifier-spec-list' and `add-spec-list-to-specifier'. These - functions always work with fully-qualified spec-lists; thus, there - is no ambiguity. - - - Function: canonicalize-inst-pair inst-pair specifier-type &optional - noerror - This function canonicalizes the given INST-PAIR. - - SPECIFIER-TYPE specifies the type of specifier that this SPEC-LIST - will be used for. - - Canonicalizing means converting to the full form for an inst-pair, - i.e. `(TAG-SET . INSTANTIATOR)'. A single, untagged instantiator - is given a tag set of `nil' (the empty set), and a single tag is - converted into a tag set consisting only of that tag. - - If NOERROR is non-`nil', signal an error if the inst-pair is - invalid; otherwise return `t'. - - - Function: canonicalize-inst-list inst-list specifier-type &optional - noerror - This function canonicalizes the given INST-LIST (a list of - inst-pairs). - - SPECIFIER-TYPE specifies the type of specifier that this INST-LIST - will be used for. - - Canonicalizing means converting to the full form for an inst-list, - i.e. `((TAG-SET . INSTANTIATOR) ...)'. This function accepts a - single inst-pair or any abbreviation thereof or a list of - (possibly abbreviated) inst-pairs. (See `canonicalize-inst-pair'.) - - If NOERROR is non-`nil', signal an error if the inst-list is - invalid; otherwise return `t'. - - - Function: canonicalize-spec spec specifier-type &optional noerror - This function canonicalizes the given SPEC (a specification). - - SPECIFIER-TYPE specifies the type of specifier that this SPEC-LIST - will be used for. - - Canonicalizing means converting to the full form for a spec, i.e. - `(LOCALE (TAG-SET . INSTANTIATOR) ...)'. This function accepts a - possibly abbreviated inst-list or a cons of a locale and a - possibly abbreviated inst-list. (See `canonicalize-inst-list'.) - - If NOERROR is `nil', signal an error if the specification is - invalid; otherwise return `t'. - - - Function: canonicalize-spec-list spec-list specifier-type &optional - noerror - This function canonicalizes the given SPEC-LIST (a list of - specifications). - - SPECIFIER-TYPE specifies the type of specifier that this SPEC-LIST - will be used for. - - Canonicalizing means converting to the full form for a spec-list, - i.e. `((LOCALE (TAG-SET . INSTANTIATOR) ...) ...)'. This - function accepts a possibly abbreviated specification or a list of - such things. (See `canonicalize-spec'.) This is the function used - to convert spec-lists accepted by `set-specifier' and such into a - form suitable for `add-spec-list-to-specifier'. - - This function tries extremely hard to resolve any ambiguities, and - the built-in specifier types (font, image, toolbar, etc.) are - designed so that there won't be any ambiguities. - - If NOERROR is `nil', signal an error if the spec-list is invalid; - otherwise return `t'. - diff --git a/info/lispref.info-35 b/info/lispref.info-35 index db3eddf..7b1e8fa 100644 --- a/info/lispref.info-35 +++ b/info/lispref.info-35 @@ -50,6 +50,492 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Specifiers In-Depth, Next: Specifier Instancing, Prev: Introduction to Specifiers, Up: Specifiers + +In-Depth Overview of a Specifier +================================ + + A specifier object encapsulates a set of "specifications", each of +which says what its value should be if a particular condition applies. +For example, one specification might be "The value should be +darkseagreen2 on X devices" another might be "The value should be blue +in the *Help* buffer". In specifier terminology, these conditions are +called "locales" and the values are called "instantiators". Given a +specifier, a logical question is "What is its value in a particular +situation?" This involves looking through the specifications to see +which ones apply to this particular situation, and perhaps preferring +one over another if more than one applies. In specifier terminology, a +"particular situation" is called a "domain", and determining its value +in a particular domain is called "instancing". Most of the time, a +domain is identified by a particular window. For example, if the +redisplay engine is drawing text in the default face in a particular +window, it retrieves the specifier for the foreground color of the +default face and "instances" it in the domain given by that window; in +other words, it asks the specifier, "What is your value in this +window?". + + More specifically, a specifier contains a set of "specifications", +each of which associates a "locale" (a window object, a buffer object, +a frame object, a device object, or the symbol `global') with an +"inst-list", which is a list of one or more "inst-pairs". (For each +possible locale, there can be at most one specification containing that +locale.) Each inst-pair is a cons of a "tag set" (an unordered list of +zero or more symbols, or "tags") and an "instantiator" (the allowed +form of this varies depending on the type of specifier). In a given +specification, there may be more than one inst-pair with the same tag +set; this is unlike for locales. + + The tag set is used to restrict the sorts of devices over which the +instantiator is valid and to uniquely identify instantiators added by a +particular application, so that different applications can work on the +same specifier and not interfere with each other. Each tag can have a +"predicate" associated with it, which is a function of one argument (a +device) that specifies whether the tag matches that particular device. +(If a tag does not have a predicate, it matches all devices.) All tags +in a tag set must match a device for the associated inst-pair to be +instantiable over that device. (A null tag set is perfectly valid.) + + The valid device types (normally `x', `tty', and `stream') and +device classes (normally `color', `grayscale', and `mono') can always +be used as tags, and match devices of the associated type or class +(*note Consoles and Devices::). User-defined tags may be defined, with +an optional predicate specified. An application can create its own +tag, use it to mark all its instantiators, and be fairly confident that +it will not interfere with other applications that modify the same +specifier--Functions that add a specification to a specifier usually +only overwrite existing inst-pairs with the same tag set as was given, +and a particular tag or tag set can be specified when removing +instantiators. + + When a specifier is instanced in a domain, both the locale and the +tag set can be viewed as specifying necessary conditions that must +apply in that domain for an instantiator to be considered as a possible +result of the instancing. More specific locales always override more +general locales (thus, there is no particular ordering of the +specifications in a specifier); however, the tag sets are simply +considered in the order that the inst-pairs occur in the +specification's inst-list. + + Note also that the actual object that results from the instancing +(called an "instance object") may not be the same as the instantiator +from which it was derived. For some specifier types (such as integer +specifiers and boolean specifiers), the instantiator will be returned +directly as the instance object. For other types, however, this is not +the case. For example, for font specifiers, the instantiator is a +font-description string and the instance object is a font-instance +object, which describes how the font is displayed on a particular +device. A font-instance object encapsulates such things as the actual +font name used to display the font on that device (a font-description +string under X is usually a wildcard specification that may resolve to +different font names, with possibly different foundries, widths, etc., +on different devices), the extra properties of that font on that +device, etc. Furthermore, this conversion (called "instantiation") +might fail--a font or color might not exist on a particular device, for +example. + + +File: lispref.info, Node: Specifier Instancing, Next: Specifier Types, Prev: Specifiers In-Depth, Up: Specifiers + +How a Specifier Is Instanced +============================ + + Instancing of a specifier in a particular window domain proceeds as +follows: + + * First, XEmacs searches for a specification whose locale is the + same as the window. If that fails, the search is repeated, + looking for a locale that is the same as the window's buffer. If + that fails, the search is repeated using the window's frame, then + using the device that frame is on. Finally, the specification + whose locale is the symbol `global' (if there is such a + specification) is considered. + + * The inst-pairs contained in the specification that was found are + considered in their order in the inst-list, looking for one whose + tag set matches the device that is derived from the window domain. + (The tag set is an unordered list of zero or more tag symbols. + For all tags that have predicates associated with them, the + predicate must match the device.) + + * If a matching tag set is found, the corresponding instantiator is + passed to the specifier's instantiation method, which is specific + to the type of the specifier. If it succeeds, the resulting + instance object is returned as the result of the instancing and + the instancing is done. Otherwise, the operation continues, + looking for another matching inst-pair in the current + specification. + + * When there are no more inst-pairs to be considered in the current + specification, the search starts over, looking for another + specification as in the first step above. + + * If all specifications are exhausted and no instance object can be + derived, the instancing fails. (Actually, this is not completely + true. Some specifier objects for built-in properties have a + "fallback" value, which is either an inst-list or another + specifier object, that is consulted if the instancing is about to + fail. If it is an inst-list, the searching proceeds using the + inst-pairs in that list. If it is a specifier, the entire + instancing starts over using that specifier instead of the given + one. Fallback values are set by the C code and cannot be + modified, except perhaps indirectly, using any Lisp functions. + The purpose of them is to supply some values to make sure that + instancing of built-in properties can't fail and to implement some + basic specifier inheritance, such as the fact that faces inherit + their properties from the `default' face.) + + It is also possible to instance a specifier over a frame domain or +device domain instead of over a window domain. The C code, for example, +instances the `top-toolbar-height' variable over a frame domain in +order to determine the height of a frame's top toolbar. Instancing over +a frame or device is similar to instancing over a window except that +specifications for locales that cannot be derived from the domain are +ignored. Specifically, instancing over a frame looks first for frame +locales, then device locales, then the `global' locale. Instancing +over a device domain looks only for device locales and the `global' +locale. + + +File: lispref.info, Node: Specifier Types, Next: Adding Specifications, Prev: Specifier Instancing, Up: Specifiers + +Specifier Types +=============== + + There are various different types of specifiers. The type of a +specifier controls what sorts of instantiators are valid, how an +instantiator is instantiated, etc. Here is a list of built-in specifier +types: + +`boolean' + The valid instantiators are the symbols `t' and `nil'. Instance + objects are the same as instantiators so no special instantiation + function is needed. + +`integer' + The valid instantiators are integers. Instance objects are the + same as instantiators so no special instantiation function is + needed. `modeline-shadow-thickness' is an example of an integer + specifier (negative thicknesses indicate that the shadow is drawn + recessed instead of raised). + +`natnum' + The valid instantiators are natnums (non-negative integers). + Instance objects are the same as instantiators so no special + instantiation function is needed. Natnum specifiers are used for + dimension variables such as `top-toolbar-height'. + +`generic' + All Lisp objects are valid instantiators. Instance objects are + the same as instantiators so no special instantiation function is + needed. + +`font' + The valid instantiators are strings describing fonts or vectors + indicating inheritance from the font of some face. Instance + objects are font-instance objects, which are specific to a + particular device. The instantiation method for font specifiers + can fail, unlike for integer, natnum, boolean, and generic + specifiers. + +`color' + The valid instantiators are strings describing colors or vectors + indicating inheritance from the foreground or background of some + face. Instance objects are color-instance objects, which are + specific to a particular device. The instantiation method for + color specifiers can fail, as for font specifiers. + +`image' + Images are perhaps the most complicated type of built-in + specifier. The valid instantiators are strings (a filename, + inline data for a pixmap, or text to be displayed in a text glyph) + or vectors describing inline data of various sorts or indicating + inheritance from the background-pixmap property of some face. + Instance objects are either strings (for text images), + image-instance objects (for pixmap images), or subwindow objects + (for subwindow images). The instantiation method for image + specifiers can fail, as for font and color specifiers. + +`face-boolean' + The valid instantiators are the symbols `t' and `nil' and vectors + indicating inheritance from a boolean property of some face. + Specifiers of this sort are used for all of the built-in boolean + properties of faces. Instance objects are either the symbol `t' + or the symbol `nil'. + +`toolbar' + The valid instantiators are toolbar descriptors, which are lists + of toolbar-button descriptors (each of which is a vector of two or + four elements). *Note Toolbar::, for more information. + + Color and font instance objects can also be used in turn as +instantiators for a new color or font instance object. Since these +instance objects are device-specific, the instantiator can be used +directly as the new instance object, but only if they are of the same +device. If the devices differ, the base color or font of the +instantiating object is effectively used instead as the instantiator. + + *Note Faces and Window-System Objects::, for more information on +fonts, colors, and face-boolean specifiers. *Note Glyphs::, for more +information about image specifiers. *Note Toolbar::, for more +information on toolbar specifiers. + + - Function: specifier-type specifier + This function returns the type of SPECIFIER. The returned value + will be a symbol: one of `integer', `boolean', etc., as listed in + the above table. + + Functions are also provided to query whether an object is a +particular kind of specifier: + + - Function: boolean-specifier-p object + This function returns non-`nil' if OBJECT is a boolean specifier. + + - Function: integer-specifier-p object + This function returns non-`nil' if OBJECT is an integer specifier. + + - Function: natnum-specifier-p object + This function returns non-`nil' if OBJECT is a natnum specifier. + + - Function: generic-specifier-p object + This function returns non-`nil' if OBJECT is a generic specifier. + + - Function: face-boolean-specifier-p object + This function returns non-`nil' if OBJECT is a face-boolean + specifier. + + - Function: toolbar-specifier-p object + This function returns non-`nil' if OBJECT is a toolbar specifier. + + - Function: font-specifier-p object + This function returns non-`nil' if OBJECT is a font specifier. + + - Function: color-specifier-p object + This function returns non-`nil' if OBJECT is a color specifier. + + - Function: image-specifier-p object + This function returns non-`nil' if OBJECT is an image specifier. + + +File: lispref.info, Node: Adding Specifications, Next: Retrieving Specifications, Prev: Specifier Types, Up: Specifiers + +Adding specifications to a Specifier +==================================== + + - Function: add-spec-to-specifier specifier instantiator &optional + locale tag-set how-to-add + This function adds a specification to SPECIFIER. The + specification maps from LOCALE (which should be a window, buffer, + frame, device, or the symbol `global', and defaults to `global') + to INSTANTIATOR, whose allowed values depend on the type of the + specifier. Optional argument TAG-SET limits the instantiator to + apply only to the specified tag set, which should be a list of + tags all of which must match the device being instantiated over + (tags are a device type, a device class, or tags defined with + `define-specifier-tag'). Specifying a single symbol for TAG-SET + is equivalent to specifying a one-element list containing that + symbol. Optional argument HOW-TO-ADD specifies what to do if + there are already specifications in the specifier. It should be + one of + + `prepend' + Put at the beginning of the current list of instantiators for + LOCALE. + + `append' + Add to the end of the current list of instantiators for + LOCALE. + + `remove-tag-set-prepend' + This is the default. Remove any existing instantiators whose + tag set is the same as TAG-SET; then put the new instantiator + at the beginning of the current list. + + `remove-tag-set-append' + Remove any existing instantiators whose tag set is the same as + TAG-SET; then put the new instantiator at the end of the + current list. + + `remove-locale' + Remove all previous instantiators for this locale before + adding the new spec. + + `remove-locale-type' + Remove all specifications for all locales of the same type as + LOCALE (this includes LOCALE itself) before adding the new + spec. + + `remove-all' + Remove all specifications from the specifier before adding + the new spec. + + `remove-tag-set-prepend' is the default. + + You can retrieve the specifications for a particular locale or + locale type with the function `specifier-spec-list' or + `specifier-specs'. + + - Function: add-spec-list-to-specifier specifier spec-list &optional + how-to-add + This function adds a "spec-list" (a list of specifications) to + SPECIFIER. The format of a spec-list is + + `((LOCALE (TAG-SET . INSTANTIATOR) ...) ...)' + + where + + * LOCALE := a window, a buffer, a frame, a device, or `global' + + * TAG-SET := an unordered list of zero or more TAGS, each of + which is a symbol + + * TAG := a device class (*note Consoles and Devices::), a + device type, or a tag defined with `define-specifier-tag' + + * INSTANTIATOR := format determined by the type of specifier + + The pair `(TAG-SET . INSTANTIATOR)' is called an "inst-pair". A + list of inst-pairs is called an "inst-list". The pair `(LOCALE . + INST-LIST)' is called a "specification". A spec-list, then, can + be viewed as a list of specifications. + + HOW-TO-ADD specifies how to combine the new specifications with + the existing ones, and has the same semantics as for + `add-spec-to-specifier'. + + In many circumstances, the higher-level function `set-specifier' is + more convenient and should be used instead. + + - Special Form: let-specifier specifier-list &rest body + This special form temporarily adds specifications to specifiers, + evaluates forms in BODY and restores the specifiers to their + previous states. The specifiers and their temporary + specifications are listed in SPECIFIER-LIST. + + The format of SPECIFIER-LIST is + + ((SPECIFIER VALUE &optional LOCALE TAG-SET HOW-TO-ADD) ...) + + SPECIFIER is the specifier to be temporarily modified. VALUE is + the instantiator to be temporarily added to specifier in LOCALE. + LOCALE, TAG-SET and HOW-TO-ADD have the same meaning as in + `add-spec-to-specifier'. + + This special form is implemented as a macro; the code resulting + from macro expansion will add specifications to specifiers using + `add-spec-to-specifier'. After forms in BODY are evaluated, the + temporary specifications are removed and old specifier spec-lists + are restored. + + LOCALE, TAG-SET and HOW-TO-ADD may be omitted, and default to + `nil'. The value of the last form in BODY is returned. + + NOTE: If you want the specifier's instance to change in all + circumstances, use `(selected-window)' as the LOCALE. If LOCALE + is `nil' or omitted, it defaults to `global'. + + The following example removes the 3D modeline effect in the + currently selected window for the duration of a second: + + (let-specifier ((modeline-shadow-thickness 0 (selected-window))) + (sit-for 1)) + + - Function: set-specifier specifier value &optional locale tag-set + how-to-add + This function adds some specifications to SPECIFIER. VALUE can be + a single instantiator or tagged instantiator (added as a global + specification), a list of tagged and/or untagged instantiators + (added as a global specification), a cons of a locale and + instantiator or locale and instantiator list, a list of such + conses, or nearly any other reasonable form. More specifically, + VALUE can be anything accepted by `canonicalize-spec-list'. + + LOCALE, TAG-SET, and HOW-TO-ADD are the same as in + `add-spec-to-specifier'. + + Note that `set-specifier' is exactly complementary to + `specifier-specs' except in the case where SPECIFIER has no specs + at all in it but `nil' is a valid instantiator (in that case, + `specifier-specs' will return `nil' (meaning no specs) and + `set-specifier' will interpret the `nil' as meaning "I'm adding a + global instantiator and its value is `nil'"), or in strange cases + where there is an ambiguity between a spec-list and an inst-list, + etc. (The built-in specifier types are designed in such a way as + to avoid any such ambiguities.) + + If you want to work with spec-lists, you should probably not use + these functions, but should use the lower-level functions + `specifier-spec-list' and `add-spec-list-to-specifier'. These + functions always work with fully-qualified spec-lists; thus, there + is no ambiguity. + + - Function: canonicalize-inst-pair inst-pair specifier-type &optional + noerror + This function canonicalizes the given INST-PAIR. + + SPECIFIER-TYPE specifies the type of specifier that this SPEC-LIST + will be used for. + + Canonicalizing means converting to the full form for an inst-pair, + i.e. `(TAG-SET . INSTANTIATOR)'. A single, untagged instantiator + is given a tag set of `nil' (the empty set), and a single tag is + converted into a tag set consisting only of that tag. + + If NOERROR is non-`nil', signal an error if the inst-pair is + invalid; otherwise return `t'. + + - Function: canonicalize-inst-list inst-list specifier-type &optional + noerror + This function canonicalizes the given INST-LIST (a list of + inst-pairs). + + SPECIFIER-TYPE specifies the type of specifier that this INST-LIST + will be used for. + + Canonicalizing means converting to the full form for an inst-list, + i.e. `((TAG-SET . INSTANTIATOR) ...)'. This function accepts a + single inst-pair or any abbreviation thereof or a list of + (possibly abbreviated) inst-pairs. (See `canonicalize-inst-pair'.) + + If NOERROR is non-`nil', signal an error if the inst-list is + invalid; otherwise return `t'. + + - Function: canonicalize-spec spec specifier-type &optional noerror + This function canonicalizes the given SPEC (a specification). + + SPECIFIER-TYPE specifies the type of specifier that this SPEC-LIST + will be used for. + + Canonicalizing means converting to the full form for a spec, i.e. + `(LOCALE (TAG-SET . INSTANTIATOR) ...)'. This function accepts a + possibly abbreviated inst-list or a cons of a locale and a + possibly abbreviated inst-list. (See `canonicalize-inst-list'.) + + If NOERROR is `nil', signal an error if the specification is + invalid; otherwise return `t'. + + - Function: canonicalize-spec-list spec-list specifier-type &optional + noerror + This function canonicalizes the given SPEC-LIST (a list of + specifications). + + SPECIFIER-TYPE specifies the type of specifier that this SPEC-LIST + will be used for. + + Canonicalizing means converting to the full form for a spec-list, + i.e. `((LOCALE (TAG-SET . INSTANTIATOR) ...) ...)'. This + function accepts a possibly abbreviated specification or a list of + such things. (See `canonicalize-spec'.) This is the function used + to convert spec-lists accepted by `set-specifier' and such into a + form suitable for `add-spec-list-to-specifier'. + + This function tries extremely hard to resolve any ambiguities, and + the built-in specifier types (font, image, toolbar, etc.) are + designed so that there won't be any ambiguities. + + If NOERROR is `nil', signal an error if the spec-list is invalid; + otherwise return `t'. + + File: lispref.info, Node: Retrieving Specifications, Next: Specifier Tag Functions, Prev: Adding Specifications, Up: Specifiers Retrieving the Specifications from a Specifier @@ -64,9 +550,9 @@ Retrieving the Specifications from a Specifier or the symbol `global'), a spec-list consisting of the specification for that locale will be returned. - If LOCALE is a locale type (i.e. a symbol `window', `buffer', - `frame', or `device'), a spec-list of the specifications for all - locales of that type will be returned. + If LOCALE is a locale type (i.e. one of the symbols `window', + `buffer', `frame', or `device'), a spec-list of the specifications + for all locales of that type will be returned. If LOCALE is `nil' or the symbol `all', a spec-list of all specifications in SPECIFIER will be returned. @@ -77,7 +563,7 @@ Retrieving the Specifications from a Specifier Only instantiators where TAG-SET (a list of zero or more tags) is a subset of (or possibly equal to) the instantiator's tag set are - returned. (The default value of` nil' is a subset of all tag sets, + returned. (The default value of `nil' is a subset of all tag sets, so in this case no instantiators will be screened out.) If EXACT-P is non-`nil', however, TAG-SET must be equal to an instantiator's tag set for the instantiator to be returned. @@ -440,11 +926,11 @@ Functions for Checking the Validity of Specifier Components and `global'. (`nil' is not valid.) - Function: valid-specifier-locale-type-p locale-type - Given a specifier LOCALE-TYPE, this function returns non-nil if it - is valid. Valid locale types are the symbols `global', `device', - `frame', `window', and `buffer'. (Note, however, that in functions - that accept either a locale or a locale type, `global' is - considered an individual locale.) + Given a specifier LOCALE-TYPE, this function returns non-`nil' if + it is valid. Valid locale types are the symbols `global', + `device', `frame', `window', and `buffer'. (Note, however, that in + functions that accept either a locale or a locale type, `global' + is considered an individual locale.) - Function: valid-specifier-type-p specifier-type Given a SPECIFIER-TYPE, this function returns non-`nil' if it is @@ -510,7 +996,7 @@ Other Functions for Working with Specifications in a Specifier tag set for the instantiator to be copied. Optional argument HOW-TO-ADD specifies what to do with existing - specifications in DEST. If nil, then whichever locales or locale + specifications in DEST. If `nil', then whichever locales or locale types are copied will first be completely erased in DEST. Otherwise, it is the same as in `add-spec-to-specifier'. @@ -607,515 +1093,3 @@ mark. * Other Face Display Functions:: Other functions pertaining to how a a face appears. - -File: lispref.info, Node: Merging Faces, Next: Basic Face Functions, Up: Faces - -Merging Faces for Display -------------------------- - - Here are all the ways to specify which face to use for display of -text: - - * With defaults. Each frame has a "default face", which is used for - all text that doesn't somehow specify another face. The face named - `default' applies to the text area, while the faces `left-margin' - and `right-margin' apply to the left and right margin areas. - - * With text properties. A character may have a `face' property; if - so, it's displayed with that face. (Text properties are actually - implemented in terms of extents.) *Note Text Properties::. - - * With extents. An extent may have a `face' property, which applies - to all the text covered by the extent; in addition, if the - `highlight' property is set, the `highlight' property applies when - the mouse moves over the extent or if the extent is explicitly - highlighted. *Note Extents::. - - * With annotations. Annotations that are inserted into a buffer can - specify their own face. (Annotations are actually implemented in - terms of extents.) *Note Annotations::. - - If these various sources together specify more than one face for a -particular character, XEmacs merges the properties of the various faces -specified. Extents, text properties, and annotations all use the same -underlying representation (as extents). When multiple extents cover one -character, an extent with higher priority overrides those with lower -priority. *Note Extents::. If no extent covers a particular character, -the `default' face is used. - - If a background pixmap is specified, it determines what will be -displayed in the background of text characters. If the background -pixmap is actually a pixmap, with its colors specified, those colors are -used; if it is a bitmap, the face's foreground and background colors are -used to color it. - - -File: lispref.info, Node: Basic Face Functions, Next: Face Properties, Prev: Merging Faces, Up: Faces - -Basic Functions for Working with Faces --------------------------------------- - - The properties a face can specify include the font, the foreground -color, the background color, the background pixmap, the underlining, -the display table, and (for TTY devices) whether the text is to be -highlighted, dimmed, blinking, or displayed in reverse video. The face -can also leave these unspecified, causing them to assume the value of -the corresponding property of the `default' face. - - Here are the basic primitives for working with faces. - - - Function: make-face name &optional doc-string temporary - This function defines and returns a new face named NAME, initially - with all properties unspecified. It does nothing if there is - already a face named NAME. Optional argument DOC-STRING specifies - an explanatory string used for descriptive purposes. If optional - argument TEMPORARY is non-`nil', the face will automatically - disappear when there are no more references to it anywhere in text - or Lisp code (otherwise, the face will continue to exist - indefinitely even if it is not used). - - - Function: face-list &optional temporary - This function returns a list of the names of all defined faces. If - TEMPORARY is `nil', only the permanent faces are included. If it - is `t', only the temporary faces are included. If it is any other - non-`nil' value both permanent and temporary are included. - - - Function: facep object - This function returns whether the given object is a face. - - - Function: copy-face old-face new-name &optional locale how-to-add - This function defines a new face named NEW-NAME which is a copy of - the existing face named OLD-FACE. If there is already a face - named NEW-NAME, then it alters the face to have the same - properties as OLD-FACE. LOCALE and HOW-TO-ADD let you copy just - parts of the old face rather than the whole face, and are as in - `copy-specifier' (*note Specifiers::). - - -File: lispref.info, Node: Face Properties, Next: Face Convenience Functions, Prev: Basic Face Functions, Up: Faces - -Face Properties ---------------- - - You can examine and modify the properties of an existing face with -the following functions. - - The following symbols have predefined meanings: - -`foreground' - The foreground color of the face. - -`background' - The background color of the face. - -`font' - The font used to display text covered by this face. - -`display-table' - The display table of the face. - -`background-pixmap' - The pixmap displayed in the background of the face. Only used by - faces on X devices. - -`underline' - Underline all text covered by this face. - -`highlight' - Highlight all text covered by this face. Only used by faces on TTY - devices. - -`dim' - Dim all text covered by this face. Only used by faces on TTY - devices. - -`blinking' - Blink all text covered by this face. Only used by faces on TTY - devices. - -`reverse' - Reverse the foreground and background colors. Only used by faces - on TTY devices. - -`doc-string' - Description of what the face's normal use is. NOTE: This is not a - specifier, unlike all the other built-in properties, and cannot - contain locale-specific values. - - - Function: set-face-property face property value &optional locale tag - how-to-add - This function changes a property of a FACE. - - For built-in properties, the actual value of the property is a - specifier and you cannot change this; but you can change the - specifications within the specifier, and that is what this - function will do. For user-defined properties, you can use this - function to either change the actual value of the property or, if - this value is a specifier, change the specifications within it. - - If PROPERTY is a built-in property, the specifications to be added - to this property can be supplied in many different ways: - - If VALUE is a simple instantiator (e.g. a string naming a - font or color) or a list of instantiators, then the - instantiator(s) will be added as a specification of the - property for the given LOCALE (which defaults to `global' if - omitted). - - If VALUE is a list of specifications (each of which is a cons - of a locale and a list of instantiators), then LOCALE must be - `nil' (it does not make sense to explicitly specify a locale - in this case), and specifications will be added as given. - - If VALUE is a specifier (as would be returned by - `face-property' if no LOCALE argument is given), then some or - all of the specifications in the specifier will be added to - the property. In this case, the function is really - equivalent to `copy-specifier' and LOCALE has the same - semantics (if it is a particular locale, the specification - for the locale will be copied; if a locale type, - specifications for all locales of that type will be copied; - if `nil' or `all', then all specifications will be copied). - - HOW-TO-ADD should be either `nil' or one of the symbols `prepend', - `append', `remove-tag-set-prepend', `remove-tag-set-append', - `remove-locale', `remove-locale-type', or `remove-all'. See - `copy-specifier' and `add-spec-to-specifier' for a description of - what each of these means. Most of the time, you do not need to - worry about this argument; the default behavior usually is fine. - - In general, it is OK to pass an instance object (e.g. as returned - by `face-property-instance') as an instantiator in place of an - actual instantiator. In such a case, the instantiator used to - create that instance object will be used (for example, if you set - a font-instance object as the value of the `font' property, then - the font name used to create that object will be used instead). - If some cases, however, doing this conversion does not make sense, - and this will be noted in the documentation for particular types - of instance objects. - - If PROPERTY is not a built-in property, then this function will - simply set its value if LOCALE is `nil'. However, if LOCALE is - given, then this function will attempt to add VALUE as the - instantiator for the given LOCALE, using `add-spec-to-specifier'. - If the value of the property is not a specifier, it will - automatically be converted into a `generic' specifier. - - - Function: remove-face-property face property &optional local tag-set - exact-p - This function removes a property of a FACE. - - For built-in properties, this is analogous to `remove-specifier'. - For more information, *Note Other Specification Functions::. - - When PROPERTY is not a built-in property, this function will just - remove its value if LOCALE is `nil' or `all'. However, if LOCALE - is other than that, this function will attempt to remove VALUE as - the instantiator for the given LOCALE with `remove-specifier'. If - the value of the property is not a specifier, it will be converted - into a `generic' specifier automatically. - - - Function: face-property face property &optional locale - This function returns FACE's value of the given PROPERTY. - - If LOCALE is omitted, the FACE's actual value for PROPERTY will be - returned. For built-in properties, this will be a specifier - object of a type appropriate to the property (e.g. a font or color - specifier). For other properties, this could be anything. - - If LOCALE is supplied, then instead of returning the actual value, - the specification(s) for the given locale or locale type will be - returned. This will only work if the actual value of PROPERTY is - a specifier (this will always be the case for built-in properties, - but not or not may apply to user-defined properties). If the - actual value of PROPERTY is not a specifier, this value will - simply be returned regardless of LOCALE. - - The return value will be a list of instantiators (e.g. strings - specifying a font or color name), or a list of specifications, - each of which is a cons of a locale and a list of instantiators. - Specifically, if LOCALE is a particular locale (a buffer, window, - frame, device, or `global'), a list of instantiators for that - locale will be returned. Otherwise, if LOCALE is a locale type - (one of the symbols `buffer', `window', `frame', or `device'), the - specifications for all locales of that type will be returned. - Finally, if LOCALE is `all', the specifications for all locales of - all types will be returned. - - The specifications in a specifier determine what the value of - PROPERTY will be in a particular "domain" or set of circumstances, - which is typically a particular Emacs window along with the buffer - it contains and the frame and device it lies within. The value is - derived from the instantiator associated with the most specific - locale (in the order buffer, window, frame, device, and `global') - that matches the domain in question. In other words, given a - domain (i.e. an Emacs window, usually), the specifier for PROPERTY - will first be searched for a specification whose locale is the - buffer contained within that window; then for a specification - whose locale is the window itself; then for a specification whose - locale is the frame that the window is contained within; etc. The - first instantiator that is valid for the domain (usually this - means that the instantiator is recognized by the device [i.e. the - X server or TTY device] that the domain is on). The function - `face-property-instance' actually does all this, and is used to - determine how to display the face. - - - Function: face-property-instance face property &optional domain - default no-fallback - This function returns the instance of FACE's PROPERTY in the - specified DOMAIN. - - Under most circumstances, DOMAIN will be a particular window, and - the returned instance describes how the specified property - actually is displayed for that window and the particular buffer in - it. Note that this may not be the same as how the property - appears when the buffer is displayed in a different window or - frame, or how the property appears in the same window if you - switch to another buffer in that window; and in those cases, the - returned instance would be different. - - The returned instance will typically be a color-instance, - font-instance, or pixmap-instance object, and you can query it - using the appropriate object-specific functions. For example, you - could use `color-instance-rgb-components' to find out the RGB - (red, green, and blue) components of how the `background' property - of the `highlight' face is displayed in a particular window. The - results might be different from the results you would get for - another window (perhaps the user specified a different color for - the frame that window is on; or perhaps the same color was - specified but the window is on a different X server, and that X - server has different RGB values for the color from this one). - - DOMAIN defaults to the selected window if omitted. - - DOMAIN can be a frame or device, instead of a window. The value - returned for a such a domain is used in special circumstances when - a more specific domain does not apply; for example, a frame value - might be used for coloring a toolbar, which is conceptually - attached to a frame rather than a particular window. The value is - also useful in determining what the value would be for a - particular window within the frame or device, if it is not - overridden by a more specific specification. - - If PROPERTY does not name a built-in property, its value will - simply be returned unless it is a specifier object, in which case - it will be instanced using `specifier-instance'. - - Optional arguments DEFAULT and NO-FALLBACK are the same as in - `specifier-instance'. *Note Specifiers::. - - -File: lispref.info, Node: Face Convenience Functions, Next: Other Face Display Functions, Prev: Face Properties, Up: Faces - -Face Convenience Functions --------------------------- - - - Function: set-face-foreground face color &optional locale tag - how-to-add - - Function: set-face-background face color &optional locale tag - how-to-add - These functions set the foreground (respectively, background) - color of face FACE to COLOR. The argument COLOR should be a - string (the name of a color) or a color object as returned by - `make-color' (*note Colors::). - - - Function: set-face-background-pixmap face pixmap &optional locale - tag how-to-add - This function sets the background pixmap of face FACE to PIXMAP. - The argument PIXMAP should be a string (the name of a bitmap or - pixmap file; the directories listed in the variable - `x-bitmap-file-path' will be searched) or a glyph object as - returned by `make-glyph' (*note Glyphs::). The argument may also - be a list of the form `(WIDTH HEIGHT DATA)' where WIDTH and HEIGHT - are the size in pixels, and DATA is a string, containing the raw - bits of the bitmap. - - - Function: set-face-font face font &optional locale tag how-to-add - This function sets the font of face FACE. The argument FONT - should be a string or a font object as returned by `make-font' - (*note Fonts::). - - - Function: set-face-underline-p face underline-p &optional locale tag - how-to-add - This function sets the underline property of face FACE. - - - Function: face-foreground face &optional locale - - Function: face-background face &optional locale - These functions return the foreground (respectively, background) - color specifier of face FACE. *Note Colors::. - - - Function: face-background-pixmap face &optional locale - This function return the background-pixmap glyph object of face - FACE. - - - Function: face-font face &optional locale - This function returns the font specifier of face FACE. (Note: - This is not the same as the function `face-font' in FSF Emacs.) - *Note Fonts::. - - - Function: face-font-name face &optional domain - This function returns the name of the font of face FACE, or `nil' - if it is unspecified. This is basically equivalent to `(font-name - (face-font FACE) DOMAIN)' except that it does not cause an error - if FACE's font is `nil'. (This function is named `face-font' in - FSF Emacs.) - - - Function: face-underline-p face &optional locale - This function returns the underline property of face FACE. - - - Function: face-foreground-instance face &optional domain - - Function: face-background-instance face &optional domain - These functions return the foreground (respectively, background) - color specifier of face FACE. *Note Colors::. - - - Function: face-background-pixmap-instance face &optional domain - This function return the background-pixmap glyph object of face - FACE. - - - Function: face-font-instance face &optional domain - This function returns the font specifier of face FACE. *Note - Fonts::. - - -File: lispref.info, Node: Other Face Display Functions, Prev: Face Convenience Functions, Up: Faces - -Other Face Display Functions ----------------------------- - - - Function: invert-face face &optional locale - Swap the foreground and background colors of face FACE. If the - face doesn't specify both foreground and background, then its - foreground and background are set to the default background and - foreground. - - - Function: face-equal face1 face2 &optional domain - This returns `t' if the faces FACE1 and FACE2 will display in the - same way. DOMAIN is as in `face-property-instance'. - - - Function: face-differs-from-default-p face &optional domain - This returns `t' if the face FACE displays differently from the - default face. DOMAIN is as in `face-property-instance'. - - -File: lispref.info, Node: Fonts, Next: Colors, Prev: Faces, Up: Faces and Window-System Objects - -Fonts -===== - - This section describes how to work with font specifier and font -instance objects, which encapsulate fonts in the window system. - -* Menu: - -* Font Specifiers:: Specifying how a font will appear. -* Font Instances:: What a font specifier gets instanced as. -* Font Instance Names:: The name of a font instance. -* Font Instance Size:: The size of a font instance. -* Font Instance Characteristics:: Display characteristics of font instances. -* Font Convenience Functions:: Convenience functions that automatically - instance and retrieve the properties - of a font specifier. - - -File: lispref.info, Node: Font Specifiers, Next: Font Instances, Up: Fonts - -Font Specifiers ---------------- - - - Function: font-specifier-p object - This predicate returns `t' if OBJECT is a font specifier, and - `nil' otherwise. - - - Function: make-font-specifier spec-list - Return a new `font' specifier object with the given specification - list. SPEC-LIST can be a list of specifications (each of which is - a cons of a locale and a list of instantiators), a single - instantiator, or a list of instantiators. *Note Specifiers::, for - more information about specifiers. - - Valid instantiators for font specifiers are: - - * A string naming a font (e.g. under X this might be - "-*-courier-medium-r-*-*-*-140-*-*-*-*-iso8859-*" for a - 14-point upright medium-weight Courier font). - - * A font instance (use that instance directly if the device - matches, or use the string that generated it). - - * A vector of no elements (only on TTY's; this means to set no - font at all, thus using the "natural" font of the terminal's - text). - - * A vector of one element (a face to inherit from). - - -File: lispref.info, Node: Font Instances, Next: Font Instance Names, Prev: Font Specifiers, Up: Fonts - -Font Instances --------------- - - - Function: font-instance-p object - This predicate returns `t' if OBJECT is a font instance, and `nil' - otherwise. - - - Function: make-font-instance name &optional device noerror - This function creates a new font-instance object of the specified - name. DEVICE specifies the device this object applies to and - defaults to the selected device. An error is signalled if the - font is unknown or cannot be allocated; however, if NOERROR is - non-`nil', `nil' is simply returned in this case. - - The returned object is a normal, first-class lisp object. The way - you "deallocate" the font is the way you deallocate any other lisp - object: you drop all pointers to it and allow it to be garbage - collected. When these objects are GCed, the underlying X data is - deallocated as well. - - -File: lispref.info, Node: Font Instance Names, Next: Font Instance Size, Prev: Font Instances, Up: Fonts - -Font Instance Names -------------------- - - - Function: list-fonts pattern &optional device - This function returns a list of font names matching the given - pattern. DEVICE specifies which device to search for names, and - defaults to the currently selected device. - - - Function: font-instance-name font-instance - This function returns the name used to allocate FONT-INSTANCE. - - - Function: font-instance-truename font-instance - This function returns the canonical name of the given font - instance. Font names are patterns which may match any number of - fonts, of which the first found is used. This returns an - unambiguous name for that font (but not necessarily its only - unambiguous name). - - -File: lispref.info, Node: Font Instance Size, Next: Font Instance Characteristics, Prev: Font Instance Names, Up: Fonts - -Font Instance Size ------------------- - - - Function: x-font-size font - This function returns the nominal size of the given font. This is - done by parsing its name, so it's likely to lose. X fonts can be - specified (by the user) in either pixels or 10ths of points, and - this returns the first one it finds, so you have to decide which - units the returned value is measured in yourself ... - - - Function: x-find-larger-font font &optional device - This function loads a new, slightly larger version of the given - font (or font name). Returns the font if it succeeds, `nil' - otherwise. If scalable fonts are available, this returns a font - which is 1 point larger. Otherwise, it returns the next larger - version of this font that is defined. - - - Function: x-find-smaller-font font &optional device - This function loads a new, slightly smaller version of the given - font (or font name). Returns the font if it succeeds, `nil' - otherwise. If scalable fonts are available, this returns a font - which is 1 point smaller. Otherwise, it returns the next smaller - version of this font that is defined. - diff --git a/info/lispref.info-36 b/info/lispref.info-36 index e7c1c13..f80845e 100644 --- a/info/lispref.info-36 +++ b/info/lispref.info-36 @@ -50,12 +50,530 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Merging Faces, Next: Basic Face Functions, Up: Faces + +Merging Faces for Display +------------------------- + + Here are all the ways to specify which face to use for display of +text: + + * With defaults. Each frame has a "default face", which is used for + all text that doesn't somehow specify another face. The face named + `default' applies to the text area, while the faces `left-margin' + and `right-margin' apply to the left and right margin areas. + + * With text properties. A character may have a `face' property; if + so, it's displayed with that face. (Text properties are actually + implemented in terms of extents.) *Note Text Properties::. + + * With extents. An extent may have a `face' property, which applies + to all the text covered by the extent; in addition, if the + `highlight' property is set, the `highlight' property applies when + the mouse moves over the extent or if the extent is explicitly + highlighted. *Note Extents::. + + * With annotations. Annotations that are inserted into a buffer can + specify their own face. (Annotations are actually implemented in + terms of extents.) *Note Annotations::. + + If these various sources together specify more than one face for a +particular character, XEmacs merges the properties of the various faces +specified. Extents, text properties, and annotations all use the same +underlying representation (as extents). When multiple extents cover one +character, an extent with higher priority overrides those with lower +priority. *Note Extents::. If no extent covers a particular character, +the `default' face is used. + + If a background pixmap is specified, it determines what will be +displayed in the background of text characters. If the background +pixmap is actually a pixmap, with its colors specified, those colors are +used; if it is a bitmap, the face's foreground and background colors are +used to color it. + + +File: lispref.info, Node: Basic Face Functions, Next: Face Properties, Prev: Merging Faces, Up: Faces + +Basic Functions for Working with Faces +-------------------------------------- + + The properties a face can specify include the font, the foreground +color, the background color, the background pixmap, the underlining, +the display table, and (for TTY devices) whether the text is to be +highlighted, dimmed, blinking, or displayed in reverse video. The face +can also leave these unspecified, causing them to assume the value of +the corresponding property of the `default' face. + + Here are the basic primitives for working with faces. + + - Function: make-face name &optional doc-string temporary + This function defines and returns a new face named NAME, initially + with all properties unspecified. It does nothing if there is + already a face named NAME. Optional argument DOC-STRING specifies + an explanatory string used for descriptive purposes. If optional + argument TEMPORARY is non-`nil', the face will automatically + disappear when there are no more references to it anywhere in text + or Lisp code (otherwise, the face will continue to exist + indefinitely even if it is not used). + + - Function: face-list &optional temporary + This function returns a list of the names of all defined faces. If + TEMPORARY is `nil', only the permanent faces are included. If it + is `t', only the temporary faces are included. If it is any other + non-`nil' value both permanent and temporary are included. + + - Function: facep object + This function returns `t' if OBJECT is a face, else `nil'. + + - Function: copy-face old-face new-name &optional locale tag-set + exact-p how-to-add + This function defines a new face named NEW-NAME which is a copy of + the existing face named OLD-FACE. If there is already a face + named NEW-NAME, then it alters the face to have the same + properties as OLD-FACE. + + LOCALE, TAG-SET, EXACT-P and HOW-TO-ADD let you copy just parts of + the old face rather than the whole face, and are as in + `copy-specifier' (*note Specifiers::). + + +File: lispref.info, Node: Face Properties, Next: Face Convenience Functions, Prev: Basic Face Functions, Up: Faces + +Face Properties +--------------- + + You can examine and modify the properties of an existing face with +the following functions. + + The following symbols have predefined meanings: + +`foreground' + The foreground color of the face. + +`background' + The background color of the face. + +`font' + The font used to display text covered by this face. + +`display-table' + The display table of the face. + +`background-pixmap' + The pixmap displayed in the background of the face. Only used by + faces on X devices. + +`underline' + Underline all text covered by this face. + +`highlight' + Highlight all text covered by this face. Only used by faces on TTY + devices. + +`dim' + Dim all text covered by this face. Only used by faces on TTY + devices. + +`blinking' + Blink all text covered by this face. Only used by faces on TTY + devices. + +`reverse' + Reverse the foreground and background colors. Only used by faces + on TTY devices. + +`doc-string' + Description of what the face's normal use is. NOTE: This is not a + specifier, unlike all the other built-in properties, and cannot + contain locale-specific values. + + - Function: set-face-property face property value &optional locale + tag-set how-to-add + This function changes a property of a FACE. + + For built-in properties, the actual value of the property is a + specifier and you cannot change this; but you can change the + specifications within the specifier, and that is what this + function will do. For user-defined properties, you can use this + function to either change the actual value of the property or, if + this value is a specifier, change the specifications within it. + + If PROPERTY is a built-in property, the specifications to be added + to this property can be supplied in many different ways: + + If VALUE is a simple instantiator (e.g. a string naming a + font or color) or a list of instantiators, then the + instantiator(s) will be added as a specification of the + property for the given LOCALE (which defaults to `global' if + omitted). + + If VALUE is a list of specifications (each of which is a cons + of a locale and a list of instantiators), then LOCALE must be + `nil' (it does not make sense to explicitly specify a locale + in this case), and specifications will be added as given. + + If VALUE is a specifier (as would be returned by + `face-property' if no LOCALE argument is given), then some or + all of the specifications in the specifier will be added to + the property. In this case, the function is really + equivalent to `copy-specifier' and LOCALE has the same + semantics (if it is a particular locale, the specification + for the locale will be copied; if a locale type, + specifications for all locales of that type will be copied; + if `nil' or `all', then all specifications will be copied). + + HOW-TO-ADD should be either `nil' or one of the symbols `prepend', + `append', `remove-tag-set-prepend', `remove-tag-set-append', + `remove-locale', `remove-locale-type', or `remove-all'. See + `copy-specifier' and `add-spec-to-specifier' for a description of + what each of these means. Most of the time, you do not need to + worry about this argument; the default behavior usually is fine. + + In general, it is OK to pass an instance object (e.g. as returned + by `face-property-instance') as an instantiator in place of an + actual instantiator. In such a case, the instantiator used to + create that instance object will be used (for example, if you set + a font-instance object as the value of the `font' property, then + the font name used to create that object will be used instead). + If some cases, however, doing this conversion does not make sense, + and this will be noted in the documentation for particular types + of instance objects. + + If PROPERTY is not a built-in property, then this function will + simply set its value if LOCALE is `nil'. However, if LOCALE is + given, then this function will attempt to add VALUE as the + instantiator for the given LOCALE, using `add-spec-to-specifier'. + If the value of the property is not a specifier, it will + automatically be converted into a `generic' specifier. + + - Function: remove-face-property face property &optional locale + tag-set exact-p + This function removes a property of a FACE. + + For built-in properties, this is analogous to `remove-specifier'. + For more information, *Note Other Specification Functions::. + + When PROPERTY is not a built-in property, this function will just + remove its value if LOCALE is `nil' or `all'. However, if LOCALE + is other than that, this function will attempt to remove VALUE as + the instantiator for the given LOCALE with `remove-specifier'. If + the value of the property is not a specifier, it will be converted + into a `generic' specifier automatically. + + - Function: face-property face property &optional locale tag-set + exact-p + This function returns FACE's value of the given PROPERTY. + + If LOCALE is omitted, the FACE's actual value for PROPERTY will be + returned. For built-in properties, this will be a specifier + object of a type appropriate to the property (e.g. a font or color + specifier). For other properties, this could be anything. + + If LOCALE is supplied, then instead of returning the actual value, + the specification(s) for the given locale or locale type will be + returned. This will only work if the actual value of PROPERTY is + a specifier (this will always be the case for built-in properties, + but not or not may apply to user-defined properties). If the + actual value of PROPERTY is not a specifier, this value will + simply be returned regardless of LOCALE. + + The return value will be a list of instantiators (e.g. strings + specifying a font or color name), or a list of specifications, + each of which is a cons of a locale and a list of instantiators. + Specifically, if LOCALE is a particular locale (a buffer, window, + frame, device, or `global'), a list of instantiators for that + locale will be returned. Otherwise, if LOCALE is a locale type + (one of the symbols `buffer', `window', `frame', or `device'), the + specifications for all locales of that type will be returned. + Finally, if LOCALE is `all', the specifications for all locales of + all types will be returned. + + The specifications in a specifier determine what the value of + PROPERTY will be in a particular "domain" or set of circumstances, + which is typically a particular Emacs window along with the buffer + it contains and the frame and device it lies within. The value is + derived from the instantiator associated with the most specific + locale (in the order buffer, window, frame, device, and `global') + that matches the domain in question. In other words, given a + domain (i.e. an Emacs window, usually), the specifier for PROPERTY + will first be searched for a specification whose locale is the + buffer contained within that window; then for a specification + whose locale is the window itself; then for a specification whose + locale is the frame that the window is contained within; etc. The + first instantiator that is valid for the domain (usually this + means that the instantiator is recognized by the device [i.e. the + X server or TTY device] that the domain is on). The function + `face-property-instance' actually does all this, and is used to + determine how to display the face. + + - Function: face-property-instance face property &optional domain + default no-fallback + This function returns the instance of FACE's PROPERTY in the + specified DOMAIN. + + Under most circumstances, DOMAIN will be a particular window, and + the returned instance describes how the specified property + actually is displayed for that window and the particular buffer in + it. Note that this may not be the same as how the property + appears when the buffer is displayed in a different window or + frame, or how the property appears in the same window if you + switch to another buffer in that window; and in those cases, the + returned instance would be different. + + The returned instance will typically be a color-instance, + font-instance, or pixmap-instance object, and you can query it + using the appropriate object-specific functions. For example, you + could use `color-instance-rgb-components' to find out the RGB + (red, green, and blue) components of how the `background' property + of the `highlight' face is displayed in a particular window. The + results might be different from the results you would get for + another window (perhaps the user specified a different color for + the frame that window is on; or perhaps the same color was + specified but the window is on a different X server, and that X + server has different RGB values for the color from this one). + + DOMAIN defaults to the selected window if omitted. + + DOMAIN can be a frame or device, instead of a window. The value + returned for a such a domain is used in special circumstances when + a more specific domain does not apply; for example, a frame value + might be used for coloring a toolbar, which is conceptually + attached to a frame rather than a particular window. The value is + also useful in determining what the value would be for a + particular window within the frame or device, if it is not + overridden by a more specific specification. + + If PROPERTY does not name a built-in property, its value will + simply be returned unless it is a specifier object, in which case + it will be instanced using `specifier-instance'. + + Optional arguments DEFAULT and NO-FALLBACK are the same as in + `specifier-instance'. *Note Specifiers::. + + +File: lispref.info, Node: Face Convenience Functions, Next: Other Face Display Functions, Prev: Face Properties, Up: Faces + +Face Convenience Functions +-------------------------- + + - Command: set-face-foreground face color &optional locale tag-set + how-to-add + - Command: set-face-background face color &optional locale tag-set + how-to-add + These functions set the foreground (respectively, background) + color of face FACE to COLOR. The argument COLOR should be a + string (the name of a color) or a color object as returned by + `make-color' (*note Colors::). + + - Command: set-face-background-pixmap face pixmap &optional locale + tag-set how-to-add + This function sets the background pixmap of face FACE to PIXMAP. + The argument PIXMAP should be a string (the name of a bitmap or + pixmap file; the directories listed in the variable + `x-bitmap-file-path' will be searched) or a glyph object as + returned by `make-glyph' (*note Glyphs::). The argument may also + be a list of the form `(WIDTH HEIGHT DATA)' where WIDTH and HEIGHT + are the size in pixels, and DATA is a string, containing the raw + bits of the bitmap. + + - Command: set-face-font face font &optional locale tag-set how-to-add + This function sets the font of face FACE. The argument FONT + should be a string or a font object as returned by `make-font' + (*note Fonts::). + + - Command: set-face-underline-p face underline-p &optional locale + tag-set how-to-add + This function sets the underline property of face FACE. + + - Function: face-foreground face &optional locale tag-set exact-p + - Function: face-background face &optional locale tag-set exact-p + These functions return the foreground (respectively, background) + color specifier of face FACE. *Note Colors::. + + - Function: face-background-pixmap face &optional locale tag-set + exact-p + This function return the background-pixmap glyph object of face + FACE. + + - Function: face-font face &optional locale tag-set exact-p + This function returns the font specifier of face FACE. (Note: + This is not the same as the function `face-font' in FSF Emacs.) + + *Note Fonts::. + + - Function: face-font-name face &optional domain + This function returns the name of the font of face FACE, or `nil' + if it is unspecified. This is basically equivalent to `(font-name + (face-font FACE) DOMAIN)' except that it does not cause an error + if FACE's font is `nil'. (This function is named `face-font' in + FSF Emacs.) + + - Function: face-underline-p face &optional locale + This function returns the underline property of face FACE. + + - Function: face-foreground-instance face &optional domain + - Function: face-background-instance face &optional domain + These functions return the foreground (respectively, background) + color specifier of face FACE. *Note Colors::. + + - Function: face-background-pixmap-instance face &optional domain + This function return the background-pixmap glyph object of face + FACE. + + - Function: face-font-instance face &optional domain + This function returns the font specifier of face FACE. *Note + Fonts::. + + +File: lispref.info, Node: Other Face Display Functions, Prev: Face Convenience Functions, Up: Faces + +Other Face Display Functions +---------------------------- + + - Command: invert-face face &optional locale + Swap the foreground and background colors of face FACE. If the + face doesn't specify both foreground and background, then its + foreground and background are set to the default background and + foreground. + + - Function: face-equal face1 face2 &optional domain + This returns `t' if the faces FACE1 and FACE2 will display in the + same way. DOMAIN is as in `face-property-instance'. + + - Function: face-differs-from-default-p face &optional domain + This returns `t' if the face FACE displays differently from the + default face. DOMAIN is as in `face-property-instance'. + + +File: lispref.info, Node: Fonts, Next: Colors, Prev: Faces, Up: Faces and Window-System Objects + +Fonts +===== + + This section describes how to work with font specifier and font +instance objects, which encapsulate fonts in the window system. + +* Menu: + +* Font Specifiers:: Specifying how a font will appear. +* Font Instances:: What a font specifier gets instanced as. +* Font Instance Names:: The name of a font instance. +* Font Instance Size:: The size of a font instance. +* Font Instance Characteristics:: Display characteristics of font instances. +* Font Convenience Functions:: Convenience functions that automatically + instance and retrieve the properties + of a font specifier. + + +File: lispref.info, Node: Font Specifiers, Next: Font Instances, Up: Fonts + +Font Specifiers +--------------- + + - Function: font-specifier-p object + This predicate returns `t' if OBJECT is a font specifier, and + `nil' otherwise. + + - Function: make-font-specifier spec-list + Return a new `font' specifier object with the given specification + list. SPEC-LIST can be a list of specifications (each of which is + a cons of a locale and a list of instantiators), a single + instantiator, or a list of instantiators. *Note Specifiers::, for + more information about specifiers. + + Valid instantiators for font specifiers are: + + * A string naming a font (e.g. under X this might be + "-*-courier-medium-r-*-*-*-140-*-*-*-*-iso8859-*" for a + 14-point upright medium-weight Courier font). + + * A font instance (use that instance directly if the device + matches, or use the string that generated it). + + * A vector of no elements (only on TTY's; this means to set no + font at all, thus using the "natural" font of the terminal's + text). + + * A vector of one element (a face to inherit from). + + +File: lispref.info, Node: Font Instances, Next: Font Instance Names, Prev: Font Specifiers, Up: Fonts + +Font Instances +-------------- + + - Function: font-instance-p object + This predicate returns `t' if OBJECT is a font instance, and `nil' + otherwise. + + - Function: make-font-instance name &optional device noerror + This function creates a new font-instance object of the specified + name. DEVICE specifies the device this object applies to and + defaults to the selected device. An error is signalled if the + font is unknown or cannot be allocated; however, if NOERROR is + non-`nil', `nil' is simply returned in this case. + + The returned object is a normal, first-class lisp object. The way + you "deallocate" the font is the way you deallocate any other lisp + object: you drop all pointers to it and allow it to be garbage + collected. When these objects are GCed, the underlying X data is + deallocated as well. + + +File: lispref.info, Node: Font Instance Names, Next: Font Instance Size, Prev: Font Instances, Up: Fonts + +Font Instance Names +------------------- + + - Function: list-fonts pattern &optional device + This function returns a list of font names matching the given + pattern. DEVICE specifies which device to search for names, and + defaults to the currently selected device. + + - Function: font-instance-name font-instance + This function returns the name used to allocate FONT-INSTANCE. + + - Function: font-instance-truename font-instance + This function returns the canonical name of the given font + instance. Font names are patterns which may match any number of + fonts, of which the first found is used. This returns an + unambiguous name for that font (but not necessarily its only + unambiguous name). + + +File: lispref.info, Node: Font Instance Size, Next: Font Instance Characteristics, Prev: Font Instance Names, Up: Fonts + +Font Instance Size +------------------ + + - Function: x-font-size font + This function returns the nominal size of the given font. This is + done by parsing its name, so it's likely to lose. X fonts can be + specified (by the user) in either pixels or 10ths of points, and + this returns the first one it finds, so you have to decide which + units the returned value is measured in yourself ... + + - Function: x-find-larger-font font &optional device + This function loads a new, slightly larger version of the given + font (or font name). Returns the font if it succeeds, `nil' + otherwise. If scalable fonts are available, this returns a font + which is 1 point larger. Otherwise, it returns the next larger + version of this font that is defined. + + - Function: x-find-smaller-font font &optional device + This function loads a new, slightly smaller version of the given + font (or font name). Returns the font if it succeeds, `nil' + otherwise. If scalable fonts are available, this returns a font + which is 1 point smaller. Otherwise, it returns the next smaller + version of this font that is defined. + + File: lispref.info, Node: Font Instance Characteristics, Next: Font Convenience Functions, Prev: Font Instance Size, Up: Fonts Font Instance Characteristics ----------------------------- - - Function: font-instance-properties font + - Function: font-instance-properties font-instance This function returns the properties (an alist or `nil') of FONT-INSTANCE. @@ -172,7 +690,7 @@ Color Specifiers inherit from (if omitted, defaults to the same property that this face-boolean specifier is used for; if this specifier is not part of a face, the instantiator would not be valid), and - optionally a value which, if non-nil, means to invert the + optionally a value which, if non-`nil', means to invert the sense of the inherited property. @@ -511,312 +1029,3 @@ Creating Glyphs pointer glyph. Instead, you probably want to be calling `set-glyph-image' on an existing glyph, e.g. `text-pointer-glyph'. - -File: lispref.info, Node: Glyph Properties, Next: Glyph Convenience Functions, Prev: Creating Glyphs, Up: Glyph Functions - -Glyph Properties ----------------- - - Each glyph has a list of properties, which control all of the -aspects of the glyph's appearance. The following symbols have -predefined meanings: - -`image' - The image used to display the glyph. - -`baseline' - Percent above baseline that glyph is to be displayed. Only for - glyphs displayed inside of a buffer. - -`contrib-p' - Whether the glyph contributes to the height of the line it's on. - Only for glyphs displayed inside of a buffer. - -`face' - Face of this glyph (_not_ a specifier). - - - Function: set-glyph-property glyph property value &optional locale - tag-set how-to-add - This function changes a property of a GLYPH. - - For built-in properties, the actual value of the property is a - specifier and you cannot change this; but you can change the - specifications within the specifier, and that is what this - function will do. For user-defined properties, you can use this - function to either change the actual value of the property or, if - this value is a specifier, change the specifications within it. - - If PROPERTY is a built-in property, the specifications to be added - to this property can be supplied in many different ways: - - * If VALUE is a simple instantiator (e.g. a string naming a - pixmap filename) or a list of instantiators, then the - instantiator(s) will be added as a specification of the - property for the given LOCALE (which defaults to `global' if - omitted). - - * If VALUE is a list of specifications (each of which is a cons - of a locale and a list of instantiators), then LOCALE must be - `nil' (it does not make sense to explicitly specify a locale - in this case), and specifications will be added as given. - - * If VALUE is a specifier (as would be returned by - `glyph-property' if no LOCALE argument is given), then some - or all of the specifications in the specifier will be added - to the property. In this case, the function is really - equivalent to `copy-specifier' and LOCALE has the same - semantics (if it is a particular locale, the specification - for the locale will be copied; if a locale type, - specifications for all locales of that type will be copied; - if `nil' or `all', then all specifications will be copied). - - HOW-TO-ADD should be either `nil' or one of the symbols `prepend', - `append', `remove-tag-set-prepend', `remove-tag-set-append', - `remove-locale', `remove-locale-type', or `remove-all'. See - `copy-specifier' and `add-spec-to-specifier' for a description of - what each of these means. Most of the time, you do not need to - worry about this argument; the default behavior usually is fine. - - In general, it is OK to pass an instance object (e.g. as returned - by `glyph-property-instance') as an instantiator in place of an - actual instantiator. In such a case, the instantiator used to - create that instance object will be used (for example, if you set - a font-instance object as the value of the `font' property, then - the font name used to create that object will be used instead). - If some cases, however, doing this conversion does not make sense, - and this will be noted in the documentation for particular types - of instance objects. - - If PROPERTY is not a built-in property, then this function will - simply set its value if LOCALE is `nil'. However, if LOCALE is - given, then this function will attempt to add VALUE as the - instantiator for the given LOCALE, using `add-spec-to-specifier'. - If the value of the property is not a specifier, it will - automatically be converted into a `generic' specifier. - - - Function: glyph-property glyph property &optional locale - This function returns GLYPH's value of the given PROPERTY. - - If LOCALE is omitted, the GLYPH's actual value for PROPERTY will - be returned. For built-in properties, this will be a specifier - object of a type appropriate to the property (e.g. a font or color - specifier). For other properties, this could be anything. - - If LOCALE is supplied, then instead of returning the actual value, - the specification(s) for the given locale or locale type will be - returned. This will only work if the actual value of PROPERTY is - a specifier (this will always be the case for built-in properties, - but may or may not apply to user-defined properties). If the - actual value of PROPERTY is not a specifier, this value will - simply be returned regardless of LOCALE. - - The return value will be a list of instantiators (e.g. vectors - specifying pixmap data), or a list of specifications, each of - which is a cons of a locale and a list of instantiators. - Specifically, if LOCALE is a particular locale (a buffer, window, - frame, device, or `global'), a list of instantiators for that - locale will be returned. Otherwise, if LOCALE is a locale type - (one of the symbols `buffer', `window', `frame', or `device'), the - specifications for all locales of that type will be returned. - Finally, if LOCALE is `all', the specifications for all locales of - all types will be returned. - - The specifications in a specifier determine what the value of - PROPERTY will be in a particular "domain" or set of circumstances, - which is typically a particular Emacs window along with the buffer - it contains and the frame and device it lies within. The value is - derived from the instantiator associated with the most specific - locale (in the order buffer, window, frame, device, and `global') - that matches the domain in question. In other words, given a - domain (i.e. an Emacs window, usually), the specifier for PROPERTY - will first be searched for a specification whose locale is the - buffer contained within that window; then for a specification - whose locale is the window itself; then for a specification whose - locale is the frame that the window is contained within; etc. The - first instantiator that is valid for the domain (usually this - means that the instantiator is recognized by the device [i.e. the - X server or TTY device] that the domain is on). The function - `glyph-property-instance' actually does all this, and is used to - determine how to display the glyph. - - - Function: glyph-property-instance glyph property &optional domain - default no-fallback - This function returns the instance of GLYPH's PROPERTY in the - specified DOMAIN. - - Under most circumstances, DOMAIN will be a particular window, and - the returned instance describes how the specified property - actually is displayed for that window and the particular buffer in - it. Note that this may not be the same as how the property - appears when the buffer is displayed in a different window or - frame, or how the property appears in the same window if you - switch to another buffer in that window; and in those cases, the - returned instance would be different. - - The returned instance is an image-instance object, and you can - query it using the appropriate image instance functions. For - example, you could use `image-instance-depth' to find out the - depth (number of color planes) of a pixmap displayed in a - particular window. The results might be different from the - results you would get for another window (perhaps the user - specified a different image for the frame that window is on; or - perhaps the same image was specified but the window is on a - different X server, and that X server has different color - capabilities from this one). - - DOMAIN defaults to the selected window if omitted. - - DOMAIN can be a frame or device, instead of a window. The value - returned for such a domain is used in special circumstances when a - more specific domain does not apply; for example, a frame value - might be used for coloring a toolbar, which is conceptually - attached to a frame rather than a particular window. The value is - also useful in determining what the value would be for a - particular window within the frame or device, if it is not - overridden by a more specific specification. - - If PROPERTY does not name a built-in property, its value will - simply be returned unless it is a specifier object, in which case - it will be instanced using `specifier-instance'. - - Optional arguments DEFAULT and NO-FALLBACK are the same as in - `specifier-instance'. *Note Specifiers::. - - - Function: remove-glyph-property glyph property &optional locale - tag-set exact-p - This function removes a property from a glyph. For built-in - properties, this is analogous to `remove-specifier'. *Note - remove-specifier-p: Specifiers, for the meaning of the LOCALE, - TAG-SET, and EXACT-P arguments. - - -File: lispref.info, Node: Glyph Convenience Functions, Next: Glyph Dimensions, Prev: Glyph Properties, Up: Glyph Functions - -Glyph Convenience Functions ---------------------------- - - The following functions are provided for working with specific -properties of a glyph. Note that these are exactly like calling the -general functions described above and passing in the appropriate value -for PROPERTY. - - Remember that if you want to determine the "value" of a specific -glyph property, you probably want to use the `*-instance' functions. -For example, to determine whether a glyph contributes to its line -height, use `glyph-contrib-p-instance', not `glyph-contrib-p'. (The -latter will return a boolean specifier or a list of specifications, and -you probably aren't concerned with these.) - - - Function: glyph-image glyph &optional locale - This function is equivalent to calling `glyph-property' with a - property of `image'. The return value will be an image specifier - if LOCALE is `nil' or omitted; otherwise, it will be a - specification or list of specifications. - - - Function: set-glyph-image glyph spec &optional locale tag-set - how-to-add - This function is equivalent to calling `set-glyph-property' with a - property of `image'. - - - Function: glyph-image-instance glyph &optional domain default - no-fallback - This function returns the instance of GLYPH's image in the given - DOMAIN, and is equivalent to calling `glyph-property-instance' - with a property of `image'. The return value will be an image - instance. - - Normally DOMAIN will be a window or `nil' (meaning the selected - window), and an instance object describing how the image appears - in that particular window and buffer will be returned. - - - Function: glyph-contrib-p glyph &optional locale - This function is equivalent to calling `glyph-property' with a - property of `contrib-p'. The return value will be a boolean - specifier if LOCALE is `nil' or omitted; otherwise, it will be a - specification or list of specifications. - - - Function: set-glyph-contrib-p glyph spec &optional locale tag-set - how-to-add - This function is equivalent to calling `set-glyph-property' with a - property of `contrib-p'. - - - Function: glyph-contrib-p-instance glyph &optional domain default - no-fallback - This function returns whether the glyph contributes to its line - height in the given DOMAIN, and is equivalent to calling - `glyph-property-instance' with a property of `contrib-p'. The - return value will be either `nil' or `t'. (Normally DOMAIN will be - a window or `nil', meaning the selected window.) - - - Function: glyph-baseline glyph &optional locale - This function is equivalent to calling `glyph-property' with a - property of `baseline'. The return value will be a specifier if - LOCALE is `nil' or omitted; otherwise, it will be a specification - or list of specifications. - - - Function: set-glyph-baseline glyph spec &optional locale tag-set - how-to-add - This function is equivalent to calling `set-glyph-property' with a - property of `baseline'. - - - Function: glyph-baseline-instance glyph &optional domain default - no-fallback - This function returns the instance of GLYPH's baseline value in - the given DOMAIN, and is equivalent to calling - `glyph-property-instance' with a property of `baseline'. The - return value will be an integer or `nil'. - - Normally DOMAIN will be a window or `nil' (meaning the selected - window), and an instance object describing the baseline value - appears in that particular window and buffer will be returned. - - - Function: glyph-face glyph - This function returns the face of GLYPH. (Remember, this is not a - specifier, but a simple property.) - - - Function: set-glyph-face glyph face - This function changes the face of GLYPH to FACE. - - -File: lispref.info, Node: Glyph Dimensions, Prev: Glyph Convenience Functions, Up: Glyph Functions - -Glyph Dimensions ----------------- - - - Function: glyph-width glyph &optional window - This function returns the width of GLYPH on WINDOW. This may not - be exact as it does not take into account all of the context that - redisplay will. - - - Function: glyph-ascent glyph &optional window - This function returns the ascent value of GLYPH on WINDOW. This - may not be exact as it does not take into account all of the - context that redisplay will. - - - Function: glyph-descent glyph &optional window - This function returns the descent value of GLYPH on WINDOW. This - may not be exact as it does not take into account all of the - context that redisplay will. - - - Function: glyph-height glyph &optional window - This function returns the height of GLYPH on WINDOW. (This is - equivalent to the sum of the ascent and descent values.) This may - not be exact as it does not take into account all of the context - that redisplay will. - - -File: lispref.info, Node: Images, Next: Glyph Types, Prev: Glyph Functions, Up: Glyphs - -Images -====== - -* Menu: - -* Image Specifiers:: Specifying how an image will appear. -* Image Instantiator Conversion:: - Conversion is applied to image instantiators - at the time they are added to an - image specifier or at the time they - are passed to `make-image-instance'. -* Image Instances:: What an image specifier gets instanced as. - diff --git a/info/lispref.info-37 b/info/lispref.info-37 index d4e9b21..1ba7a7d 100644 --- a/info/lispref.info-37 +++ b/info/lispref.info-37 @@ -50,6 +50,315 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Glyph Properties, Next: Glyph Convenience Functions, Prev: Creating Glyphs, Up: Glyph Functions + +Glyph Properties +---------------- + + Each glyph has a list of properties, which control all of the +aspects of the glyph's appearance. The following symbols have +predefined meanings: + +`image' + The image used to display the glyph. + +`baseline' + Percent above baseline that glyph is to be displayed. Only for + glyphs displayed inside of a buffer. + +`contrib-p' + Whether the glyph contributes to the height of the line it's on. + Only for glyphs displayed inside of a buffer. + +`face' + Face of this glyph (_not_ a specifier). + + - Function: set-glyph-property glyph property value &optional locale + tag-set how-to-add + This function changes a property of a GLYPH. + + For built-in properties, the actual value of the property is a + specifier and you cannot change this; but you can change the + specifications within the specifier, and that is what this + function will do. For user-defined properties, you can use this + function to either change the actual value of the property or, if + this value is a specifier, change the specifications within it. + + If PROPERTY is a built-in property, the specifications to be added + to this property can be supplied in many different ways: + + * If VALUE is a simple instantiator (e.g. a string naming a + pixmap filename) or a list of instantiators, then the + instantiator(s) will be added as a specification of the + property for the given LOCALE (which defaults to `global' if + omitted). + + * If VALUE is a list of specifications (each of which is a cons + of a locale and a list of instantiators), then LOCALE must be + `nil' (it does not make sense to explicitly specify a locale + in this case), and specifications will be added as given. + + * If VALUE is a specifier (as would be returned by + `glyph-property' if no LOCALE argument is given), then some + or all of the specifications in the specifier will be added + to the property. In this case, the function is really + equivalent to `copy-specifier' and LOCALE has the same + semantics (if it is a particular locale, the specification + for the locale will be copied; if a locale type, + specifications for all locales of that type will be copied; + if `nil' or `all', then all specifications will be copied). + + HOW-TO-ADD should be either `nil' or one of the symbols `prepend', + `append', `remove-tag-set-prepend', `remove-tag-set-append', + `remove-locale', `remove-locale-type', or `remove-all'. See + `copy-specifier' and `add-spec-to-specifier' for a description of + what each of these means. Most of the time, you do not need to + worry about this argument; the default behavior usually is fine. + + In general, it is OK to pass an instance object (e.g. as returned + by `glyph-property-instance') as an instantiator in place of an + actual instantiator. In such a case, the instantiator used to + create that instance object will be used (for example, if you set + a font-instance object as the value of the `font' property, then + the font name used to create that object will be used instead). + If some cases, however, doing this conversion does not make sense, + and this will be noted in the documentation for particular types + of instance objects. + + If PROPERTY is not a built-in property, then this function will + simply set its value if LOCALE is `nil'. However, if LOCALE is + given, then this function will attempt to add VALUE as the + instantiator for the given LOCALE, using `add-spec-to-specifier'. + If the value of the property is not a specifier, it will + automatically be converted into a `generic' specifier. + + - Function: glyph-property glyph property &optional locale + This function returns GLYPH's value of the given PROPERTY. + + If LOCALE is omitted, the GLYPH's actual value for PROPERTY will + be returned. For built-in properties, this will be a specifier + object of a type appropriate to the property (e.g. a font or color + specifier). For other properties, this could be anything. + + If LOCALE is supplied, then instead of returning the actual value, + the specification(s) for the given locale or locale type will be + returned. This will only work if the actual value of PROPERTY is + a specifier (this will always be the case for built-in properties, + but may or may not apply to user-defined properties). If the + actual value of PROPERTY is not a specifier, this value will + simply be returned regardless of LOCALE. + + The return value will be a list of instantiators (e.g. vectors + specifying pixmap data), or a list of specifications, each of + which is a cons of a locale and a list of instantiators. + Specifically, if LOCALE is a particular locale (a buffer, window, + frame, device, or `global'), a list of instantiators for that + locale will be returned. Otherwise, if LOCALE is a locale type + (one of the symbols `buffer', `window', `frame', or `device'), the + specifications for all locales of that type will be returned. + Finally, if LOCALE is `all', the specifications for all locales of + all types will be returned. + + The specifications in a specifier determine what the value of + PROPERTY will be in a particular "domain" or set of circumstances, + which is typically a particular Emacs window along with the buffer + it contains and the frame and device it lies within. The value is + derived from the instantiator associated with the most specific + locale (in the order buffer, window, frame, device, and `global') + that matches the domain in question. In other words, given a + domain (i.e. an Emacs window, usually), the specifier for PROPERTY + will first be searched for a specification whose locale is the + buffer contained within that window; then for a specification + whose locale is the window itself; then for a specification whose + locale is the frame that the window is contained within; etc. The + first instantiator that is valid for the domain (usually this + means that the instantiator is recognized by the device [i.e. the + X server or TTY device] that the domain is on). The function + `glyph-property-instance' actually does all this, and is used to + determine how to display the glyph. + + - Function: glyph-property-instance glyph property &optional domain + default no-fallback + This function returns the instance of GLYPH's PROPERTY in the + specified DOMAIN. + + Under most circumstances, DOMAIN will be a particular window, and + the returned instance describes how the specified property + actually is displayed for that window and the particular buffer in + it. Note that this may not be the same as how the property + appears when the buffer is displayed in a different window or + frame, or how the property appears in the same window if you + switch to another buffer in that window; and in those cases, the + returned instance would be different. + + The returned instance is an image-instance object, and you can + query it using the appropriate image instance functions. For + example, you could use `image-instance-depth' to find out the + depth (number of color planes) of a pixmap displayed in a + particular window. The results might be different from the + results you would get for another window (perhaps the user + specified a different image for the frame that window is on; or + perhaps the same image was specified but the window is on a + different X server, and that X server has different color + capabilities from this one). + + DOMAIN defaults to the selected window if omitted. + + DOMAIN can be a frame or device, instead of a window. The value + returned for such a domain is used in special circumstances when a + more specific domain does not apply; for example, a frame value + might be used for coloring a toolbar, which is conceptually + attached to a frame rather than a particular window. The value is + also useful in determining what the value would be for a + particular window within the frame or device, if it is not + overridden by a more specific specification. + + If PROPERTY does not name a built-in property, its value will + simply be returned unless it is a specifier object, in which case + it will be instanced using `specifier-instance'. + + Optional arguments DEFAULT and NO-FALLBACK are the same as in + `specifier-instance'. *Note Specifiers::. + + - Function: remove-glyph-property glyph property &optional locale + tag-set exact-p + This function removes a property from a glyph. For built-in + properties, this is analogous to `remove-specifier'. *Note + remove-specifier-p: Specifiers, for the meaning of the LOCALE, + TAG-SET, and EXACT-P arguments. + + +File: lispref.info, Node: Glyph Convenience Functions, Next: Glyph Dimensions, Prev: Glyph Properties, Up: Glyph Functions + +Glyph Convenience Functions +--------------------------- + + The following functions are provided for working with specific +properties of a glyph. Note that these are exactly like calling the +general functions described above and passing in the appropriate value +for PROPERTY. + + Remember that if you want to determine the "value" of a specific +glyph property, you probably want to use the `*-instance' functions. +For example, to determine whether a glyph contributes to its line +height, use `glyph-contrib-p-instance', not `glyph-contrib-p'. (The +latter will return a boolean specifier or a list of specifications, and +you probably aren't concerned with these.) + + - Function: glyph-image glyph &optional locale + This function is equivalent to calling `glyph-property' with a + property of `image'. The return value will be an image specifier + if LOCALE is `nil' or omitted; otherwise, it will be a + specification or list of specifications. + + - Function: set-glyph-image glyph spec &optional locale tag-set + how-to-add + This function is equivalent to calling `set-glyph-property' with a + property of `image'. + + - Function: glyph-image-instance glyph &optional domain default + no-fallback + This function returns the instance of GLYPH's image in the given + DOMAIN, and is equivalent to calling `glyph-property-instance' + with a property of `image'. The return value will be an image + instance. + + Normally DOMAIN will be a window or `nil' (meaning the selected + window), and an instance object describing how the image appears + in that particular window and buffer will be returned. + + - Function: glyph-contrib-p glyph &optional locale + This function is equivalent to calling `glyph-property' with a + property of `contrib-p'. The return value will be a boolean + specifier if LOCALE is `nil' or omitted; otherwise, it will be a + specification or list of specifications. + + - Function: set-glyph-contrib-p glyph spec &optional locale tag-set + how-to-add + This function is equivalent to calling `set-glyph-property' with a + property of `contrib-p'. + + - Function: glyph-contrib-p-instance glyph &optional domain default + no-fallback + This function returns whether the glyph contributes to its line + height in the given DOMAIN, and is equivalent to calling + `glyph-property-instance' with a property of `contrib-p'. The + return value will be either `nil' or `t'. (Normally DOMAIN will be + a window or `nil', meaning the selected window.) + + - Function: glyph-baseline glyph &optional locale + This function is equivalent to calling `glyph-property' with a + property of `baseline'. The return value will be a specifier if + LOCALE is `nil' or omitted; otherwise, it will be a specification + or list of specifications. + + - Function: set-glyph-baseline glyph spec &optional locale tag-set + how-to-add + This function is equivalent to calling `set-glyph-property' with a + property of `baseline'. + + - Function: glyph-baseline-instance glyph &optional domain default + no-fallback + This function returns the instance of GLYPH's baseline value in + the given DOMAIN, and is equivalent to calling + `glyph-property-instance' with a property of `baseline'. The + return value will be an integer or `nil'. + + Normally DOMAIN will be a window or `nil' (meaning the selected + window), and an instance object describing the baseline value + appears in that particular window and buffer will be returned. + + - Function: glyph-face glyph + This function returns the face of GLYPH. (Remember, this is not a + specifier, but a simple property.) + + - Function: set-glyph-face glyph face + This function changes the face of GLYPH to FACE. + + +File: lispref.info, Node: Glyph Dimensions, Prev: Glyph Convenience Functions, Up: Glyph Functions + +Glyph Dimensions +---------------- + + - Function: glyph-width glyph &optional window + This function returns the width of GLYPH on WINDOW. This may not + be exact as it does not take into account all of the context that + redisplay will. + + - Function: glyph-ascent glyph &optional window + This function returns the ascent value of GLYPH on WINDOW. This + may not be exact as it does not take into account all of the + context that redisplay will. + + - Function: glyph-descent glyph &optional window + This function returns the descent value of GLYPH on WINDOW. This + may not be exact as it does not take into account all of the + context that redisplay will. + + - Function: glyph-height glyph &optional window + This function returns the height of GLYPH on WINDOW. (This is + equivalent to the sum of the ascent and descent values.) This may + not be exact as it does not take into account all of the context + that redisplay will. + + +File: lispref.info, Node: Images, Next: Glyph Types, Prev: Glyph Functions, Up: Glyphs + +Images +====== + +* Menu: + +* Image Specifiers:: Specifying how an image will appear. +* Image Instantiator Conversion:: + Conversion is applied to image instantiators + at the time they are added to an + image specifier or at the time they + are passed to `make-image-instance'. +* Image Instances:: What an image specifier gets instanced as. + + File: lispref.info, Node: Image Specifiers, Next: Image Instantiator Conversion, Up: Images Image Specifiers @@ -366,11 +675,15 @@ implies that the file must exist when the instantiator is added to the image, but does not need to exist at any other time (e.g. it may safely be a temporary file). - - Function: valid-image-instantiator-format-p format + - Function: valid-image-instantiator-format-p format &optional locale This function returns non-`nil' if FORMAT is a valid image - instantiator format. Note that the return value for many formats - listed above depends on whether XEmacs was compiled with support - for that format. + instantiator format. + + If LOCALE is non-`nil' then the format is checked in that locale. + If LOCALE is `nil' the current console is used. + + Note that the return value for many formats listed above depends on + whether XEmacs was compiled with support for that format. - Function: image-instantiator-format-list This function return a list of valid image-instantiator formats. @@ -391,10 +704,10 @@ be a temporary file). - Variable: x-bitmap-file-path A list of the directories in which X bitmap files may be found. - If nil, this is initialized from the `"*bitmapFilePath"' resource. - This is used by the `make-image-instance' function (however, note - that if the environment variable `XBMLANGPATH' is set, it is - consulted first). + If `nil', this is initialized from the `"*bitmapFilePath"' + resource. This is used by the `make-image-instance' function + (however, note that if the environment variable `XBMLANGPATH' is + set, it is consulted first).  File: lispref.info, Node: Image Instantiator Conversion, Next: Image Instances, Prev: Image Specifiers, Up: Images @@ -522,7 +835,7 @@ string, a mono pixmap, a color pixmap, etc. type `nothing'. - Function: widget-image-instance-p object - Return t if OBJECT is an image instance of type `widget'. + Return `t' if OBJECT is an image instance of type `widget'.  File: lispref.info, Node: Image Instance Functions, Prev: Image Instance Types, Up: Image Instances @@ -531,7 +844,7 @@ Image Instance Functions ........................ - Function: make-image-instance data &optional domain dest-types - no-error + noerror This function creates a new image-instance object. DATA is an image instantiator, which describes the image (*note @@ -589,10 +902,10 @@ Image Instance Functions #### We should fix this.) n If omitted, DOMAIN defaults to the selected window. - NO-ERROR controls what happens when the image cannot be generated. - If NIL, an error message is generated. If T, no messages are - generated and this function returns NIL. If anything else, a - warning message is generated and this function returns NIL. + NOERROR controls what happens when the image cannot be generated. + If `nil', an error message is generated. If `t', no messages are + generated and this function returns `nil'. If anything else, a + warning message is generated and this function returns `nil'. - Function: colorize-image-instance image-instance foreground background @@ -852,364 +1165,3 @@ can work with annotations without knowing how extents work. * Annotation Hooks:: Hooks called at certain times during an annotation's lifetime. - -File: lispref.info, Node: Annotation Basics, Next: Annotation Primitives, Up: Annotations - -Annotation Basics -================= - - Marginal annotations are notes associated with a particular location -in a buffer. They may be displayed in a margin created on the -left-hand or right-hand side of the frame, in any whitespace at the -beginning or end of a line, or inside of the text itself. Every -annotation may have an associated action to be performed when the -annotation is selected. The term "annotation" is used to refer to an -individual note. The term "margin" is generically used to refer to the -whitespace before the first character on a line or after the last -character on a line. - - Each annotation has the following characteristics: -GLYPH - This is a glyph object and is used as the displayed representation - of the annotation. - -DOWN-GLYPH - If given, this glyph is used as the displayed representation of - the annotation when the mouse is pressed down over the annotation. - -FACE - The face with which to display the glyph. - -SIDE - Which side of the text (left or right) the annotation is displayed - at. - -ACTION - If non-`nil', this field must contain a function capable of being - the first argument to `funcall'. This function is normally - evaluated with a single argument, the value of the DATA field, - each time the annotation is selected. However, if the WITH-EVENT - parameter to `make-annotation' is non-`nil', the function is - called with two arguments. The first argument is the same as - before, and the second argument is the event (a button-up event, - usually) that activated the annotation. - -DATA - Not used internally. This field can contain any E-Lisp object. - It is passed as the first argument to ACTION described above. - -MENU - A menu displayed when the right mouse button is pressed over the - annotation. - - The margin is divided into "outside" and "inside". The outside -margin is space on the left or right side of the frame which normal text -cannot be displayed in. The inside margin is that space between the -leftmost or rightmost point at which text can be displayed and where the -first or last character actually is. - - There are four different "layout types" which affect the exact -location an annotation appears. - -`outside-margin' - The annotation is placed in the outside margin area. as close as - possible to the edge of the frame. If the outside margin is not - wide enough for an annotation to fit, it is not displayed. - -`inside-margin' - The annotation is placed in the inside margin area, as close as - possible to the edge of the frame. If the inside margin is not - wide enough for the annotation to fit, it will be displayed using - any available outside margin space if and only if the specifier - `use-left-overflow' or `use-right-overflow' (depending on which - side the annotation appears in) is non-`nil'. - -`whitespace' - The annotation is placed in the inside margin area, as close as - possible to the first or last non-whitespace character on a line. - If the inside margin is not wide enough for the annotation to fit, - it will be displayed if and only if the specifier - `use-left-overflow' or `use-right-overflow' (depending on which - side the annotation appears in) is non-`nil'. - -`text' - The annotation is placed at the position it is inserted. It will - create enough space for itself inside of the text area. It does - not take up a place in the logical buffer, only in the display of - the buffer. - - The current layout policy is that all `whitespace' annotations are -displayed first. Next, all `inside-margin' annotations are displayed -using any remaining space. Finally as many `outside-margin' -annotations are displayed as possible. The `text' annotations will -always display as they create their own space to display in. - - -File: lispref.info, Node: Annotation Primitives, Next: Annotation Properties, Prev: Annotation Basics, Up: Annotations - -Annotation Primitives -===================== - - - Function: make-annotation glyph &optional position layout buffer - with-event d-glyph rightp - This function creates a marginal annotation at position POS in - BUFFER. The annotation is displayed using GLYPH, which should be - a glyph object or a string, and is positioned using layout policy - LAYOUT. If POS is `nil', point is used. If LAYOUT is `nil', - `whitespace' is used. If BUFFER is `nil', the current buffer is - used. - - If WITH-EVENT is non-`nil', then when an annotation is activated, - the triggering event is passed as the second arg to the annotation - function. If D-GLYPH is non-`nil' then it is used as the glyph - that will be displayed when button1 is down. If RIGHTP is - non-`nil' then the glyph will be displayed on the right side of - the buffer instead of the left. - - The newly created annotation is returned. - - - Function: delete-annotation annotation - This function removes ANNOTATION from its buffer. This does not - modify the buffer text. - - - Function: annotationp annotation - This function returns `t' if ANNOTATION is an annotation, `nil' - otherwise. - - -File: lispref.info, Node: Annotation Properties, Next: Margin Primitives, Prev: Annotation Primitives, Up: Annotations - -Annotation Properties -===================== - - - Function: annotation-glyph annotation - This function returns the glyph object used to display ANNOTATION. - - - Function: set-annotation-glyph annotation glyph &optional layout side - This function sets the glyph of ANNOTATION to GLYPH, which should - be a glyph object. If LAYOUT is non-`nil', set the layout policy - of ANNOTATION to LAYOUT. If SIDE is `left' or `right', change the - side of the buffer at which the annotation is displayed to the - given side. The new value of `annotation-glyph' is returned. - - - Function: annotation-down-glyph annotation - This function returns the glyph used to display ANNOTATION when - the left mouse button is depressed on the annotation. - - - Function: set-annotation-down-glyph annotation glyph - This function returns the glyph used to display ANNOTATION when - the left mouse button is depressed on the annotation to GLYPH, - which should be a glyph object. - - - Function: annotation-face annotation - This function returns the face associated with ANNOTATION. - - - Function: set-annotation-face annotation face - This function sets the face associated with ANNOTATION to FACE. - - - Function: annotation-layout annotation - This function returns the layout policy of ANNOTATION. - - - Function: set-annotation-layout annotation layout - This function sets the layout policy of ANNOTATION to LAYOUT. - - - Function: annotation-side annotation - This function returns the side of the buffer that ANNOTATION is - displayed on. Return value is a symbol, either `left' or `right'. - - - Function: annotation-data annotation - This function returns the data associated with ANNOTATION. - - - Function: set-annotation-data annotation data - This function sets the data field of ANNOTATION to DATA. DATA is - returned. - - - Function: annotation-action annotation - This function returns the action associated with ANNOTATION. - - - Function: set-annotation-action annotation action - This function sets the action field of ANNOTATION to ACTION. - ACTION is returned.. - - - Function: annotation-menu annotation - This function returns the menu associated with ANNOTATION. - - - Function: set-annotation-menu annotation menu - This function sets the menu associated with ANNOTATION to MENU. - This menu will be displayed when the right mouse button is pressed - over the annotation. - - - Function: annotation-visible annotation - This function returns `t' if there is enough available space to - display ANNOTATION, `nil' otherwise. - - - Function: annotation-width annotation - This function returns the width of ANNOTATION in pixels. - - - Function: hide-annotation annotation - This function removes ANNOTATION's glyph, making it invisible. - - - Function: reveal-annotation annotation - This function restores ANNOTATION's glyph, making it visible. - - -File: lispref.info, Node: Locating Annotations, Next: Annotation Hooks, Prev: Margin Primitives, Up: Annotations - -Locating Annotations -==================== - - - Function: annotations-in-region start end buffer - This function returns a list of all annotations in BUFFER which - are between START and END inclusively. - - - Function: annotations-at &optional position buffer - This function returns a list of all annotations at POSITION in - BUFFER. If POSITION is `nil' point is used. If BUFFER is `nil' - the current buffer is used. - - - Function: annotation-list &optional buffer - This function returns a list of all annotations in BUFFER. If - BUFFER is `nil', the current buffer is used. - - - Function: all-annotations - This function returns a list of all annotations in all buffers in - existence. - - -File: lispref.info, Node: Margin Primitives, Next: Locating Annotations, Prev: Annotation Properties, Up: Annotations - -Margin Primitives -================= - - The margin widths are controllable on a buffer-local, window-local, -frame-local, device-local, or device-type-local basis through the use -of specifiers. *Note Specifiers::. - - - Specifier: left-margin-width - This is a specifier variable controlling the width of the left - outside margin, in characters. Use `set-specifier' to change its - value. - - - Specifier: right-margin-width - This is a specifier variable controlling the width of the right - outside margin, in characters. Use `set-specifier' to change its - value. - - - Specifier: use-left-overflow - If non-`nil', use the left outside margin as extra whitespace when - displaying `whitespace' and `inside-margin' annotations. Defaults - to `nil'. This is a specifier variable; use `set-specifier' to - change its value. - - - Specifier: use-right-overflow - If non-`nil', use the right outside margin as extra whitespace when - displaying `whitespace' and `inside-margin' annotations. Defaults - to `nil'. This is a specifier variable; use `set-specifier' to - change its value. - - - Function: window-left-margin-pixel-width &optional window - This function returns the width in pixels of the left outside - margin of WINDOW. If WINDOW is `nil', the selected window is - assumed. - - - Function: window-right-margin-pixel-width &optional window - This function returns the width in pixels of the right outside - margin of WINDOW. If WINDOW is `nil', the selected window is - assumed. - - The margin colors are controlled by the faces `left-margin' and -`right-margin'. These can be set using the X resources -`Emacs.left-margin.background' and `Emacs.left-margin.foreground'; -likewise for the right margin. - - -File: lispref.info, Node: Annotation Hooks, Prev: Locating Annotations, Up: Annotations - -Annotation Hooks -================ - - The following three hooks are provided for use with the marginal -annotations: - -`before-delete-annotation-hook' - This hook is called immediately before an annotation is destroyed. - It is passed a single argument, the annotation being destroyed. - -`after-delete-annotation-hook' - This normal hook is called immediately after an annotation is - destroyed. - -`make-annotation-hook' - This hook is called immediately after an annotation is created. - It is passed a single argument, the newly created annotation. - - -File: lispref.info, Node: Display, Next: Hash Tables, Prev: Annotations, Up: Top - -Emacs Display -************* - - This chapter describes a number of other features related to the -display that XEmacs presents to the user. - -* Menu: - -* Refresh Screen:: Clearing the screen and redrawing everything on it. -* Truncation:: Folding or wrapping long text lines. -* The Echo Area:: Where messages are displayed. -* Warnings:: Display of Warnings. -* 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. -* Blinking:: How XEmacs shows the matching open parenthesis. -* Usual Display:: The usual conventions for displaying nonprinting chars. -* Display Tables:: How to specify other conventions. -* Beeping:: Audible signal to the user. - - -File: lispref.info, Node: Refresh Screen, Next: Truncation, Up: Display - -Refreshing the Screen -===================== - - The function `redraw-frame' redisplays the entire contents of a -given frame. *Note Frames::. - - - Function: redraw-frame frame - This function clears and redisplays frame FRAME. - - Even more powerful is `redraw-display': - - - Command: redraw-display &optional device - This function redraws all frames on DEVICE marked as having their - image garbled. DEVICE defaults to the selected device. If DEVICE - is `t', all devices will have their frames checked. - - 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 XEmacs also refreshes the screen. -Some terminal emulators record separate contents for display-oriented -programs such as XEmacs and for ordinary sequential display. If you are -using such a terminal, you might want to inhibit the redisplay on -resumption. *Note Suspending XEmacs::. - - - Variable: no-redraw-on-reenter - This variable controls whether XEmacs redraws the entire screen - after it has been suspended and resumed. Non-`nil' means yes, - `nil' means no. - - The above functions do not actually cause the display to be updated; -rather, they clear out the internal display records that XEmacs -maintains, so that the next time the display is updated it will be -redrawn from scratch. Normally this occurs the next time that -`next-event' or `sit-for' is called; however, a display update will not -occur if there is input pending. *Note Command Loop::. - - - Function: force-cursor-redisplay - This function causes an immediate update of the cursor on the - selected frame. (This function does not exist in FSF Emacs.) - diff --git a/info/lispref.info-38 b/info/lispref.info-38 index 289148a..85d95e3 100644 --- a/info/lispref.info-38 +++ b/info/lispref.info-38 @@ -50,6 +50,373 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Annotation Basics, Next: Annotation Primitives, Up: Annotations + +Annotation Basics +================= + + Marginal annotations are notes associated with a particular location +in a buffer. They may be displayed in a margin created on the +left-hand or right-hand side of the frame, in any whitespace at the +beginning or end of a line, or inside of the text itself. Every +annotation may have an associated action to be performed when the +annotation is selected. The term "annotation" is used to refer to an +individual note. The term "margin" is generically used to refer to the +whitespace before the first character on a line or after the last +character on a line. + + Each annotation has the following characteristics: +GLYPH + This is a glyph object and is used as the displayed representation + of the annotation. + +DOWN-GLYPH + If given, this glyph is used as the displayed representation of + the annotation when the mouse is pressed down over the annotation. + +FACE + The face with which to display the glyph. + +SIDE + Which side of the text (left or right) the annotation is displayed + at. + +ACTION + If non-`nil', this field must contain a function capable of being + the first argument to `funcall'. This function is normally + evaluated with a single argument, the value of the DATA field, + each time the annotation is selected. However, if the WITH-EVENT + parameter to `make-annotation' is non-`nil', the function is + called with two arguments. The first argument is the same as + before, and the second argument is the event (a button-up event, + usually) that activated the annotation. + +DATA + Not used internally. This field can contain any E-Lisp object. + It is passed as the first argument to ACTION described above. + +MENU + A menu displayed when the right mouse button is pressed over the + annotation. + + The margin is divided into "outside" and "inside". The outside +margin is space on the left or right side of the frame which normal text +cannot be displayed in. The inside margin is that space between the +leftmost or rightmost point at which text can be displayed and where the +first or last character actually is. + + There are four different "layout types" which affect the exact +location an annotation appears. + +`outside-margin' + The annotation is placed in the outside margin area. as close as + possible to the edge of the frame. If the outside margin is not + wide enough for an annotation to fit, it is not displayed. + +`inside-margin' + The annotation is placed in the inside margin area, as close as + possible to the edge of the frame. If the inside margin is not + wide enough for the annotation to fit, it will be displayed using + any available outside margin space if and only if the specifier + `use-left-overflow' or `use-right-overflow' (depending on which + side the annotation appears in) is non-`nil'. + +`whitespace' + The annotation is placed in the inside margin area, as close as + possible to the first or last non-whitespace character on a line. + If the inside margin is not wide enough for the annotation to fit, + it will be displayed if and only if the specifier + `use-left-overflow' or `use-right-overflow' (depending on which + side the annotation appears in) is non-`nil'. + +`text' + The annotation is placed at the position it is inserted. It will + create enough space for itself inside of the text area. It does + not take up a place in the logical buffer, only in the display of + the buffer. + + The current layout policy is that all `whitespace' annotations are +displayed first. Next, all `inside-margin' annotations are displayed +using any remaining space. Finally as many `outside-margin' +annotations are displayed as possible. The `text' annotations will +always display as they create their own space to display in. + + +File: lispref.info, Node: Annotation Primitives, Next: Annotation Properties, Prev: Annotation Basics, Up: Annotations + +Annotation Primitives +===================== + + - Function: make-annotation glyph &optional position layout buffer + with-event d-glyph rightp + This function creates a marginal annotation at position POSITION in + BUFFER. The annotation is displayed using GLYPH, which should be + a glyph object or a string, and is positioned using layout policy + LAYOUT. If POSITION is `nil', point is used. If LAYOUT is `nil', + `whitespace' is used. If BUFFER is `nil', the current buffer is + used. + + If WITH-EVENT is non-`nil', then when an annotation is activated, + the triggering event is passed as the second arg to the annotation + function. If D-GLYPH is non-`nil' then it is used as the glyph + that will be displayed when button1 is down. If RIGHTP is + non-`nil' then the glyph will be displayed on the right side of + the buffer instead of the left. + + The newly created annotation is returned. + + - Function: delete-annotation annotation + This function removes ANNOTATION from its buffer. This does not + modify the buffer text. + + - Function: annotationp annotation + This function returns `t' if ANNOTATION is an annotation, `nil' + otherwise. + + +File: lispref.info, Node: Annotation Properties, Next: Margin Primitives, Prev: Annotation Primitives, Up: Annotations + +Annotation Properties +===================== + + - Function: annotation-glyph annotation + This function returns the glyph object used to display ANNOTATION. + + - Function: set-annotation-glyph annotation glyph &optional layout side + This function sets the glyph of ANNOTATION to GLYPH, which should + be a glyph object. If LAYOUT is non-`nil', set the layout policy + of ANNOTATION to LAYOUT. If SIDE is `left' or `right', change the + side of the buffer at which the annotation is displayed to the + given side. The new value of `annotation-glyph' is returned. + + - Function: annotation-down-glyph annotation + This function returns the glyph used to display ANNOTATION when + the left mouse button is depressed on the annotation. + + - Function: set-annotation-down-glyph annotation glyph + This function returns the glyph used to display ANNOTATION when + the left mouse button is depressed on the annotation to GLYPH, + which should be a glyph object. + + - Function: annotation-face annotation + This function returns the face associated with ANNOTATION. + + - Function: set-annotation-face annotation face + This function sets the face associated with ANNOTATION to FACE. + + - Function: annotation-layout annotation + This function returns the layout policy of ANNOTATION. + + - Function: set-annotation-layout annotation layout + This function sets the layout policy of ANNOTATION to LAYOUT. + + - Function: annotation-side annotation + This function returns the side of the buffer that ANNOTATION is + displayed on. Return value is a symbol, either `left' or `right'. + + - Function: annotation-data annotation + This function returns the data associated with ANNOTATION. + + - Function: set-annotation-data annotation data + This function sets the data field of ANNOTATION to DATA. DATA is + returned. + + - Function: annotation-action annotation + This function returns the action associated with ANNOTATION. + + - Function: set-annotation-action annotation action + This function sets the action field of ANNOTATION to ACTION. + ACTION is returned.. + + - Function: annotation-menu annotation + This function returns the menu associated with ANNOTATION. + + - Function: set-annotation-menu annotation menu + This function sets the menu associated with ANNOTATION to MENU. + This menu will be displayed when the right mouse button is pressed + over the annotation. + + - Function: annotation-visible annotation + This function returns `t' if there is enough available space to + display ANNOTATION, `nil' otherwise. + + - Function: annotation-width annotation + This function returns the width of ANNOTATION in pixels. + + - Function: hide-annotation annotation + This function removes ANNOTATION's glyph, making it invisible. + + - Function: reveal-annotation annotation + This function restores ANNOTATION's glyph, making it visible. + + +File: lispref.info, Node: Locating Annotations, Next: Annotation Hooks, Prev: Margin Primitives, Up: Annotations + +Locating Annotations +==================== + + - Function: annotations-in-region start end buffer + This function returns a list of all annotations in BUFFER which + are between START and END inclusively. + + - Function: annotations-at &optional position buffer + This function returns a list of all annotations at POSITION in + BUFFER. If POSITION is `nil' point is used. If BUFFER is `nil' + the current buffer is used. + + - Function: annotation-list &optional buffer + This function returns a list of all annotations in BUFFER. If + BUFFER is `nil', the current buffer is used. + + - Function: all-annotations + This function returns a list of all annotations in all buffers in + existence. + + +File: lispref.info, Node: Margin Primitives, Next: Locating Annotations, Prev: Annotation Properties, Up: Annotations + +Margin Primitives +================= + + The margin widths are controllable on a buffer-local, window-local, +frame-local, device-local, or device-type-local basis through the use +of specifiers. *Note Specifiers::. + + - Specifier: left-margin-width + This is a specifier variable controlling the width of the left + outside margin, in characters. Use `set-specifier' to change its + value. + + - Specifier: right-margin-width + This is a specifier variable controlling the width of the right + outside margin, in characters. Use `set-specifier' to change its + value. + + - Specifier: use-left-overflow + If non-`nil', use the left outside margin as extra whitespace when + displaying `whitespace' and `inside-margin' annotations. Defaults + to `nil'. This is a specifier variable; use `set-specifier' to + change its value. + + - Specifier: use-right-overflow + If non-`nil', use the right outside margin as extra whitespace when + displaying `whitespace' and `inside-margin' annotations. Defaults + to `nil'. This is a specifier variable; use `set-specifier' to + change its value. + + - Function: window-left-margin-pixel-width &optional window + This function returns the width in pixels of the left outside + margin of WINDOW. If WINDOW is `nil', the selected window is + assumed. + + - Function: window-right-margin-pixel-width &optional window + This function returns the width in pixels of the right outside + margin of WINDOW. If WINDOW is `nil', the selected window is + assumed. + + The margin colors are controlled by the faces `left-margin' and +`right-margin'. These can be set using the X resources +`Emacs.left-margin.background' and `Emacs.left-margin.foreground'; +likewise for the right margin. + + +File: lispref.info, Node: Annotation Hooks, Prev: Locating Annotations, Up: Annotations + +Annotation Hooks +================ + + The following three hooks are provided for use with the marginal +annotations: + +`before-delete-annotation-hook' + This hook is called immediately before an annotation is destroyed. + It is passed a single argument, the annotation being destroyed. + +`after-delete-annotation-hook' + This normal hook is called immediately after an annotation is + destroyed. + +`make-annotation-hook' + This hook is called immediately after an annotation is created. + It is passed a single argument, the newly created annotation. + + +File: lispref.info, Node: Display, Next: Hash Tables, Prev: Annotations, Up: Top + +Emacs Display +************* + + This chapter describes a number of other features related to the +display that XEmacs presents to the user. + +* Menu: + +* Refresh Screen:: Clearing the screen and redrawing everything on it. +* Truncation:: Folding or wrapping long text lines. +* The Echo Area:: Where messages are displayed. +* Warnings:: Display of Warnings. +* 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. +* Blinking:: How XEmacs shows the matching open parenthesis. +* Usual Display:: The usual conventions for displaying nonprinting chars. +* Display Tables:: How to specify other conventions. +* Beeping:: Audible signal to the user. + + +File: lispref.info, Node: Refresh Screen, Next: Truncation, Up: Display + +Refreshing the Screen +===================== + + The function `redraw-frame' redisplays the entire contents of a +given frame. *Note Frames::. + + - Function: redraw-frame &optional frame no-preempt + This function clears and redisplays frame FRAME. + + FRAME defaults to the selected frame if omitted. + + Normally, redisplay is preempted as normal if input arrives. + However, if optional second arg NO-PREEMPT is non-`nil', redisplay + will not stop for input and is guaranteed to proceed to completion. + + Even more powerful is `redraw-display': + + - Command: redraw-display &optional device + This function redraws all frames on DEVICE marked as having their + image garbled. DEVICE defaults to the selected device. If DEVICE + is `t', all devices will have their frames checked. + + 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 XEmacs also refreshes the screen. +Some terminal emulators record separate contents for display-oriented +programs such as XEmacs and for ordinary sequential display. If you are +using such a terminal, you might want to inhibit the redisplay on +resumption. *Note Suspending XEmacs::. + + - Variable: no-redraw-on-reenter + This variable controls whether XEmacs redraws the entire screen + after it has been suspended and resumed. Non-`nil' means yes, + `nil' means no. + + The above functions do not actually cause the display to be updated; +rather, they clear out the internal display records that XEmacs +maintains, so that the next time the display is updated it will be +redrawn from scratch. Normally this occurs the next time that +`next-event' or `sit-for' is called; however, a display update will not +occur if there is input pending. *Note Command Loop::. + + - Function: force-cursor-redisplay &optional frame + This function causes an immediate update of the cursor on FRAME, + which defaults to the selected frame. + + File: lispref.info, Node: Truncation, Next: The Echo Area, Prev: Refresh Screen, Up: Display Truncation @@ -201,7 +568,7 @@ the message stack. If a message remains at the head of the message-stack and NO-RESTORE is `nil', it will be displayed. The string which remains in the echo area will be returned, or `nil' if the - message-stack is now empty. If LABEL is nil, the entire + message-stack is now empty. If LABEL is `nil', the entire message-stack is cleared. ;; Show a message, wait for 2 seconds, and restore old minibuffer @@ -693,7 +1060,7 @@ open parenthesis when the user inserts a close parenthesis. gives good results, but the default is 1, which works on all systems. - - Function: blink-matching-open + - Command: blink-matching-open This function is the default value of `blink-paren-function'. It assumes that point follows a character with close parenthesis syntax and moves the cursor momentarily to the matching opening @@ -828,395 +1195,3 @@ effect of setting `ctl-arrow' to a non-`nil' value: (setq i (1+ i))) (aset disptab 127 "^?")) - -File: lispref.info, Node: Active Display Table, Next: Character Descriptors, Prev: Display Table Format, Up: Display Tables - -Active Display Table --------------------- - - The active display table is controlled by the variable -`current-display-table'. This is a specifier, which means that you can -specify separate values for it in individual buffers, windows, frames, -and devices, as well as a global value. It also means that you cannot -set this variable using `setq'; use `set-specifier' instead. *Note -Specifiers::. (FSF Emacs uses `window-display-table', -`buffer-display-table', `standard-display-table', etc. to control the -display table. However, specifiers are a cleaner and more powerful way -of doing the same thing. FSF Emacs also uses a different format for -the contents of a display table, using additional indirection to a -"glyph table" and such. Note that "glyph" has a different meaning in -XEmacs.) - - - Variable: current-display-table - The display table currently in use. This is a specifier. - - Display tables are used to control how characters are displayed. - Each time that redisplay processes a character, it is looked up in - all the display tables that apply (obtained by calling - `specifier-instance' on `current-display-table' and any overriding - display tables specified in currently active faces). The first - entry found that matches the character determines how the - character is displayed. If there is no matching entry, the - default display method is used. (Non-control characters are - displayed as themselves and control characters are displayed - according to the buffer-local variable `ctl-arrow'. Control - characters are further affected by `control-arrow-glyph' and - `octal-escape-glyph'.) - - Each instantiator in this specifier and the display-table - specifiers in faces is a display table or a list of such tables. - If a list, each table will be searched in turn for an entry - matching a particular character. Each display table is one of - - * A vector, specifying values for characters starting at 0. - - * A char table, either of type `char' or `generic'. - - * A range table. - - Each entry in a display table should be one of - - * nil (this entry is ignored and the search continues). - - * A character (use this character; if it happens to be the same - as the original character, default processing happens, - otherwise redisplay attempts to display this character - directly; #### At some point recursive display-table lookup - will be implemented). - - * A string (display each character in the string directly; #### - At some point recursive display-table lookup will be - implemented). - - * A glyph (display the glyph; #### At some point recursive - display-table lookup will be implemented when a string glyph - is being processed). - - * A cons of the form (format "STRING") where STRING is a - printf-like spec used to process the character. #### - Unfortunately no formatting directives other than %% are - implemented. - - * A vector (each element of the vector is processed recursively; - in such a case, nil elements in the vector are simply - ignored). - - #### At some point in the near future, display tables are - likely to be expanded to include other features, such as - referencing characters in particular fonts and allowing the - character search to continue all the way up the chain of - specifier instantiators. These features are necessary to - properly display Unicode characters. - - Individual faces can also specify an overriding display table; this -is set using `set-face-display-table'. *Note Faces::. - - If no display table can be determined for a particular window, then -XEmacs uses the usual display conventions. *Note Usual Display::. - - -File: lispref.info, Node: Character Descriptors, Prev: Active Display Table, Up: Display Tables - -Character Descriptors ---------------------- - - Each element of the display-table vector describes how to display a -particular character and is called a "character descriptor". A -character descriptor can be: - -a string - Display this particular string wherever the character is to be - displayed. - -a glyph - Display this particular glyph wherever the character is to be - displayed. - -a vector - The vector may contain strings and/or glyphs. Display the - elements of the vector one after another wherever the character is - to be displayed. - -`nil' - Display according to the standard interpretation (*note Usual - Display::). - - -File: lispref.info, Node: Beeping, Prev: Display Tables, Up: Display - -Beeping -======= - - You can make XEmacs ring a bell, play a sound, 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. (*Note Errors::.) - - - Function: ding &optional dont-terminate sound device - This function beeps, or flashes the screen (see `visible-bell' - below). It also terminates any keyboard macro currently executing - unless DONT-TERMINATE is non-`nil'. If SOUND is specified, it - should be a symbol specifying which sound to make. This sound - will be played if `visible-bell' is `nil'. (This only works if - sound support was compiled into the executable and you are running - on the console of a Sun SparcStation, SGI, HP9000s700, or Linux - PC. Otherwise you just get a beep.) The optional third argument - specifies what device to make the sound on, and defaults to the - selected device. - - - Function: beep &optional dont-terminate sound device - This is a synonym for `ding'. - - - User Option: visible-bell - This variable determines whether XEmacs should flash the screen to - represent a bell. Non-`nil' means yes, `nil' means no. On TTY - devices, this is effective only if the Termcap entry for the - terminal type has the visible bell flag (`vb') set. - - - Variable: sound-alist - This variable holds an alist associating names with sounds. When - `beep' or `ding' is called with one of the name symbols, the - associated sound will be generated instead of the standard beep. - - Each element of `sound-alist' is a list describing a sound. The - first element of the list is the name of the sound being defined. - Subsequent elements of the list are alternating keyword/value - pairs: - - `sound' - A string of raw sound data, or the name of another sound to - play. The symbol `t' here means use the default X beep. - - `volume' - An integer from 0-100, defaulting to `bell-volume'. - - `pitch' - If using the default X beep, the pitch (Hz) to generate. - - `duration' - If using the default X beep, the duration (milliseconds). - - For compatibility, elements of `sound-alist' may also be: - - * `( sound-name . )' - - * `( sound-name )' - - You should probably add things to this list by calling the function - `load-sound-file'. - - Caveats: - - - You can only play audio data if running on the console screen - of a Sun SparcStation, SGI, or HP9000s700. - - - The pitch, duration, and volume options are available - everywhere, but many X servers ignore the `pitch' option. - - The following beep-types are used by XEmacs itself: - - `auto-save-error' - when an auto-save does not succeed - - `command-error' - when the XEmacs command loop catches an error - - `undefined-key' - when you type a key that is undefined - - `undefined-click' - when you use an undefined mouse-click combination - - `no-completion' - during completing-read - - `y-or-n-p' - when you type something other than 'y' or 'n' - - `yes-or-no-p' - when you type something other than 'yes' or 'no' - - `default' - used when nothing else is appropriate. - - Other lisp packages may use other beep types, but these are the - ones that the C kernel of XEmacs uses. - - - User Option: bell-volume - This variable specifies the default volume for sounds, from 0 to - 100. - - - Command: load-default-sounds - This function loads and installs some sound files as beep-types. - - - Command: load-sound-file filename sound-name &optional volume - This function reads in an audio file and adds it to `sound-alist'. - The sound file must be in the Sun/NeXT U-LAW format. SOUND-NAME - should be a symbol, specifying the name of the sound. If VOLUME - is specified, the sound will be played at that volume; otherwise, - the value of BELL-VOLUME will be used. - - - Function: play-sound sound &optional volume device - This function plays sound SOUND, which should be a symbol - mentioned in `sound-alist'. If VOLUME is specified, it overrides - the value (if any) specified in `sound-alist'. DEVICE specifies - the device to play the sound on, and defaults to the selected - device. - - - Command: play-sound-file file &optional volume device - This function plays the named sound file at volume VOLUME, which - defaults to `bell-volume'. DEVICE specifies the device to play - the sound on, and defaults to the selected device. - - -File: lispref.info, Node: Hash Tables, Next: Range Tables, Prev: Display, Up: Top - -Hash Tables -*********** - - - Function: hash-table-p object - This function returns `t' if OBJECT is a hash table, else `nil'. - -* Menu: - -* Introduction to Hash Tables:: Hash tables are fast data structures for - implementing simple tables (i.e. finite - mappings from keys to values). -* Working With Hash Tables:: Hash table functions. -* Weak Hash Tables:: Hash tables with special garbage-collection - behavior. - - -File: lispref.info, Node: Introduction to Hash Tables, Next: Working With Hash Tables, Up: Hash Tables - -Introduction to Hash Tables -=========================== - - A "hash table" is a data structure that provides mappings from -arbitrary Lisp objects called "keys" to other arbitrary Lisp objects -called "values". A key/value pair is sometimes called an "entry" in -the hash table. There are many ways other than hash tables of -implementing the same sort of mapping, e.g. association lists (*note -Association Lists::) and property lists (*note Property Lists::), but -hash tables provide much faster lookup when there are many entries in -the mapping. Hash tables are an implementation of the abstract data -type "dictionary", also known as "associative array". - - Internally, hash tables are hashed using the "linear probing" hash -table implementation method. This method hashes each key to a -particular spot in the hash table, and then scans forward sequentially -until a blank entry is found. To look up a key, hash to the appropriate -spot, then search forward for the key until either a key is found or a -blank entry stops the search. This method is used in preference to -double hashing because of changes in recent hardware. The penalty for -non-sequential access to memory has been increasing, and this -compensates for the problem of clustering that linear probing entails. - - When hash tables are created, the user may (but is not required to) -specify initial properties that influence performance. - - Use the `:size' parameter to specify the number of entries that are -likely to be stored in the hash table, to avoid the overhead of resizing -the table. But if the pre-allocated space for the entries is never -used, it is simply wasted and makes XEmacs slower. Excess unused hash -table entries exact a small continuous performance penalty, since they -must be scanned at every garbage collection. If the number of entries -in the hash table is unknown, simply avoid using the `:size' keyword. - - Use the `:rehash-size' and `:rehash-threshold' keywords to adjust -the algorithm for deciding when to rehash the hash table. For -temporary hash tables that are going to be very heavily used, use a -small rehash threshold, for example, 0.4 and a large rehash size, for -example 2.0. For permanent hash tables that will be infrequently used, -specify a large rehash threshold, for example 0.8. - - Hash tables can also be created by the lisp reader using structure -syntax, for example: - #s(hash-table size 20 data (foo 1 bar 2)) - - The structure syntax accepts the same keywords as `make-hash-table' -(without the `:' character), as well as the additional keyword `data', -which specifies the initial hash table contents. - - - Function: make-hash-table &key `test' `size' `rehash-size' - `rehash-threshold' `weakness' - This function returns a new empty hash table object. - - Keyword `:test' can be `eq', `eql' (default) or `equal'. - Comparison between keys is done using this function. If speed is - important, consider using `eq'. When storing strings in the hash - table, you will likely need to use `equal'. - - Keyword `:size' specifies the number of keys likely to be inserted. - This number of entries can be inserted without enlarging the hash - table. - - Keyword `:rehash-size' must be a float greater than 1.0, and - specifies the factor by which to increase the size of the hash - table when enlarging. - - Keyword `:rehash-threshold' must be a float between 0.0 and 1.0, - and specifies the load factor of the hash table which triggers - enlarging. - - Non-standard keyword `:weakness' can be `nil' (default), `t', - `key-and-value', `key', `value' or `key-or-value'. `t' is an - alias for `key-and-value'. - - A key-and-value-weak hash table, also known as a fully-weak or - simply as a weak hash table, is one whose pointers do not count as - GC referents: for any key-value pair in the hash table, if the only - remaining pointer to either the key or the value is in a weak hash - table, then the pair will be removed from the hash table, and the - key and value collected. A non-weak hash table (or any other - pointer) would prevent the object from being collected. - - A key-weak hash table is similar to a fully-weak hash table except - that a key-value pair will be removed only if the key remains - unmarked outside of weak hash tables. The pair will remain in the - hash table if the key is pointed to by something other than a weak - hash table, even if the value is not. - - A value-weak hash table is similar to a fully-weak hash table - except that a key-value pair will be removed only if the value - remains unmarked outside of weak hash tables. The pair will - remain in the hash table if the value is pointed to by something - other than a weak hash table, even if the key is not. - - A key-or-value-weak hash table is similar to a fully-weak hash - table except that a key-value pair will be removed only if the - value and the key remain unmarked outside of weak hash tables. - The pair will remain in the hash table if the value or key are - pointed to by something other than a weak hash table, even if the - other is not. - - - Function: copy-hash-table hash-table - This function returns a new hash table which contains the same - keys and values as HASH-TABLE. The keys and values will not - themselves be copied. - - - Function: hash-table-count hash-table - This function returns the number of entries in HASH-TABLE. - - - Function: hash-table-test hash-table - This function returns the test function of HASH-TABLE. This can - be one of `eq', `eql' or `equal'. - - - Function: hash-table-size hash-table - This function returns the current number of slots in HASH-TABLE, - whether occupied or not. - - - Function: hash-table-rehash-size hash-table - This function returns the current rehash size of HASH-TABLE. This - is a float greater than 1.0; the factor by which HASH-TABLE is - enlarged when the rehash threshold is exceeded. - - - Function: hash-table-rehash-threshold hash-table - This function returns the current rehash threshold of HASH-TABLE. - This is a float between 0.0 and 1.0; the maximum "load factor" of - HASH-TABLE, beyond which the HASH-TABLE is enlarged by rehashing. - - - Function: hash-table-weakness hash-table - This function returns the weakness of HASH-TABLE. This can be one - of `nil', `t', `key' or `value'. - diff --git a/info/lispref.info-39 b/info/lispref.info-39 index c94a1b1..892739d 100644 --- a/info/lispref.info-39 +++ b/info/lispref.info-39 @@ -50,6 +50,398 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Active Display Table, Next: Character Descriptors, Prev: Display Table Format, Up: Display Tables + +Active Display Table +-------------------- + + The active display table is controlled by the variable +`current-display-table'. This is a specifier, which means that you can +specify separate values for it in individual buffers, windows, frames, +and devices, as well as a global value. It also means that you cannot +set this variable using `setq'; use `set-specifier' instead. *Note +Specifiers::. (FSF Emacs uses `window-display-table', +`buffer-display-table', `standard-display-table', etc. to control the +display table. However, specifiers are a cleaner and more powerful way +of doing the same thing. FSF Emacs also uses a different format for +the contents of a display table, using additional indirection to a +"glyph table" and such. Note that "glyph" has a different meaning in +XEmacs.) + + - Variable: current-display-table + The display table currently in use. This is a specifier. + + Display tables are used to control how characters are displayed. + Each time that redisplay processes a character, it is looked up in + all the display tables that apply (obtained by calling + `specifier-instance' on `current-display-table' and any overriding + display tables specified in currently active faces). The first + entry found that matches the character determines how the + character is displayed. If there is no matching entry, the + default display method is used. (Non-control characters are + displayed as themselves and control characters are displayed + according to the buffer-local variable `ctl-arrow'. Control + characters are further affected by `control-arrow-glyph' and + `octal-escape-glyph'.) + + Each instantiator in this specifier and the display-table + specifiers in faces is a display table or a list of such tables. + If a list, each table will be searched in turn for an entry + matching a particular character. Each display table is one of + + * A vector, specifying values for characters starting at 0. + + * A char table, either of type `char' or `generic'. + + * A range table. + + Each entry in a display table should be one of + + * nil (this entry is ignored and the search continues). + + * A character (use this character; if it happens to be the same + as the original character, default processing happens, + otherwise redisplay attempts to display this character + directly; #### At some point recursive display-table lookup + will be implemented). + + * A string (display each character in the string directly; #### + At some point recursive display-table lookup will be + implemented). + + * A glyph (display the glyph; #### At some point recursive + display-table lookup will be implemented when a string glyph + is being processed). + + * A cons of the form (format "STRING") where STRING is a + printf-like spec used to process the character. #### + Unfortunately no formatting directives other than %% are + implemented. + + * A vector (each element of the vector is processed recursively; + in such a case, nil elements in the vector are simply + ignored). + + #### At some point in the near future, display tables are + likely to be expanded to include other features, such as + referencing characters in particular fonts and allowing the + character search to continue all the way up the chain of + specifier instantiators. These features are necessary to + properly display Unicode characters. + + Individual faces can also specify an overriding display table; this +is set using `set-face-display-table'. *Note Faces::. + + If no display table can be determined for a particular window, then +XEmacs uses the usual display conventions. *Note Usual Display::. + + +File: lispref.info, Node: Character Descriptors, Prev: Active Display Table, Up: Display Tables + +Character Descriptors +--------------------- + + Each element of the display-table vector describes how to display a +particular character and is called a "character descriptor". A +character descriptor can be: + +a string + Display this particular string wherever the character is to be + displayed. + +a glyph + Display this particular glyph wherever the character is to be + displayed. + +a vector + The vector may contain strings and/or glyphs. Display the + elements of the vector one after another wherever the character is + to be displayed. + +`nil' + Display according to the standard interpretation (*note Usual + Display::). + + +File: lispref.info, Node: Beeping, Prev: Display Tables, Up: Display + +Beeping +======= + + You can make XEmacs ring a bell, play a sound, 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. (*Note Errors::.) + + - Function: ding &optional dont-terminate sound device + This function beeps, or flashes the screen (see `visible-bell' + below). It also terminates any keyboard macro currently executing + unless DONT-TERMINATE is non-`nil'. If SOUND is specified, it + should be a symbol specifying which sound to make. This sound + will be played if `visible-bell' is `nil'. (This only works if + sound support was compiled into the executable and you are running + on the console of a Sun SparcStation, SGI, HP9000s700, or Linux + PC. Otherwise you just get a beep.) The optional third argument + specifies what device to make the sound on, and defaults to the + selected device. + + - Function: beep &optional dont-terminate sound device + This is a synonym for `ding'. + + - User Option: visible-bell + This variable determines whether XEmacs should flash the screen to + represent a bell. Non-`nil' means yes, `nil' means no. On TTY + devices, this is effective only if the Termcap entry for the + terminal type has the visible bell flag (`vb') set. + + - Variable: sound-alist + This variable holds an alist associating names with sounds. When + `beep' or `ding' is called with one of the name symbols, the + associated sound will be generated instead of the standard beep. + + Each element of `sound-alist' is a list describing a sound. The + first element of the list is the name of the sound being defined. + Subsequent elements of the list are alternating keyword/value + pairs: + + `sound' + A string of raw sound data, or the name of another sound to + play. The symbol `t' here means use the default X beep. + + `volume' + An integer from 0-100, defaulting to `bell-volume'. + + `pitch' + If using the default X beep, the pitch (Hz) to generate. + + `duration' + If using the default X beep, the duration (milliseconds). + + For compatibility, elements of `sound-alist' may also be: + + * `( sound-name . )' + + * `( sound-name )' + + You should probably add things to this list by calling the function + `load-sound-file'. + + Caveats: + + - You can only play audio data if running on the console screen + of a Sun SparcStation, SGI, or HP9000s700. + + - The pitch, duration, and volume options are available + everywhere, but many X servers ignore the `pitch' option. + + The following beep-types are used by XEmacs itself: + + `auto-save-error' + when an auto-save does not succeed + + `command-error' + when the XEmacs command loop catches an error + + `undefined-key' + when you type a key that is undefined + + `undefined-click' + when you use an undefined mouse-click combination + + `no-completion' + during completing-read + + `y-or-n-p' + when you type something other than 'y' or 'n' + + `yes-or-no-p' + when you type something other than 'yes' or 'no' + + `default' + used when nothing else is appropriate. + + Other lisp packages may use other beep types, but these are the + ones that the C kernel of XEmacs uses. + + - User Option: bell-volume + This variable specifies the default volume for sounds, from 0 to + 100. + + - Command: load-default-sounds + This function loads and installs some sound files as beep-types. + + - Command: load-sound-file filename sound-name &optional volume + This function reads in an audio file and adds it to `sound-alist'. + The sound file must be in the Sun/NeXT U-LAW format. SOUND-NAME + should be a symbol, specifying the name of the sound. If VOLUME + is specified, the sound will be played at that volume; otherwise, + the value of BELL-VOLUME will be used. + + - Function: play-sound sound &optional volume device + This function plays sound SOUND, which should be a symbol + mentioned in `sound-alist'. If VOLUME is specified, it overrides + the value (if any) specified in `sound-alist'. DEVICE specifies + the device to play the sound on, and defaults to the selected + device. + + - Command: play-sound-file file &optional volume device + This function plays the named sound file at volume VOLUME, which + defaults to `bell-volume'. DEVICE specifies the device to play + the sound on, and defaults to the selected device. + + +File: lispref.info, Node: Hash Tables, Next: Range Tables, Prev: Display, Up: Top + +Hash Tables +*********** + + - Function: hash-table-p object + This function returns `t' if OBJECT is a hash table, else `nil'. + +* Menu: + +* Introduction to Hash Tables:: Hash tables are fast data structures for + implementing simple tables (i.e. finite + mappings from keys to values). +* Working With Hash Tables:: Hash table functions. +* Weak Hash Tables:: Hash tables with special garbage-collection + behavior. + + +File: lispref.info, Node: Introduction to Hash Tables, Next: Working With Hash Tables, Up: Hash Tables + +Introduction to Hash Tables +=========================== + + A "hash table" is a data structure that provides mappings from +arbitrary Lisp objects called "keys" to other arbitrary Lisp objects +called "values". A key/value pair is sometimes called an "entry" in +the hash table. There are many ways other than hash tables of +implementing the same sort of mapping, e.g. association lists (*note +Association Lists::) and property lists (*note Property Lists::), but +hash tables provide much faster lookup when there are many entries in +the mapping. Hash tables are an implementation of the abstract data +type "dictionary", also known as "associative array". + + Internally, hash tables are hashed using the "linear probing" hash +table implementation method. This method hashes each key to a +particular spot in the hash table, and then scans forward sequentially +until a blank entry is found. To look up a key, hash to the appropriate +spot, then search forward for the key until either a key is found or a +blank entry stops the search. This method is used in preference to +double hashing because of changes in recent hardware. The penalty for +non-sequential access to memory has been increasing, and this +compensates for the problem of clustering that linear probing entails. + + When hash tables are created, the user may (but is not required to) +specify initial properties that influence performance. + + Use the `:size' parameter to specify the number of entries that are +likely to be stored in the hash table, to avoid the overhead of resizing +the table. But if the pre-allocated space for the entries is never +used, it is simply wasted and makes XEmacs slower. Excess unused hash +table entries exact a small continuous performance penalty, since they +must be scanned at every garbage collection. If the number of entries +in the hash table is unknown, simply avoid using the `:size' keyword. + + Use the `:rehash-size' and `:rehash-threshold' keywords to adjust +the algorithm for deciding when to rehash the hash table. For +temporary hash tables that are going to be very heavily used, use a +small rehash threshold, for example, 0.4 and a large rehash size, for +example 2.0. For permanent hash tables that will be infrequently used, +specify a large rehash threshold, for example 0.8. + + Hash tables can also be created by the lisp reader using structure +syntax, for example: + #s(hash-table size 20 data (foo 1 bar 2)) + + The structure syntax accepts the same keywords as `make-hash-table' +(without the `:' character), as well as the additional keyword `data', +which specifies the initial hash table contents. + + - Function: make-hash-table &key `test' `size' `rehash-size' + `rehash-threshold' `weakness' + This function returns a new empty hash table object. + + Keyword `:test' can be `eq', `eql' (default) or `equal'. + Comparison between keys is done using this function. If speed is + important, consider using `eq'. When storing strings in the hash + table, you will likely need to use `equal'. + + Keyword `:size' specifies the number of keys likely to be inserted. + This number of entries can be inserted without enlarging the hash + table. + + Keyword `:rehash-size' must be a float greater than 1.0, and + specifies the factor by which to increase the size of the hash + table when enlarging. + + Keyword `:rehash-threshold' must be a float between 0.0 and 1.0, + and specifies the load factor of the hash table which triggers + enlarging. + + Non-standard keyword `:weakness' can be `nil' (default), `t', + `key-and-value', `key', `value' or `key-or-value'. `t' is an + alias for `key-and-value'. + + A key-and-value-weak hash table, also known as a fully-weak or + simply as a weak hash table, is one whose pointers do not count as + GC referents: for any key-value pair in the hash table, if the only + remaining pointer to either the key or the value is in a weak hash + table, then the pair will be removed from the hash table, and the + key and value collected. A non-weak hash table (or any other + pointer) would prevent the object from being collected. + + A key-weak hash table is similar to a fully-weak hash table except + that a key-value pair will be removed only if the key remains + unmarked outside of weak hash tables. The pair will remain in the + hash table if the key is pointed to by something other than a weak + hash table, even if the value is not. + + A value-weak hash table is similar to a fully-weak hash table + except that a key-value pair will be removed only if the value + remains unmarked outside of weak hash tables. The pair will + remain in the hash table if the value is pointed to by something + other than a weak hash table, even if the key is not. + + A key-or-value-weak hash table is similar to a fully-weak hash + table except that a key-value pair will be removed only if the + value and the key remain unmarked outside of weak hash tables. + The pair will remain in the hash table if the value or key are + pointed to by something other than a weak hash table, even if the + other is not. + + - Function: copy-hash-table hash-table + This function returns a new hash table which contains the same + keys and values as HASH-TABLE. The keys and values will not + themselves be copied. + + - Function: hash-table-count hash-table + This function returns the number of entries in HASH-TABLE. + + - Function: hash-table-test hash-table + This function returns the test function of HASH-TABLE. This can + be one of `eq', `eql' or `equal'. + + - Function: hash-table-size hash-table + This function returns the current number of slots in HASH-TABLE, + whether occupied or not. + + - Function: hash-table-rehash-size hash-table + This function returns the current rehash size of HASH-TABLE. This + is a float greater than 1.0; the factor by which HASH-TABLE is + enlarged when the rehash threshold is exceeded. + + - Function: hash-table-rehash-threshold hash-table + This function returns the current rehash threshold of HASH-TABLE. + This is a float between 0.0 and 1.0; the maximum "load factor" of + HASH-TABLE, beyond which the HASH-TABLE is enlarged by rehashing. + + - Function: hash-table-weakness hash-table + This function returns the weakness of HASH-TABLE. This can be one + of `nil', `t', `key' or `value'. + + File: lispref.info, Node: Working With Hash Tables, Next: Weak Hash Tables, Prev: Introduction to Hash Tables, Up: Hash Tables Working With Hash Tables @@ -162,10 +554,10 @@ Introduction to Range Tables - Function: make-range-table Make a new, empty range table. - - Function: copy-range-table old-table - Make a new range table which contains the same values for the same - ranges as the given table. The values will not themselves be - copied. + - Function: copy-range-table range-table + This function returns a new range table which contains the same + values for the same ranges as RANGE-TABLE. The values will not + themselves be copied.  File: lispref.info, Node: Working With Range Tables, Prev: Introduction to Range Tables, Up: Range Tables @@ -173,23 +565,25 @@ File: lispref.info, Node: Working With Range Tables, Prev: Introduction to Ran Working With Range Tables ========================= - - Function: get-range-table pos table &optional default - This function finds value for position POS in TABLE. If there is - no corresponding value, return DEFAULT (defaults to `nil'). + - Function: get-range-table pos range-table &optional default + This function finds value for position POS in RANGE-TABLE. If + there is no corresponding value, return DEFAULT (defaults to + `nil'). - - Function: put-range-table start end val table - This function sets the value for range (START, END) to be VAL in - TABLE. + - Function: put-range-table start end value range-table + This function sets the value for range (START, END) to be VALUE in + RANGE-TABLE. - - Function: remove-range-table start end table - This function removes the value for range (START, END) in TABLE. + - Function: remove-range-table start end range-table + This function removes the value for range (START, END) in + RANGE-TABLE. - - Function: clear-range-table table - This function flushes TABLE. + - Function: clear-range-table range-table + This function flushes RANGE-TABLE. - - Function: map-range-table function table - This function maps FUNCTION over entries in TABLE, calling it with - three args, the beginning and end of the range and the + - Function: map-range-table function range-table + This function maps FUNCTION over entries in RANGE-TABLE, calling + it with three args, the beginning and end of the range and the corresponding value.  @@ -230,11 +624,11 @@ Connecting to a Database available: `'hash', `'btree', and `'recno'. See the manpages for the Berkeley DB functions for more information about these types. - - Function: close-database obj - This function closes database OBJ. + - Function: close-database database + This function closes database DATABASE. - - Function: database-live-p obj - This function returns `t' iff OBJ is an active database, else + - Function: database-live-p object + This function returns `t' if OBJECT is an active database, else `nil'.  @@ -243,21 +637,21 @@ File: lispref.info, Node: Working With a Database, Next: Other Database Functi Working With a Database ======================= - - Function: get-database key dbase &optional default + - Function: get-database key database &optional default This function finds the value for KEY in DATABASE. If there is no corresponding value, DEFAULT is returned (`nil' if DEFAULT is omitted). - - Function: map-database function dbase + - Function: map-database function database This function maps FUNCTION over entries in DATABASE, calling it with two args, each key and value in the database. - - Function: put-database key val dbase &optional replace - This function stores KEY and VAL in DATABASE. If optional fourth - arg REPLACE is non-`nil', replace any existing entry in the + - Function: put-database key value database &optional replace + This function stores KEY and VALUE in DATABASE. If optional + fourth arg REPLACE is non-`nil', replace any existing entry in the database. - - Function: remove-database key dbase + - Function: remove-database key database This function removes KEY from DATABASE.  @@ -266,18 +660,17 @@ File: lispref.info, Node: Other Database Functions, Prev: Working With a Datab Other Database Functions ======================== - - Function: database-file-name obj - This function returns the filename associated with the database - OBJ. + - Function: database-file-name database + This function returns the filename associated with DATABASE. - - Function: database-last-error &optional obj - This function returns the last error associated with database OBJ. + - Function: database-last-error &optional database + This function returns the last error associated with DATABASE. - - Function: database-subtype obj - This function returns the subtype of database OBJ, if any. + - Function: database-subtype database + This function returns the subtype of DATABASE, if any. - - Function: database-type obj - This function returns the type of database OBJ. + - Function: database-type database + This function returns the type of DATABASE.  File: lispref.info, Node: Processes, Next: System Interface, Prev: Databases, Up: Top @@ -336,7 +729,7 @@ The other two, `call-process' and `call-process-region', create a synchronous process and do not return a process object (*note Synchronous Processes::). - Synchronous and asynchronous processes are explained in following + Synchronous and asynchronous processes are explained in the following sections. Since the three functions are all called in a similar fashion, their common arguments are described here. @@ -368,6 +761,10 @@ passed directly to the specified program. program; it may not contain any command-line arguments. You must use ARGS to provide those. + If you want to use features of the shell, then invoke the shell +directly using, for example, PROGRAM of `"sh"', and ARGS of `"-c"' and +"COMMAND LINE...". + The subprocess gets its current directory from the value of `default-directory' (*note File Name Expansion::). @@ -501,14 +898,14 @@ In version 19, they return an indication of how the process terminated. (concat (file-name-as-directory file) ".") file)) - - Function: call-process-region start end program &optional delete - destination display &rest args + - Function: call-process-region start end program &optional deletep + destination displayp &rest args This function sends the text between START to END as standard input to a process running PROGRAM. It deletes the text sent if - DELETE is non-`nil'; this is useful when BUFFER is `t', to insert + DELETEP is non-`nil'; this is useful when BUFFER is `t', to insert the output in the current buffer. - The arguments DESTINATION and DISPLAY control what to do with the + The arguments DESTINATION and DISPLAYP 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 `call-process', above. If DESTINATION is the integer 0, `call-process-region' @@ -645,7 +1042,9 @@ how to create an asynchronous process with `start-process'. 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 PTYs is limited on many systems and - it is good not to waste them. + it is good not to waste them. A rule of thumb is to use ptys for + processes the user interacts with directly, and pipes for + processes that are hidden from the user. The value `process-connection-type' is used when `start-process' is called. So you can specify how to communicate with one @@ -659,6 +1058,15 @@ how to create an asynchronous process with `start-process'. PTY, use the function `process-tty-name' (*note Process Information::). + Lisp functions that manipulate processes usually accept a PROCESS +argument. Besides using an actual process object for this argument, you +can use a process name, a buffer object, the name of a buffer, or +`nil'. Specifying a buffer or buffer name for the PROCESS argument +means use the process associated with the buffer (or the most recent +one, if there is more than one). `nil' means use the process +associated with the current buffer. *Note Process Information::. +*Note Process Buffers::. +  File: lispref.info, Node: Deleting Processes, Next: Process Information, Prev: Asynchronous Processes, Up: Processes @@ -723,9 +1131,12 @@ Process Information (process-list) => (# #) - - Function: get-process name - This function returns the process named NAME, or `nil' if there is - none. An error is signaled if NAME is not a string. + - Function: get-process process-name + This function returns the process named PROCESS-NAME. If + PROCESS-NAME is a string and there is no process with that name, + the value is `nil'. If PROCESS-NAME is actually a process, it is + returned as given. (That is not very useful, so the argument is + usually a name.) For example: (get-process "shell") => # @@ -749,9 +1160,9 @@ Process Information - Function: process-name process This function returns the name of PROCESS. - - Function: process-status process-name - This function returns the status of PROCESS-NAME as a symbol. The - argument PROCESS-NAME must be a process, a buffer, a process name + - Function: process-status process + This function returns the status of PROCESS as a symbol. The + argument PROCESS must be a process, a buffer, a process name (string) or a buffer name (string). The possible values for an actual subprocess are: @@ -777,7 +1188,7 @@ Process Information open a new connection to the same place. `nil' - if PROCESS-NAME is not the name of an existing process. + if PROCESS does not identify an existing process. (process-status "shell") => run @@ -812,398 +1223,3 @@ Process Information instead of a terminal (see `process-connection-type' in *Note Asynchronous Processes::). - -File: lispref.info, Node: Input to Processes, Next: Signals to Processes, Prev: Process Information, Up: Processes - -Sending Input to Processes -========================== - - Asynchronous subprocesses receive input when it is sent to them by -XEmacs, 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 -PTY. On these systems, Emacs sends an EOF periodically amidst the -other characters, to force them through. For most programs, these EOFs -do no harm. - - - Function: process-send-string process-name string - This function sends PROCESS-NAME the contents of STRING as - standard input. The argument PROCESS-NAME must be a process or - the name of a process. If it is `nil', the current buffer's - process is used. - - The function returns `nil'. - - (process-send-string "shell<1>" "ls\n") - => nil - - - ---------- Buffer: *shell* ---------- - ... - introduction.texi syntax-tables.texi~ - introduction.texi~ text.texi - introduction.txt text.texi~ - ... - ---------- Buffer: *shell* ---------- - - - Command: process-send-region process-name start end - This function sends the text in the region defined by START and - END as standard input to PROCESS-NAME, which is a process or a - process name. (If it is `nil', the current buffer's process is - used.) - - An error is signaled unless both START and END are integers or - markers that indicate positions in the current buffer. (It is - unimportant which number is larger.) - - - Function: process-send-eof &optional process-name - This function makes PROCESS-NAME see an end-of-file in its input. - The EOF comes after any text already sent to it. - - If PROCESS-NAME is not supplied, or if it is `nil', then this - function sends the EOF to the current buffer's process. An error - is signaled if the current buffer has no process. - - The function returns PROCESS-NAME. - - (process-send-eof "shell") - => "shell" - - -File: lispref.info, Node: Signals to Processes, Next: Output from Processes, Prev: Input to Processes, Up: Processes - -Sending Signals to Processes -============================ - - "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 `SIGINT' means that the user has typed -`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. - - The set of signals and their names is defined by the operating -system; XEmacs has facilities for sending only a few of the signals -that are defined. XEmacs can send signals only to its own subprocesses. - - You can send signals explicitly by calling the functions in this -section. XEmacs also sends signals automatically at certain times: -killing a buffer sends a `SIGHUP' signal to all its associated -processes; killing XEmacs sends a `SIGHUP' signal to all remaining -processes. (`SIGHUP' is a signal that indicates that the connection -between the user and the process is broken, for example if a connection -via a telephone line is hung up.) - - Each of the signal-sending functions takes two optional arguments: -PROCESS and CURRENT-GROUP. - - The argument PROCESS must be either a process or a buffer, the name -of one, or `nil'. If it is `nil', the process defaults to the process -associated with the current buffer. An error is signaled if PROCESS -does not identify a process. - - The argument CURRENT-GROUP is a flag that makes a difference when -you are running a job-control shell as an XEmacs subprocess. If it is -non-`nil', then the signal is sent to the current foreground process -group of the terminal that XEmacs uses to communicate with the -subprocess. If the process is a job-control shell, this means the -shell's current subjob. If it is `nil', the signal is sent to the -process group of the immediate subprocess of XEmacs. If the subprocess -is a job-control shell, this is the shell itself. - - The flag 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 -`process-connection-type' in *Note Asynchronous Processes::. - - Some of the functions below take a SIGNAL argument, which identifies -a signal to be sent. It must be either an integer or a symbol which -names the signal, like `SIGSEGV'. - - - Function: process-send-signal signal &optional process current-group - This function sends the signal SIGNAL to the process PROCESS. The - following functions can be implemented in terms of - `process-send-signal'. - - - Function: interrupt-process &optional process current-group - This function interrupts the process PROCESS by sending the signal - `SIGINT'. Outside of XEmacs, typing the "interrupt character" - (normally `C-c') sends this signal. When the argument - CURRENT-GROUP is non-`nil', you can think of this function as - "typing `C-c'" on the terminal by which XEmacs talks to the - subprocess. - - - Function: kill-process &optional process current-group - This function kills the process PROCESS by sending the signal - `SIGKILL'. This signal kills the subprocess immediately, and - cannot be handled by the subprocess. - - - Function: quit-process &optional process current-group - This function sends the signal `SIGQUIT' to the process PROCESS. - This signal is the one sent by the "quit character" (usually - `C-\') when you are not inside XEmacs. - - - Function: stop-process &optional process current-group - This function stops the process PROCESS by sending the signal - `SIGTSTP'. Use `continue-process' to resume its execution. - - On systems with job control, the "stop character" (usually `C-z') - sends this signal (outside of XEmacs). When CURRENT-GROUP is - non-`nil', you can think of this function as "typing `C-z'" on the - terminal XEmacs uses to communicate with the subprocess. - - - Function: continue-process &optional process current-group - This function resumes execution of the process PROCESS by sending - it the signal `SIGCONT'. This presumes that PROCESS was stopped - previously. - - - Function: signal-process pid signal - This function sends a signal to the process with process id PID, - which need not be a child of XEmacs. The argument SIGNAL - specifies which signal to send. - - -File: lispref.info, Node: Output from Processes, Next: Sentinels, Prev: Signals to Processes, Up: Processes - -Receiving 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 "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. - - -File: lispref.info, Node: Process Buffers, Next: Filter Functions, Up: Output from Processes - -Process Buffers ---------------- - - A process can (and usually does) have an "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 XEmacs Lisp. - - Unless the process has a filter function (*note Filter Functions::), -its output is inserted in the associated buffer. The position to insert -the output is determined by the `process-mark', which is then updated -to point to the end of the text just inserted. Usually, but not -always, the `process-mark' is at the end of the buffer. - - - Function: process-buffer process - This function returns the associated buffer of the process PROCESS. - - (process-buffer (get-process "shell")) - => # - - - Function: process-mark process - This function returns the process marker for PROCESS, which is the - marker that says where to insert output from the process. - - If PROCESS does not have a buffer, `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 `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. - - - Function: set-process-buffer process buffer - This function sets the buffer associated with PROCESS to BUFFER. - If BUFFER is `nil', the process becomes associated with no buffer. - - - Function: get-buffer-process buffer-or-name - This function returns the process associated with 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. - - (get-buffer-process "*shell*") - => # - - Killing the process's buffer deletes the process, which kills the - subprocess with a `SIGHUP' signal (*note Signals to Processes::). - - -File: lispref.info, Node: Filter Functions, Next: Accepting Output, Prev: Process Buffers, Up: Output from Processes - -Process Filter Functions ------------------------- - - A process "filter function" is a function that receives the standard -output from the associated process. If a process has a filter, then -_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 XEmacs 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 -`sit-for' or `sleep-for' (*note Waiting::), or `accept-process-output' -(*note 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 `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 `inhibit-quit' to `nil'. *Note 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 -`debug-on-error' is non-`nil', the error-catching is turned off. This -makes it possible to use the Lisp debugger to debug the filter -function. *Note Debugger::. - - Many filter functions sometimes or always insert the text in the -process's buffer, mimicking the actions of XEmacs when there is no -filter. Such filter functions need to use `set-buffer' in order to be -sure to insert in that buffer. To avoid setting the current buffer -semipermanently, these filter functions must use `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: - - (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))) - (save-excursion - ;; 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)))) - -The reason to use an explicit `unwind-protect' rather than letting -`save-excursion' restore the current buffer is so as to preserve the -change in point made by `goto-char'. - - To make the filter force the process buffer to be visible whenever -new text arrives, insert the following line just before the -`unwind-protect': - - (display-buffer (process-buffer proc)) - - To force point to move to the end of the new output no matter where -it was previously, eliminate the variable `moving' and call `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. *Note 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, -`(buffer-name (process-buffer PROCESS))' returns `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. - - - Function: set-process-filter process filter - This function gives PROCESS the filter function FILTER. If FILTER - is `nil', then the process will have no filter. If FILTER is `t', - then no output from the process will be accepted until the filter - is changed. (Output received during this time is not discarded, - but is queued, and will be processed as soon as the filter is - changed.) - - - Function: process-filter process - This function returns the filter function of PROCESS, or `nil' if - it has none. `t' means that output processing has been stopped. - - Here is an example of use of a filter function: - - (defun keep-output (process output) - (setq kept (cons output kept))) - => keep-output - (setq kept nil) - => nil - (set-process-filter (get-process "shell") 'keep-output) - => keep-output - (process-send-string "shell" "ls ~/other\n") - => nil - kept - => ("lewis@slug[8] % " - "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 - ") - - -File: lispref.info, Node: Accepting Output, Prev: Filter Functions, Up: Output from Processes - -Accepting Output from Processes -------------------------------- - - Output from asynchronous subprocesses normally arrives only while -XEmacs 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. - - - Function: accept-process-output &optional process seconds millisec - This function allows XEmacs to read pending output from processes. - The output is inserted in the associated buffers or given to - their filter functions. If PROCESS is non-`nil' then this - function does not return until some output has been received from - PROCESS. - - The arguments SECONDS and 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 - `accept-process-output' returns after that much time whether or - not there has been any subprocess output. Note that SECONDS is - allowed to be a floating-point number; thus, there is no need to - ever use MILLISEC. (It is retained for compatibility purposes.) - - The function `accept-process-output' returns non-`nil' if it did - get some output, or `nil' if the timeout expired before output - arrived. - diff --git a/info/lispref.info-4 b/info/lispref.info-4 index 7c10dcf..5f78301 100644 --- a/info/lispref.info-4 +++ b/info/lispref.info-4 @@ -530,7 +530,7 @@ describing the data type. => nil - - Function: old-eq obj1 obj2 + - Function: old-eq object1 object2 This function exists under XEmacs 20 and is exactly like `eq' except that it suffers from the char-int confoundance disease. In other words, it returns `t' if given a character and the @@ -943,8 +943,12 @@ any argument is floating. not check for overflow. Thus `(1+ 134217727)' may evaluate to -134217728, depending on your hardware. - - Function: 1+ number-or-marker - This function returns NUMBER-OR-MARKER plus 1. For example, + - Function: 1+ number + This function returns NUMBER plus one. NUMBER may be a number, + character or marker. Markers and characters are converted to + integers. + + For example, (setq foo 4) => 4 @@ -968,16 +972,21 @@ not check for overflow. Thus `(1+ 134217727)' may evaluate to more convenient and natural way to increment a variable is `(incf foo)'. - - Function: 1- number-or-marker - This function returns NUMBER-OR-MARKER minus 1. + - Function: 1- number + This function returns NUMBER minus one. NUMBER may be a number, + character or marker. Markers and characters are converted to + integers. - Function: abs number This returns the absolute value of NUMBER. - - Function: + &rest numbers-or-markers + - Function: + &rest numbers This function adds its arguments together. When given no arguments, `+' returns 0. + If any of the arguments are characters or markers, they are first + converted to integers. + (+) => 0 (+ 1) @@ -985,12 +994,15 @@ not check for overflow. Thus `(1+ 134217727)' may evaluate to (+ 1 2 3 4) => 10 - - Function: - &optional number-or-marker &rest other-numbers-or-markers + - Function: - &optional number &rest other-numbers The `-' function serves two purposes: negation and subtraction. When `-' has a single argument, the value is the negative of the argument. When there are multiple arguments, `-' subtracts each of - the OTHER-NUMBERS-OR-MARKERS from NUMBER-OR-MARKER, cumulatively. - If there are no arguments, the result is 0. + the OTHER-NUMBERS from NUMBER, cumulatively. If there are no + arguments, an error is signaled. + + If any of the arguments are characters or markers, they are first + converted to integers. (- 10 1 2 3 4) => 0 @@ -999,10 +1011,13 @@ not check for overflow. Thus `(1+ 134217727)' may evaluate to (-) => 0 - - Function: * &rest numbers-or-markers + - Function: * &rest numbers This function multiplies its arguments together, and returns the product. When given no arguments, `*' returns 1. + If any of the arguments are characters or markers, they are first + converted to integers. + (*) => 1 (* 1) @@ -1010,20 +1025,24 @@ not check for overflow. Thus `(1+ 134217727)' may evaluate to (* 1 2 3 4) => 24 - - Function: / dividend divisor &rest divisors - This function divides DIVIDEND by DIVISOR and returns the - quotient. If there are additional arguments DIVISORS, then it - divides DIVIDEND by each divisor in turn. Each argument may be a - number or a marker. + - Function: / dividend &rest divisors + The `/' function serves two purposes: inversion and division. When + `/' has a single argument, the value is the inverse of the + argument. When there are multiple arguments, `/' divides DIVIDEND + by each of the DIVISORS, cumulatively, returning the quotient. If + there are no arguments, an error is signaled. - 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 + If none of the arguments are floats, then the result is an integer. + 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 `/' 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. + If any of the arguments are characters or markers, they are first + converted to integers. + If you divide by 0, an `arith-error' error is signaled. (*Note Errors::.) @@ -1033,6 +1052,8 @@ not check for overflow. Thus `(1+ 134217727)' may evaluate to => 2 (/ 25 3 2) => 4 + (/ 3.0) + => 0.3333333333333333 (/ -17 6) => -2 @@ -1110,20 +1131,20 @@ is a nearby integer. `ffloor' returns the nearest integer below; `fceiling', the nearest integer above; `ftruncate', the nearest integer in the direction towards zero; `fround', the nearest integer. - - Function: ffloor float - This function rounds FLOAT to the next lower integral value, and + - Function: ffloor number + This function rounds NUMBER to the next lower integral value, and returns that value as a floating point number. - - Function: fceiling float - This function rounds FLOAT to the next higher integral value, and + - Function: fceiling number + This function rounds NUMBER to the next higher integral value, and returns that value as a floating point number. - - Function: ftruncate float - This function rounds FLOAT towards zero to an integral value, and + - Function: ftruncate number + This function rounds NUMBER towards zero to an integral value, and returns that value as a floating point number. - - Function: fround float - This function rounds FLOAT to the nearest integral value, and + - Function: fround number + This function rounds NUMBER to the nearest integral value, and returns that value as a floating point number.  @@ -1351,62 +1372,65 @@ Standard Mathematical Functions supported (which is the normal state of affairs). They allow integers as well as floating point numbers as arguments. - - Function: sin arg - - Function: cos arg - - Function: tan arg + - Function: sin number + - Function: cos number + - Function: tan number These are the ordinary trigonometric functions, with argument measured in radians. - - Function: asin arg - The value of `(asin ARG)' is a number between -pi/2 and pi/2 - (inclusive) whose sine is ARG; if, however, ARG is out of range - (outside [-1, 1]), then the result is a NaN. + - Function: asin number + The value of `(asin NUMBER)' is a number between -pi/2 and pi/2 + (inclusive) whose sine is NUMBER; if, however, NUMBER is out of + range (outside [-1, 1]), then the result is a NaN. + + - Function: acos number + The value of `(acos NUMBER)' is a number between 0 and pi + (inclusive) whose cosine is NUMBER; if, however, NUMBER is out of + range (outside [-1, 1]), then the result is a NaN. - - Function: acos arg - The value of `(acos ARG)' is a number between 0 and pi (inclusive) - whose cosine is ARG; if, however, ARG is out of range (outside - [-1, 1]), then the result is a NaN. + - Function: atan number &optional number2 + The value of `(atan NUMBER)' is a number between -pi/2 and pi/2 + (exclusive) whose tangent is NUMBER. - - Function: atan arg - The value of `(atan ARG)' is a number between -pi/2 and pi/2 - (exclusive) whose tangent is ARG. + If optional argument NUMBER2 is supplied, the function returns + `atan2(NUMBER,NUMBER2)'. - - Function: sinh arg - - Function: cosh arg - - Function: tanh arg + - Function: sinh number + - Function: cosh number + - Function: tanh number These are the ordinary hyperbolic trigonometric functions. - - Function: asinh arg - - Function: acosh arg - - Function: atanh arg + - Function: asinh number + - Function: acosh number + - Function: atanh number These are the inverse hyperbolic trigonometric functions. - - Function: exp arg - This is the exponential function; it returns e to the power ARG. - e is a fundamental mathematical constant also called the base of - natural logarithms. + - Function: exp number + This is the exponential function; it returns e to the power + NUMBER. e is a fundamental mathematical constant also called the + base of natural logarithms. - - Function: log arg &optional base - This function returns the logarithm of ARG, with base BASE. If - you don't specify BASE, the base E is used. If ARG is negative, - the result is a NaN. + - Function: log number &optional base + This function returns the logarithm of NUMBER, with base BASE. If + you don't specify BASE, the base E is used. If NUMBER is + negative, the result is a NaN. - - Function: log10 arg - This function returns the logarithm of ARG, with base 10. If ARG - is negative, the result is a NaN. `(log10 X)' == `(log X 10)', at - least approximately. + - Function: log10 number + This function returns the logarithm of NUMBER, with base 10. If + NUMBER is negative, the result is a NaN. `(log10 X)' == `(log X + 10)', at least approximately. - Function: expt x y This function returns X raised to power Y. If both arguments are integers and Y is positive, the result is an integer; in this case, it is truncated to fit the range of possible integer values. - - Function: sqrt arg - This returns the square root of ARG. If ARG is negative, the - value is a NaN. + - Function: sqrt number + This returns the square root of NUMBER. If NUMBER is negative, + the value is a NaN. - - Function: cube-root arg - This returns the cube root of ARG. + - Function: cube-root number + This returns the cube root of NUMBER.  File: lispref.info, Node: Random Numbers, Prev: Math Functions, Up: Numbers diff --git a/info/lispref.info-40 b/info/lispref.info-40 index 5c82aef..ea7b5d9 100644 --- a/info/lispref.info-40 +++ b/info/lispref.info-40 @@ -50,6 +50,411 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Input to Processes, Next: Signals to Processes, Prev: Process Information, Up: Processes + +Sending Input to Processes +========================== + + Asynchronous subprocesses receive input when it is sent to them by +XEmacs, 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 +PTY. On these systems, XEmacs sends long input in chunks, with EOF +characters added amidst the other characters, to force the operating +system to periodically drain the input buffer. For most programs, +these EOFs do no harm. + + - Function: process-send-string process string &optional start end + This function sends PROCESS the contents of STRING as standard + input. + + The argument PROCESS may be a process or the name of a process, or + a buffer or the name of a buffer, in which case the buffer's + process is used. If it is `nil', the current buffer's process is + used. + + Optional arguments START and END specify part of STRING; see + `substring'. + + The function returns `nil'. + + (process-send-string "shell<1>" "ls\n") + => nil + + + ---------- Buffer: *shell* ---------- + ... + introduction.texi syntax-tables.texi~ + introduction.texi~ text.texi + introduction.txt text.texi~ + ... + ---------- Buffer: *shell* ---------- + + - Function: process-send-region process start end &optional buffer + This function sends the text in the region defined by START and + END as standard input to PROCESS. + + The argument PROCESS may be a process or the name of a process, or + a buffer or the name of a buffer, in which case the buffer's + process is used. If it is `nil', the current buffer's process is + used. + + An error is signaled unless both START and END are integers or + markers that indicate positions in the current buffer. (It is + unimportant which number is larger.) + + - Function: process-send-eof &optional process + This function makes PROCESS see an end-of-file in its input. The + EOF comes after any text already sent to it. + + PROCESS may be a process, a buffer, the name of a process or + buffer, or `nil', indicating the current buffer's process. An + error is signaled if PROCESS does not identify any process. + + The function returns the process object identified by PROCESS. + + (process-send-eof "shell") + => "shell" + + +File: lispref.info, Node: Signals to Processes, Next: Output from Processes, Prev: Input to Processes, Up: Processes + +Sending Signals to Processes +============================ + + "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 `SIGINT' means that the user has typed +`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. + + The set of signals and their names is defined by the operating +system; XEmacs has facilities for sending only a few of the signals +that are defined. XEmacs can send signals only to its own subprocesses. + + You can send signals explicitly by calling the functions in this +section. XEmacs also sends signals automatically at certain times: +killing a buffer sends a `SIGHUP' signal to all its associated +processes; killing XEmacs sends a `SIGHUP' signal to all remaining +processes. (`SIGHUP' is a signal that indicates that the connection +between the user and the process is broken, for example if a connection +via a telephone line is hung up.) + + Each of the signal-sending functions takes two optional arguments: +PROCESS and CURRENT-GROUP. + + The argument PROCESS must be either a process or a buffer, the name +of one, or `nil'. If it is `nil', the process defaults to the process +associated with the current buffer. An error is signaled if PROCESS +does not identify a process. + + The argument CURRENT-GROUP is a flag that makes a difference when +you are running a job-control shell as an XEmacs subprocess. If it is +non-`nil', then the signal is sent to the current foreground process +group of the terminal that XEmacs uses to communicate with the +subprocess. If the process is a job-control shell, this means the +shell's current subjob. If it is `nil', the signal is sent to the +process group of the immediate subprocess of XEmacs. If the subprocess +is a job-control shell, this is the shell itself. + + The flag 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 +`process-connection-type' in *Note Asynchronous Processes::. + + Some of the functions below take a SIGNAL argument, which identifies +a signal to be sent. It must be either an integer or a symbol which +names the signal, like `SIGSEGV'. + + - Function: process-send-signal signal &optional process current-group + This function sends the signal SIGNAL to the process PROCESS. The + following functions can be implemented in terms of + `process-send-signal'. + + - Function: interrupt-process &optional process current-group + This function interrupts the process PROCESS by sending the signal + `SIGINT'. Outside of XEmacs, typing the "interrupt character" + (normally `C-c') sends this signal. When the argument + CURRENT-GROUP is non-`nil', you can think of this function as + "typing `C-c'" on the terminal by which XEmacs talks to the + subprocess. + + - Function: kill-process &optional process current-group + This function kills the process PROCESS by sending the signal + `SIGKILL'. This signal kills the subprocess immediately, and + cannot be handled by the subprocess. + + - Function: quit-process &optional process current-group + This function sends the signal `SIGQUIT' to the process PROCESS. + This signal is the one sent by the "quit character" (usually + `C-\') when you are not inside XEmacs. + + - Function: stop-process &optional process current-group + This function stops the process PROCESS by sending the signal + `SIGTSTP'. Use `continue-process' to resume its execution. + + On systems with job control, the "stop character" (usually `C-z') + sends this signal (outside of XEmacs). When CURRENT-GROUP is + non-`nil', you can think of this function as "typing `C-z'" on the + terminal XEmacs uses to communicate with the subprocess. + + - Function: continue-process &optional process current-group + This function resumes execution of the process PROCESS by sending + it the signal `SIGCONT'. This presumes that PROCESS was stopped + previously. + + - Command: signal-process pid signal + This function sends a signal to the process with process id PID, + which need not be a child of XEmacs. The argument SIGNAL + specifies which signal to send. + + +File: lispref.info, Node: Output from Processes, Next: Sentinels, Prev: Signals to Processes, Up: Processes + +Receiving 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 "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. + + +File: lispref.info, Node: Process Buffers, Next: Filter Functions, Up: Output from Processes + +Process Buffers +--------------- + + A process can (and usually does) have an "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 XEmacs Lisp. + + Unless the process has a filter function (*note Filter Functions::), +its output is inserted in the associated buffer. The position to insert +the output is determined by the `process-mark', which is then updated +to point to the end of the text just inserted. Usually, but not +always, the `process-mark' is at the end of the buffer. + + - Function: process-buffer process + This function returns the associated buffer of the process PROCESS. + + (process-buffer (get-process "shell")) + => # + + - Function: process-mark process + This function returns the process marker for PROCESS, which is the + marker that says where to insert output from the process. + + If PROCESS does not have a buffer, `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 `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. + + - Function: set-process-buffer process buffer + This function sets the buffer associated with PROCESS to BUFFER. + If BUFFER is `nil', the process becomes associated with no buffer. + + - Function: get-buffer-process buffer-or-name + This function returns the process associated with BUFFER-OR-NAME. + If there are several processes associated with BUFFER-OR-NAME, + 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. + + (get-buffer-process "*shell*") + => # + + Killing the process's buffer deletes the process, which kills the + subprocess with a `SIGHUP' signal (*note Signals to Processes::). + + +File: lispref.info, Node: Filter Functions, Next: Accepting Output, Prev: Process Buffers, Up: Output from Processes + +Process Filter Functions +------------------------ + + A process "filter function" is a function that receives the standard +output from the associated process. If a process has a filter, then +_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 XEmacs 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 +`sit-for' or `sleep-for' (*note Waiting::), or `accept-process-output' +(*note 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 `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 `inhibit-quit' to `nil'. *Note 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 +`debug-on-error' is non-`nil', the error-catching is turned off. This +makes it possible to use the Lisp debugger to debug the filter +function. *Note Debugger::. + + Many filter functions sometimes or always insert the text in the +process's buffer, mimicking the actions of XEmacs when there is no +filter. Such filter functions need to use `set-buffer' in order to be +sure to insert in that buffer. To avoid setting the current buffer +semipermanently, these filter functions must use `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: + + (defun ordinary-insertion-filter (process string) + (let ((old-buffer (current-buffer))) + (unwind-protect + (let (moving) + (set-buffer (process-buffer process)) + (setq moving (= (point) (process-mark process))) + (save-excursion + ;; Insert the text, moving the process-marker. + (goto-char (process-mark process)) + (insert string) + (set-marker (process-mark process) (point))) + (if moving (goto-char (process-mark process)))) + (set-buffer old-buffer)))) + +The reason to use an explicit `unwind-protect' rather than letting +`save-excursion' restore the current buffer is so as to preserve the +change in point made by `goto-char'. + + To make the filter force the process buffer to be visible whenever +new text arrives, insert the following line just before the +`unwind-protect': + + (display-buffer (process-buffer process)) + + To force point to move to the end of the new output no matter where +it was previously, eliminate the variable `moving' and call `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. *Note 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, +`(buffer-name (process-buffer PROCESS))' returns `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. + + - Function: set-process-filter process filter + This function gives PROCESS the filter function FILTER. If FILTER + is `nil', then the process will have no filter. If FILTER is `t', + then no output from the process will be accepted until the filter + is changed. (Output received during this time is not discarded, + but is queued, and will be processed as soon as the filter is + changed.) + + - Function: process-filter process + This function returns the filter function of PROCESS, or `nil' if + it has none. `t' means that output processing has been stopped. + + Here is an example of use of a filter function: + + (defun keep-output (process output) + (setq kept (cons output kept))) + => keep-output + (setq kept nil) + => nil + (set-process-filter (get-process "shell") 'keep-output) + => keep-output + (process-send-string "shell" "ls ~/other\n") + => nil + kept + => ("lewis@slug[8] % " + "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 + ") + + +File: lispref.info, Node: Accepting Output, Prev: Filter Functions, Up: Output from Processes + +Accepting Output from Processes +------------------------------- + + Output from asynchronous subprocesses normally arrives only while +XEmacs 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. + + - Function: accept-process-output &optional process seconds millisec + This function allows XEmacs to read pending output from processes. + The output is inserted in the associated buffers or given to + their filter functions. If PROCESS is non-`nil' then this + function does not return until some output has been received from + PROCESS. + + The arguments SECONDS and 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 + `accept-process-output' returns after that much time whether or + not there has been any subprocess output. Note that SECONDS is + allowed to be a floating-point number; thus, there is no need to + ever use MILLISEC. (It is retained for compatibility purposes.) + + The function `accept-process-output' returns non-`nil' if it did + get some output, or `nil' if the timeout expired before output + arrived. + + File: lispref.info, Node: Sentinels, Next: Process Window Size, Prev: Output from Processes, Up: Processes Sentinels: Detecting Process Status Changes @@ -201,23 +606,39 @@ connection, and it never returns either of those values for a real subprocess. *Note Process Information::. - Function: open-network-stream name buffer-or-name host service + &optional protocol This function opens a TCP connection for a service to a host. It returns a process object to represent the connection. + Input and output work as for other process objects. + `delete-process' closes the connection. + The NAME argument specifies the name for the process object. It is modified as necessary to make it unique. The 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 - BUFFER-OR-NAME is `nil', it means that the connection is not - associated with any buffer. + connection. It can be a buffer or the name of one. Output from + the connection is inserted in the buffer, unless you specify a + filter function to handle the output. If BUFFER-OR-NAME is `nil', + it means that the connection is not associated with any buffer. The arguments HOST and SERVICE specify where to connect to; HOST is the host name or IP address (a string), and SERVICE is the name of a defined network service (a string) or a port number (an integer). + Optional fifth arg PROTOCOL is the network protocol to use. + Currently only `tcp' (Transmission Control Protocol) and `udp' + (User Datagram Protocol) are supported. When omitted, `tcp' is + assumed. + + Output via `process-send-string' and input via buffer or filter + (see `set-process-filter') are stream-oriented. That means UDP + datagrams are not guaranteed to be sent and received in discrete + packets. (But small datagrams around 500 bytes that are not + truncated by `process-send-string' are usually fine.) Note further + that the UDP protocol does not guard against lost packets. +  File: lispref.info, Node: System Interface, Next: X-Windows, Prev: Processes, Up: Top @@ -584,7 +1005,7 @@ Killing XEmacs parent process normally resumes control. The low-level primitive for killing XEmacs is `kill-emacs'. - - Function: kill-emacs &optional exit-data + - Command: kill-emacs &optional exit-data This function exits the XEmacs process and kills it. If EXIT-DATA is an integer, then it is used as the exit status of @@ -638,15 +1059,15 @@ 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 XEmacs is an X client. - - Function: suspend-emacs string + - Command: suspend-emacs &optional stuffstring This function stops XEmacs and returns control to the superior process. If and when the superior process resumes XEmacs, `suspend-emacs' returns `nil' to its caller in Lisp. - If STRING is non-`nil', its characters are sent to be read as - terminal input by XEmacs's superior shell. The characters in - STRING are not echoed by the superior shell; only the results - appear. + If optional arg STUFFSTRING is non-`nil', its characters are sent + to be read as terminal input by XEmacs's superior shell. The + characters in STUFFSTRING are not echoed by the superior shell; + only the results appear. Before suspending, `suspend-emacs' runs the normal hook `suspend-hook'. In Emacs version 18, `suspend-hook' was not a @@ -697,586 +1118,3 @@ when XEmacs is an X client. - Variable: suspend-resume-hook This variable is a normal hook run after suspending. - -File: lispref.info, Node: System Environment, Next: User Identification, Prev: Getting Out, Up: System Interface - -Operating System Environment -============================ - - XEmacs provides access to variables in the operating system -environment through various functions. These variables include the -name of the system, the user's UID, and so on. - - - Variable: system-type - The value of this variable is a symbol indicating the type of - operating system XEmacs is operating on. Here is a table of the - possible values: - - `aix-v3' - AIX. - - `berkeley-unix' - Berkeley BSD. - - `dgux' - Data General DGUX operating system. - - `gnu' - A GNU system using the GNU HURD and Mach. - - `hpux' - Hewlett-Packard HPUX operating system. - - `irix' - Silicon Graphics Irix system. - - `linux' - A GNU system using the Linux kernel. - - `ms-dos' - Microsoft MS-DOS "operating system." - - `next-mach' - NeXT Mach-based system. - - `rtu' - Masscomp RTU, UCB universe. - - `unisoft-unix' - UniSoft UniPlus. - - `usg-unix-v' - AT&T System V. - - `vax-vms' - VAX VMS. - - `windows-nt' - Microsoft windows NT. - - `xenix' - SCO Xenix 386. - - 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 - `system-configuration' to distinguish between different operating - systems. - - - Variable: 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 `string-match'. - - - Function: system-name - This function returns the name of the machine you are running on. - (system-name) - => "prep.ai.mit.edu" - - The symbol `system-name' is a variable as well as a function. In -fact, the function returns whatever value the variable `system-name' -currently holds. Thus, you can set the variable `system-name' in case -Emacs is confused about the name of your system. The variable is also -useful for constructing frame titles (*note Frame Titles::). - - - Variable: mail-host-address - If this variable is non-`nil', it is used instead of `system-name' - for purposes of generating email addresses. For example, it is - used when constructing the default value of `user-mail-address'. - *Note User Identification::. (Since this is done when XEmacs - starts up, the value actually used is the one saved when XEmacs - was dumped. *Note Building XEmacs::.) - - - Function: getenv var - This function returns the value of the environment variable VAR, - as a string. Within XEmacs, the environment variable values are - kept in the Lisp variable `process-environment'. - - (getenv "USER") - => "lewis" - - lewis@slug[10] % printenv - PATH=.:/user/lewis/bin:/usr/bin:/usr/local/bin - USER=lewis - TERM=ibmapa16 - SHELL=/bin/csh - HOME=/user/lewis - - - Command: setenv variable value - This command sets the value of the environment variable named - VARIABLE to VALUE. Both arguments should be strings. This - function works by modifying `process-environment'; binding that - variable with `let' is also reasonable practice. - - - Variable: process-environment - This variable is a list of strings, each describing one environment - variable. The functions `getenv' and `setenv' work by means of - this variable. - - process-environment - => ("l=/usr/stanford/lib/gnuemacs/lisp" - "PATH=.:/user/lewis/bin:/usr/class:/nfsusr/local/bin" - "USER=lewis" - "TERM=ibmapa16" - "SHELL=/bin/csh" - "HOME=/user/lewis") - - - Variable: 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 `":"' for Unix and GNU systems, and `";"' - for MS-DOS and Windows NT. - - - Variable: 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. - - - Variable: invocation-directory - This variable holds the directory from which the Emacs executable - was invoked, or perhaps `nil' if that directory cannot be - determined. - - - Variable: installation-directory - If non-`nil', this is a directory within which to look for the - `lib-src' and `etc' subdirectories. This is non-`nil' when Emacs - can't find those directories in their standard installed - locations, but can find them in a directory related somehow to the - one containing the Emacs executable. - - - Function: load-average &optional use-floats - This function returns a list of the current 1-minute, 5-minute and - 15-minute load averages. The values are integers that are 100 - times the system load averages. (The load averages indicate the - number of processes trying to run.) - - When USE-FLOATS is non-`nil', floats will be returned instead of - integers. These floats are not multiplied by 100. - - (load-average) - => (169 158 164) - (load-average t) - => (1.69921875 1.58984375 1.640625) - - lewis@rocky[5] % uptime - 8:06pm up 16 day(s), 21:57, 40 users, - load average: 1.68, 1.59, 1.64 - - If the 5-minute or 15-minute load averages are not available, - return a shortened list, containing only those averages which are - available. - - On some systems, this function may require special privileges to - run, or it may be unimplemented for the particular system type. - In that case, the function will signal an error. - - - Function: emacs-pid - This function returns the process ID of the Emacs process. - - - Function: 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, SETP, is `t' or `nil', indicating whether the - privilege is to be turned on or off. Its default is `nil'. The - function returns `t' if successful, `nil' otherwise. - - If the third argument, GETPRV, is non-`nil', `setprv' does not - change the privilege, but returns `t' or `nil' indicating whether - the privilege is currently enabled. - - -File: lispref.info, Node: User Identification, Next: Time of Day, Prev: System Environment, Up: System Interface - -User Identification -=================== - - - Variable: 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. - - - Function: user-login-name &optional uid - If you don't specify UID, this function returns the name under - which the user is logged in. If the environment variable `LOGNAME' - is set, that value is used. Otherwise, if the environment variable - `USER' is set, that value is used. Otherwise, the value is based - on the effective UID, not the real UID. - - If you specify UID, the value is the user name that corresponds to - UID (which should be an integer). - - (user-login-name) - => "lewis" - - - Function: user-real-login-name - This function returns the user name corresponding to Emacs's real - UID. This ignores the effective UID and ignores the environment - variables `LOGNAME' and `USER'. - - - Variable: user-full-name - This variable holds the name of the user running this Emacs. It is - initialized at startup time from the value of `NAME' environment - variable. You can change the value of this variable to alter the - result of the `user-full-name' function. - - - Function: user-full-name &optional user - This function returns the full name of USER. If USER is `nil', it - defaults to the user running this Emacs. In that case, the value - of `user-full-name' variable, if non-`nil', will be used. - - If USER is specified explicitly, `user-full-name' variable is - ignored. - - (user-full-name) - => "Hrvoje Niksic" - (setq user-full-name "Hrvoje \"Niksa\" Niksic") - (user-full-name) - => "Hrvoje \"Niksa\" Niksic" - (user-full-name "hniksic") - => "Hrvoje Niksic" - - The symbols `user-login-name', `user-real-login-name' and -`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 (*note Frame -Titles::). - - - Function: user-real-uid - This function returns the real UID of the user. - - (user-real-uid) - => 19 - - - Function: user-uid - This function returns the effective UID of the user. - - - Function: user-home-directory - This function returns the "`HOME'" directory of the user, and is - intended to replace occurrences of "`(getenv "HOME")'". Under - Unix systems, the following is done: - - 1. Return the value of "`(getenv "HOME")'", if set. - - 2. Return "/", as a fallback, but issue a warning. (Future - versions of XEmacs will also attempt to lookup the `HOME' - directory via `getpwent()', but this has not yet been - implemented.) - - Under MS Windows, this is done: - - 1. Return the value of "`(getenv "HOME")'", if set. - - 2. If the environment variables `HOMEDRIVE' and `HOMEDIR' are - both set, return the concatenation (the following description - uses MS Windows environment variable substitution syntax): - `%HOMEDRIVE%%HOMEDIR%'. - - 3. Return "C:\", as a fallback, but issue a warning. - - -File: lispref.info, Node: Time of Day, Next: Time Conversion, Prev: User Identification, Up: System Interface - -Time of Day -=========== - - This section explains how to determine the current time and the time -zone. - - - Function: 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 `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. - - The argument 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 `current-time' (see below) and from `file-attributes' (*note - File Attributes::). - - (current-time-string) - => "Wed Oct 14 22:21:05 1987" - - - Function: current-time - This function returns the system's time value as a list of three - integers: `(HIGH LOW MICROSEC)'. The integers HIGH and LOW - combine to give the number of seconds since 0:00 January 1, 1970, - which is HIGH * 2**16 + LOW. - - The third element, 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 `file-attributes'. *Note File - Attributes::. - - - Function: 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 `(OFFSET NAME)'. Here 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, 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 - `nil'. - - The argument 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 `current-time' - (see above) and from `file-attributes' (*note File Attributes::). - - -File: lispref.info, Node: Time Conversion, Next: Timers, Prev: Time of Day, Up: System Interface - -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 `current-time' (*note Time of Day::) and -`file-attributes' (*note File Attributes::). - - - Function: format-time-string format-string &optional time - This function converts TIME to a string according to - FORMAT-STRING. If TIME is omitted, it defaults to the current - time. The argument FORMAT-STRING may contain `%'-sequences which - say to substitute parts of the time. Here is a table of what the - `%'-sequences mean: - - `%a' - This stands for the abbreviated name of the day of week. - - `%A' - This stands for the full name of the day of week. - - `%b' - This stands for the abbreviated name of the month. - - `%B' - This stands for the full name of the month. - - `%c' - This is a synonym for `%x %X'. - - `%C' - This has a locale-specific meaning. In the default locale - (named C), it is equivalent to `%A, %B %e, %Y'. - - `%d' - This stands for the day of month, zero-padded. - - `%D' - This is a synonym for `%m/%d/%y'. - - `%e' - This stands for the day of month, blank-padded. - - `%h' - This is a synonym for `%b'. - - `%H' - This stands for the hour (00-23). - - `%I' - This stands for the hour (00-12). - - `%j' - This stands for the day of the year (001-366). - - `%k' - This stands for the hour (0-23), blank padded. - - `%l' - This stands for the hour (1-12), blank padded. - - `%m' - This stands for the month (01-12). - - `%M' - This stands for the minute (00-59). - - `%n' - This stands for a newline. - - `%p' - This stands for `AM' or `PM', as appropriate. - - `%r' - This is a synonym for `%I:%M:%S %p'. - - `%R' - This is a synonym for `%H:%M'. - - `%S' - This stands for the seconds (00-60). - - `%t' - This stands for a tab character. - - `%T' - This is a synonym for `%H:%M:%S'. - - `%U' - This stands for the week of the year (01-52), assuming that - weeks start on Sunday. - - `%w' - This stands for the numeric day of week (0-6). Sunday is day - 0. - - `%W' - This stands for the week of the year (01-52), assuming that - weeks start on Monday. - - `%x' - This has a locale-specific meaning. In the default locale - (named C), it is equivalent to `%D'. - - `%X' - This has a locale-specific meaning. In the default locale - (named C), it is equivalent to `%T'. - - `%y' - This stands for the year without century (00-99). - - `%Y' - This stands for the year with century. - - `%Z' - This stands for the time zone abbreviation. - - - Function: decode-time time - This function converts a time value into calendrical information. - The return value is a list of nine elements, as follows: - - (SECONDS MINUTES HOUR DAY MONTH YEAR DOW DST ZONE) - - Here is what the elements mean: - - SEC - The number of seconds past the minute, as an integer between - 0 and 59. - - MINUTE - The number of minutes past the hour, as an integer between 0 - and 59. - - HOUR - The hour of the day, as an integer between 0 and 23. - - DAY - The day of the month, as an integer between 1 and 31. - - MONTH - The month of the year, as an integer between 1 and 12. - - YEAR - The year, an integer typically greater than 1900. - - DOW - The day of week, as an integer between 0 and 6, where 0 - stands for Sunday. - - DST - `t' if daylight savings time is effect, otherwise `nil'. - - ZONE - An integer indicating the time zone, as the number of seconds - east of Greenwich. - - Note that Common Lisp has different meanings for DOW and ZONE. - - - Function: encode-time seconds minutes hour day month year &optional - zone - This function is the inverse of `decode-time'. It converts seven - items of calendrical data into a time value. For the meanings of - the arguments, see the table above under `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 `encode-time'. - - The optional argument 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 `current-time-zone') or an integer (as - you would get from `decode-time'). The specified zone is used - without any further alteration for daylight savings time. - - -File: lispref.info, Node: Timers, Next: Terminal Input, Prev: Time Conversion, Up: System Interface - -Timers for Delayed Execution -============================ - - You can set up a timer to call a function at a specified future time. - - - Function: add-timeout secs function object &optional resignal - This function adds a timeout, to be signaled after the timeout - period has elapsed. SECS is a number of seconds, expressed as an - integer or a float. FUNCTION will be called after that many - seconds have elapsed, with one argument, the given OBJECT. If the - optional RESIGNAL argument is provided, then after this timeout - expires, `add-timeout' will automatically be called again with - RESIGNAL as the first argument. - - This function returns an object which is the "id" of this - particular timeout. You can pass that object to `disable-timeout' - to turn off the timeout before it has been signalled. - - The number of seconds may be expressed as a floating-point number, - in which case some fractional part of a second will be used. - Caveat: the usable timeout granularity will vary from system to - system. - - Adding a timeout causes a timeout event to be returned by - `next-event', and the function will be invoked by - `dispatch-event', so if XEmacs is in a tight loop, the function - will not be invoked until the next call to sit-for or until the - return to top-level (the same is true of process filters). - - WARNING: if you are thinking of calling add-timeout from inside of - a callback function as a way of resignalling a timeout, think - again. There is a race condition. That's why the RESIGNAL - argument exists. - - (NOTE: In FSF Emacs, this function is called `run-at-time' and has - different semantics.) - - - Function: disable-timeout id - Cancel the requested action for ID, which should be a value - previously returned by `add-timeout'. This cancels the effect of - that call to `add-timeout'; the arrival of the specified time will - not cause anything special to happen. (NOTE: In FSF Emacs, this - function is called `cancel-timer'.) - - -File: lispref.info, Node: Terminal Input, Next: Terminal Output, Prev: Timers, Up: System Interface - -Terminal Input -============== - - This section describes functions and variables for recording or -manipulating terminal input. See *Note 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. - diff --git a/info/lispref.info-41 b/info/lispref.info-41 index c4ba9dd..62e99b6 100644 --- a/info/lispref.info-41 +++ b/info/lispref.info-41 @@ -50,12 +50,589 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: System Environment, Next: User Identification, Prev: Getting Out, Up: System Interface + +Operating System Environment +============================ + + XEmacs provides access to variables in the operating system +environment through various functions. These variables include the +name of the system, the user's UID, and so on. + + - Variable: system-type + The value of this variable is a symbol indicating the type of + operating system XEmacs is operating on. Here is a table of the + possible values: + + `aix-v3' + AIX. + + `berkeley-unix' + Berkeley BSD. + + `dgux' + Data General DGUX operating system. + + `gnu' + A GNU system using the GNU HURD and Mach. + + `hpux' + Hewlett-Packard HPUX operating system. + + `irix' + Silicon Graphics Irix system. + + `linux' + A GNU system using the Linux kernel. + + `ms-dos' + Microsoft MS-DOS "operating system." + + `next-mach' + NeXT Mach-based system. + + `rtu' + Masscomp RTU, UCB universe. + + `unisoft-unix' + UniSoft UniPlus. + + `usg-unix-v' + AT&T System V. + + `windows-nt' + Microsoft windows NT. + + `xenix' + SCO Xenix 386. + + 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 + `system-configuration' to distinguish between different operating + systems. + + - Variable: 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 `string-match'. + + - Function: system-name + This function returns the name of the machine you are running on. + (system-name) + => "prep.ai.mit.edu" + + The symbol `system-name' is a variable as well as a function. In +fact, the function returns whatever value the variable `system-name' +currently holds. Thus, you can set the variable `system-name' in case +Emacs is confused about the name of your system. The variable is also +useful for constructing frame titles (*note Frame Titles::). + + - Variable: mail-host-address + If this variable is non-`nil', it is used instead of `system-name' + for purposes of generating email addresses. For example, it is + used when constructing the default value of `user-mail-address'. + *Note User Identification::. (Since this is done when XEmacs + starts up, the value actually used is the one saved when XEmacs + was dumped. *Note Building XEmacs::.) + + - Command: getenv var &optional interactivep + This function returns the value of the environment variable VAR, + as a string. Within XEmacs, the environment variable values are + kept in the Lisp variable `process-environment'. + + When invoked interactively, `getenv' prints the value in the echo + area. + + (getenv "USER") + => "lewis" + + lewis@slug[10] % printenv + PATH=.:/user/lewis/bin:/usr/bin:/usr/local/bin + USER=lewis + TERM=ibmapa16 + SHELL=/bin/csh + HOME=/user/lewis + + - Command: setenv variable &optional value unset + This command sets the value of the environment variable named + VARIABLE to VALUE. Both arguments should be strings. This + function works by modifying `process-environment'; binding that + variable with `let' is also reasonable practice. + + - Variable: process-environment + This variable is a list of strings, each describing one environment + variable. The functions `getenv' and `setenv' work by + manipulating this variable. + + process-environment + => ("l=/usr/stanford/lib/gnuemacs/lisp" + "PATH=.:/user/lewis/bin:/usr/class:/nfsusr/local/bin" + "USER=lewis" + "TERM=ibmapa16" + "SHELL=/bin/csh" + "HOME=/user/lewis") + + - Variable: 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 `":"' for Unix and GNU systems, and `";"' + for MS-DOS and Windows NT. + + - Variable: 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. + + - Variable: invocation-directory + This variable holds the directory from which the Emacs executable + was invoked, or perhaps `nil' if that directory cannot be + determined. + + - Variable: installation-directory + If non-`nil', this is a directory within which to look for the + `lib-src' and `etc' subdirectories. This is non-`nil' when Emacs + can't find those directories in their standard installed + locations, but can find them in a directory related somehow to the + one containing the Emacs executable. + + - Function: load-average &optional use-floats + This function returns a list of the current 1-minute, 5-minute and + 15-minute load averages. The values are integers that are 100 + times the system load averages. (The load averages indicate the + number of processes trying to run.) + + When USE-FLOATS is non-`nil', floats will be returned instead of + integers. These floats are not multiplied by 100. + + (load-average) + => (169 158 164) + (load-average t) + => (1.69921875 1.58984375 1.640625) + + lewis@rocky[5] % uptime + 8:06pm up 16 day(s), 21:57, 40 users, + load average: 1.68, 1.59, 1.64 + + If the 5-minute or 15-minute load averages are not available, + return a shortened list, containing only those averages which are + available. + + On some systems, this function may require special privileges to + run, or it may be unimplemented for the particular system type. + In that case, the function will signal an error. + + - Function: emacs-pid + This function returns the process ID of the Emacs process. + + +File: lispref.info, Node: User Identification, Next: Time of Day, Prev: System Environment, Up: System Interface + +User Identification +=================== + + - Variable: 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. + + - Function: user-login-name &optional uid + If you don't specify UID, this function returns the name under + which the user is logged in. If the environment variable `LOGNAME' + is set, that value is used. Otherwise, if the environment variable + `USER' is set, that value is used. Otherwise, the value is based + on the effective UID, not the real UID. + + If you specify UID, the value is the user name that corresponds to + UID (which should be an integer). + + (user-login-name) + => "lewis" + + - Function: user-real-login-name + This function returns the user name corresponding to Emacs's real + UID. This ignores the effective UID and ignores the environment + variables `LOGNAME' and `USER'. + + - Variable: user-full-name + This variable holds the name of the user running this Emacs. It is + initialized at startup time from the value of `NAME' environment + variable. You can change the value of this variable to alter the + result of the `user-full-name' function. + + - Function: user-full-name &optional user + This function returns the full name of USER. If USER is `nil', it + defaults to the user running this Emacs. In that case, the value + of `user-full-name' variable, if non-`nil', will be used. + + If USER is specified explicitly, `user-full-name' variable is + ignored. + + (user-full-name) + => "Hrvoje Niksic" + (setq user-full-name "Hrvoje \"Niksa\" Niksic") + (user-full-name) + => "Hrvoje \"Niksa\" Niksic" + (user-full-name "hniksic") + => "Hrvoje Niksic" + + The symbols `user-login-name', `user-real-login-name' and +`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 (*note Frame +Titles::). + + - Function: user-real-uid + This function returns the real UID of the user. + + (user-real-uid) + => 19 + + - Function: user-uid + This function returns the effective UID of the user. + + - Function: user-home-directory + This function returns the "`HOME'" directory of the user, and is + intended to replace occurrences of "`(getenv "HOME")'". Under + Unix systems, the following is done: + + 1. Return the value of "`(getenv "HOME")'", if set. + + 2. Return "/", as a fallback, but issue a warning. (Future + versions of XEmacs will also attempt to lookup the `HOME' + directory via `getpwent()', but this has not yet been + implemented.) + + Under MS Windows, this is done: + + 1. Return the value of "`(getenv "HOME")'", if set. + + 2. If the environment variables `HOMEDRIVE' and `HOMEDIR' are + both set, return the concatenation (the following description + uses MS Windows environment variable substitution syntax): + `%HOMEDRIVE%%HOMEDIR%'. + + 3. Return "C:\", as a fallback, but issue a warning. + + +File: lispref.info, Node: Time of Day, Next: Time Conversion, Prev: User Identification, Up: System Interface + +Time of Day +=========== + + This section explains how to determine the current time and the time +zone. + + - Function: 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 `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. + + The argument 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 `current-time' (see below) and from `file-attributes' (*note + File Attributes::). + + (current-time-string) + => "Wed Oct 14 22:21:05 1987" + + - Function: current-time + This function returns the system's time value as a list of three + integers: `(HIGH LOW MICROSEC)'. The integers HIGH and LOW + combine to give the number of seconds since 0:00 January 1, 1970, + which is HIGH * 2**16 + LOW. + + The third element, 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 `file-attributes'. *Note File + Attributes::. + + - Function: 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 `(OFFSET NAME)'. Here 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, 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 + `nil'. + + The argument 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 `current-time' + (see above) and from `file-attributes' (*note File Attributes::). + + +File: lispref.info, Node: Time Conversion, Next: Timers, Prev: Time of Day, Up: System Interface + +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 `current-time' (*note Time of Day::) and +`file-attributes' (*note File Attributes::). + + - Function: format-time-string format-string &optional time + This function converts TIME to a string according to + FORMAT-STRING. If TIME is omitted, it defaults to the current + time. The argument FORMAT-STRING may contain `%'-sequences which + say to substitute parts of the time. Here is a table of what the + `%'-sequences mean: + + `%a' + This stands for the abbreviated name of the day of week. + + `%A' + This stands for the full name of the day of week. + + `%b' + This stands for the abbreviated name of the month. + + `%B' + This stands for the full name of the month. + + `%c' + This is a synonym for `%x %X'. + + `%C' + This has a locale-specific meaning. In the default locale + (named C), it is equivalent to `%A, %B %e, %Y'. + + `%d' + This stands for the day of month, zero-padded. + + `%D' + This is a synonym for `%m/%d/%y'. + + `%e' + This stands for the day of month, blank-padded. + + `%h' + This is a synonym for `%b'. + + `%H' + This stands for the hour (00-23). + + `%I' + This stands for the hour (00-12). + + `%j' + This stands for the day of the year (001-366). + + `%k' + This stands for the hour (0-23), blank padded. + + `%l' + This stands for the hour (1-12), blank padded. + + `%m' + This stands for the month (01-12). + + `%M' + This stands for the minute (00-59). + + `%n' + This stands for a newline. + + `%p' + This stands for `AM' or `PM', as appropriate. + + `%r' + This is a synonym for `%I:%M:%S %p'. + + `%R' + This is a synonym for `%H:%M'. + + `%S' + This stands for the seconds (00-60). + + `%t' + This stands for a tab character. + + `%T' + This is a synonym for `%H:%M:%S'. + + `%U' + This stands for the week of the year (01-52), assuming that + weeks start on Sunday. + + `%w' + This stands for the numeric day of week (0-6). Sunday is day + 0. + + `%W' + This stands for the week of the year (01-52), assuming that + weeks start on Monday. + + `%x' + This has a locale-specific meaning. In the default locale + (named C), it is equivalent to `%D'. + + `%X' + This has a locale-specific meaning. In the default locale + (named C), it is equivalent to `%T'. + + `%y' + This stands for the year without century (00-99). + + `%Y' + This stands for the year with century. + + `%Z' + This stands for the time zone abbreviation. + + - Function: decode-time &optional specified-time + This function converts a time value into calendrical information. + The optional SPECIFIED-TIME should be a list of (HIGH LOW . + IGNORED) or (HIGH . LOW), as from `current-time' and + `file-attributes', or `nil' to use the current time. + + The return value is a list of nine elements, as follows: + + (SECONDS MINUTES HOUR DAY MONTH YEAR DOW DST ZONE) + + Here is what the elements mean: + + SEC + The number of seconds past the minute, as an integer between + 0 and 59. + + MINUTE + The number of minutes past the hour, as an integer between 0 + and 59. + + HOUR + The hour of the day, as an integer between 0 and 23. + + DAY + The day of the month, as an integer between 1 and 31. + + MONTH + The month of the year, as an integer between 1 and 12. + + YEAR + The year, an integer typically greater than 1900. + + DOW + The day of week, as an integer between 0 and 6, where 0 + stands for Sunday. + + DST + `t' if daylight savings time is effect, otherwise `nil'. + + ZONE + An integer indicating the time zone, as the number of seconds + east of Greenwich. + + Note that Common Lisp has different meanings for DOW and ZONE. + + - Function: encode-time seconds minutes hour day month year &optional + zone + This function is the inverse of `decode-time'. It converts seven + items of calendrical data into a time value. For the meanings of + the arguments, see the table above under `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 `encode-time'. + + The optional argument 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 `current-time-zone') or an integer (as + you would get from `decode-time'). The specified zone is used + without any further alteration for daylight savings time. + + +File: lispref.info, Node: Timers, Next: Terminal Input, Prev: Time Conversion, Up: System Interface + +Timers for Delayed Execution +============================ + + You can set up a timer to call a function at a specified future time. + + - Function: add-timeout secs function object &optional resignal + This function adds a timeout, to be signaled after the timeout + period has elapsed. SECS is a number of seconds, expressed as an + integer or a float. FUNCTION will be called after that many + seconds have elapsed, with one argument, the given OBJECT. If the + optional RESIGNAL argument is provided, then after this timeout + expires, `add-timeout' will automatically be called again with + RESIGNAL as the first argument. + + This function returns an object which is the "id" of this + particular timeout. You can pass that object to `disable-timeout' + to turn off the timeout before it has been signalled. + + The number of seconds may be expressed as a floating-point number, + in which case some fractional part of a second will be used. + Caveat: the usable timeout granularity will vary from system to + system. + + Adding a timeout causes a timeout event to be returned by + `next-event', and the function will be invoked by + `dispatch-event', so if XEmacs is in a tight loop, the function + will not be invoked until the next call to sit-for or until the + return to top-level (the same is true of process filters). + + WARNING: if you are thinking of calling add-timeout from inside of + a callback function as a way of resignalling a timeout, think + again. There is a race condition. That's why the RESIGNAL + argument exists. + + (NOTE: In FSF Emacs, this function is called `run-at-time' and has + different semantics.) + + - Function: disable-timeout id + Cancel the requested action for ID, which should be a value + previously returned by `add-timeout'. This cancels the effect of + that call to `add-timeout'; the arrival of the specified time will + not cause anything special to happen. (NOTE: In FSF Emacs, this + function is called `cancel-timer'.) + + +File: lispref.info, Node: Terminal Input, Next: Terminal Output, Prev: Timers, Up: System Interface + +Terminal Input +============== + + This section describes functions and variables for recording or +manipulating terminal input. See *Note 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. + + File: lispref.info, Node: Input Modes, Next: Translating Input, Up: Terminal Input Input Modes ----------- - - Function: set-input-mode interrupt flow meta quit-char + - Function: set-input-mode interrupt flow meta &optional quit-char + console This function sets the mode for reading keyboard input. If INTERRUPT is non-null, then XEmacs uses input interrupts. If it is `nil', then it uses CBREAK mode. When XEmacs communicates @@ -83,7 +660,7 @@ Input Modes The `current-input-mode' function returns the input mode settings XEmacs is currently using. - - Function: current-input-mode + - Function: current-input-mode &optional console This function returns current mode for reading keyboard input. It returns a list, corresponding to the arguments of `set-input-mode', of the form `(INTERRUPT FLOW META QUIT)' in which: @@ -287,10 +864,10 @@ the proper value, but others do not. If XEmacs has the wrong value, it makes decisions that are less than optimal. To fix the problem, use `set-device-baud-rate'. - - Function: set-device-baud-rate &optional device + - Function: set-device-baud-rate device baud-rate This function sets the output speed of DEVICE. See `device-baud-rate'. DEVICE defaults to the selected device - (usually the only device) if omitted. + (usually the only device) if `nil'. - Function: send-string-to-terminal char-or-string &optional stdout-p device @@ -374,12 +951,16 @@ terminals, this problem is gradually being cured. For the mean time, XEmacs provides a convenient way of enabling flow control if you want it: call the function `enable-flow-control'. - - Function: enable-flow-control + - Command: enable-flow-control &optional argument This function enables use of `C-s' and `C-q' for output flow control, and provides the characters `C-\' and `C-^' as aliases for them using `keyboard-translate-table' (*note Translating Input::). + With optional argument ARGUMENT (interactively the prefix + argument), enable flow control mode if ARGUMENT is positive; else + disable it. + You can use the function `enable-flow-control-on' in your `.emacs' file to enable flow control automatically on certain terminal types. @@ -505,11 +1086,25 @@ clients that still use them. This function returns the contents of cut buffer number N. (This function is called `x-get-cut-buffer' in FSF Emacs.) - - Function: x-store-cutbuffer string + - Function: x-store-cutbuffer string &optional push This function stores STRING into the first cut buffer (cut buffer - 0), moving the other values down through the series of cut buffers, - kill-ring-style. (This function is called `x-set-cut-buffer' in FSF - Emacs.) + 0). + + Normally, the contents of the first cut buffer are simply replaced + by STRING. However, if optional argument PUSH is non-`nil', the + cut buffers are rotated. This means that the previous value of + the first cut buffer moves to the second cut buffer, and the + second to the third, and so on, moving the other values down + through the series of cut buffers, kill-ring-style. There are 8 + cut buffers altogether. + + Cut buffers are considered obsolete; you should use selections + instead. + + This function has no effect if support for cut buffers was not + compiled in. + + This function is called `x-set-cut-buffer' in FSF Emacs.  File: lispref.info, Node: X Server, Next: X Miscellaneous, Prev: X Selections, Up: X-Windows @@ -644,7 +1239,7 @@ Resources XEmacs is dumped, or by setting it in the file `lisp/term/x-win.el'. - By default, this variable is nil at startup. When the connection + By default, this variable is `nil' at startup. When the connection to the X server is first initialized, the X resource database will be consulted and the value will be set according to whether any resources are found for the application class "XEmacs". @@ -677,495 +1272,3 @@ optional and defaults to the selected device. (Note that this is different from previous versions of XEmacs, which returned `StaticGray', `GrayScale', etc.) - -File: lispref.info, Node: Grabs, Prev: Server Data, Up: X Server - -Restricting Access to the Server by Other Apps ----------------------------------------------- - - - Function: x-grab-keyboard &optional device - This function grabs the keyboard on the given device (defaulting - to the selected one). So long as the keyboard is grabbed, all - keyboard events will be delivered to XEmacs--it is not possible - for other X clients to eavesdrop on them. Ungrab the keyboard - with `x-ungrab-keyboard' (use an `unwind-protect'). Returns `t' - if the grab was successful; `nil' otherwise. - - - Function: x-ungrab-keyboard &optional device - This function releases a keyboard grab made with `x-grab-keyboard'. - - - Function: x-grab-pointer &optional device cursor ignore-keyboard - This function grabs the pointer and restricts it to its current - window. If optional DEVICE argument is `nil', the selected device - will be used. If optional CURSOR argument is non-`nil', change - the pointer shape to that until `x-ungrab-pointer' is called (it - should be an object returned by the `make-cursor' function). If - the second optional argument IGNORE-KEYBOARD is non-`nil', ignore - all keyboard events during the grab. Returns `t' if the grab is - successful, `nil' otherwise. - - - Function: x-ungrab-pointer &optional device - This function releases a pointer grab made with `x-grab-pointer'. - If optional first arg DEVICE is `nil' the selected device is used. - If it is `t' the pointer will be released on all X devices. - - -File: lispref.info, Node: X Miscellaneous, Prev: X Server, Up: X-Windows - -Miscellaneous X Functions and Variables -======================================= - - - Variable: x-bitmap-file-path - This variable holds a list of the directories in which X bitmap - files may be found. If `nil', this is initialized from the - `"*bitmapFilePath"' resource. This is used by the - `make-image-instance' function (however, note that if the - environment variable `XBMLANGPATH' is set, it is consulted first). - - - Variable: x-library-search-path - This variable holds the search path used by `read-color' to find - `rgb.txt'. - - - Function: x-valid-keysym-name-p keysym - This function returns true if KEYSYM names a keysym that the X - library knows about. Valid keysyms are listed in the files - `/usr/include/X11/keysymdef.h' and in `/usr/lib/X11/XKeysymDB', or - whatever the equivalents are on your system. - - - Function: x-window-id &optional frame - This function returns the ID of the X11 window. This gives us a - chance to manipulate the Emacs window from within a different - program. Since the ID is an unsigned long, we return it as a - string. - - - Variable: x-allow-sendevents - If non-`nil', synthetic events are allowed. `nil' means they are - ignored. Beware: allowing XEmacs to process SendEvents opens a - big security hole. - - - Function: x-debug-mode arg &optional device - With a true arg, make the connection to the X server synchronous. - With false, make it asynchronous. Synchronous connections are - much slower, but are useful for debugging. (If you get X errors, - make the connection synchronous, and use a debugger to set a - breakpoint on `x_error_handler'. Your backtrace of the C stack - will now be useful. In asynchronous mode, the stack above - `x_error_handler' isn't helpful because of buffering.) If DEVICE - is not specified, the selected device is assumed. - - Calling this function is the same as calling the C function - `XSynchronize', or starting the program with the `-sync' command - line argument. - - - Variable: x-debug-events - If non-zero, debug information about events that XEmacs sees is - displayed. Information is displayed on stderr. Currently defined - values are: - - * 1 == non-verbose output - - * 2 == verbose output - - -File: lispref.info, Node: ToolTalk Support, Next: LDAP Support, Prev: X-Windows, Up: Top - -ToolTalk Support -**************** - -* Menu: - -* XEmacs ToolTalk API Summary:: -* Sending Messages:: -* Receiving Messages:: - - -File: lispref.info, Node: XEmacs ToolTalk API Summary, Next: Sending Messages, Up: ToolTalk Support - -XEmacs ToolTalk API Summary -=========================== - - The XEmacs Lisp interface to ToolTalk is similar, at least in spirit, -to the standard C ToolTalk API. Only the message and pattern parts of -the API are supported at present; more of the API could be added if -needed. The Lisp interface departs from the C API in a few ways: - - * ToolTalk is initialized automatically at XEmacs startup-time. - Messages can only be sent other ToolTalk applications connected to - the same X11 server that XEmacs is running on. - - * There are fewer entry points; polymorphic functions with keyword - arguments are used instead. - - * The callback interface is simpler and marginally less functional. - A single callback may be associated with a message or a pattern; - the callback is specified with a Lisp symbol (the symbol should - have a function binding). - - * The session attribute for messages and patterns is always - initialized to the default session. - - * Anywhere a ToolTalk enum constant, e.g. `TT_SESSION', is valid, one - can substitute the corresponding symbol, e.g. `'TT_SESSION'. This - simplifies building lists that represent messages and patterns. - - -File: lispref.info, Node: Sending Messages, Next: Receiving Messages, Prev: XEmacs ToolTalk API Summary, Up: ToolTalk Support - -Sending Messages -================ - -* Menu: - -* Example of Sending Messages:: -* Elisp Interface for Sending Messages:: - - -File: lispref.info, Node: Example of Sending Messages, Next: Elisp Interface for Sending Messages, Up: Sending Messages - -Example of Sending Messages ---------------------------- - - Here's a simple example that sends a query to another application -and then displays its reply. Both the query and the reply are stored -in the first argument of the message. - - (defun tooltalk-random-query-handler (msg) - (let ((state (get-tooltalk-message-attribute msg 'state))) - (cond - ((eq state 'TT_HANDLED) - (message (get-tooltalk-message-attribute msg arg_val 0))) - ((memq state '(TT_FAILED TT_REJECTED)) - (message "Random query turns up nothing"))))) - - (defvar random-query-message - '( class TT_REQUEST - scope TT_SESSION - address TT_PROCEDURE - op "random-query" - args '((TT_INOUT "?" "string")) - callback tooltalk-random-query-handler)) - - (let ((m (make-tooltalk-message random-query-message))) - (send-tooltalk-message m)) - - -File: lispref.info, Node: Elisp Interface for Sending Messages, Prev: Example of Sending Messages, Up: Sending Messages - -Elisp Interface for Sending Messages ------------------------------------- - - - Function: make-tooltalk-message attributes - Create a ToolTalk message and initialize its attributes. The - value of ATTRIBUTES must be a list of alternating keyword/values, - where keywords are symbols that name valid message attributes. - For example: - - (make-tooltalk-message - '(class TT_NOTICE - scope TT_SESSION - address TT_PROCEDURE - op "do-something" - args ("arg1" 12345 (TT_INOUT "arg3" "string")))) - - Values must always be strings, integers, or symbols that represent - ToolTalk constants. Attribute names are the same as those - supported by `set-tooltalk-message-attribute', plus `args'. - - The value of `args' should be a list of message arguments where - each message argument has the following form: - - `(mode [value [type]])' or just `value' - - Where MODE is one of `TT_IN', `TT_OUT', or `TT_INOUT' and TYPE is - a string. If TYPE isn't specified then `int' is used if VALUE is - a number; otherwise `string' is used. If TYPE is `string' then - VALUE is converted to a string (if it isn't a string already) with - `prin1-to-string'. If only a value is specified then MODE - defaults to `TT_IN'. If MODE is `TT_OUT' then VALUE and TYPE - don't need to be specified. You can find out more about the - semantics and uses of ToolTalk message arguments in chapter 4 of - the `ToolTalk Programmer's Guide'. - - - - Function: send-tooltalk-message msg - Send the message on its way. Once the message has been sent it's - almost always a good idea to get rid of it with - `destroy-tooltalk-message'. - - - - Function: return-tooltalk-message msg &optional mode - Send a reply to this message. The second argument can be `reply', - `reject' or `fail'; the default is `reply'. Before sending a - reply, all message arguments whose mode is `TT_INOUT' or `TT_OUT' - should have been filled in--see `set-tooltalk-message-attribute'. - - - - Function: get-tooltalk-message-attribute msg attribute &optional argn - Returns the indicated ToolTalk message attribute. Attributes are - identified by symbols with the same name (underscores and all) as - the suffix of the ToolTalk `tt_message_' function that - extracts the value. String attribute values are copied and - enumerated type values (except disposition) are converted to - symbols; e.g. `TT_HANDLER' is `'TT_HANDLER', `uid' and `gid' are - represented by fixnums (small integers), `opnum' is converted to a - string, and `disposition' is converted to a fixnum. We convert - `opnum' (a C int) to a string (e.g. `123' => `"123"') because - there's no guarantee that opnums will fit within the range of - XEmacs Lisp integers. - - [TBD] Use the `plist' attribute instead of C API `user' attribute - for user-defined message data. To retrieve the value of a message - property, specify the indicator for ARGN. For example, to get the - value of a property called `rflag', use - - (get-tooltalk-message-attribute msg 'plist 'rflag) - - To get the value of a message argument use one of the `arg_val' - (strings), `arg_ival' (integers), or `arg_bval' (strings with - embedded nulls), attributes. For example, to get the integer - value of the third argument: - - (get-tooltalk-message-attribute msg 'arg_ival 2) - - As you can see, argument numbers are zero-based. The type of each - arguments can be retrieved with the `arg_type' attribute; however - ToolTalk doesn't define any semantics for the string value of - `arg_type'. Conventionally `string' is used for strings and `int' - for 32 bit integers. Note that XEmacs Lisp stores the lengths of - strings explicitly (unlike C) so treating the value returned by - `arg_bval' like a string is fine. - - - - Function: set-tooltalk-message-attribute value msg attribute - &optional argn - Initialize one ToolTalk message attribute. - - Attribute names and values are the same as for - `get-tooltalk-message-attribute'. A property list is provided for - user data (instead of the `user' message attribute); see - `get-tooltalk-message-attribute'. - - Callbacks are handled slightly differently than in the C ToolTalk - API. The value of CALLBACK should be the name of a function of one - argument. It will be called each time the state of the message - changes. This is usually used to notice when the message's state - has changed to `TT_HANDLED' (or `TT_FAILED'), so that reply - argument values can be used. - - If one of the argument attributes is specified as `arg_val', - `arg_ival', or `arg_bval', then ARGN must be the number of an - already created argument. Arguments can be added to a message - with `add-tooltalk-message-arg'. - - - - Function: add-tooltalk-message-arg msg mode type &optional value - Append one new argument to the message. MODE must be one of - `TT_IN', `TT_INOUT', or `TT_OUT', TYPE must be a string, and VALUE - can be a string or an integer. ToolTalk doesn't define any - semantics for TYPE, so only the participants in the protocol - you're using need to agree what types mean (if anything). - Conventionally `string' is used for strings and `int' for 32 bit - integers. Arguments can initialized by providing a value or with - `set-tooltalk-message-attribute'; the latter is necessary if you - want to initialize the argument with a string that can contain - embedded nulls (use `arg_bval'). - - - - Function: create-tooltalk-message - Create a new ToolTalk message. The message's session attribute is - initialized to the default session. Other attributes can be - initialized with `set-tooltalk-message-attribute'. - `make-tooltalk-message' is the preferred way to create and - initialize a message. - - - - Function: destroy-tooltalk-message msg - Apply `tt_message_destroy' to the message. It's not necessary to - destroy messages after they've been processed by a message or - pattern callback, the Lisp/ToolTalk callback machinery does this - for you. - - -File: lispref.info, Node: Receiving Messages, Prev: Sending Messages, Up: ToolTalk Support - -Receiving Messages -================== - -* Menu: - -* Example of Receiving Messages:: -* Elisp Interface for Receiving Messages:: - - -File: lispref.info, Node: Example of Receiving Messages, Next: Elisp Interface for Receiving Messages, Up: Receiving Messages - -Example of Receiving Messages ------------------------------ - - Here's a simple example of a handler for a message that tells XEmacs -to display a string in the mini-buffer area. The message operation is -called `emacs-display-string'. Its first (0th) argument is the string -to display. - - (defun tooltalk-display-string-handler (msg) - (message (get-tooltalk-message-attribute msg 'arg_val 0))) - - (defvar display-string-pattern - '(category TT_HANDLE - scope TT_SESSION - op "emacs-display-string" - callback tooltalk-display-string-handler)) - - (let ((p (make-tooltalk-pattern display-string-pattern))) - (register-tooltalk-pattern p)) - - -File: lispref.info, Node: Elisp Interface for Receiving Messages, Prev: Example of Receiving Messages, Up: Receiving Messages - -Elisp Interface for Receiving Messages --------------------------------------- - - - Function: make-tooltalk-pattern attributes - Create a ToolTalk pattern and initialize its attributes. The - value of attributes must be a list of alternating keyword/values, - where keywords are symbols that name valid pattern attributes or - lists of valid attributes. For example: - - (make-tooltalk-pattern - '(category TT_OBSERVE - scope TT_SESSION - op ("operation1" "operation2") - args ("arg1" 12345 (TT_INOUT "arg3" "string")))) - - Attribute names are the same as those supported by - `add-tooltalk-pattern-attribute', plus `'args'. - - Values must always be strings, integers, or symbols that represent - ToolTalk constants or lists of same. When a list of values is - provided all of the list elements are added to the attribute. In - the example above, messages whose `op' attribute is `"operation1"' - or `"operation2"' would match the pattern. - - The value of ARGS should be a list of pattern arguments where each - pattern argument has the following form: - - `(mode [value [type]])' or just `value' - - Where MODE is one of `TT_IN', `TT_OUT', or `TT_INOUT' and TYPE is - a string. If TYPE isn't specified then `int' is used if VALUE is - a number; otherwise `string' is used. If TYPE is `string' then - VALUE is converted to a string (if it isn't a string already) with - `prin1-to-string'. If only a value is specified then MODE - defaults to `TT_IN'. If MODE is `TT_OUT' then VALUE and TYPE - don't need to be specified. You can find out more about the - semantics and uses of ToolTalk pattern arguments in chapter 3 of - the `ToolTalk Programmer's Guide'. - - - - Function: register-tooltalk-pattern pat - XEmacs will begin receiving messages that match this pattern. - - - Function: unregister-tooltalk-pattern pat - XEmacs will stop receiving messages that match this pattern. - - - Function: add-tooltalk-pattern-attribute value pat indicator - Add one value to the indicated pattern attribute. The names of - attributes are the same as the ToolTalk accessors used to set them - less the `tooltalk_pattern_' prefix and the `_add' suffix. For - example, the name of the attribute for the - `tt_pattern_disposition_add' attribute is `disposition'. The - `category' attribute is handled specially, since a pattern can only - be a member of one category (`TT_OBSERVE' or `TT_HANDLE'). - - Callbacks are handled slightly differently than in the C ToolTalk - API. The value of CALLBACK should be the name of a function of one - argument. It will be called each time the pattern matches an - incoming message. - - - Function: add-tooltalk-pattern-arg pat mode type value - Add one fully-specified argument to a ToolTalk pattern. MODE must - be one of `TT_IN', `TT_INOUT', or `TT_OUT'. TYPE must be a - string. VALUE can be an integer, string or `nil'. If VALUE is an - integer then an integer argument (`tt_pattern_iarg_add') is added; - otherwise a string argument is added. At present there's no way - to add a binary data argument. - - - - Function: create-tooltalk-pattern - Create a new ToolTalk pattern and initialize its session attribute - to be the default session. - - - Function: destroy-tooltalk-pattern pat - Apply `tt_pattern_destroy' to the pattern. This effectively - unregisters the pattern. - - - Function: describe-tooltalk-message msg &optional stream - Print the message's attributes and arguments to STREAM. This is - often useful for debugging. - - -File: lispref.info, Node: LDAP Support, Next: PostgreSQL Support, Prev: ToolTalk Support, Up: Top - -LDAP Support -************ - - XEmacs can be linked with a LDAP client library to provide Elisp -primitives to access directory servers using the Lightweight Directory -Access Protocol. - -* Menu: - -* Building XEmacs with LDAP support:: How to add LDAP support to XEmacs -* XEmacs LDAP API:: Lisp access to LDAP functions -* Syntax of Search Filters:: A brief summary of RFC 1558 - - -File: lispref.info, Node: Building XEmacs with LDAP support, Next: XEmacs LDAP API, Prev: LDAP Support, Up: LDAP Support - -Building XEmacs with LDAP support -================================= - - LDAP support must be added to XEmacs at build time since it requires -linking to an external LDAP client library. As of 21.2, XEmacs has been -successfully built and tested with - - * OpenLDAP 1.2 () - - * University of Michigan's LDAP 3.3 - () - - * LDAP SDK 1.0 from Netscape Corp. () - - Other libraries conforming to RFC 1823 will probably work also but -may require some minor tweaking at C level. - - The standard XEmacs configure script auto-detects an installed LDAP -library provided the library itself and the corresponding header files -can be found in the library and include paths. A successful detection -will be signalled in the final output of the configure script. - - -File: lispref.info, Node: XEmacs LDAP API, Next: Syntax of Search Filters, Prev: Building XEmacs with LDAP support, Up: LDAP Support - -XEmacs LDAP API -=============== - - XEmacs LDAP API consists of two layers: a low-level layer which -tries to stay as close as possible to the C API (where practical) and a -higher-level layer which provides more convenient primitives to -effectively use LDAP. - - The low-level API should be used directly for very specific purposes -(such as multiple operations on a connection) only. The higher-level -functions provide a more convenient way to access LDAP directories -hiding the subtleties of handling the connection, translating arguments -and ensuring compliance with LDAP internationalization rules and formats -(currently partly implemented only). - -* Menu: - -* LDAP Variables:: Lisp variables related to LDAP -* The High-Level LDAP API:: High-level LDAP lisp functions -* The Low-Level LDAP API:: Low-level LDAP lisp primitives -* LDAP Internationalization:: I18n variables and functions - diff --git a/info/lispref.info-42 b/info/lispref.info-42 index 8185761..5bebd1f 100644 --- a/info/lispref.info-42 +++ b/info/lispref.info-42 @@ -50,6 +50,502 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Grabs, Prev: Server Data, Up: X Server + +Restricting Access to the Server by Other Apps +---------------------------------------------- + + - Function: x-grab-keyboard &optional device + This function grabs the keyboard on the given device (defaulting + to the selected one). So long as the keyboard is grabbed, all + keyboard events will be delivered to XEmacs--it is not possible + for other X clients to eavesdrop on them. Ungrab the keyboard + with `x-ungrab-keyboard' (use an `unwind-protect'). Returns `t' + if the grab was successful; `nil' otherwise. + + - Function: x-ungrab-keyboard &optional device + This function releases a keyboard grab made with `x-grab-keyboard'. + + - Function: x-grab-pointer &optional device cursor ignore-keyboard + This function grabs the pointer and restricts it to its current + window. If optional DEVICE argument is `nil', the selected device + will be used. If optional CURSOR argument is non-`nil', change + the pointer shape to that until `x-ungrab-pointer' is called (it + should be an object returned by the `make-cursor' function). If + the second optional argument IGNORE-KEYBOARD is non-`nil', ignore + all keyboard events during the grab. Returns `t' if the grab is + successful, `nil' otherwise. + + - Function: x-ungrab-pointer &optional device + This function releases a pointer grab made with `x-grab-pointer'. + If optional first arg DEVICE is `nil' the selected device is used. + If it is `t' the pointer will be released on all X devices. + + +File: lispref.info, Node: X Miscellaneous, Prev: X Server, Up: X-Windows + +Miscellaneous X Functions and Variables +======================================= + + - Variable: x-bitmap-file-path + This variable holds a list of the directories in which X bitmap + files may be found. If `nil', this is initialized from the + `"*bitmapFilePath"' resource. This is used by the + `make-image-instance' function (however, note that if the + environment variable `XBMLANGPATH' is set, it is consulted first). + + - Variable: x-library-search-path + This variable holds the search path used by `read-color' to find + `rgb.txt'. + + - Function: x-valid-keysym-name-p keysym + This function returns true if KEYSYM names a keysym that the X + library knows about. Valid keysyms are listed in the files + `/usr/include/X11/keysymdef.h' and in `/usr/lib/X11/XKeysymDB', or + whatever the equivalents are on your system. + + - Function: x-window-id &optional frame + This function returns the ID of the X11 window. This gives us a + chance to manipulate the Emacs window from within a different + program. Since the ID is an unsigned long, we return it as a + string. + + - Variable: x-allow-sendevents + If non-`nil', synthetic events are allowed. `nil' means they are + ignored. Beware: allowing XEmacs to process SendEvents opens a + big security hole. + + - Function: x-debug-mode arg &optional device + With a true arg, make the connection to the X server synchronous. + With false, make it asynchronous. Synchronous connections are + much slower, but are useful for debugging. (If you get X errors, + make the connection synchronous, and use a debugger to set a + breakpoint on `x_error_handler'. Your backtrace of the C stack + will now be useful. In asynchronous mode, the stack above + `x_error_handler' isn't helpful because of buffering.) If DEVICE + is not specified, the selected device is assumed. + + Calling this function is the same as calling the C function + `XSynchronize', or starting the program with the `-sync' command + line argument. + + - Variable: x-debug-events + If non-zero, debug information about events that XEmacs sees is + displayed. Information is displayed on stderr. Currently defined + values are: + + * 1 == non-verbose output + + * 2 == verbose output + + +File: lispref.info, Node: ToolTalk Support, Next: LDAP Support, Prev: X-Windows, Up: Top + +ToolTalk Support +**************** + +* Menu: + +* XEmacs ToolTalk API Summary:: +* Sending Messages:: +* Receiving Messages:: + + +File: lispref.info, Node: XEmacs ToolTalk API Summary, Next: Sending Messages, Up: ToolTalk Support + +XEmacs ToolTalk API Summary +=========================== + + The XEmacs Lisp interface to ToolTalk is similar, at least in spirit, +to the standard C ToolTalk API. Only the message and pattern parts of +the API are supported at present; more of the API could be added if +needed. The Lisp interface departs from the C API in a few ways: + + * ToolTalk is initialized automatically at XEmacs startup-time. + Messages can only be sent other ToolTalk applications connected to + the same X11 server that XEmacs is running on. + + * There are fewer entry points; polymorphic functions with keyword + arguments are used instead. + + * The callback interface is simpler and marginally less functional. + A single callback may be associated with a message or a pattern; + the callback is specified with a Lisp symbol (the symbol should + have a function binding). + + * The session attribute for messages and patterns is always + initialized to the default session. + + * Anywhere a ToolTalk enum constant, e.g. `TT_SESSION', is valid, one + can substitute the corresponding symbol, e.g. `'TT_SESSION'. This + simplifies building lists that represent messages and patterns. + + +File: lispref.info, Node: Sending Messages, Next: Receiving Messages, Prev: XEmacs ToolTalk API Summary, Up: ToolTalk Support + +Sending Messages +================ + +* Menu: + +* Example of Sending Messages:: +* Elisp Interface for Sending Messages:: + + +File: lispref.info, Node: Example of Sending Messages, Next: Elisp Interface for Sending Messages, Up: Sending Messages + +Example of Sending Messages +--------------------------- + + Here's a simple example that sends a query to another application +and then displays its reply. Both the query and the reply are stored +in the first argument of the message. + + (defun tooltalk-random-query-handler (msg) + (let ((state (get-tooltalk-message-attribute msg 'state))) + (cond + ((eq state 'TT_HANDLED) + (message (get-tooltalk-message-attribute msg arg_val 0))) + ((memq state '(TT_FAILED TT_REJECTED)) + (message "Random query turns up nothing"))))) + + (defvar random-query-message + '( class TT_REQUEST + scope TT_SESSION + address TT_PROCEDURE + op "random-query" + args '((TT_INOUT "?" "string")) + callback tooltalk-random-query-handler)) + + (let ((m (make-tooltalk-message random-query-message))) + (send-tooltalk-message m)) + + +File: lispref.info, Node: Elisp Interface for Sending Messages, Prev: Example of Sending Messages, Up: Sending Messages + +Elisp Interface for Sending Messages +------------------------------------ + + - Function: make-tooltalk-message attributes + Create a ToolTalk message and initialize its attributes. The + value of ATTRIBUTES must be a list of alternating keyword/values, + where keywords are symbols that name valid message attributes. + For example: + + (make-tooltalk-message + '(class TT_NOTICE + scope TT_SESSION + address TT_PROCEDURE + op "do-something" + args ("arg1" 12345 (TT_INOUT "arg3" "string")))) + + Values must always be strings, integers, or symbols that represent + ToolTalk constants. Attribute names are the same as those + supported by `set-tooltalk-message-attribute', plus `args'. + + The value of `args' should be a list of message arguments where + each message argument has the following form: + + `(mode [value [type]])' or just `value' + + Where MODE is one of `TT_IN', `TT_OUT', or `TT_INOUT' and TYPE is + a string. If TYPE isn't specified then `int' is used if VALUE is + a number; otherwise `string' is used. If TYPE is `string' then + VALUE is converted to a string (if it isn't a string already) with + `prin1-to-string'. If only a value is specified then MODE + defaults to `TT_IN'. If MODE is `TT_OUT' then VALUE and TYPE + don't need to be specified. You can find out more about the + semantics and uses of ToolTalk message arguments in chapter 4 of + the `ToolTalk Programmer's Guide'. + + + - Function: send-tooltalk-message msg + Send the message on its way. Once the message has been sent it's + almost always a good idea to get rid of it with + `destroy-tooltalk-message'. + + + - Function: return-tooltalk-message msg &optional mode + Send a reply to this message. The second argument can be `reply', + `reject' or `fail'; the default is `reply'. Before sending a + reply, all message arguments whose mode is `TT_INOUT' or `TT_OUT' + should have been filled in--see `set-tooltalk-message-attribute'. + + + - Function: get-tooltalk-message-attribute msg attribute &optional argn + Returns the indicated ToolTalk message attribute. Attributes are + identified by symbols with the same name (underscores and all) as + the suffix of the ToolTalk `tt_message_' function that + extracts the value. String attribute values are copied and + enumerated type values (except disposition) are converted to + symbols; e.g. `TT_HANDLER' is `'TT_HANDLER', `uid' and `gid' are + represented by fixnums (small integers), `opnum' is converted to a + string, and `disposition' is converted to a fixnum. We convert + `opnum' (a C int) to a string (e.g. `123' => `"123"') because + there's no guarantee that opnums will fit within the range of + XEmacs Lisp integers. + + [TBD] Use the `plist' attribute instead of C API `user' attribute + for user-defined message data. To retrieve the value of a message + property, specify the indicator for ARGN. For example, to get the + value of a property called `rflag', use + + (get-tooltalk-message-attribute msg 'plist 'rflag) + + To get the value of a message argument use one of the `arg_val' + (strings), `arg_ival' (integers), or `arg_bval' (strings with + embedded nulls), attributes. For example, to get the integer + value of the third argument: + + (get-tooltalk-message-attribute msg 'arg_ival 2) + + As you can see, argument numbers are zero-based. The type of each + arguments can be retrieved with the `arg_type' attribute; however + ToolTalk doesn't define any semantics for the string value of + `arg_type'. Conventionally `string' is used for strings and `int' + for 32 bit integers. Note that XEmacs Lisp stores the lengths of + strings explicitly (unlike C) so treating the value returned by + `arg_bval' like a string is fine. + + + - Function: set-tooltalk-message-attribute value msg attribute + &optional argn + Initialize one ToolTalk message attribute. + + Attribute names and values are the same as for + `get-tooltalk-message-attribute'. A property list is provided for + user data (instead of the `user' message attribute); see + `get-tooltalk-message-attribute'. + + Callbacks are handled slightly differently than in the C ToolTalk + API. The value of CALLBACK should be the name of a function of one + argument. It will be called each time the state of the message + changes. This is usually used to notice when the message's state + has changed to `TT_HANDLED' (or `TT_FAILED'), so that reply + argument values can be used. + + If one of the argument attributes is specified as `arg_val', + `arg_ival', or `arg_bval', then ARGN must be the number of an + already created argument. Arguments can be added to a message + with `add-tooltalk-message-arg'. + + + - Function: add-tooltalk-message-arg msg mode type &optional value + Append one new argument to the message. MODE must be one of + `TT_IN', `TT_INOUT', or `TT_OUT', TYPE must be a string, and VALUE + can be a string or an integer. ToolTalk doesn't define any + semantics for TYPE, so only the participants in the protocol + you're using need to agree what types mean (if anything). + Conventionally `string' is used for strings and `int' for 32 bit + integers. Arguments can initialized by providing a value or with + `set-tooltalk-message-attribute'; the latter is necessary if you + want to initialize the argument with a string that can contain + embedded nulls (use `arg_bval'). + + + - Function: create-tooltalk-message &optional no-callback + Create a new ToolTalk message. The message's session attribute is + initialized to the default session. Other attributes can be + initialized with `set-tooltalk-message-attribute'. + `make-tooltalk-message' is the preferred way to create and + initialize a message. + + Optional arg NO-CALLBACK says don't add a C-level callback at all. + Normally don't do that; just don't specify the Lisp callback when + calling `make-tooltalk-message'. + + + - Function: destroy-tooltalk-message msg + Apply `tt_message_destroy' to the message. It's not necessary to + destroy messages after they've been processed by a message or + pattern callback, the Lisp/ToolTalk callback machinery does this + for you. + + +File: lispref.info, Node: Receiving Messages, Prev: Sending Messages, Up: ToolTalk Support + +Receiving Messages +================== + +* Menu: + +* Example of Receiving Messages:: +* Elisp Interface for Receiving Messages:: + + +File: lispref.info, Node: Example of Receiving Messages, Next: Elisp Interface for Receiving Messages, Up: Receiving Messages + +Example of Receiving Messages +----------------------------- + + Here's a simple example of a handler for a message that tells XEmacs +to display a string in the mini-buffer area. The message operation is +called `emacs-display-string'. Its first (0th) argument is the string +to display. + + (defun tooltalk-display-string-handler (msg) + (message (get-tooltalk-message-attribute msg 'arg_val 0))) + + (defvar display-string-pattern + '(category TT_HANDLE + scope TT_SESSION + op "emacs-display-string" + callback tooltalk-display-string-handler)) + + (let ((p (make-tooltalk-pattern display-string-pattern))) + (register-tooltalk-pattern p)) + + +File: lispref.info, Node: Elisp Interface for Receiving Messages, Prev: Example of Receiving Messages, Up: Receiving Messages + +Elisp Interface for Receiving Messages +-------------------------------------- + + - Function: make-tooltalk-pattern attributes + Create a ToolTalk pattern and initialize its attributes. The + value of attributes must be a list of alternating keyword/values, + where keywords are symbols that name valid pattern attributes or + lists of valid attributes. For example: + + (make-tooltalk-pattern + '(category TT_OBSERVE + scope TT_SESSION + op ("operation1" "operation2") + args ("arg1" 12345 (TT_INOUT "arg3" "string")))) + + Attribute names are the same as those supported by + `add-tooltalk-pattern-attribute', plus `'args'. + + Values must always be strings, integers, or symbols that represent + ToolTalk constants or lists of same. When a list of values is + provided all of the list elements are added to the attribute. In + the example above, messages whose `op' attribute is `"operation1"' + or `"operation2"' would match the pattern. + + The value of ARGS should be a list of pattern arguments where each + pattern argument has the following form: + + `(mode [value [type]])' or just `value' + + Where MODE is one of `TT_IN', `TT_OUT', or `TT_INOUT' and TYPE is + a string. If TYPE isn't specified then `int' is used if VALUE is + a number; otherwise `string' is used. If TYPE is `string' then + VALUE is converted to a string (if it isn't a string already) with + `prin1-to-string'. If only a value is specified then MODE + defaults to `TT_IN'. If MODE is `TT_OUT' then VALUE and TYPE + don't need to be specified. You can find out more about the + semantics and uses of ToolTalk pattern arguments in chapter 3 of + the `ToolTalk Programmer's Guide'. + + + - Function: register-tooltalk-pattern pattern + XEmacs will begin receiving messages that match this pattern. + + - Function: unregister-tooltalk-pattern pattern + XEmacs will stop receiving messages that match this pattern. + + - Function: add-tooltalk-pattern-attribute value pattern indicator + Add one value to the indicated pattern attribute. The names of + attributes are the same as the ToolTalk accessors used to set them + less the `tooltalk_pattern_' prefix and the `_add' suffix. For + example, the name of the attribute for the + `tt_pattern_disposition_add' attribute is `disposition'. The + `category' attribute is handled specially, since a pattern can only + be a member of one category (`TT_OBSERVE' or `TT_HANDLE'). + + Callbacks are handled slightly differently than in the C ToolTalk + API. The value of CALLBACK should be the name of a function of one + argument. It will be called each time the pattern matches an + incoming message. + + - Function: add-tooltalk-pattern-arg pattern mode vtype &optional value + Add one fully-specified argument to a ToolTalk pattern. MODE must + be one of `TT_IN', `TT_INOUT', or `TT_OUT'. VTYPE must be a + string. VALUE can be an integer, string or `nil'. If VALUE is an + integer then an integer argument (`tt_pattern_iarg_add') is added; + otherwise a string argument is added. At present there's no way + to add a binary data argument. + + + - Function: create-tooltalk-pattern + Create a new ToolTalk pattern and initialize its session attribute + to be the default session. + + - Function: destroy-tooltalk-pattern pattern + Apply `tt_pattern_destroy' to the pattern. This effectively + unregisters the pattern. + + - Function: describe-tooltalk-message msg &optional stream + Print the message's attributes and arguments to STREAM. This is + often useful for debugging. + + +File: lispref.info, Node: LDAP Support, Next: PostgreSQL Support, Prev: ToolTalk Support, Up: Top + +LDAP Support +************ + + XEmacs can be linked with a LDAP client library to provide Elisp +primitives to access directory servers using the Lightweight Directory +Access Protocol. + +* Menu: + +* Building XEmacs with LDAP support:: How to add LDAP support to XEmacs +* XEmacs LDAP API:: Lisp access to LDAP functions +* Syntax of Search Filters:: A brief summary of RFC 1558 + + +File: lispref.info, Node: Building XEmacs with LDAP support, Next: XEmacs LDAP API, Prev: LDAP Support, Up: LDAP Support + +Building XEmacs with LDAP support +================================= + + LDAP support must be added to XEmacs at build time since it requires +linking to an external LDAP client library. As of 21.2, XEmacs has been +successfully built and tested with + + * OpenLDAP 1.2 () + + * University of Michigan's LDAP 3.3 + () + + * LDAP SDK 1.0 from Netscape Corp. () + + Other libraries conforming to RFC 1823 will probably work also but +may require some minor tweaking at C level. + + The standard XEmacs configure script auto-detects an installed LDAP +library provided the library itself and the corresponding header files +can be found in the library and include paths. A successful detection +will be signalled in the final output of the configure script. + + +File: lispref.info, Node: XEmacs LDAP API, Next: Syntax of Search Filters, Prev: Building XEmacs with LDAP support, Up: LDAP Support + +XEmacs LDAP API +=============== + + XEmacs LDAP API consists of two layers: a low-level layer which +tries to stay as close as possible to the C API (where practical) and a +higher-level layer which provides more convenient primitives to +effectively use LDAP. + + The low-level API should be used directly for very specific purposes +(such as multiple operations on a connection) only. The higher-level +functions provide a more convenient way to access LDAP directories +hiding the subtleties of handling the connection, translating arguments +and ensuring compliance with LDAP internationalization rules and formats +(currently partly implemented only). + +* Menu: + +* LDAP Variables:: Lisp variables related to LDAP +* The High-Level LDAP API:: High-level LDAP lisp functions +* The Low-Level LDAP API:: Low-level LDAP lisp primitives +* LDAP Internationalization:: I18n variables and functions + + File: lispref.info, Node: LDAP Variables, Next: The High-Level LDAP API, Prev: XEmacs LDAP API, Up: XEmacs LDAP API LDAP Variables @@ -145,7 +641,7 @@ function) or `ldap-search-entries' (high-level search function) according to the actual parameters. A direct call to one of these two functions is preferred since it is faster and unambiguous. - - Function: ldap-search-entries filter &optional host attributes + - Command: ldap-search-entries filter &optional host attributes attrsonly withdn Perform an LDAP search. FILTER is the search filter *note Syntax of Search Filters:: HOST is the LDAP host on which to perform the @@ -164,8 +660,8 @@ functions is preferred since it is faster and unambiguous. specifications of the form `(DN (ATTR . VALUE) (ATTR . VALUE) ...)' where DN the distinguished name of an entry to add, the following are cons cells containing attribute/value string pairs. HOST is - the LDAP host, defaulting to `ldap-default-host' BINDDN is the DN - to bind as to the server PASSWD is the corresponding password. + the LDAP host, defaulting to `ldap-default-host'. BINDDN is the + DN to bind as to the server. PASSWD is the corresponding password. - Function: ldap-modify-entries entry-mods &optional host binddn passwd Modify entries of an LDAP directory. ENTRY_MODS is a list of @@ -177,14 +673,14 @@ functions is preferred since it is faster and unambiguous. depending on MOD-OP. MOD-OP is the type of modification, one of the symbols `add', `delete' or `replace'. ATTR is the LDAP attribute type to modify. HOST is the LDAP host, defaulting to - `ldap-default-host' BINDDN is the DN to bind as to the server - PASSWD is the corresponding password" + `ldap-default-host'. BINDDN is the DN to bind as to the server. + PASSWD is the corresponding password. - Function: ldap-delete-entries dn &optional host binddn passwd Delete an entry from an LDAP directory. DN is the distinguished name of an entry to delete or a list of those. HOST is the LDAP - host, defaulting to `ldap-default-host' BINDDN is the DN to bind - as to the server PASSWD is the corresponding password. + host, defaulting to `ldap-default-host'. BINDDN is the DN to bind + as to the server. PASSWD is the corresponding password.  File: lispref.info, Node: The Low-Level LDAP API, Next: LDAP Internationalization, Prev: The High-Level LDAP API, Up: XEmacs LDAP API @@ -220,10 +716,10 @@ The LDAP Lisp Object This function returns non-`nil' if OBJECT is a `ldap' object. - Function: ldap-host ldap - Return the server host of the connection represented by LDAP + Return the server host of the connection represented by LDAP. - Function: ldap-live-p ldap - Return non-`nil' if LDAP is an active LDAP connection + Return non-`nil' if LDAP is an active LDAP connection.  File: lispref.info, Node: Opening and Closing a LDAP Connection, Next: Low-level Operations on a LDAP Server, Prev: The LDAP Lisp Object, Up: The Low-Level LDAP API @@ -257,17 +753,17 @@ Opening and Closing a LDAP Connection `always', `search' or `find' and defines how aliases are dereferenced. `never' - Aliases are never dereferenced + Aliases are never dereferenced. `always' - Aliases are always dereferenced + Aliases are always dereferenced. `search' - Aliases are dereferenced when searching + Aliases are dereferenced when searching. `find' Aliases are dereferenced when locating the base object - for the search The default is `never'. + for the search. The default is `never'. `timelimit' The timeout limit for the connection in seconds. @@ -277,7 +773,7 @@ Opening and Closing a LDAP Connection performed on this connection. - Function: ldap-close ldap - Close the connection represented by LDAP + Close the connection represented by LDAP.  File: lispref.info, Node: Low-level Operations on a LDAP Server, Prev: Opening and Closing a LDAP Connection, Up: The Low-Level LDAP API @@ -291,23 +787,24 @@ requiring a preliminary call to `ldap-open'. Multiple searches can be made on the same connection, then the session must be closed with `ldap-close'. - - Function: ldap-search-basic ldap filter base scope attrs attrsonly + - Function: ldap-search-basic ldap filter &optional base scope attrs + attrsonly withdn verbose Perform a search on an open connection LDAP created with `ldap-open'. FILTER is a filter string for the search *note Syntax of Search Filters:: BASE is the distinguished name at which to start the search. SCOPE is one of the symbols `base', `onelevel' or `subtree' indicating the scope of the search limited to a base object, to a single level or to the whole subtree. The - default is `subtree'. `attrs' is a list of strings indicating - which attributes to retrieve for each matching entry. If `nil' all - available attributes are returned. If `attrsonly' is non-`nil' - then only the attributes are retrieved, not their associated values - If `withdn' is non-`nil' then each entry in the result is - prepended with its distinguished name DN If `verbose' is non-`nil' - then progress messages are echoed The function returns a list of + default is `subtree'. ATTRS is a list of strings indicating which + attributes to retrieve for each matching entry. If `nil' all + available attributes are returned. If ATTRSONLY is non-`nil' then + only the attributes are retrieved, not their associated values. + If WITHDN is non-`nil' then each entry in the result is prepended + with its distinguished name DN. If VERBOSE is non-`nil' then + progress messages are echoed The function returns a list of matching entries. Each entry is itself an alist of attribute/value pairs optionally preceded by the DN of the entry - according to the value of `withdn'. + according to the value of WITHDN. - Function: ldap-add ldap dn entry Add ENTRY to a LDAP directory which a connection LDAP has been @@ -323,12 +820,12 @@ made on the same connection, then the session must be closed with ...)' MOD-OP and ATTR are mandatory, VALUES are optional depending on MOD-OP. MOD-OP is the type of modification, one of the symbols `add', `delete' or `replace'. ATTR is the LDAP - attribute type to modify + attribute type to modify. - Function: ldap-delete ldap dn Delete an entry to an LDAP directory. LDAP is an LDAP connection object created with `ldap-open'. DN is the distinguished name of - the entry to delete + the entry to delete.  File: lispref.info, Node: LDAP Internationalization, Prev: The Low-Level LDAP API, Up: XEmacs LDAP API @@ -372,7 +869,7 @@ LDAP Internationalization Variables - Variable: ldap-default-attribute-decoder Decoder function to use for attributes whose syntax is unknown. Such a function receives an encoded attribute value as a string - and should return the decoded value as a string + and should return the decoded value as a string. - Variable: ldap-attribute-syntax-encoders A vector of functions used to encode LDAP attribute values. The @@ -390,7 +887,7 @@ LDAP Internationalization Variables - Variable: ldap-attribute-syntaxes-alist A map of LDAP attribute names to their type object id minor number. - This table is built from RFC2252 Section 5 and RFC2256 Section 5 + This table is built from RFC2252 Section 5 and RFC2256 Section 5.  File: lispref.info, Node: Encoder/Decoder Functions, Prev: LDAP Internationalization Variables, Up: LDAP Internationalization @@ -400,27 +897,27 @@ Encoder/Decoder Functions - Function: ldap-encode-boolean bool A function that encodes an elisp boolean BOOL into a LDAP boolean - string representation + string representation. - Function: ldap-decode-boolean str A function that decodes a LDAP boolean string representation STR - into an elisp boolean + into an elisp boolean. - Function: ldap-decode-string str - Decode a string STR according to `ldap-coding-system' + Decode a string STR according to LDAP-CODING-SYSTEM. - Function: ldap-encode-string str - Encode a string STR according to `ldap-coding-system' + Encode a string STR according to LDAP-CODING-SYSTEM. - Function: ldap-decode-address str - Decode an address STR according to `ldap-coding-system' and + Decode an address STR according to LDAP-CODING-SYSTEM and replacing $ signs with newlines as specified by LDAP encoding - rules for addresses + rules for addresses. - Function: ldap-encode-address str - Encode an address STR according to `ldap-coding-system' and + Encode an address STR according to LDAP-CODING-SYSTEM and replacing newlines with $ signs as specified by LDAP encoding - rules for addresses + rules for addresses.  File: lispref.info, Node: Syntax of Search Filters, Prev: XEmacs LDAP API, Up: LDAP Support @@ -633,661 +1130,3 @@ connection and when the `pq-setenv' call is made. Compatibility Note: This variable is not present in InfoDock. - -File: lispref.info, Node: libpq Lisp Symbols and DataTypes, Next: Synchronous Interface Functions, Prev: libpq Lisp Variables, Up: XEmacs PostgreSQL libpq API - -libpq Lisp Symbols and Datatypes --------------------------------- - - The following set of symbols are used to represent the intermediate -states involved in the asynchronous interface. - - - Symbol: pgres::polling-failed - Undocumented. A fatal error has occurred during processing of an - asynchronous operation. - - - Symbol: pgres::polling-reading - An intermediate status return during an asynchronous operation. It - indicates that one may use `select' before polling again. - - - Symbol: pgres::polling-writing - An intermediate status return during an asynchronous operation. It - indicates that one may use `select' before polling again. - - - Symbol: pgres::polling-ok - An asynchronous operation has successfully completed. - - - Symbol: pgres::polling-active - An intermediate status return during an asynchronous operation. - One can call the poll function again immediately. - - - Function: pq-pgconn conn field - CONN A database connection object. FIELD A symbol indicating - which field of PGconn to fetch. Possible values are shown in the - following table. - `pq::db' - Database name - - `pq::user' - Database user name - - `pq::pass' - Database user's password - - `pq::host' - Hostname database server is running on - - `pq::port' - TCP port number used in the connection - - `pq::tty' - Debugging TTY - - Compatibility note: Debugging TTYs are not used in the - XEmacs Lisp API. - - `pq::options' - Additional server options - - `pq::status' - Connection status. Possible return values are shown in the - following table. - `pg::connection-ok' - The normal, connected status. - - `pg::connection-bad' - The connection is not open and the PGconn object needs - to be deleted by `pq-finish'. - - `pg::connection-started' - An asynchronous connection has been started, but is not - yet complete. - - `pg::connection-made' - An asynchronous connect has been made, and there is data - waiting to be sent. - - `pg::connection-awaiting-response' - Awaiting data from the backend during an asynchronous - connection. - - `pg::connection-auth-ok' - Received authentication, waiting for the backend to - start up. - - `pg::connection-setenv' - Negotiating environment during an asynchronous - connection. - - `pq::error-message' - The last error message that was delivered to this connection. - - `pq::backend-pid' - The process ID of the backend database server. - - The `PGresult' object is used by libpq to encapsulate the results of -queries. The printed representation takes on four forms. When the -PGresult object contains tuples from an SQL `SELECT' it will look like: - - (setq R (pq-exec P "SELECT * FROM xemacs_test;")) - => # - - The number in brackets indicates how many rows of data are available. -When the PGresult object is the result of a command query that doesn't -return anything, it will look like: - - (pq-exec P "CREATE TABLE a_new_table (i int);") - => # - - When either the query is a command-type query that can affect a -number of different rows, but doesn't return any of them it will look -like: - - (progn - (pq-exec P "INSERT INTO a_new_table VALUES (1);") - (pq-exec P "INSERT INTO a_new_table VALUES (2);") - (pq-exec P "INSERT INTO a_new_table VALUES (3);") - (setq R (pq-exec P "DELETE FROM a_new_table;"))) - => # - - Lastly, when the underlying PGresult object has been deallocated -directly by `pq-clear' the printed representation will look like: - - (progn - (setq R (pq-exec P "SELECT * FROM xemacs_test;")) - (pq-clear R) - R) - => # - - The following set of functions are accessors to various data in the -PGresult object. - - - Function: pq-result-status result - Return status of a query result. RESULT is a PGresult object. - The return value is one of the symbols in the following table. - `pgres::empty-query' - A query contained no text. This is usually the result of a - recoverable error, or a minor programming error. - - `pgres::command-ok' - A query command that doesn't return anything was executed - properly by the backend. - - `pgres::tuples-ok' - A query command that returns tuples was executed properly by - the backend. - - `pgres::copy-out' - Copy Out data transfer is in progress. - - `pgres::copy-in' - Copy In data transfer is in progress. - - `pgres::bad-response' - An unexpected response was received from the backend. - - `pgres::nonfatal-error' - Undocumented. This value is returned when the libpq function - `PQresultStatus' is called with a NULL pointer. - - `pgres::fatal-error' - Undocumented. An error has occurred in processing the query - and the operation was not completed. - - - Function: pq-res-status result - Return the query result status as a string, not a symbol. RESULT - is a PGresult object. - - (setq R (pq-exec P "SELECT * FROM xemacs_test;")) - => # - (pq-res-status R) - => "PGRES_TUPLES_OK" - - - Function: pq-result-error-message result - Return an error message generated by the query, if any. RESULT is - a PGresult object. - - (setq R (pq-exec P "SELECT * FROM xemacs-test;")) - => - (pq-result-error-message R) - => "ERROR: parser: parse error at or near \"-\" - " - - - Function: pq-ntuples result - Return the number of tuples in the query result. RESULT is a - PGresult object. - - (setq R (pq-exec P "SELECT * FROM xemacs_test;")) - => # - (pq-ntuples R) - => 5 - - - Function: pq-nfields result - Return the number of fields in each tuple of the query result. - RESULT is a PGresult object. - - (setq R (pq-exec P "SELECT * FROM xemacs_test;")) - => # - (pq-nfields R) - => 3 - - - Function: pq-binary-tuples result - Returns t if binary tuples are present in the results, nil - otherwise. RESULT is a PGresult object. - - (setq R (pq-exec P "SELECT * FROM xemacs_test;")) - => # - (pq-binary-tuples R) - => nil - - - Function: pq-fname result field-index - Returns the name of a specific field. RESULT is a PGresult object. - FIELD-INDEX is the number of the column to select from. The first - column is number zero. - - (let (i l) - (setq R (pq-exec P "SELECT * FROM xemacs_test;")) - (setq i (pq-nfields R)) - (while (>= (decf i) 0) - (push (pq-fname R i) l)) - l) - => ("id" "shikona" "rank") - - - Function: pq-fnumber result field-name - Return the field number corresponding to the given field name. -1 - is returned on a bad field name. RESULT is a PGresult object. - FIELD-NAME is a string representing the field name to find. - (setq R (pq-exec P "SELECT * FROM xemacs_test;")) - => # - (pq-fnumber R "id") - => 0 - (pq-fnumber R "Not a field") - => -1 - - - Function: pq-ftype result field-num - Return an integer code representing the data type of the specified - column. RESULT is a PGresult object. FIELD-NUM is the field - number. - - The return value of this function is the Object ID (Oid) in the - database of the type. Further queries need to be made to various - system tables in order to convert this value into something useful. - - - Function: pq-fmod result field-num - Return the type modifier code associated with a field. Field - numbers start at zero. RESULT is a PGresult object. FIELD-INDEX - selects which field to use. - - - Function: pq-fsize result field-index - Return size of the given field. RESULT is a PGresult object. - FIELD-INDEX selects which field to use. - - (let (i l) - (setq R (pq-exec P "SELECT * FROM xemacs_test;")) - (setq i (pq-nfields R)) - (while (>= (decf i) 0) - (push (list (pq-ftype R i) (pq-fsize R i)) l)) - l) - => ((23 23) (25 25) (25 25)) - - - Function: pq-get-value result tup-num field-num - Retrieve a return value. RESULT is a PGresult object. TUP-NUM - selects which tuple to fetch from. FIELD-NUM selects which field - to fetch from. - - Both tuples and fields are numbered from zero. - - (setq R (pq-exec P "SELECT * FROM xemacs_test;")) - => # - (pq-get-value R 0 1) - => "Musashimaru" - (pq-get-value R 1 1) - => "Dejima" - (pq-get-value R 2 1) - => "Musoyama" - - - Function: pq-get-length result tup-num field-num - Return the length of a specific value. RESULT is a PGresult - object. TUP-NUM selects which tuple to fetch from. FIELD-NUM - selects which field to fetch from. - - (setq R (pq-exec P "SELECT * FROM xemacs_test;")) - => # - (pq-get-length R 0 1) - => 11 - (pq-get-length R 1 1) - => 6 - (pq-get-length R 2 1) - => 8 - - - Function: pq-get-is-null result tup-num field-num - Return t if the specific value is the SQL NULL. RESULT is a - PGresult object. TUP-NUM selects which tuple to fetch from. - FIELD-NUM selects which field to fetch from. - - - Function: pq-cmd-status result - Return a summary string from the query. RESULT is a PGresult - object. - (pq-exec P "INSERT INTO xemacs_test - VALUES (6, 'Wakanohana', 'Yokozuna');") - => # - (pq-cmd-status R) - => "INSERT 542086 1" - (setq R (pq-exec P "UPDATE xemacs_test SET rank='retired' - WHERE shikona='Wakanohana';")) - => # - (pq-cmd-status R) - => "UPDATE 1" - - Note that the first number returned from an insertion, like in the - example, is an object ID number and will almost certainly vary from - system to system since object ID numbers in Postgres must be unique - across all databases. - - - Function: pq-cmd-tuples result - Return the number of tuples if the last command was an - INSERT/UPDATE/DELETE. If the last command was something else, the - empty string is returned. RESULT is a PGresult object. - - (setq R (pq-exec P "INSERT INTO xemacs_test VALUES - (7, 'Takanohana', 'Yokuzuna');")) - => # - (pq-cmd-tuples R) - => "1" - (setq R (pq-exec P "SELECT * from xemacs_test;")) - => # - (pq-cmd-tuples R) - => "" - (setq R (pq-exec P "DELETE FROM xemacs_test - WHERE shikona LIKE '%hana';")) - => # - (pq-cmd-tuples R) - => "2" - - - Function: pq-oid-value result - Return the object id of the insertion if the last command was an - INSERT. 0 is returned if the last command was not an insertion. - RESULT is a PGresult object. - - In the first example, the numbers you will see on your local - system will almost certainly be different, however the second - number from the right in the unprintable PGresult object and the - number returned by `pq-oid-value' should match. - (setq R (pq-exec P "INSERT INTO xemacs_test VALUES - (8, 'Terao', 'Maegashira');")) - => # - (pq-oid-value R) - => 542089 - (setq R (pq-exec P "SELECT shikona FROM xemacs_test - WHERE rank='Maegashira';")) - => # - (pq-oid-value R) - => 0 - - - Function: pq-make-empty-pgresult conn status - Create an empty pgresult with the given status. CONN a database - connection object STATUS a value that can be returned by - `pq-result-status'. - - The caller is responsible for making sure the return value gets - properly freed. - - -File: lispref.info, Node: Synchronous Interface Functions, Next: Asynchronous Interface Functions, Prev: libpq Lisp Symbols and DataTypes, Up: XEmacs PostgreSQL libpq API - -Synchronous Interface Functions -------------------------------- - - - Function: pq-connectdb conninfo - Establish a (synchronous) database connection. CONNINFO A string - of blank separated options. Options are of the form "OPTION = - VALUE". If VALUE contains blanks, it must be single quoted. - Blanks around the equal sign are optional. Multiple option - assignments are blank separated. - (pq-connectdb "dbname=japanese port = 25432") - => # - The printed representation of a database connection object has four - fields. The first field is the hostname where the database server - is running (in this case localhost), the second field is the port - number, the third field is the database user name, and the fourth - field is the name of the database. - - Database connection objects which have been disconnected and will - generate an immediate error if they are used look like: - # - Bad connections can be reestablished with `pq-reset', or deleted - entirely with `pq-finish'. - - A database connection object that has been deleted looks like: - (let ((P1 (pq-connectdb ""))) - (pq-finish P1) - P1) - => # - - Note that database connection objects are the most heavy weight - objects in XEmacs Lisp at this writing, usually representing as - much as several megabytes of virtual memory on the machine the - database server is running on. It is wisest to explicitly delete - them when you are finished with them, rather than letting garbage - collection do it. An example idiom is: - - (let ((P (pq-connectiondb ""))) - (unwind-protect - (progn - (...)) ; access database here - (pq-finish P))) - - The following options are available in the options string: - `authtype' - Authentication type. Same as PGAUTHTYPE. This is no longer - used. - - `user' - Database user name. Same as PGUSER. - - `password' - Database password. - - `dbname' - Database name. Same as PGDATABASE - - `host' - Symbolic hostname. Same as PGHOST. - - `hostaddr' - Host address as four octets (eg. like 192.168.1.1). - - `port' - TCP port to connect to. Same as PGPORT. - - `tty' - Debugging TTY. Same as PGTTY. This value is suppressed in - the XEmacs Lisp API. - - `options' - Extra backend database options. Same as PGOPTIONS. A - database connection object is returned regardless of whether a - connection was established or not. - - - Function: pq-reset conn - Reestablish database connection. CONN A database connection - object. - - This function reestablishes a database connection using the - original connection parameters. This is useful if something has - happened to the TCP link and it has become broken. - - - Function: pq-exec conn query - Make a synchronous database query. CONN A database connection - object. QUERY A string containing an SQL query. A PGresult - object is returned, which in turn may be queried by its many - accessor functions to retrieve state out of it. If the query - string contains multiple SQL commands, only results from the final - command are returned. - - (setq R (pq-exec P "SELECT * FROM xemacs_test; - DELETE FROM xemacs_test WHERE id=8;")) - => # - - - Function: pq-notifies conn - Return the latest async notification that has not yet been handled. - CONN A database connection object. If there has been a - notification, then a list of two elements will be returned. The - first element contains the relation name being notified, the second - element contains the backend process ID number. nil is returned - if there aren't any notifications to process. - - - Function: PQsetenv conn - Synchronous transfer of environment variables to a backend CONN A - database connection object. - - Environment variable transfer is done as a normal part of database - connection. - - Compatibility note: This function was present but not documented - in versions of libpq prior to 7.0. - - -File: lispref.info, Node: Asynchronous Interface Functions, Next: Large Object Support, Prev: Synchronous Interface Functions, Up: XEmacs PostgreSQL libpq API - -Asynchronous Interface Functions --------------------------------- - - Making command by command examples is too complex with the -asynchronous interface functions. See the examples section for -complete calling sequences. - - - Function: pq-connect-start conninfo - Begin establishing an asynchronous database connection. CONNINFO - A string containing the connection options. See the documentation - of `pq-connectdb' for a listing of all the available flags. - - - Function: pq-connect-poll conn - An intermediate function to be called during an asynchronous - database connection. CONN A database connection object. The - result codes are documented in a previous section. - - - Function: pq-is-busy conn - Returns t if `pq-get-result' would block waiting for input. CONN - A database connection object. - - - Function: pq-consume-input conn - Consume any available input from the backend. CONN A database - connection object. - - Nil is returned if anything bad happens. - - - Function: pq-reset-start conn - Reset connection to the backend asynchronously. CONN A database - connection object. - - - Function: pq-reset-poll conn - Poll an asynchronous reset for completion CONN A database - connection object. - - - Function: pq-reset-cancel conn - Attempt to request cancellation of the current operation. CONN A - database connection object. - - The return value is t if the cancel request was successfully - dispatched, nil if not (in which case conn->errorMessage is set). - Note: successful dispatch is no guarantee that there will be any - effect at the backend. The application must read the operation - result as usual. - - - Function: pq-send-query conn query - Submit a query to Postgres and don't wait for the result. CONN A - database connection object. Returns: t if successfully submitted - nil if error (conn->errorMessage is set) - - - Function: pq-get-result conn - Retrieve an asynchronous result from a query. CONN A database - connection object. - - NIL is returned when no more query work remains. - - - Function: pq-set-nonblocking conn arg - Sets the PGconn's database connection non-blocking if the arg is - TRUE or makes it non-blocking if the arg is FALSE, this will not - protect you from PQexec(), you'll only be safe when using the - non-blocking API. CONN A database connection object. - - - Function: pq-is-nonblocking conn - Return the blocking status of the database connection CONN A - database connection object. - - - Function: pq-flush conn - Force the write buffer to be written (or at least try) CONN A - database connection object. - - - Function: PQsetenvStart conn - Start asynchronously passing environment variables to a backend. - CONN A database connection object. - - Compatibility note: this function is only available with libpq-7.0. - - - Function: PQsetenvPoll conn - Check an asynchronous environment variables transfer for - completion. CONN A database connection object. - - Compatibility note: this function is only available with libpq-7.0. - - - Function: PQsetenvAbort conn - Attempt to terminate an asynchronous environment variables - transfer. CONN A database connection object. - - Compatibility note: this function is only available with libpq-7.0. - - -File: lispref.info, Node: Large Object Support, Next: Other libpq Functions, Prev: Asynchronous Interface Functions, Up: XEmacs PostgreSQL libpq API - -Large Object Support --------------------- - - - Function: pq-lo-import conn filename - Import a file as a large object into the database. CONN a - database connection object FILENAME filename to import - - On success, the object id is returned. - - - Function: pq-lo-export conn oid filename - Copy a large object in the database into a file. CONN a database - connection object. OID object id number of a large object. - FILENAME filename to export to. - - -File: lispref.info, Node: Other libpq Functions, Next: Unimplemented libpq Functions, Prev: Large Object Support, Up: XEmacs PostgreSQL libpq API - -Other libpq Functions ---------------------- - - - Function: pq-finish conn - Destroy a database connection object by calling free on it. CONN - a database connection object - - It is possible to not call this routine because the usual XEmacs - garbage collection mechanism will call the underlying libpq - routine whenever it is releasing stale `PGconn' objects. However, - this routine is useful in `unwind-protect' clauses to make - connections go away quickly when unrecoverable errors have - occurred. - - After calling this routine, the printed representation of the - XEmacs wrapper object will contain the string "DEAD". - - - Function: pq-client-encoding conn - Return the client encoding as an integer code. CONN a database - connection object - - (pq-client-encoding P) - => 1 - - Compatibility note: This function did not exist prior to libpq-7.0 - and does not exist in a non-Mule XEmacs. - - - Function: pq-set-client-encoding conn encoding - Set client coding system. CONN a database connection object - ENCODING a string representing the desired coding system - - (pq-set-client-encoding P "EUC_JP") - => 0 - - The current idiom for ensuring proper coding system conversion is - the following (illustrated for EUC Japanese encoding): - (setq P (pq-connectdb "...")) - (let ((file-name-coding-system 'euc-jp) - (pg-coding-system 'euc-jp)) - (pq-set-client-encoding "EUC_JP") - ...) - (pq-finish P) - Compatibility note: This function did not exist prior to libpq-7.0 - and does not exist in a non-Mule XEmacs. - - - Function: pq-env-2-encoding - Return the integer code representing the coding system in - PGCLIENTENCODING. - - (pq-env-2-encoding) - => 0 - Compatibility note: This function did not exist prior to libpq-7.0 - and does not exist in a non-Mule XEmacs. - - - Function: pq-clear res - Destroy a query result object by calling free() on it. RES a - query result object - - Note: The memory allocation systems of libpq and XEmacs are - different. The XEmacs representation of a query result object - will have both the XEmacs version and the libpq version freed at - the next garbage collection when the object is no longer being - referenced. Calling this function does not release the XEmacs - object, it is still subject to the usual rules for Lisp objects. - The printed representation of the XEmacs object will contain the - string "DEAD" after this routine is called indicating that it is no - longer useful for anything. - - - Function: pq-conn-defaults - Return a data structure that represents the connection defaults. - The data is returned as a list of lists, where each sublist - contains info regarding a single option. - diff --git a/info/lispref.info-43 b/info/lispref.info-43 index 4b1d70b..18337d7 100644 --- a/info/lispref.info-43 +++ b/info/lispref.info-43 @@ -50,6 +50,664 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: libpq Lisp Symbols and DataTypes, Next: Synchronous Interface Functions, Prev: libpq Lisp Variables, Up: XEmacs PostgreSQL libpq API + +libpq Lisp Symbols and Datatypes +-------------------------------- + + The following set of symbols are used to represent the intermediate +states involved in the asynchronous interface. + + - Symbol: pgres::polling-failed + Undocumented. A fatal error has occurred during processing of an + asynchronous operation. + + - Symbol: pgres::polling-reading + An intermediate status return during an asynchronous operation. It + indicates that one may use `select' before polling again. + + - Symbol: pgres::polling-writing + An intermediate status return during an asynchronous operation. It + indicates that one may use `select' before polling again. + + - Symbol: pgres::polling-ok + An asynchronous operation has successfully completed. + + - Symbol: pgres::polling-active + An intermediate status return during an asynchronous operation. + One can call the poll function again immediately. + + - Function: pq-pgconn conn field + CONN A database connection object. FIELD A symbol indicating + which field of PGconn to fetch. Possible values are shown in the + following table. + `pq::db' + Database name + + `pq::user' + Database user name + + `pq::pass' + Database user's password + + `pq::host' + Hostname database server is running on + + `pq::port' + TCP port number used in the connection + + `pq::tty' + Debugging TTY + + Compatibility note: Debugging TTYs are not used in the + XEmacs Lisp API. + + `pq::options' + Additional server options + + `pq::status' + Connection status. Possible return values are shown in the + following table. + `pg::connection-ok' + The normal, connected status. + + `pg::connection-bad' + The connection is not open and the PGconn object needs + to be deleted by `pq-finish'. + + `pg::connection-started' + An asynchronous connection has been started, but is not + yet complete. + + `pg::connection-made' + An asynchronous connect has been made, and there is data + waiting to be sent. + + `pg::connection-awaiting-response' + Awaiting data from the backend during an asynchronous + connection. + + `pg::connection-auth-ok' + Received authentication, waiting for the backend to + start up. + + `pg::connection-setenv' + Negotiating environment during an asynchronous + connection. + + `pq::error-message' + The last error message that was delivered to this connection. + + `pq::backend-pid' + The process ID of the backend database server. + + The `PGresult' object is used by libpq to encapsulate the results of +queries. The printed representation takes on four forms. When the +PGresult object contains tuples from an SQL `SELECT' it will look like: + + (setq R (pq-exec P "SELECT * FROM xemacs_test;")) + => # + + The number in brackets indicates how many rows of data are available. +When the PGresult object is the result of a command query that doesn't +return anything, it will look like: + + (pq-exec P "CREATE TABLE a_new_table (i int);") + => # + + When either the query is a command-type query that can affect a +number of different rows, but doesn't return any of them it will look +like: + + (progn + (pq-exec P "INSERT INTO a_new_table VALUES (1);") + (pq-exec P "INSERT INTO a_new_table VALUES (2);") + (pq-exec P "INSERT INTO a_new_table VALUES (3);") + (setq R (pq-exec P "DELETE FROM a_new_table;"))) + => # + + Lastly, when the underlying PGresult object has been deallocated +directly by `pq-clear' the printed representation will look like: + + (progn + (setq R (pq-exec P "SELECT * FROM xemacs_test;")) + (pq-clear R) + R) + => # + + The following set of functions are accessors to various data in the +PGresult object. + + - Function: pq-result-status result + Return status of a query result. RESULT is a PGresult object. + The return value is one of the symbols in the following table. + `pgres::empty-query' + A query contained no text. This is usually the result of a + recoverable error, or a minor programming error. + + `pgres::command-ok' + A query command that doesn't return anything was executed + properly by the backend. + + `pgres::tuples-ok' + A query command that returns tuples was executed properly by + the backend. + + `pgres::copy-out' + Copy Out data transfer is in progress. + + `pgres::copy-in' + Copy In data transfer is in progress. + + `pgres::bad-response' + An unexpected response was received from the backend. + + `pgres::nonfatal-error' + Undocumented. This value is returned when the libpq function + `PQresultStatus' is called with a NULL pointer. + + `pgres::fatal-error' + Undocumented. An error has occurred in processing the query + and the operation was not completed. + + - Function: pq-res-status result + Return the query result status as a string, not a symbol. RESULT + is a PGresult object. + + (setq R (pq-exec P "SELECT * FROM xemacs_test;")) + => # + (pq-res-status R) + => "PGRES_TUPLES_OK" + + - Function: pq-result-error-message result + Return an error message generated by the query, if any. RESULT is + a PGresult object. + + (setq R (pq-exec P "SELECT * FROM xemacs-test;")) + => + (pq-result-error-message R) + => "ERROR: parser: parse error at or near \"-\" + " + + - Function: pq-ntuples result + Return the number of tuples in the query result. RESULT is a + PGresult object. + + (setq R (pq-exec P "SELECT * FROM xemacs_test;")) + => # + (pq-ntuples R) + => 5 + + - Function: pq-nfields result + Return the number of fields in each tuple of the query result. + RESULT is a PGresult object. + + (setq R (pq-exec P "SELECT * FROM xemacs_test;")) + => # + (pq-nfields R) + => 3 + + - Function: pq-binary-tuples result + Returns t if binary tuples are present in the results, nil + otherwise. RESULT is a PGresult object. + + (setq R (pq-exec P "SELECT * FROM xemacs_test;")) + => # + (pq-binary-tuples R) + => nil + + - Function: pq-fname result field-index + Returns the name of a specific field. RESULT is a PGresult object. + FIELD-INDEX is the number of the column to select from. The first + column is number zero. + + (let (i l) + (setq R (pq-exec P "SELECT * FROM xemacs_test;")) + (setq i (pq-nfields R)) + (while (>= (decf i) 0) + (push (pq-fname R i) l)) + l) + => ("id" "shikona" "rank") + + - Function: pq-fnumber result field-name + Return the field number corresponding to the given field name. -1 + is returned on a bad field name. RESULT is a PGresult object. + FIELD-NAME is a string representing the field name to find. + (setq R (pq-exec P "SELECT * FROM xemacs_test;")) + => # + (pq-fnumber R "id") + => 0 + (pq-fnumber R "Not a field") + => -1 + + - Function: pq-ftype result field-num + Return an integer code representing the data type of the specified + column. RESULT is a PGresult object. FIELD-NUM is the field + number. + + The return value of this function is the Object ID (Oid) in the + database of the type. Further queries need to be made to various + system tables in order to convert this value into something useful. + + - Function: pq-fmod result field-num + Return the type modifier code associated with a field. Field + numbers start at zero. RESULT is a PGresult object. FIELD-INDEX + selects which field to use. + + - Function: pq-fsize result field-index + Return size of the given field. RESULT is a PGresult object. + FIELD-INDEX selects which field to use. + + (let (i l) + (setq R (pq-exec P "SELECT * FROM xemacs_test;")) + (setq i (pq-nfields R)) + (while (>= (decf i) 0) + (push (list (pq-ftype R i) (pq-fsize R i)) l)) + l) + => ((23 23) (25 25) (25 25)) + + - Function: pq-get-value result tup-num field-num + Retrieve a return value. RESULT is a PGresult object. TUP-NUM + selects which tuple to fetch from. FIELD-NUM selects which field + to fetch from. + + Both tuples and fields are numbered from zero. + + (setq R (pq-exec P "SELECT * FROM xemacs_test;")) + => # + (pq-get-value R 0 1) + => "Musashimaru" + (pq-get-value R 1 1) + => "Dejima" + (pq-get-value R 2 1) + => "Musoyama" + + - Function: pq-get-length result tup-num field-num + Return the length of a specific value. RESULT is a PGresult + object. TUP-NUM selects which tuple to fetch from. FIELD-NUM + selects which field to fetch from. + + (setq R (pq-exec P "SELECT * FROM xemacs_test;")) + => # + (pq-get-length R 0 1) + => 11 + (pq-get-length R 1 1) + => 6 + (pq-get-length R 2 1) + => 8 + + - Function: pq-get-is-null result tup-num field-num + Return t if the specific value is the SQL NULL. RESULT is a + PGresult object. TUP-NUM selects which tuple to fetch from. + FIELD-NUM selects which field to fetch from. + + - Function: pq-cmd-status result + Return a summary string from the query. RESULT is a PGresult + object. + (pq-exec P "INSERT INTO xemacs_test + VALUES (6, 'Wakanohana', 'Yokozuna');") + => # + (pq-cmd-status R) + => "INSERT 542086 1" + (setq R (pq-exec P "UPDATE xemacs_test SET rank='retired' + WHERE shikona='Wakanohana';")) + => # + (pq-cmd-status R) + => "UPDATE 1" + + Note that the first number returned from an insertion, like in the + example, is an object ID number and will almost certainly vary from + system to system since object ID numbers in Postgres must be unique + across all databases. + + - Function: pq-cmd-tuples result + Return the number of tuples if the last command was an + INSERT/UPDATE/DELETE. If the last command was something else, the + empty string is returned. RESULT is a PGresult object. + + (setq R (pq-exec P "INSERT INTO xemacs_test VALUES + (7, 'Takanohana', 'Yokuzuna');")) + => # + (pq-cmd-tuples R) + => "1" + (setq R (pq-exec P "SELECT * from xemacs_test;")) + => # + (pq-cmd-tuples R) + => "" + (setq R (pq-exec P "DELETE FROM xemacs_test + WHERE shikona LIKE '%hana';")) + => # + (pq-cmd-tuples R) + => "2" + + - Function: pq-oid-value result + Return the object id of the insertion if the last command was an + INSERT. 0 is returned if the last command was not an insertion. + RESULT is a PGresult object. + + In the first example, the numbers you will see on your local + system will almost certainly be different, however the second + number from the right in the unprintable PGresult object and the + number returned by `pq-oid-value' should match. + (setq R (pq-exec P "INSERT INTO xemacs_test VALUES + (8, 'Terao', 'Maegashira');")) + => # + (pq-oid-value R) + => 542089 + (setq R (pq-exec P "SELECT shikona FROM xemacs_test + WHERE rank='Maegashira';")) + => # + (pq-oid-value R) + => 0 + + - Function: pq-make-empty-pgresult conn status + Create an empty pgresult with the given status. CONN a database + connection object STATUS a value that can be returned by + `pq-result-status'. + + The caller is responsible for making sure the return value gets + properly freed. + + +File: lispref.info, Node: Synchronous Interface Functions, Next: Asynchronous Interface Functions, Prev: libpq Lisp Symbols and DataTypes, Up: XEmacs PostgreSQL libpq API + +Synchronous Interface Functions +------------------------------- + + - Function: pq-connectdb conninfo + Establish a (synchronous) database connection. CONNINFO A string + of blank separated options. Options are of the form "OPTION = + VALUE". If VALUE contains blanks, it must be single quoted. + Blanks around the equal sign are optional. Multiple option + assignments are blank separated. + (pq-connectdb "dbname=japanese port = 25432") + => # + The printed representation of a database connection object has four + fields. The first field is the hostname where the database server + is running (in this case localhost), the second field is the port + number, the third field is the database user name, and the fourth + field is the name of the database. + + Database connection objects which have been disconnected and will + generate an immediate error if they are used look like: + # + Bad connections can be reestablished with `pq-reset', or deleted + entirely with `pq-finish'. + + A database connection object that has been deleted looks like: + (let ((P1 (pq-connectdb ""))) + (pq-finish P1) + P1) + => # + + Note that database connection objects are the most heavy weight + objects in XEmacs Lisp at this writing, usually representing as + much as several megabytes of virtual memory on the machine the + database server is running on. It is wisest to explicitly delete + them when you are finished with them, rather than letting garbage + collection do it. An example idiom is: + + (let ((P (pq-connectiondb ""))) + (unwind-protect + (progn + (...)) ; access database here + (pq-finish P))) + + The following options are available in the options string: + `authtype' + Authentication type. Same as PGAUTHTYPE. This is no longer + used. + + `user' + Database user name. Same as PGUSER. + + `password' + Database password. + + `dbname' + Database name. Same as PGDATABASE + + `host' + Symbolic hostname. Same as PGHOST. + + `hostaddr' + Host address as four octets (eg. like 192.168.1.1). + + `port' + TCP port to connect to. Same as PGPORT. + + `tty' + Debugging TTY. Same as PGTTY. This value is suppressed in + the XEmacs Lisp API. + + `options' + Extra backend database options. Same as PGOPTIONS. A + database connection object is returned regardless of whether a + connection was established or not. + + - Function: pq-reset conn + Reestablish database connection. CONN A database connection + object. + + This function reestablishes a database connection using the + original connection parameters. This is useful if something has + happened to the TCP link and it has become broken. + + - Function: pq-exec conn query + Make a synchronous database query. CONN A database connection + object. QUERY A string containing an SQL query. A PGresult + object is returned, which in turn may be queried by its many + accessor functions to retrieve state out of it. If the query + string contains multiple SQL commands, only results from the final + command are returned. + + (setq R (pq-exec P "SELECT * FROM xemacs_test; + DELETE FROM xemacs_test WHERE id=8;")) + => # + + - Function: pq-notifies conn + Return the latest async notification that has not yet been handled. + CONN A database connection object. If there has been a + notification, then a list of two elements will be returned. The + first element contains the relation name being notified, the second + element contains the backend process ID number. nil is returned + if there aren't any notifications to process. + + - Function: PQsetenv conn + Synchronous transfer of environment variables to a backend CONN A + database connection object. + + Environment variable transfer is done as a normal part of database + connection. + + Compatibility note: This function was present but not documented + in versions of libpq prior to 7.0. + + +File: lispref.info, Node: Asynchronous Interface Functions, Next: Large Object Support, Prev: Synchronous Interface Functions, Up: XEmacs PostgreSQL libpq API + +Asynchronous Interface Functions +-------------------------------- + + Making command by command examples is too complex with the +asynchronous interface functions. See the examples section for +complete calling sequences. + + - Function: pq-connect-start conninfo + Begin establishing an asynchronous database connection. CONNINFO + A string containing the connection options. See the documentation + of `pq-connectdb' for a listing of all the available flags. + + - Function: pq-connect-poll conn + An intermediate function to be called during an asynchronous + database connection. CONN A database connection object. The + result codes are documented in a previous section. + + - Function: pq-is-busy conn + Returns t if `pq-get-result' would block waiting for input. CONN + A database connection object. + + - Function: pq-consume-input conn + Consume any available input from the backend. CONN A database + connection object. + + Nil is returned if anything bad happens. + + - Function: pq-reset-start conn + Reset connection to the backend asynchronously. CONN A database + connection object. + + - Function: pq-reset-poll conn + Poll an asynchronous reset for completion CONN A database + connection object. + + - Function: pq-reset-cancel conn + Attempt to request cancellation of the current operation. CONN A + database connection object. + + The return value is t if the cancel request was successfully + dispatched, nil if not (in which case conn->errorMessage is set). + Note: successful dispatch is no guarantee that there will be any + effect at the backend. The application must read the operation + result as usual. + + - Function: pq-send-query conn query + Submit a query to Postgres and don't wait for the result. CONN A + database connection object. Returns: t if successfully submitted + nil if error (conn->errorMessage is set) + + - Function: pq-get-result conn + Retrieve an asynchronous result from a query. CONN A database + connection object. + + `nil' is returned when no more query work remains. + + - Function: pq-set-nonblocking conn arg + Sets the PGconn's database connection non-blocking if the arg is + TRUE or makes it non-blocking if the arg is FALSE, this will not + protect you from PQexec(), you'll only be safe when using the + non-blocking API. CONN A database connection object. + + - Function: pq-is-nonblocking conn + Return the blocking status of the database connection CONN A + database connection object. + + - Function: pq-flush conn + Force the write buffer to be written (or at least try) CONN A + database connection object. + + - Function: PQsetenvStart conn + Start asynchronously passing environment variables to a backend. + CONN A database connection object. + + Compatibility note: this function is only available with libpq-7.0. + + - Function: PQsetenvPoll conn + Check an asynchronous environment variables transfer for + completion. CONN A database connection object. + + Compatibility note: this function is only available with libpq-7.0. + + - Function: PQsetenvAbort conn + Attempt to terminate an asynchronous environment variables + transfer. CONN A database connection object. + + Compatibility note: this function is only available with libpq-7.0. + + +File: lispref.info, Node: Large Object Support, Next: Other libpq Functions, Prev: Asynchronous Interface Functions, Up: XEmacs PostgreSQL libpq API + +Large Object Support +-------------------- + + - Function: pq-lo-import conn filename + Import a file as a large object into the database. CONN a + database connection object FILENAME filename to import + + On success, the object id is returned. + + - Function: pq-lo-export conn oid filename + Copy a large object in the database into a file. CONN a database + connection object. OID object id number of a large object. + FILENAME filename to export to. + + +File: lispref.info, Node: Other libpq Functions, Next: Unimplemented libpq Functions, Prev: Large Object Support, Up: XEmacs PostgreSQL libpq API + +Other libpq Functions +--------------------- + + - Function: pq-finish conn + Destroy a database connection object by calling free on it. CONN + a database connection object + + It is possible to not call this routine because the usual XEmacs + garbage collection mechanism will call the underlying libpq + routine whenever it is releasing stale `PGconn' objects. However, + this routine is useful in `unwind-protect' clauses to make + connections go away quickly when unrecoverable errors have + occurred. + + After calling this routine, the printed representation of the + XEmacs wrapper object will contain the string "DEAD". + + - Function: pq-client-encoding conn + Return the client encoding as an integer code. CONN a database + connection object + + (pq-client-encoding P) + => 1 + + Compatibility note: This function did not exist prior to libpq-7.0 + and does not exist in a non-Mule XEmacs. + + - Function: pq-set-client-encoding conn encoding + Set client coding system. CONN a database connection object + ENCODING a string representing the desired coding system + + (pq-set-client-encoding P "EUC_JP") + => 0 + + The current idiom for ensuring proper coding system conversion is + the following (illustrated for EUC Japanese encoding): + (setq P (pq-connectdb "...")) + (let ((file-name-coding-system 'euc-jp) + (pg-coding-system 'euc-jp)) + (pq-set-client-encoding "EUC_JP") + ...) + (pq-finish P) + Compatibility note: This function did not exist prior to libpq-7.0 + and does not exist in a non-Mule XEmacs. + + - Function: pq-env-2-encoding + Return the integer code representing the coding system in + PGCLIENTENCODING. + + (pq-env-2-encoding) + => 0 + Compatibility note: This function did not exist prior to libpq-7.0 + and does not exist in a non-Mule XEmacs. + + - Function: pq-clear res + Destroy a query result object by calling free() on it. RES a + query result object + + Note: The memory allocation systems of libpq and XEmacs are + different. The XEmacs representation of a query result object + will have both the XEmacs version and the libpq version freed at + the next garbage collection when the object is no longer being + referenced. Calling this function does not release the XEmacs + object, it is still subject to the usual rules for Lisp objects. + The printed representation of the XEmacs object will contain the + string "DEAD" after this routine is called indicating that it is no + longer useful for anything. + + - Function: pq-conn-defaults + Return a data structure that represents the connection defaults. + The data is returned as a list of lists, where each sublist + contains info regarding a single option. + + File: lispref.info, Node: Unimplemented libpq Functions, Prev: Other libpq Functions, Up: XEmacs PostgreSQL libpq API Unimplemented libpq Functions @@ -492,14 +1150,9 @@ specify the domain after the documentation. Example: (defconst limbs 4 "Number of limbs" "emacs-gorilla") - Autoloaded functions which are specified in `loaddefs.el' do not need -to have a domain specification, because their documentation strings are -extracted into the main message base. However, for autoloaded functions -which are specified in a separate package, use following syntax: - - - Function: autoload symbol filename &optional docstring interactive - macro domain - Example: + - Function: autoload function filename &optional docstring interactive + type + This function defines FUNCTION to autoload from FILENAME Example: (autoload 'explore "jungle" "Explore the jungle." nil nil "emacs-gorilla")  @@ -556,593 +1209,3 @@ on "MULE". * CCL:: A special language for writing fast converters. * Category Tables:: Subdividing charsets into groups. - -File: lispref.info, Node: Internationalization Terminology, Next: Charsets, Up: MULE - -Internationalization Terminology -================================ - - In internationalization terminology, a string of text is divided up -into "characters", which are the printable units that make up the text. -A single character is (for example) a capital `A', the number `2', a -Katakana character, a Hangul character, a Kanji ideograph (an -"ideograph" is a "picture" character, such as is used in Japanese -Kanji, Chinese Hanzi, and Korean Hanja; typically there are thousands -of such ideographs in each language), etc. The basic property of a -character is that it is the smallest unit of text with semantic -significance in text processing. - - Human beings normally process text visually, so to a first -approximation a character may be identified with its shape. Note that -the same character may be drawn by two different people (or in two -different fonts) in slightly different ways, although the "basic shape" -will be the same. But consider the works of Scott Kim; human beings -can recognize hugely variant shapes as the "same" character. -Sometimes, especially where characters are extremely complicated to -write, completely different shapes may be defined as the "same" -character in national standards. The Taiwanese variant of Hanzi is -generally the most complicated; over the centuries, the Japanese, -Koreans, and the People's Republic of China have adopted -simplifications of the shape, but the line of descent from the original -shape is recorded, and the meanings and pronunciation of different -forms of the same character are considered to be identical within each -language. (Of course, it may take a specialist to recognize the -related form; the point is that the relations are standardized, despite -the differing shapes.) - - In some cases, the differences will be significant enough that it is -actually possible to identify two or more distinct shapes that both -represent the same character. For example, the lowercase letters `a' -and `g' each have two distinct possible shapes--the `a' can optionally -have a curved tail projecting off the top, and the `g' can be formed -either of two loops, or of one loop and a tail hanging off the bottom. -Such distinct possible shapes of a character are called "glyphs". The -important characteristic of two glyphs making up the same character is -that the choice between one or the other is purely stylistic and has no -linguistic effect on a word (this is the reason why a capital `A' and -lowercase `a' are different characters rather than different -glyphs--e.g. `Aspen' is a city while `aspen' is a kind of tree). - - Note that "character" and "glyph" are used differently here than -elsewhere in XEmacs. - - A "character set" is essentially a set of related characters. ASCII, -for example, is a set of 94 characters (or 128, if you count -non-printing characters). Other character sets are ISO8859-1 (ASCII -plus various accented characters and other international symbols), JIS -X 0201 (ASCII, more or less, plus half-width Katakana), JIS X 0208 -(Japanese Kanji), JIS X 0212 (a second set of less-used Japanese Kanji), -GB2312 (Mainland Chinese Hanzi), etc. - - The definition of a character set will implicitly or explicitly give -it an "ordering", a way of assigning a number to each character in the -set. For many character sets, there is a natural ordering, for example -the "ABC" ordering of the Roman letters. But it is not clear whether -digits should come before or after the letters, and in fact different -European languages treat the ordering of accented characters -differently. It is useful to use the natural order where available, of -course. The number assigned to any particular character is called the -character's "code point". (Within a given character set, each -character has a unique code point. Thus the word "set" is ill-chosen; -different orderings of the same characters are different character sets. -Identifying characters is simple enough for alphabetic character sets, -but the difference in ordering can cause great headaches when the same -thousands of characters are used by different cultures as in the Hanzi.) - - A code point may be broken into a number of "position codes". The -number of position codes required to index a particular character in a -character set is called the "dimension" of the character set. For -practical purposes, a position code may be thought of as a byte-sized -index. The printing characters of ASCII, being a relatively small -character set, is of dimension one, and each character in the set is -indexed using a single position code, in the range 1 through 94. Use of -this unusual range, rather than the familiar 33 through 126, is an -intentional abstraction; to understand the programming issues you must -break the equation between character sets and encodings. - - JIS X 0208, i.e. Japanese Kanji, has thousands of characters, and is -of dimension two - every character is indexed by two position codes, -each in the range 1 through 94. (This number "94" is not a -coincidence; we shall see that the JIS position codes were chosen so -that JIS kanji could be encoded without using codes that in ASCII are -associated with device control functions.) Note that the choice of the -range here is somewhat arbitrary. You could just as easily index the -printing characters in ASCII using numbers in the range 0 through 93, 2 -through 95, 3 through 96, etc. In fact, the standardized _encoding_ -for the ASCII _character set_ uses the range 33 through 126. - - An "encoding" is a way of numerically representing characters from -one or more character sets into a stream of like-sized numerical values -called "words"; typically these are 8-bit, 16-bit, or 32-bit -quantities. If an encoding encompasses only one character set, then the -position codes for the characters in that character set could be used -directly. (This is the case with the trivial cipher used by children, -assigning 1 to `A', 2 to `B', and so on.) However, even with ASCII, -other considerations intrude. For example, why are the upper- and -lowercase alphabets separated by 8 characters? Why do the digits start -with `0' being assigned the code 48? In both cases because semantically -interesting operations (case conversion and numerical value extraction) -become convenient masking operations. Other artificial aspects (the -control characters being assigned to codes 0-31 and 127) are historical -accidents. (The use of 127 for `DEL' is an artifact of the "punch -once" nature of paper tape, for example.) - - Naive use of the position code is not possible, however, if more than -one character set is to be used in the encoding. For example, printed -Japanese text typically requires characters from multiple character sets -- ASCII, JIS X 0208, and JIS X 0212, to be specific. Each of these is -indexed using one or more position codes in the range 1 through 94, so -the position codes could not be used directly or there would be no way -to tell which character was meant. Different Japanese encodings handle -this differently - JIS uses special escape characters to denote -different character sets; EUC sets the high bit of the position codes -for JIS X 0208 and JIS X 0212, and puts a special extra byte before each -JIS X 0212 character; etc. (JIS, EUC, and most of the other encodings -you will encounter in files are 7-bit or 8-bit encodings. There is one -common 16-bit encoding, which is Unicode; this strives to represent all -the world's characters in a single large character set. 32-bit -encodings are often used internally in programs, such as XEmacs with -MULE support, to simplify the code that manipulates them; however, they -are not used externally because they are not very space-efficient.) - - A general method of handling text using multiple character sets -(whether for multilingual text, or simply text in an extremely -complicated single language like Japanese) is defined in the -international standard ISO 2022. ISO 2022 will be discussed in more -detail later (*note ISO 2022::), but for now suffice it to say that text -needs control functions (at least spacing), and if escape sequences are -to be used, an escape sequence introducer. It was decided to make all -text streams compatible with ASCII in the sense that the codes 0-31 -(and 128-159) would always be control codes, never graphic characters, -and where defined by the character set the `SPC' character would be -assigned code 32, and `DEL' would be assigned 127. Thus there are 94 -code points remaining if 7 bits are used. This is the reason that most -character sets are defined using position codes in the range 1 through -94. Then ISO 2022 compatible encodings are produced by shifting the -position codes 1 to 94 into character codes 33 to 126, or (if 8 bit -codes are available) into character codes 161 to 254. - - Encodings are classified as either "modal" or "non-modal". In a -"modal encoding", there are multiple states that the encoding can be -in, and the interpretation of the values in the stream depends on the -current global state of the encoding. Special values in the encoding, -called "escape sequences", are used to change the global state. JIS, -for example, is a modal encoding. The bytes `ESC $ B' indicate that, -from then on, bytes are to be interpreted as position codes for JIS X -0208, rather than as ASCII. This effect is cancelled using the bytes -`ESC ( B', which mean "switch from whatever the current state is to -ASCII". To switch to JIS X 0212, the escape sequence `ESC $ ( D'. -(Note that here, as is common, the escape sequences do in fact begin -with `ESC'. This is not necessarily the case, however. Some encodings -use control characters called "locking shifts" (effect persists until -cancelled) to switch character sets.) - - A "non-modal encoding" has no global state that extends past the -character currently being interpreted. EUC, for example, is a -non-modal encoding. Characters in JIS X 0208 are encoded by setting -the high bit of the position codes, and characters in JIS X 0212 are -encoded by doing the same but also prefixing the character with the -byte 0x8F. - - The advantage of a modal encoding is that it is generally more -space-efficient, and is easily extendible because there are essentially -an arbitrary number of escape sequences that can be created. The -disadvantage, however, is that it is much more difficult to work with -if it is not being processed in a sequential manner. In the non-modal -EUC encoding, for example, the byte 0x41 always refers to the letter -`A'; whereas in JIS, it could either be the letter `A', or one of the -two position codes in a JIS X 0208 character, or one of the two -position codes in a JIS X 0212 character. Determining exactly which -one is meant could be difficult and time-consuming if the previous -bytes in the string have not already been processed, or impossible if -they are drawn from an external stream that cannot be rewound. - - Non-modal encodings are further divided into "fixed-width" and -"variable-width" formats. A fixed-width encoding always uses the same -number of words per character, whereas a variable-width encoding does -not. EUC is a good example of a variable-width encoding: one to three -bytes are used per character, depending on the character set. 16-bit -and 32-bit encodings are nearly always fixed-width, and this is in fact -one of the main reasons for using an encoding with a larger word size. -The advantages of fixed-width encodings should be obvious. The -advantages of variable-width encodings are that they are generally more -space-efficient and allow for compatibility with existing 8-bit -encodings such as ASCII. (For example, in Unicode ASCII characters are -simply promoted to a 16-bit representation. That means that every -ASCII character contains a `NUL' byte; evidently all of the standard -string manipulation functions will lose badly in a fixed-width Unicode -environment.) - - The bytes in an 8-bit encoding are often referred to as "octets" -rather than simply as bytes. This terminology dates back to the days -before 8-bit bytes were universal, when some computers had 9-bit bytes, -others had 10-bit bytes, etc. - - -File: lispref.info, Node: Charsets, Next: MULE Characters, Prev: Internationalization Terminology, Up: MULE - -Charsets -======== - - A "charset" in MULE is an object that encapsulates a particular -character set as well as an ordering of those characters. Charsets are -permanent objects and are named using symbols, like faces. - - - Function: charsetp object - This function returns non-`nil' if OBJECT is a charset. - -* Menu: - -* Charset Properties:: Properties of a charset. -* Basic Charset Functions:: Functions for working with charsets. -* Charset Property Functions:: Functions for accessing charset properties. -* Predefined Charsets:: Predefined charset objects. - - -File: lispref.info, Node: Charset Properties, Next: Basic Charset Functions, Up: Charsets - -Charset Properties ------------------- - - Charsets have the following properties: - -`name' - A symbol naming the charset. Every charset must have a different - name; this allows a charset to be referred to using its name - rather than the actual charset object. - -`doc-string' - A documentation string describing the charset. - -`registry' - A regular expression matching the font registry field for this - character set. For example, both the `ascii' and `latin-iso8859-1' - charsets use the registry `"ISO8859-1"'. This field is used to - choose an appropriate font when the user gives a general font - specification such as `-*-courier-medium-r-*-140-*', i.e. a - 14-point upright medium-weight Courier font. - -`dimension' - Number of position codes used to index a character in the - character set. XEmacs/MULE can only handle character sets of - dimension 1 or 2. This property defaults to 1. - -`chars' - Number of characters in each dimension. In XEmacs/MULE, the only - allowed values are 94 or 96. (There are a couple of pre-defined - character sets, such as ASCII, that do not follow this, but you - cannot define new ones like this.) Defaults to 94. Note that if - the dimension is 2, the character set thus described is 94x94 or - 96x96. - -`columns' - Number of columns used to display a character in this charset. - Only used in TTY mode. (Under X, the actual width of a character - can be derived from the font used to display the characters.) If - unspecified, defaults to the dimension. (This is almost always the - correct value, because character sets with dimension 2 are usually - ideograph character sets, which need two columns to display the - intricate ideographs.) - -`direction' - A symbol, either `l2r' (left-to-right) or `r2l' (right-to-left). - Defaults to `l2r'. This specifies the direction that the text - should be displayed in, and will be left-to-right for most - charsets but right-to-left for Hebrew and Arabic. (Right-to-left - display is not currently implemented.) - -`final' - Final byte of the standard ISO 2022 escape sequence designating - this charset. Must be supplied. Each combination of (DIMENSION, - CHARS) defines a separate namespace for final bytes, and each - charset within a particular namespace must have a different final - byte. Note that ISO 2022 restricts the final byte to the range - 0x30 - 0x7E if dimension == 1, and 0x30 - 0x5F if dimension == 2. - Note also that final bytes in the range 0x30 - 0x3F are reserved - for user-defined (not official) character sets. For more - information on ISO 2022, see *Note Coding Systems::. - -`graphic' - 0 (use left half of font on output) or 1 (use right half of font on - output). Defaults to 0. This specifies how to convert the - position codes that index a character in a character set into an - index into the font used to display the character set. With - `graphic' set to 0, position codes 33 through 126 map to font - indices 33 through 126; with it set to 1, position codes 33 - through 126 map to font indices 161 through 254 (i.e. the same - number but with the high bit set). For example, for a font whose - registry is ISO8859-1, the left half of the font (octets 0x20 - - 0x7F) is the `ascii' charset, while the right half (octets 0xA0 - - 0xFF) is the `latin-iso8859-1' charset. - -`ccl-program' - A compiled CCL program used to convert a character in this charset - into an index into the font. This is in addition to the `graphic' - property. If a CCL program is defined, the position codes of a - character will first be processed according to `graphic' and then - passed through the CCL program, with the resulting values used to - index the font. - - This is used, for example, in the Big5 character set (used in - Taiwan). This character set is not ISO-2022-compliant, and its - size (94x157) does not fit within the maximum 96x96 size of - ISO-2022-compliant character sets. As a result, XEmacs/MULE - splits it (in a rather complex fashion, so as to group the most - commonly used characters together) into two charset objects - (`big5-1' and `big5-2'), each of size 94x94, and each charset - object uses a CCL program to convert the modified position codes - back into standard Big5 indices to retrieve a character from a - Big5 font. - - Most of the above properties can only be set when the charset is -initialized, and cannot be changed later. *Note Charset Property -Functions::. - - -File: lispref.info, Node: Basic Charset Functions, Next: Charset Property Functions, Prev: Charset Properties, Up: Charsets - -Basic Charset Functions ------------------------ - - - Function: find-charset charset-or-name - This function retrieves the charset of the given name. If - CHARSET-OR-NAME is a charset object, it is simply returned. - Otherwise, CHARSET-OR-NAME should be a symbol. If there is no - such charset, `nil' is returned. Otherwise the associated charset - object is returned. - - - Function: get-charset name - This function retrieves the charset of the given name. Same as - `find-charset' except an error is signalled if there is no such - charset instead of returning `nil'. - - - Function: charset-list - This function returns a list of the names of all defined charsets. - - - Function: make-charset name doc-string props - This function defines a new character set. This function is for - use with MULE support. NAME is a symbol, the name by which the - character set is normally referred. DOC-STRING is a string - describing the character set. PROPS is a property list, - describing the specific nature of the character set. The - recognized properties are `registry', `dimension', `columns', - `chars', `final', `graphic', `direction', and `ccl-program', as - previously described. - - - Function: make-reverse-direction-charset charset new-name - This function makes a charset equivalent to CHARSET but which goes - in the opposite direction. NEW-NAME is the name of the new - charset. The new charset is returned. - - - Function: charset-from-attributes dimension chars final &optional - direction - This function returns a charset with the given DIMENSION, CHARS, - FINAL, and DIRECTION. If DIRECTION is omitted, both directions - will be checked (left-to-right will be returned if character sets - exist for both directions). - - - Function: charset-reverse-direction-charset charset - This function returns the charset (if any) with the same dimension, - number of characters, and final byte as CHARSET, but which is - displayed in the opposite direction. - - -File: lispref.info, Node: Charset Property Functions, Next: Predefined Charsets, Prev: Basic Charset Functions, Up: Charsets - -Charset Property Functions --------------------------- - - All of these functions accept either a charset name or charset -object. - - - Function: charset-property charset prop - This function returns property PROP of CHARSET. *Note Charset - Properties::. - - Convenience functions are also provided for retrieving individual -properties of a charset. - - - Function: charset-name charset - This function returns the name of CHARSET. This will be a symbol. - - - Function: charset-doc-string charset - This function returns the doc string of CHARSET. - - - Function: charset-registry charset - This function returns the registry of CHARSET. - - - Function: charset-dimension charset - This function returns the dimension of CHARSET. - - - Function: charset-chars charset - This function returns the number of characters per dimension of - CHARSET. - - - Function: charset-columns charset - This function returns the number of display columns per character - (in TTY mode) of CHARSET. - - - Function: charset-direction charset - This function returns the display direction of CHARSET--either - `l2r' or `r2l'. - - - Function: charset-final charset - This function returns the final byte of the ISO 2022 escape - sequence designating CHARSET. - - - Function: charset-graphic charset - This function returns either 0 or 1, depending on whether the - position codes of characters in CHARSET map to the left or right - half of their font, respectively. - - - Function: charset-ccl-program charset - This function returns the CCL program, if any, for converting - position codes of characters in CHARSET into font indices. - - The only property of a charset that can currently be set after the -charset has been created is the CCL program. - - - Function: set-charset-ccl-program charset ccl-program - This function sets the `ccl-program' property of CHARSET to - CCL-PROGRAM. - - -File: lispref.info, Node: Predefined Charsets, Prev: Charset Property Functions, Up: Charsets - -Predefined Charsets -------------------- - - The following charsets are predefined in the C code. - - Name Type Fi Gr Dir Registry - -------------------------------------------------------------- - ascii 94 B 0 l2r ISO8859-1 - control-1 94 0 l2r --- - latin-iso8859-1 94 A 1 l2r ISO8859-1 - latin-iso8859-2 96 B 1 l2r ISO8859-2 - latin-iso8859-3 96 C 1 l2r ISO8859-3 - latin-iso8859-4 96 D 1 l2r ISO8859-4 - cyrillic-iso8859-5 96 L 1 l2r ISO8859-5 - arabic-iso8859-6 96 G 1 r2l ISO8859-6 - greek-iso8859-7 96 F 1 l2r ISO8859-7 - hebrew-iso8859-8 96 H 1 r2l ISO8859-8 - latin-iso8859-9 96 M 1 l2r ISO8859-9 - thai-tis620 96 T 1 l2r TIS620 - katakana-jisx0201 94 I 1 l2r JISX0201.1976 - latin-jisx0201 94 J 0 l2r JISX0201.1976 - japanese-jisx0208-1978 94x94 @ 0 l2r JISX0208.1978 - japanese-jisx0208 94x94 B 0 l2r JISX0208.19(83|90) - japanese-jisx0212 94x94 D 0 l2r JISX0212 - chinese-gb2312 94x94 A 0 l2r GB2312 - chinese-cns11643-1 94x94 G 0 l2r CNS11643.1 - chinese-cns11643-2 94x94 H 0 l2r CNS11643.2 - chinese-big5-1 94x94 0 0 l2r Big5 - chinese-big5-2 94x94 1 0 l2r Big5 - korean-ksc5601 94x94 C 0 l2r KSC5601 - composite 96x96 0 l2r --- - - The following charsets are predefined in the Lisp code. - - Name Type Fi Gr Dir Registry - -------------------------------------------------------------- - arabic-digit 94 2 0 l2r MuleArabic-0 - arabic-1-column 94 3 0 r2l MuleArabic-1 - arabic-2-column 94 4 0 r2l MuleArabic-2 - sisheng 94 0 0 l2r sisheng_cwnn\|OMRON_UDC_ZH - chinese-cns11643-3 94x94 I 0 l2r CNS11643.1 - chinese-cns11643-4 94x94 J 0 l2r CNS11643.1 - chinese-cns11643-5 94x94 K 0 l2r CNS11643.1 - chinese-cns11643-6 94x94 L 0 l2r CNS11643.1 - chinese-cns11643-7 94x94 M 0 l2r CNS11643.1 - ethiopic 94x94 2 0 l2r Ethio - ascii-r2l 94 B 0 r2l ISO8859-1 - ipa 96 0 1 l2r MuleIPA - vietnamese-lower 96 1 1 l2r VISCII1.1 - vietnamese-upper 96 2 1 l2r VISCII1.1 - - For all of the above charsets, the dimension and number of columns -are the same. - - Note that ASCII, Control-1, and Composite are handled specially. -This is why some of the fields are blank; and some of the filled-in -fields (e.g. the type) are not really accurate. - - -File: lispref.info, Node: MULE Characters, Next: Composite Characters, Prev: Charsets, Up: MULE - -MULE Characters -=============== - - - Function: make-char charset arg1 &optional arg2 - This function makes a multi-byte character from CHARSET and octets - ARG1 and ARG2. - - - Function: char-charset ch - This function returns the character set of char CH. - - - Function: char-octet ch &optional n - This function returns the octet (i.e. position code) numbered N - (should be 0 or 1) of char CH. N defaults to 0 if omitted. - - - Function: find-charset-region start end &optional buffer - This function returns a list of the charsets in the region between - START and END. BUFFER defaults to the current buffer if omitted. - - - Function: find-charset-string string - This function returns a list of the charsets in STRING. - - -File: lispref.info, Node: Composite Characters, Next: Coding Systems, Prev: MULE Characters, Up: MULE - -Composite Characters -==================== - - Composite characters are not yet completely implemented. - - - Function: make-composite-char string - This function converts a string into a single composite character. - The character is the result of overstriking all the characters in - the string. - - - Function: composite-char-string ch - This function returns a string of the characters comprising a - composite character. - - - Function: compose-region start end &optional buffer - This function composes the characters in the region from START to - END in BUFFER into one composite character. The composite - character replaces the composed characters. BUFFER defaults to - the current buffer if omitted. - - - Function: decompose-region start end &optional buffer - This function decomposes any composite characters in the region - from START to END in BUFFER. This converts each composite - character into one or more characters, the individual characters - out of which the composite character was formed. Non-composite - characters are left as-is. BUFFER defaults to the current buffer - if omitted. - - -File: lispref.info, Node: Coding Systems, Next: CCL, Prev: Composite Characters, Up: MULE - -Coding Systems -============== - - A coding system is an object that defines how text containing -multiple character sets is encoded into a stream of (typically 8-bit) -bytes. The coding system is used to decode the stream into a series of -characters (which may be from multiple charsets) when the text is read -from a file or process, and is used to encode the text back into the -same format when it is written out to a file or process. - - For example, many ISO-2022-compliant coding systems (such as Compound -Text, which is used for inter-client data under the X Window System) use -escape sequences to switch between different charsets - Japanese Kanji, -for example, is invoked with `ESC $ ( B'; ASCII is invoked with `ESC ( -B'; and Cyrillic is invoked with `ESC - L'. See `make-coding-system' -for more information. - - Coding systems are normally identified using a symbol, and the -symbol is accepted in place of the actual coding system object whenever -a coding system is called for. (This is similar to how faces and -charsets work.) - - - Function: coding-system-p object - This function returns non-`nil' if OBJECT is a coding system. - -* Menu: - -* Coding System Types:: Classifying coding systems. -* ISO 2022:: An international standard for - charsets and encodings. -* EOL Conversion:: Dealing with different ways of denoting - the end of a line. -* Coding System Properties:: Properties of a coding system. -* Basic Coding System Functions:: Working with coding systems. -* Coding System Property Functions:: Retrieving a coding system's properties. -* Encoding and Decoding Text:: Encoding and decoding text. -* Detection of Textual Encoding:: Determining how text is encoded. -* Big5 and Shift-JIS Functions:: Special functions for these non-standard - encodings. -* Predefined Coding Systems:: Coding systems implemented by MULE. - diff --git a/info/lispref.info-44 b/info/lispref.info-44 index b3a5f6a..e1ddc4f 100644 --- a/info/lispref.info-44 +++ b/info/lispref.info-44 @@ -50,6 +50,596 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Internationalization Terminology, Next: Charsets, Up: MULE + +Internationalization Terminology +================================ + + In internationalization terminology, a string of text is divided up +into "characters", which are the printable units that make up the text. +A single character is (for example) a capital `A', the number `2', a +Katakana character, a Hangul character, a Kanji ideograph (an +"ideograph" is a "picture" character, such as is used in Japanese +Kanji, Chinese Hanzi, and Korean Hanja; typically there are thousands +of such ideographs in each language), etc. The basic property of a +character is that it is the smallest unit of text with semantic +significance in text processing. + + Human beings normally process text visually, so to a first +approximation a character may be identified with its shape. Note that +the same character may be drawn by two different people (or in two +different fonts) in slightly different ways, although the "basic shape" +will be the same. But consider the works of Scott Kim; human beings +can recognize hugely variant shapes as the "same" character. +Sometimes, especially where characters are extremely complicated to +write, completely different shapes may be defined as the "same" +character in national standards. The Taiwanese variant of Hanzi is +generally the most complicated; over the centuries, the Japanese, +Koreans, and the People's Republic of China have adopted +simplifications of the shape, but the line of descent from the original +shape is recorded, and the meanings and pronunciation of different +forms of the same character are considered to be identical within each +language. (Of course, it may take a specialist to recognize the +related form; the point is that the relations are standardized, despite +the differing shapes.) + + In some cases, the differences will be significant enough that it is +actually possible to identify two or more distinct shapes that both +represent the same character. For example, the lowercase letters `a' +and `g' each have two distinct possible shapes--the `a' can optionally +have a curved tail projecting off the top, and the `g' can be formed +either of two loops, or of one loop and a tail hanging off the bottom. +Such distinct possible shapes of a character are called "glyphs". The +important characteristic of two glyphs making up the same character is +that the choice between one or the other is purely stylistic and has no +linguistic effect on a word (this is the reason why a capital `A' and +lowercase `a' are different characters rather than different +glyphs--e.g. `Aspen' is a city while `aspen' is a kind of tree). + + Note that "character" and "glyph" are used differently here than +elsewhere in XEmacs. + + A "character set" is essentially a set of related characters. ASCII, +for example, is a set of 94 characters (or 128, if you count +non-printing characters). Other character sets are ISO8859-1 (ASCII +plus various accented characters and other international symbols), JIS +X 0201 (ASCII, more or less, plus half-width Katakana), JIS X 0208 +(Japanese Kanji), JIS X 0212 (a second set of less-used Japanese Kanji), +GB2312 (Mainland Chinese Hanzi), etc. + + The definition of a character set will implicitly or explicitly give +it an "ordering", a way of assigning a number to each character in the +set. For many character sets, there is a natural ordering, for example +the "ABC" ordering of the Roman letters. But it is not clear whether +digits should come before or after the letters, and in fact different +European languages treat the ordering of accented characters +differently. It is useful to use the natural order where available, of +course. The number assigned to any particular character is called the +character's "code point". (Within a given character set, each +character has a unique code point. Thus the word "set" is ill-chosen; +different orderings of the same characters are different character sets. +Identifying characters is simple enough for alphabetic character sets, +but the difference in ordering can cause great headaches when the same +thousands of characters are used by different cultures as in the Hanzi.) + + A code point may be broken into a number of "position codes". The +number of position codes required to index a particular character in a +character set is called the "dimension" of the character set. For +practical purposes, a position code may be thought of as a byte-sized +index. The printing characters of ASCII, being a relatively small +character set, is of dimension one, and each character in the set is +indexed using a single position code, in the range 1 through 94. Use of +this unusual range, rather than the familiar 33 through 126, is an +intentional abstraction; to understand the programming issues you must +break the equation between character sets and encodings. + + JIS X 0208, i.e. Japanese Kanji, has thousands of characters, and is +of dimension two - every character is indexed by two position codes, +each in the range 1 through 94. (This number "94" is not a +coincidence; we shall see that the JIS position codes were chosen so +that JIS kanji could be encoded without using codes that in ASCII are +associated with device control functions.) Note that the choice of the +range here is somewhat arbitrary. You could just as easily index the +printing characters in ASCII using numbers in the range 0 through 93, 2 +through 95, 3 through 96, etc. In fact, the standardized _encoding_ +for the ASCII _character set_ uses the range 33 through 126. + + An "encoding" is a way of numerically representing characters from +one or more character sets into a stream of like-sized numerical values +called "words"; typically these are 8-bit, 16-bit, or 32-bit +quantities. If an encoding encompasses only one character set, then the +position codes for the characters in that character set could be used +directly. (This is the case with the trivial cipher used by children, +assigning 1 to `A', 2 to `B', and so on.) However, even with ASCII, +other considerations intrude. For example, why are the upper- and +lowercase alphabets separated by 8 characters? Why do the digits start +with `0' being assigned the code 48? In both cases because semantically +interesting operations (case conversion and numerical value extraction) +become convenient masking operations. Other artificial aspects (the +control characters being assigned to codes 0-31 and 127) are historical +accidents. (The use of 127 for `DEL' is an artifact of the "punch +once" nature of paper tape, for example.) + + Naive use of the position code is not possible, however, if more than +one character set is to be used in the encoding. For example, printed +Japanese text typically requires characters from multiple character sets +- ASCII, JIS X 0208, and JIS X 0212, to be specific. Each of these is +indexed using one or more position codes in the range 1 through 94, so +the position codes could not be used directly or there would be no way +to tell which character was meant. Different Japanese encodings handle +this differently - JIS uses special escape characters to denote +different character sets; EUC sets the high bit of the position codes +for JIS X 0208 and JIS X 0212, and puts a special extra byte before each +JIS X 0212 character; etc. (JIS, EUC, and most of the other encodings +you will encounter in files are 7-bit or 8-bit encodings. There is one +common 16-bit encoding, which is Unicode; this strives to represent all +the world's characters in a single large character set. 32-bit +encodings are often used internally in programs, such as XEmacs with +MULE support, to simplify the code that manipulates them; however, they +are not used externally because they are not very space-efficient.) + + A general method of handling text using multiple character sets +(whether for multilingual text, or simply text in an extremely +complicated single language like Japanese) is defined in the +international standard ISO 2022. ISO 2022 will be discussed in more +detail later (*note ISO 2022::), but for now suffice it to say that text +needs control functions (at least spacing), and if escape sequences are +to be used, an escape sequence introducer. It was decided to make all +text streams compatible with ASCII in the sense that the codes 0-31 +(and 128-159) would always be control codes, never graphic characters, +and where defined by the character set the `SPC' character would be +assigned code 32, and `DEL' would be assigned 127. Thus there are 94 +code points remaining if 7 bits are used. This is the reason that most +character sets are defined using position codes in the range 1 through +94. Then ISO 2022 compatible encodings are produced by shifting the +position codes 1 to 94 into character codes 33 to 126, or (if 8 bit +codes are available) into character codes 161 to 254. + + Encodings are classified as either "modal" or "non-modal". In a +"modal encoding", there are multiple states that the encoding can be +in, and the interpretation of the values in the stream depends on the +current global state of the encoding. Special values in the encoding, +called "escape sequences", are used to change the global state. JIS, +for example, is a modal encoding. The bytes `ESC $ B' indicate that, +from then on, bytes are to be interpreted as position codes for JIS X +0208, rather than as ASCII. This effect is cancelled using the bytes +`ESC ( B', which mean "switch from whatever the current state is to +ASCII". To switch to JIS X 0212, the escape sequence `ESC $ ( D'. +(Note that here, as is common, the escape sequences do in fact begin +with `ESC'. This is not necessarily the case, however. Some encodings +use control characters called "locking shifts" (effect persists until +cancelled) to switch character sets.) + + A "non-modal encoding" has no global state that extends past the +character currently being interpreted. EUC, for example, is a +non-modal encoding. Characters in JIS X 0208 are encoded by setting +the high bit of the position codes, and characters in JIS X 0212 are +encoded by doing the same but also prefixing the character with the +byte 0x8F. + + The advantage of a modal encoding is that it is generally more +space-efficient, and is easily extendible because there are essentially +an arbitrary number of escape sequences that can be created. The +disadvantage, however, is that it is much more difficult to work with +if it is not being processed in a sequential manner. In the non-modal +EUC encoding, for example, the byte 0x41 always refers to the letter +`A'; whereas in JIS, it could either be the letter `A', or one of the +two position codes in a JIS X 0208 character, or one of the two +position codes in a JIS X 0212 character. Determining exactly which +one is meant could be difficult and time-consuming if the previous +bytes in the string have not already been processed, or impossible if +they are drawn from an external stream that cannot be rewound. + + Non-modal encodings are further divided into "fixed-width" and +"variable-width" formats. A fixed-width encoding always uses the same +number of words per character, whereas a variable-width encoding does +not. EUC is a good example of a variable-width encoding: one to three +bytes are used per character, depending on the character set. 16-bit +and 32-bit encodings are nearly always fixed-width, and this is in fact +one of the main reasons for using an encoding with a larger word size. +The advantages of fixed-width encodings should be obvious. The +advantages of variable-width encodings are that they are generally more +space-efficient and allow for compatibility with existing 8-bit +encodings such as ASCII. (For example, in Unicode ASCII characters are +simply promoted to a 16-bit representation. That means that every +ASCII character contains a `NUL' byte; evidently all of the standard +string manipulation functions will lose badly in a fixed-width Unicode +environment.) + + The bytes in an 8-bit encoding are often referred to as "octets" +rather than simply as bytes. This terminology dates back to the days +before 8-bit bytes were universal, when some computers had 9-bit bytes, +others had 10-bit bytes, etc. + + +File: lispref.info, Node: Charsets, Next: MULE Characters, Prev: Internationalization Terminology, Up: MULE + +Charsets +======== + + A "charset" in MULE is an object that encapsulates a particular +character set as well as an ordering of those characters. Charsets are +permanent objects and are named using symbols, like faces. + + - Function: charsetp object + This function returns non-`nil' if OBJECT is a charset. + +* Menu: + +* Charset Properties:: Properties of a charset. +* Basic Charset Functions:: Functions for working with charsets. +* Charset Property Functions:: Functions for accessing charset properties. +* Predefined Charsets:: Predefined charset objects. + + +File: lispref.info, Node: Charset Properties, Next: Basic Charset Functions, Up: Charsets + +Charset Properties +------------------ + + Charsets have the following properties: + +`name' + A symbol naming the charset. Every charset must have a different + name; this allows a charset to be referred to using its name + rather than the actual charset object. + +`doc-string' + A documentation string describing the charset. + +`registry' + A regular expression matching the font registry field for this + character set. For example, both the `ascii' and `latin-iso8859-1' + charsets use the registry `"ISO8859-1"'. This field is used to + choose an appropriate font when the user gives a general font + specification such as `-*-courier-medium-r-*-140-*', i.e. a + 14-point upright medium-weight Courier font. + +`dimension' + Number of position codes used to index a character in the + character set. XEmacs/MULE can only handle character sets of + dimension 1 or 2. This property defaults to 1. + +`chars' + Number of characters in each dimension. In XEmacs/MULE, the only + allowed values are 94 or 96. (There are a couple of pre-defined + character sets, such as ASCII, that do not follow this, but you + cannot define new ones like this.) Defaults to 94. Note that if + the dimension is 2, the character set thus described is 94x94 or + 96x96. + +`columns' + Number of columns used to display a character in this charset. + Only used in TTY mode. (Under X, the actual width of a character + can be derived from the font used to display the characters.) If + unspecified, defaults to the dimension. (This is almost always the + correct value, because character sets with dimension 2 are usually + ideograph character sets, which need two columns to display the + intricate ideographs.) + +`direction' + A symbol, either `l2r' (left-to-right) or `r2l' (right-to-left). + Defaults to `l2r'. This specifies the direction that the text + should be displayed in, and will be left-to-right for most + charsets but right-to-left for Hebrew and Arabic. (Right-to-left + display is not currently implemented.) + +`final' + Final byte of the standard ISO 2022 escape sequence designating + this charset. Must be supplied. Each combination of (DIMENSION, + CHARS) defines a separate namespace for final bytes, and each + charset within a particular namespace must have a different final + byte. Note that ISO 2022 restricts the final byte to the range + 0x30 - 0x7E if dimension == 1, and 0x30 - 0x5F if dimension == 2. + Note also that final bytes in the range 0x30 - 0x3F are reserved + for user-defined (not official) character sets. For more + information on ISO 2022, see *Note Coding Systems::. + +`graphic' + 0 (use left half of font on output) or 1 (use right half of font on + output). Defaults to 0. This specifies how to convert the + position codes that index a character in a character set into an + index into the font used to display the character set. With + `graphic' set to 0, position codes 33 through 126 map to font + indices 33 through 126; with it set to 1, position codes 33 + through 126 map to font indices 161 through 254 (i.e. the same + number but with the high bit set). For example, for a font whose + registry is ISO8859-1, the left half of the font (octets 0x20 - + 0x7F) is the `ascii' charset, while the right half (octets 0xA0 - + 0xFF) is the `latin-iso8859-1' charset. + +`ccl-program' + A compiled CCL program used to convert a character in this charset + into an index into the font. This is in addition to the `graphic' + property. If a CCL program is defined, the position codes of a + character will first be processed according to `graphic' and then + passed through the CCL program, with the resulting values used to + index the font. + + This is used, for example, in the Big5 character set (used in + Taiwan). This character set is not ISO-2022-compliant, and its + size (94x157) does not fit within the maximum 96x96 size of + ISO-2022-compliant character sets. As a result, XEmacs/MULE + splits it (in a rather complex fashion, so as to group the most + commonly used characters together) into two charset objects + (`big5-1' and `big5-2'), each of size 94x94, and each charset + object uses a CCL program to convert the modified position codes + back into standard Big5 indices to retrieve a character from a + Big5 font. + + Most of the above properties can only be set when the charset is +initialized, and cannot be changed later. *Note Charset Property +Functions::. + + +File: lispref.info, Node: Basic Charset Functions, Next: Charset Property Functions, Prev: Charset Properties, Up: Charsets + +Basic Charset Functions +----------------------- + + - Function: find-charset charset-or-name + This function retrieves the charset of the given name. If + CHARSET-OR-NAME is a charset object, it is simply returned. + Otherwise, CHARSET-OR-NAME should be a symbol. If there is no + such charset, `nil' is returned. Otherwise the associated charset + object is returned. + + - Function: get-charset name + This function retrieves the charset of the given name. Same as + `find-charset' except an error is signalled if there is no such + charset instead of returning `nil'. + + - Function: charset-list + This function returns a list of the names of all defined charsets. + + - Function: make-charset name doc-string props + This function defines a new character set. This function is for + use with MULE support. NAME is a symbol, the name by which the + character set is normally referred. DOC-STRING is a string + describing the character set. PROPS is a property list, + describing the specific nature of the character set. The + recognized properties are `registry', `dimension', `columns', + `chars', `final', `graphic', `direction', and `ccl-program', as + previously described. + + - Function: make-reverse-direction-charset charset new-name + This function makes a charset equivalent to CHARSET but which goes + in the opposite direction. NEW-NAME is the name of the new + charset. The new charset is returned. + + - Function: charset-from-attributes dimension chars final &optional + direction + This function returns a charset with the given DIMENSION, CHARS, + FINAL, and DIRECTION. If DIRECTION is omitted, both directions + will be checked (left-to-right will be returned if character sets + exist for both directions). + + - Function: charset-reverse-direction-charset charset + This function returns the charset (if any) with the same dimension, + number of characters, and final byte as CHARSET, but which is + displayed in the opposite direction. + + +File: lispref.info, Node: Charset Property Functions, Next: Predefined Charsets, Prev: Basic Charset Functions, Up: Charsets + +Charset Property Functions +-------------------------- + + All of these functions accept either a charset name or charset +object. + + - Function: charset-property charset prop + This function returns property PROP of CHARSET. *Note Charset + Properties::. + + Convenience functions are also provided for retrieving individual +properties of a charset. + + - Function: charset-name charset + This function returns the name of CHARSET. This will be a symbol. + + - Function: charset-description charset + This function returns the documentation string of CHARSET. + + - Function: charset-registry charset + This function returns the registry of CHARSET. + + - Function: charset-dimension charset + This function returns the dimension of CHARSET. + + - Function: charset-chars charset + This function returns the number of characters per dimension of + CHARSET. + + - Function: charset-width charset + This function returns the number of display columns per character + (in TTY mode) of CHARSET. + + - Function: charset-direction charset + This function returns the display direction of CHARSET--either + `l2r' or `r2l'. + + - Function: charset-iso-final-char charset + This function returns the final byte of the ISO 2022 escape + sequence designating CHARSET. + + - Function: charset-iso-graphic-plane charset + This function returns either 0 or 1, depending on whether the + position codes of characters in CHARSET map to the left or right + half of their font, respectively. + + - Function: charset-ccl-program charset + This function returns the CCL program, if any, for converting + position codes of characters in CHARSET into font indices. + + The only property of a charset that can currently be set after the +charset has been created is the CCL program. + + - Function: set-charset-ccl-program charset ccl-program + This function sets the `ccl-program' property of CHARSET to + CCL-PROGRAM. + + +File: lispref.info, Node: Predefined Charsets, Prev: Charset Property Functions, Up: Charsets + +Predefined Charsets +------------------- + + The following charsets are predefined in the C code. + + Name Type Fi Gr Dir Registry + -------------------------------------------------------------- + ascii 94 B 0 l2r ISO8859-1 + control-1 94 0 l2r --- + latin-iso8859-1 94 A 1 l2r ISO8859-1 + latin-iso8859-2 96 B 1 l2r ISO8859-2 + latin-iso8859-3 96 C 1 l2r ISO8859-3 + latin-iso8859-4 96 D 1 l2r ISO8859-4 + cyrillic-iso8859-5 96 L 1 l2r ISO8859-5 + arabic-iso8859-6 96 G 1 r2l ISO8859-6 + greek-iso8859-7 96 F 1 l2r ISO8859-7 + hebrew-iso8859-8 96 H 1 r2l ISO8859-8 + latin-iso8859-9 96 M 1 l2r ISO8859-9 + thai-tis620 96 T 1 l2r TIS620 + katakana-jisx0201 94 I 1 l2r JISX0201.1976 + latin-jisx0201 94 J 0 l2r JISX0201.1976 + japanese-jisx0208-1978 94x94 @ 0 l2r JISX0208.1978 + japanese-jisx0208 94x94 B 0 l2r JISX0208.19(83|90) + japanese-jisx0212 94x94 D 0 l2r JISX0212 + chinese-gb2312 94x94 A 0 l2r GB2312 + chinese-cns11643-1 94x94 G 0 l2r CNS11643.1 + chinese-cns11643-2 94x94 H 0 l2r CNS11643.2 + chinese-big5-1 94x94 0 0 l2r Big5 + chinese-big5-2 94x94 1 0 l2r Big5 + korean-ksc5601 94x94 C 0 l2r KSC5601 + composite 96x96 0 l2r --- + + The following charsets are predefined in the Lisp code. + + Name Type Fi Gr Dir Registry + -------------------------------------------------------------- + arabic-digit 94 2 0 l2r MuleArabic-0 + arabic-1-column 94 3 0 r2l MuleArabic-1 + arabic-2-column 94 4 0 r2l MuleArabic-2 + sisheng 94 0 0 l2r sisheng_cwnn\|OMRON_UDC_ZH + chinese-cns11643-3 94x94 I 0 l2r CNS11643.1 + chinese-cns11643-4 94x94 J 0 l2r CNS11643.1 + chinese-cns11643-5 94x94 K 0 l2r CNS11643.1 + chinese-cns11643-6 94x94 L 0 l2r CNS11643.1 + chinese-cns11643-7 94x94 M 0 l2r CNS11643.1 + ethiopic 94x94 2 0 l2r Ethio + ascii-r2l 94 B 0 r2l ISO8859-1 + ipa 96 0 1 l2r MuleIPA + vietnamese-lower 96 1 1 l2r VISCII1.1 + vietnamese-upper 96 2 1 l2r VISCII1.1 + + For all of the above charsets, the dimension and number of columns +are the same. + + Note that ASCII, Control-1, and Composite are handled specially. +This is why some of the fields are blank; and some of the filled-in +fields (e.g. the type) are not really accurate. + + +File: lispref.info, Node: MULE Characters, Next: Composite Characters, Prev: Charsets, Up: MULE + +MULE Characters +=============== + + - Function: make-char charset arg1 &optional arg2 + This function makes a multi-byte character from CHARSET and octets + ARG1 and ARG2. + + - Function: char-charset character + This function returns the character set of char CHARACTER. + + - Function: char-octet character &optional n + This function returns the octet (i.e. position code) numbered N + (should be 0 or 1) of char CHARACTER. N defaults to 0 if omitted. + + - Function: find-charset-region start end &optional buffer + This function returns a list of the charsets in the region between + START and END. BUFFER defaults to the current buffer if omitted. + + - Function: find-charset-string string + This function returns a list of the charsets in STRING. + + +File: lispref.info, Node: Composite Characters, Next: Coding Systems, Prev: MULE Characters, Up: MULE + +Composite Characters +==================== + + Composite characters are not yet completely implemented. + + - Function: make-composite-char string + This function converts a string into a single composite character. + The character is the result of overstriking all the characters in + the string. + + - Function: composite-char-string character + This function returns a string of the characters comprising a + composite character. + + - Function: compose-region start end &optional buffer + This function composes the characters in the region from START to + END in BUFFER into one composite character. The composite + character replaces the composed characters. BUFFER defaults to + the current buffer if omitted. + + - Function: decompose-region start end &optional buffer + This function decomposes any composite characters in the region + from START to END in BUFFER. This converts each composite + character into one or more characters, the individual characters + out of which the composite character was formed. Non-composite + characters are left as-is. BUFFER defaults to the current buffer + if omitted. + + +File: lispref.info, Node: Coding Systems, Next: CCL, Prev: Composite Characters, Up: MULE + +Coding Systems +============== + + A coding system is an object that defines how text containing +multiple character sets is encoded into a stream of (typically 8-bit) +bytes. The coding system is used to decode the stream into a series of +characters (which may be from multiple charsets) when the text is read +from a file or process, and is used to encode the text back into the +same format when it is written out to a file or process. + + For example, many ISO-2022-compliant coding systems (such as Compound +Text, which is used for inter-client data under the X Window System) use +escape sequences to switch between different charsets - Japanese Kanji, +for example, is invoked with `ESC $ ( B'; ASCII is invoked with `ESC ( +B'; and Cyrillic is invoked with `ESC - L'. See `make-coding-system' +for more information. + + Coding systems are normally identified using a symbol, and the +symbol is accepted in place of the actual coding system object whenever +a coding system is called for. (This is similar to how faces and +charsets work.) + + - Function: coding-system-p object + This function returns non-`nil' if OBJECT is a coding system. + +* Menu: + +* Coding System Types:: Classifying coding systems. +* ISO 2022:: An international standard for + charsets and encodings. +* EOL Conversion:: Dealing with different ways of denoting + the end of a line. +* Coding System Properties:: Properties of a coding system. +* Basic Coding System Functions:: Working with coding systems. +* Coding System Property Functions:: Retrieving a coding system's properties. +* Encoding and Decoding Text:: Encoding and decoding text. +* Detection of Textual Encoding:: Determining how text is encoded. +* Big5 and Shift-JIS Functions:: Special functions for these non-standard + encodings. +* Predefined Coding Systems:: Coding systems implemented by MULE. + + File: lispref.info, Node: Coding System Types, Next: ISO 2022, Up: Coding Systems Coding System Types @@ -442,839 +1032,3 @@ EOL Conversion subsidiary coding systems. (This value is converted to `nil' when stored internally, and `coding-system-property' will return `nil'.) - -File: lispref.info, Node: Coding System Properties, Next: Basic Coding System Functions, Prev: EOL Conversion, Up: Coding Systems - -Coding System Properties ------------------------- - -`mnemonic' - String to be displayed in the modeline when this coding system is - active. - -`eol-type' - End-of-line conversion to be used. It should be one of the types - listed in *Note EOL Conversion::. - -`eol-lf' - The coding system which is the same as this one, except that it - uses the Unix line-breaking convention. - -`eol-crlf' - The coding system which is the same as this one, except that it - uses the DOS line-breaking convention. - -`eol-cr' - The coding system which is the same as this one, except that it - uses the Macintosh line-breaking convention. - -`post-read-conversion' - Function called after a file has been read in, to perform the - decoding. Called with two arguments, BEG and END, denoting a - region of the current buffer to be decoded. - -`pre-write-conversion' - Function called before a file is written out, to perform the - encoding. Called with two arguments, BEG and END, denoting a - region of the current buffer to be encoded. - - The following additional properties are recognized if TYPE is -`iso2022': - -`charset-g0' -`charset-g1' -`charset-g2' -`charset-g3' - The character set initially designated to the G0 - G3 registers. - The value should be one of - - * A charset object (designate that character set) - - * `nil' (do not ever use this register) - - * `t' (no character set is initially designated to the - register, but may be later on; this automatically sets the - corresponding `force-g*-on-output' property) - -`force-g0-on-output' -`force-g1-on-output' -`force-g2-on-output' -`force-g3-on-output' - If non-`nil', send an explicit designation sequence on output - before using the specified register. - -`short' - If non-`nil', use the short forms `ESC $ @', `ESC $ A', and `ESC $ - B' on output in place of the full designation sequences `ESC $ ( - @', `ESC $ ( A', and `ESC $ ( B'. - -`no-ascii-eol' - If non-`nil', don't designate ASCII to G0 at each end of line on - output. Setting this to non-`nil' also suppresses other - state-resetting that normally happens at the end of a line. - -`no-ascii-cntl' - If non-`nil', don't designate ASCII to G0 before control chars on - output. - -`seven' - If non-`nil', use 7-bit environment on output. Otherwise, use - 8-bit environment. - -`lock-shift' - If non-`nil', use locking-shift (SO/SI) instead of single-shift or - designation by escape sequence. - -`no-iso6429' - If non-`nil', don't use ISO6429's direction specification. - -`escape-quoted' - If non-nil, literal control characters that are the same as the - beginning of a recognized ISO 2022 or ISO 6429 escape sequence (in - particular, ESC (0x1B), SO (0x0E), SI (0x0F), SS2 (0x8E), SS3 - (0x8F), and CSI (0x9B)) are "quoted" with an escape character so - that they can be properly distinguished from an escape sequence. - (Note that doing this results in a non-portable encoding.) This - encoding flag is used for byte-compiled files. Note that ESC is a - good choice for a quoting character because there are no escape - sequences whose second byte is a character from the Control-0 or - Control-1 character sets; this is explicitly disallowed by the ISO - 2022 standard. - -`input-charset-conversion' - A list of conversion specifications, specifying conversion of - characters in one charset to another when decoding is performed. - Each specification is a list of two elements: the source charset, - and the destination charset. - -`output-charset-conversion' - A list of conversion specifications, specifying conversion of - characters in one charset to another when encoding is performed. - The form of each specification is the same as for - `input-charset-conversion'. - - The following additional properties are recognized (and required) if -TYPE is `ccl': - -`decode' - CCL program used for decoding (converting to internal format). - -`encode' - CCL program used for encoding (converting to external format). - - The following properties are used internally: EOL-CR, EOL-CRLF, -EOL-LF, and BASE. - - -File: lispref.info, Node: Basic Coding System Functions, Next: Coding System Property Functions, Prev: Coding System Properties, Up: Coding Systems - -Basic Coding System Functions ------------------------------ - - - Function: find-coding-system coding-system-or-name - This function retrieves the coding system of the given name. - - If CODING-SYSTEM-OR-NAME is a coding-system object, it is simply - returned. Otherwise, CODING-SYSTEM-OR-NAME should be a symbol. - If there is no such coding system, `nil' is returned. Otherwise - the associated coding system object is returned. - - - Function: get-coding-system name - This function retrieves the coding system of the given name. Same - as `find-coding-system' except an error is signalled if there is no - such coding system instead of returning `nil'. - - - Function: coding-system-list - This function returns a list of the names of all defined coding - systems. - - - Function: coding-system-name coding-system - This function returns the name of the given coding system. - - - Function: coding-system-base coding-system - Returns the base coding system (undecided EOL convention) coding - system. - - - Function: make-coding-system name type &optional doc-string props - This function registers symbol NAME as a coding system. - - TYPE describes the conversion method used and should be one of the - types listed in *Note Coding System Types::. - - DOC-STRING is a string describing the coding system. - - PROPS is a property list, describing the specific nature of the - character set. Recognized properties are as in *Note Coding - System Properties::. - - - Function: copy-coding-system old-coding-system new-name - This function copies OLD-CODING-SYSTEM to NEW-NAME. If NEW-NAME - does not name an existing coding system, a new one will be created. - - - Function: subsidiary-coding-system coding-system eol-type - This function returns the subsidiary coding system of - CODING-SYSTEM with eol type EOL-TYPE. - - -File: lispref.info, Node: Coding System Property Functions, Next: Encoding and Decoding Text, Prev: Basic Coding System Functions, Up: Coding Systems - -Coding System Property Functions --------------------------------- - - - Function: coding-system-doc-string coding-system - This function returns the doc string for CODING-SYSTEM. - - - Function: coding-system-type coding-system - This function returns the type of CODING-SYSTEM. - - - Function: coding-system-property coding-system prop - This function returns the PROP property of CODING-SYSTEM. - - -File: lispref.info, Node: Encoding and Decoding Text, Next: Detection of Textual Encoding, Prev: Coding System Property Functions, Up: Coding Systems - -Encoding and Decoding Text --------------------------- - - - Function: decode-coding-region start end coding-system &optional - buffer - This function decodes the text between START and END which is - encoded in CODING-SYSTEM. This is useful if you've read in - encoded text from a file without decoding it (e.g. you read in a - JIS-formatted file but used the `binary' or `no-conversion' coding - system, so that it shows up as `^[$B!> | <8 | >8 | // - | < | > | == | <= | >= | != | de-sjis | en-sjis -ASSIGNMENT_OPERATOR := - += | -= | *= | /= | %= | &= | '|=' | ^= | <<= | >>= -ARRAY := '[' integer ... ']' - - -File: lispref.info, Node: CCL Statements, Next: CCL Expressions, Prev: CCL Syntax, Up: CCL - -CCL Statements --------------- - - The Emacs Code Conversion Language provides the following statement -types: "set", "if", "branch", "loop", "repeat", "break", "read", -"write", "call", and "end". - -Set statement: -============== - - The "set" statement has three variants with the syntaxes `(REG = -EXPRESSION)', `(REG ASSIGNMENT_OPERATOR EXPRESSION)', and `INTEGER'. -The assignment operator variation of the "set" statement works the same -way as the corresponding C expression statement does. The assignment -operators are `+=', `-=', `*=', `/=', `%=', `&=', `|=', `^=', `<<=', -and `>>=', and they have the same meanings as in C. A "naked integer" -INTEGER is equivalent to a SET statement of the form `(r0 = INTEGER)'. - -I/O statements: -=============== - - The "read" statement takes one or more registers as arguments. It -reads one byte (a C char) from the input into each register in turn. - - The "write" takes several forms. In the form `(write REG ...)' it -takes one or more registers as arguments and writes each in turn to the -output. The integer in a register (interpreted as an Emchar) is -encoded to multibyte form (ie, Bufbytes) and written to the current -output buffer. If it is less than 256, it is written as is. The forms -`(write EXPRESSION)' and `(write INTEGER)' are treated analogously. -The form `(write STRING)' writes the constant string to the output. A -"naked string" `STRING' is equivalent to the statement `(write -STRING)'. The form `(write REG ARRAY)' writes the REGth element of the -ARRAY to the output. - -Conditional statements: -======================= - - The "if" statement takes an EXPRESSION, a CCL BLOCK, and an optional -SECOND CCL BLOCK as arguments. If the EXPRESSION evaluates to -non-zero, the first CCL BLOCK is executed. Otherwise, if there is a -SECOND CCL BLOCK, it is executed. - - The "read-if" variant of the "if" statement takes an EXPRESSION, a -CCL BLOCK, and an optional SECOND CCL BLOCK as arguments. The -EXPRESSION must have the form `(REG OPERATOR OPERAND)' (where OPERAND is -a register or an integer). The `read-if' statement first reads from -the input into the first register operand in the EXPRESSION, then -conditionally executes a CCL block just as the `if' statement does. - - The "branch" statement takes an EXPRESSION and one or more CCL -blocks as arguments. The CCL blocks are treated as a zero-indexed -array, and the `branch' statement uses the EXPRESSION as the index of -the CCL block to execute. Null CCL blocks may be used as no-ops, -continuing execution with the statement following the `branch' -statement in the containing CCL block. Out-of-range values for the -EXPRESSION are also treated as no-ops. - - The "read-branch" variant of the "branch" statement takes an -REGISTER, a CCL BLOCK, and an optional SECOND CCL BLOCK as arguments. -The `read-branch' statement first reads from the input into the -REGISTER, then conditionally executes a CCL block just as the `branch' -statement does. - -Loop control statements: -======================== - - The "loop" statement creates a block with an implied jump from the -end of the block back to its head. The loop is exited on a `break' -statement, and continued without executing the tail by a `repeat' -statement. - - The "break" statement, written `(break)', terminates the current -loop and continues with the next statement in the current block. - - The "repeat" statement has three variants, `repeat', `write-repeat', -and `write-read-repeat'. Each continues the current loop from its -head, possibly after performing I/O. `repeat' takes no arguments and -does no I/O before jumping. `write-repeat' takes a single argument (a -register, an integer, or a string), writes it to the output, then jumps. -`write-read-repeat' takes one or two arguments. The first must be a -register. The second may be an integer or an array; if absent, it is -implicitly set to the first (register) argument. `write-read-repeat' -writes its second argument to the output, then reads from the input -into the register, and finally jumps. See the `write' and `read' -statements for the semantics of the I/O operations for each type of -argument. - -Other control statements: -========================= - - The "call" statement, written `(call CCL-PROGRAM-NAME)', executes a -CCL program as a subroutine. It does not return a value to the caller, -but can modify the register status. - - The "end" statement, written `(end)', terminates the CCL program -successfully, and returns to caller (which may be a CCL program). It -does not alter the status of the registers. - diff --git a/info/lispref.info-45 b/info/lispref.info-45 index f5017ba..e4484ee 100644 --- a/info/lispref.info-45 +++ b/info/lispref.info-45 @@ -50,6 +50,842 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Coding System Properties, Next: Basic Coding System Functions, Prev: EOL Conversion, Up: Coding Systems + +Coding System Properties +------------------------ + +`mnemonic' + String to be displayed in the modeline when this coding system is + active. + +`eol-type' + End-of-line conversion to be used. It should be one of the types + listed in *Note EOL Conversion::. + +`eol-lf' + The coding system which is the same as this one, except that it + uses the Unix line-breaking convention. + +`eol-crlf' + The coding system which is the same as this one, except that it + uses the DOS line-breaking convention. + +`eol-cr' + The coding system which is the same as this one, except that it + uses the Macintosh line-breaking convention. + +`post-read-conversion' + Function called after a file has been read in, to perform the + decoding. Called with two arguments, START and END, denoting a + region of the current buffer to be decoded. + +`pre-write-conversion' + Function called before a file is written out, to perform the + encoding. Called with two arguments, START and END, denoting a + region of the current buffer to be encoded. + + The following additional properties are recognized if TYPE is +`iso2022': + +`charset-g0' +`charset-g1' +`charset-g2' +`charset-g3' + The character set initially designated to the G0 - G3 registers. + The value should be one of + + * A charset object (designate that character set) + + * `nil' (do not ever use this register) + + * `t' (no character set is initially designated to the + register, but may be later on; this automatically sets the + corresponding `force-g*-on-output' property) + +`force-g0-on-output' +`force-g1-on-output' +`force-g2-on-output' +`force-g3-on-output' + If non-`nil', send an explicit designation sequence on output + before using the specified register. + +`short' + If non-`nil', use the short forms `ESC $ @', `ESC $ A', and `ESC $ + B' on output in place of the full designation sequences `ESC $ ( + @', `ESC $ ( A', and `ESC $ ( B'. + +`no-ascii-eol' + If non-`nil', don't designate ASCII to G0 at each end of line on + output. Setting this to non-`nil' also suppresses other + state-resetting that normally happens at the end of a line. + +`no-ascii-cntl' + If non-`nil', don't designate ASCII to G0 before control chars on + output. + +`seven' + If non-`nil', use 7-bit environment on output. Otherwise, use + 8-bit environment. + +`lock-shift' + If non-`nil', use locking-shift (SO/SI) instead of single-shift or + designation by escape sequence. + +`no-iso6429' + If non-`nil', don't use ISO6429's direction specification. + +`escape-quoted' + If non-`nil', literal control characters that are the same as the + beginning of a recognized ISO 2022 or ISO 6429 escape sequence (in + particular, ESC (0x1B), SO (0x0E), SI (0x0F), SS2 (0x8E), SS3 + (0x8F), and CSI (0x9B)) are "quoted" with an escape character so + that they can be properly distinguished from an escape sequence. + (Note that doing this results in a non-portable encoding.) This + encoding flag is used for byte-compiled files. Note that ESC is a + good choice for a quoting character because there are no escape + sequences whose second byte is a character from the Control-0 or + Control-1 character sets; this is explicitly disallowed by the ISO + 2022 standard. + +`input-charset-conversion' + A list of conversion specifications, specifying conversion of + characters in one charset to another when decoding is performed. + Each specification is a list of two elements: the source charset, + and the destination charset. + +`output-charset-conversion' + A list of conversion specifications, specifying conversion of + characters in one charset to another when encoding is performed. + The form of each specification is the same as for + `input-charset-conversion'. + + The following additional properties are recognized (and required) if +TYPE is `ccl': + +`decode' + CCL program used for decoding (converting to internal format). + +`encode' + CCL program used for encoding (converting to external format). + + The following properties are used internally: EOL-CR, EOL-CRLF, +EOL-LF, and BASE. + + +File: lispref.info, Node: Basic Coding System Functions, Next: Coding System Property Functions, Prev: Coding System Properties, Up: Coding Systems + +Basic Coding System Functions +----------------------------- + + - Function: find-coding-system coding-system-or-name + This function retrieves the coding system of the given name. + + If CODING-SYSTEM-OR-NAME is a coding-system object, it is simply + returned. Otherwise, CODING-SYSTEM-OR-NAME should be a symbol. + If there is no such coding system, `nil' is returned. Otherwise + the associated coding system object is returned. + + - Function: get-coding-system name + This function retrieves the coding system of the given name. Same + as `find-coding-system' except an error is signalled if there is no + such coding system instead of returning `nil'. + + - Function: coding-system-list + This function returns a list of the names of all defined coding + systems. + + - Function: coding-system-name coding-system + This function returns the name of the given coding system. + + - Function: coding-system-base coding-system + Returns the base coding system (undecided EOL convention) coding + system. + + - Function: make-coding-system name type &optional doc-string props + This function registers symbol NAME as a coding system. + + TYPE describes the conversion method used and should be one of the + types listed in *Note Coding System Types::. + + DOC-STRING is a string describing the coding system. + + PROPS is a property list, describing the specific nature of the + character set. Recognized properties are as in *Note Coding + System Properties::. + + - Function: copy-coding-system old-coding-system new-name + This function copies OLD-CODING-SYSTEM to NEW-NAME. If NEW-NAME + does not name an existing coding system, a new one will be created. + + - Function: subsidiary-coding-system coding-system eol-type + This function returns the subsidiary coding system of + CODING-SYSTEM with eol type EOL-TYPE. + + +File: lispref.info, Node: Coding System Property Functions, Next: Encoding and Decoding Text, Prev: Basic Coding System Functions, Up: Coding Systems + +Coding System Property Functions +-------------------------------- + + - Function: coding-system-doc-string coding-system + This function returns the doc string for CODING-SYSTEM. + + - Function: coding-system-type coding-system + This function returns the type of CODING-SYSTEM. + + - Function: coding-system-property coding-system prop + This function returns the PROP property of CODING-SYSTEM. + + +File: lispref.info, Node: Encoding and Decoding Text, Next: Detection of Textual Encoding, Prev: Coding System Property Functions, Up: Coding Systems + +Encoding and Decoding Text +-------------------------- + + - Function: decode-coding-region start end coding-system &optional + buffer + This function decodes the text between START and END which is + encoded in CODING-SYSTEM. This is useful if you've read in + encoded text from a file without decoding it (e.g. you read in a + JIS-formatted file but used the `binary' or `no-conversion' coding + system, so that it shows up as `^[$B!> | <8 | >8 | // + | < | > | == | <= | >= | != | de-sjis | en-sjis +ASSIGNMENT_OPERATOR := + += | -= | *= | /= | %= | &= | '|=' | ^= | <<= | >>= +ARRAY := '[' integer ... ']' + + +File: lispref.info, Node: CCL Statements, Next: CCL Expressions, Prev: CCL Syntax, Up: CCL + +CCL Statements +-------------- + + The Emacs Code Conversion Language provides the following statement +types: "set", "if", "branch", "loop", "repeat", "break", "read", +"write", "call", and "end". + +Set statement: +============== + + The "set" statement has three variants with the syntaxes `(REG = +EXPRESSION)', `(REG ASSIGNMENT_OPERATOR EXPRESSION)', and `INTEGER'. +The assignment operator variation of the "set" statement works the same +way as the corresponding C expression statement does. The assignment +operators are `+=', `-=', `*=', `/=', `%=', `&=', `|=', `^=', `<<=', +and `>>=', and they have the same meanings as in C. A "naked integer" +INTEGER is equivalent to a SET statement of the form `(r0 = INTEGER)'. + +I/O statements: +=============== + + The "read" statement takes one or more registers as arguments. It +reads one byte (a C char) from the input into each register in turn. + + The "write" takes several forms. In the form `(write REG ...)' it +takes one or more registers as arguments and writes each in turn to the +output. The integer in a register (interpreted as an Emchar) is +encoded to multibyte form (ie, Bufbytes) and written to the current +output buffer. If it is less than 256, it is written as is. The forms +`(write EXPRESSION)' and `(write INTEGER)' are treated analogously. +The form `(write STRING)' writes the constant string to the output. A +"naked string" `STRING' is equivalent to the statement `(write +STRING)'. The form `(write REG ARRAY)' writes the REGth element of the +ARRAY to the output. + +Conditional statements: +======================= + + The "if" statement takes an EXPRESSION, a CCL BLOCK, and an optional +SECOND CCL BLOCK as arguments. If the EXPRESSION evaluates to +non-zero, the first CCL BLOCK is executed. Otherwise, if there is a +SECOND CCL BLOCK, it is executed. + + The "read-if" variant of the "if" statement takes an EXPRESSION, a +CCL BLOCK, and an optional SECOND CCL BLOCK as arguments. The +EXPRESSION must have the form `(REG OPERATOR OPERAND)' (where OPERAND is +a register or an integer). The `read-if' statement first reads from +the input into the first register operand in the EXPRESSION, then +conditionally executes a CCL block just as the `if' statement does. + + The "branch" statement takes an EXPRESSION and one or more CCL +blocks as arguments. The CCL blocks are treated as a zero-indexed +array, and the `branch' statement uses the EXPRESSION as the index of +the CCL block to execute. Null CCL blocks may be used as no-ops, +continuing execution with the statement following the `branch' +statement in the containing CCL block. Out-of-range values for the +EXPRESSION are also treated as no-ops. + + The "read-branch" variant of the "branch" statement takes an +REGISTER, a CCL BLOCK, and an optional SECOND CCL BLOCK as arguments. +The `read-branch' statement first reads from the input into the +REGISTER, then conditionally executes a CCL block just as the `branch' +statement does. + +Loop control statements: +======================== + + The "loop" statement creates a block with an implied jump from the +end of the block back to its head. The loop is exited on a `break' +statement, and continued without executing the tail by a `repeat' +statement. + + The "break" statement, written `(break)', terminates the current +loop and continues with the next statement in the current block. + + The "repeat" statement has three variants, `repeat', `write-repeat', +and `write-read-repeat'. Each continues the current loop from its +head, possibly after performing I/O. `repeat' takes no arguments and +does no I/O before jumping. `write-repeat' takes a single argument (a +register, an integer, or a string), writes it to the output, then jumps. +`write-read-repeat' takes one or two arguments. The first must be a +register. The second may be an integer or an array; if absent, it is +implicitly set to the first (register) argument. `write-read-repeat' +writes its second argument to the output, then reads from the input +into the register, and finally jumps. See the `write' and `read' +statements for the semantics of the I/O operations for each type of +argument. + +Other control statements: +========================= + + The "call" statement, written `(call CCL-PROGRAM-NAME)', executes a +CCL program as a subroutine. It does not return a value to the caller, +but can modify the register status. + + The "end" statement, written `(end)', terminates the CCL program +successfully, and returns to caller (which may be a CCL program). It +does not alter the status of the registers. + + File: lispref.info, Node: CCL Expressions, Next: Calling CCL, Prev: CCL Statements, Up: CCL CCL Expressions @@ -126,7 +962,7 @@ programs, and from Lisp using these functions: side-effect) to contain the ending values for the corresponding registers and IC. - - Function: ccl-execute-on-string ccl-program status str &optional + - Function: ccl-execute-on-string ccl-program status string &optional continue Execute CCL-PROGRAM with initial STATUS on STRING. CCL-PROGRAM is a vector of compiled CCL code created by `ccl-compile'. STATUS @@ -135,7 +971,7 @@ programs, and from Lisp using these functions: `nil' value for a register initializer causes the register to be set to 0. A `nil' value for the IC initializer causes execution to start at the beginning of the program. An optional fourth - argument CONTINUE, if non-nil, causes the IC to remain on the + argument CONTINUE, if non-`nil', causes the IC to remain on the unsatisfied read operation if the program terminates due to exhaustion of the input buffer. Otherwise the IC is set to the end of the program. When the program is done, STATUS is modified (by @@ -146,9 +982,9 @@ programs, and from Lisp using these functions: registered: - Function: register-ccl-program name ccl-program - Register NAME for CCL program PROGRAM in `ccl-program-table'. - PROGRAM should be the compiled form of a CCL program, or nil. - Return index number of the registered CCL program. + Register NAME for CCL program CCL-PROGRAM in `ccl-program-table'. + CCL-PROGRAM should be the compiled form of a CCL program, or + `nil'. Return index number of the registered CCL program. Information about the processor time used by the CCL interpreter can be obtained using these functions: @@ -198,8 +1034,8 @@ the character is in that category. Special Lisp functions are provided that abstract this, so you do not have to directly manipulate bit vectors. - - Function: category-table-p obj - This function returns `t' if ARG is a category table. + - Function: category-table-p object + This function returns `t' if OBJECT is a category table. - Function: category-table &optional buffer This function returns the current category table. This is the one @@ -209,23 +1045,21 @@ have to directly manipulate bit vectors. This function returns the standard category table. This is the one used for new buffers. - - Function: copy-category-table &optional table - This function constructs a new category table and return it. It - is a copy of the TABLE, which defaults to the standard category - table. + - Function: copy-category-table &optional category-table + This function returns a new category table which is a copy of + CATEGORY-TABLE, which defaults to the standard category table. - - Function: set-category-table table &optional buffer - This function selects a new category table for BUFFER. One - argument, a category table. BUFFER defaults to the current buffer - if omitted. + - Function: set-category-table category-table &optional buffer + This function selects CATEGORY-TABLE as the new category table for + BUFFER. BUFFER defaults to the current buffer if omitted. - - Function: category-designator-p obj - This function returns `t' if ARG is a category designator (a char - in the range `' '' to `'~''). + - Function: category-designator-p object + This function returns `t' if OBJECT is a category designator (a + char in the range `' '' to `'~''). - - Function: category-table-value-p obj - This function returns `t' if ARG is a category table value. Valid - values are `nil' or a bit vector of size 95. + - Function: category-table-value-p object + This function returns `t' if OBJECT is a category table value. + Valid values are `nil' or a bit vector of size 95.  File: lispref.info, Node: Tips, Next: Building XEmacs and Object Allocation, Prev: MULE, Up: Top @@ -245,755 +1079,3 @@ described in the previous chapters. * Comment Tips:: Conventions for writing comments. * Library Headers:: Standard headers for library packages. - -File: lispref.info, Node: Style Tips, Next: Compilation Tips, Up: Tips - -Writing Clean Lisp Programs -=========================== - - Here are some tips for avoiding common errors in writing Lisp code -intended for widespread use: - - * 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 XEmacs Lisp--even to `cadr'. - Believe it or not, there is more than one plausible way to define - `cadr'. Play it safe; append your name prefix to produce a name - like `foo-cadr' or `mylib-cadr' instead. - - If you write a function that you think ought to be added to Emacs - under a certain name, such as `twiddle-files', don't call it by - that name in your program. Call it `mylib-twiddle-files' in your - program, and send mail to `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, - `-'. This will be consistent with XEmacs itself and with most - Emacs Lisp programs. - - * It is often useful to put a call to `provide' in each separate - library program, at least if there is more than one entry point to - the program. - - * 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 `require' to make sure they are loaded. - - * If one file FOO uses a macro defined in another file BAR, FOO - should contain this expression before the first use of the macro: - - (eval-when-compile (require 'BAR)) - - (And BAR should contain `(provide 'BAR)', to make the `require' - work.) This will cause BAR to be loaded when you byte-compile - FOO. Otherwise, you risk compiling FOO without the necessary - macro loaded, and that would produce compiled code that won't work - right. *Note Compiling Macros::. - - Using `eval-when-compile' avoids loading BAR when the compiled - version of FOO is _used_. - - * If you define a major mode, make sure to run a hook variable using - `run-hooks', just as the existing major modes do. *Note Hooks::. - - * 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 - `p'. If the name is one word, add just `p'; if the name is - multiple words, add `-p'. Examples are `framep' and - `frame-live-p'. - - * If a user option variable records a true-or-false condition, give - it a name that ends in `-flag'. - - * Please do not define `C-c LETTER' as a key in your major modes. - These sequences are reserved for users; they are the *only* - sequences reserved for users, so we cannot do without them. - - Instead, define sequences consisting of `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. - - * Sequences consisting of `C-c' followed by `{', `}', `<', `>', `:' - or `;' are also reserved for major modes. - - * Sequences consisting of `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. - - * You should not bind `C-h' following any prefix character (including - `C-c'). If you don't bind `C-h', it is automatically available as - a help character for listing the subcommands of the prefix - character. - - * You should not bind a key sequence ending in except following - another . (That is, it is ok to bind a sequence ending in - ` '.) - - The reason for this rule is that a non-prefix binding for in - any context prevents recognition of escape sequences as function - keys in that context. - - * Applications should not bind mouse events based on button 1 with - the shift key held down. These events include `S-mouse-1', - `M-S-mouse-1', `C-S-mouse-1', and so on. They are reserved for - users. - - * Modes should redefine `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. - - * 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 `WHATEVER-mode' which turns the feature on - or off, and make it autoload (*note 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. - - * It is a bad idea to define aliases for the Emacs primitives. Use - the standard names instead. - - * 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. - - * If a file does replace any of the functions or library programs of - standard XEmacs, 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. - - * Please keep the names of your XEmacs 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. - - * Don't use `next-line' or `previous-line' in programs; nearly - always, `forward-line' is more convenient as well as more - predictable and robust. *Note Text Lines::. - - * 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. *Note The Mark::. - - In particular, don't use these functions: - - * `beginning-of-buffer', `end-of-buffer' - - * `replace-string', `replace-regexp' - - 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. - - * 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). - - * The recommended way to print a message in the echo area is with - the `message' function, not `princ'. *Note The Echo Area::. - - * When you encounter an error condition, call the function `error' - (or `signal'). The function `error' does not return. *Note - Signaling Errors::. - - Do not use `message', `throw', `sleep-for', or `beep' to report - errors. - - * An error message should start with a capital letter but should not - end with a period. - - * Try to avoid using recursive edits. Instead, do what the Rmail `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 - `edit-options' command does: switch to another buffer and let the - user switch back at will. *Note Recursive Editing::. - - * In some other systems there is a convention of choosing variable - names that begin and end with `*'. 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. - - * Indent each function with `C-M-q' (`indent-sexp') using the - default indentation parameters. - - * 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. - - * 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 XEmacs 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. - - -File: lispref.info, Node: Compilation Tips, Next: Documentation Tips, Prev: Style Tips, Up: Tips - -Tips for Making Compiled Code Fast -================================== - - Here are ways of improving the execution speed of byte-compiled Lisp -programs. - - * Use the `profile' library to profile your program. See the file - `profile.el' for instructions. - - * Use iteration rather than recursion whenever possible. Function - calls are slow in XEmacs Lisp even when a compiled function is - calling another compiled function. - - * Using the primitive list-searching functions `memq', `member', - `assq', or `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. - - * 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 `byte-compile' property. If the property is non-`nil', then - the function is handled specially. - - For example, the following input will show you that `aref' is - compiled specially (*note Array Functions::) while `elt' is not - (*note Sequence Functions::): - - (get 'aref 'byte-compile) - => byte-compile-two-args - - (get 'elt 'byte-compile) - => nil - - * 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. *Note Inline Functions::. - - -File: lispref.info, Node: Documentation Tips, Next: Comment Tips, Prev: Compilation Tips, Up: Tips - -Tips for Documentation Strings -============================== - - Here are some tips for the writing of documentation strings. - - * Every command, function, or variable intended for users to know - about should have a documentation string. - - * 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. - - * The first line of the documentation string should consist of one - or two complete sentences that stand on their own as a summary. - `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. - - * 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. - - * 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." - - * Avoid using the word "cause" (or its equivalents) unnecessarily. - Instead of, "Cause Emacs to display text in boldface," write just - "Display text in boldface." - - * Do not start or end a documentation string with whitespace. - - * 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. - - * *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! - - * A variable's documentation string should start with `*' 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 `*'. *Note Defining Variables::. - - * The documentation string for a variable that is a yes-or-no flag - should start with words such as "Non-nil means...", to make it - clear that all non-`nil' values are equivalent and indicate - explicitly what `nil' and non-`nil' mean. - - * 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 `/' refers to its second argument as - `DIVISOR', because the actual argument name is `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. - - * 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: `lambda'. There are two - exceptions: write t and nil without single-quotes. (In this - manual, we normally do use single-quotes for those symbols.) - - * Don't write key sequences directly in documentation strings. - Instead, use the `\\[...]' construct to stand for them. For - example, instead of writing `C-f', write `\\[forward-char]'. When - Emacs displays the documentation string, it substitutes whatever - key is currently bound to `forward-char'. (This is normally `C-f', - but it may be some other character if the user has moved key - bindings.) *Note Keys in Documentation::. - - * 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 `\\<...>' once in the - documentation string to specify which key map to use. Do this - before the first use of `\\[...]'. The text inside the `\\<...>' - should be the name of the variable containing the local keymap for - the major mode. - - It is not practical to use `\\[...]' 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 `\\{...}' to display the rest of the mode's keymap. - - -File: lispref.info, Node: Comment Tips, Next: Library Headers, Prev: Documentation Tips, Up: Tips - -Tips on Writing Comments -======================== - - We recommend these conventions for where to put comments and how to -indent them: - -`;' - Comments that start with a single semicolon, `;', 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 `M-;' - (`indent-for-comment') command automatically inserts such a `;' in - the right place, or aligns such a comment if it is already present. - - This and following examples are taken from the Emacs sources. - - (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 - -`;;' - Comments that start with two semicolons, `;;', 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: - - (prog1 (setq auto-fill-function - ... - ... - ;; update modeline - (redraw-modeline))) - - 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. - -`;;;' - Comments that start with three semicolons, `;;;', 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: - - ;;; This Lisp code is run in XEmacs - ;;; when it is to operate as a server - ;;; for other processes. - - 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. - - (defun foo (a) - ;;; This is no longer necessary. - ;;; (force-mode-line-update) - (message "Finished with %s" a)) - -`;;;;' - Comments that start with four semicolons, `;;;;', should be aligned - to the left margin and are used for headings of major sections of a - program. For example: - - ;;;; The kill ring - -The indentation commands of the Lisp modes in XEmacs, such as `M-;' -(`indent-for-comment') and (`lisp-indent-line') automatically -indent comments according to these conventions, depending on the number -of semicolons. *Note Manipulating Comments: (emacs)Comments. - - -File: lispref.info, Node: Library Headers, Prev: Comment Tips, Up: Tips - -Conventional Headers for XEmacs Libraries -========================================= - - XEmacs 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: - - ;;; lisp-mnt.el --- minor mode for Emacs Lisp maintainers - - ;; Copyright (C) 1992 Free Software Foundation, Inc. - - ;; Author: Eric S. Raymond - ;; Maintainer: Eric S. Raymond - ;; Created: 14 Jul 1992 - ;; Version: 1.2 - ;; Keywords: docs - - ;; This file is part of XEmacs. - COPYING PERMISSIONS... - - The very first line should have this format: - - ;;; FILENAME --- DESCRIPTION - -The description should be complete in one line. - - After the copyright notice come several "header comment" lines, each -beginning with `;; HEADER-NAME:'. Here is a table of the conventional -possibilities for HEADER-NAME: - -`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 `;;' and a tab character, like this: - - ;; Author: Ashwin Ram - ;; Dave Sill - ;; Dave Brennan - ;; Eric Raymond - -`Maintainer' - This line should contain a single name/address as in the Author - line, or an address only, or the string `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 `Author' and `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 `<...>' if you - include the person's full name as well as the network address. - -`Created' - This optional line gives the original creation date of the file. - For historical interest only. - -`Version' - If you wish to record version numbers for the individual Lisp - program, put them in this line. - -`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). - -`Keywords' - This line lists keywords for the `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. - - Just about every Lisp library ought to have the `Author' and -`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: - -`;;; Commentary:' - This begins introductory comments that explain how the library - works. It should come right after the copying permissions. - -`;;; 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 XEmacs, the change history is kept in the file - `ChangeLog' and not in the source file at all; these files do not - have a `;;; Change log:' line. - -`;;; Code:' - This begins the actual code of the program. - -`;;; FILENAME ends here' - This is the "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. - - -File: lispref.info, Node: Building XEmacs and Object Allocation, Next: Standard Errors, Prev: Tips, Up: Top - -Building XEmacs; Allocation of Objects -************************************** - - This chapter describes how the runnable XEmacs executable is dumped -with the preloaded Lisp libraries in it and how storage is allocated. - - There is an entire separate document, the `XEmacs Internals Manual', -devoted to the internals of XEmacs from the perspective of the C -programmer. It contains much more detailed information about the build -process, the allocation and garbage-collection process, and other -aspects related to the internals of XEmacs. - -* Menu: - -* Building XEmacs:: How to preload Lisp libraries into XEmacs. -* Pure Storage:: A kludge to make preloaded Lisp functions sharable. -* Garbage Collection:: Reclaiming space for Lisp objects no longer used. - - -File: lispref.info, Node: Building XEmacs, Next: Pure Storage, Up: Building XEmacs and Object Allocation - -Building XEmacs -=============== - - This section explains the steps involved in building the XEmacs -executable. You don't have to know this material to build and install -XEmacs, since the makefiles do all these things automatically. This -information is pertinent to XEmacs maintenance. - - The `XEmacs Internals Manual' contains more information about this. - - Compilation of the C source files in the `src' directory produces an -executable file called `temacs', also called a "bare impure XEmacs". -It contains the XEmacs Lisp interpreter and I/O routines, but not the -editing commands. - - Before XEmacs is actually usable, a number of Lisp files need to be -loaded. These define all the editing commands, plus most of the startup -code and many very basic Lisp primitives. This is accomplished by -loading the file `loadup.el', which in turn loads all of the other -standardly-loaded Lisp files. - - It takes a substantial time to load the standard Lisp files. -Luckily, you don't have to do this each time you run XEmacs; `temacs' -can dump out an executable program called `xemacs' that has these files -preloaded. `xemacs' starts more quickly because it does not need to -load the files. This is the XEmacs executable that is normally -installed. - - To create `xemacs', use the command `temacs -batch -l loadup dump'. -The purpose of `-batch' here is to tell `temacs' to run in -non-interactive, command-line mode. (`temacs' can _only_ run in this -fashion. Part of the code required to initialize frames and faces is -in Lisp, and must be loaded before XEmacs is able to create any frames.) -The argument `dump' tells `loadup.el' to dump a new executable named -`xemacs'. - - The dumping process is highly system-specific, and some operating -systems don't support dumping. On those systems, you must start XEmacs -with the `temacs -batch -l loadup run-temacs' 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. (In older versions of Emacs, you started -Emacs from `temacs' using `temacs -l loadup'.) - - You are free to start XEmacs directly from `temacs' if you want, -even if there is already a dumped `xemacs'. Normally you wouldn't want -to do that; but the Makefiles do this when you rebuild XEmacs using -`make all-elc', which builds XEmacs and simultaneously compiles any -out-of-date Lisp files. (You need `xemacs' in order to compile Lisp -files. However, you also need the compiled Lisp files in order to dump -out `xemacs'. If both of these are missing or corrupted, you are out -of luck unless you're able to bootstrap `xemacs' from `temacs'. Note -that `make all-elc' actually loads the alternative loadup file -`loadup-el.el', which works like `loadup.el' but disables the -pure-copying process and forces XEmacs to ignore any compiled Lisp -files even if they exist.) - - You can specify additional files to preload by writing a library -named `site-load.el' that loads them. You may need to increase the -value of `PURESIZE', in `src/puresize.h', to make room for the -additional files. You should _not_ modify this file directly, however; -instead, use the `--puresize' configuration option. (If you run out of -pure space while dumping `xemacs', you will be told how much pure space -you actually will need.) However, the advantage of preloading -additional files decreases as machines get faster. On modern machines, -it is often not advisable, especially if the Lisp code is on a file -system local to the machine running XEmacs. - - You can specify other Lisp expressions to execute just before dumping -by putting them in a library named `site-init.el'. However, if they -might alter the behavior that users expect from an ordinary unmodified -XEmacs, it is better to put them in `default.el', so that users can -override them if they wish. *Note Start-up Summary::. - - Before `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 -`Snarf-documentation' (*note Accessing Documentation::). These strings -were moved out of the `xemacs' executable to make it smaller. *Note -Documentation Basics::. - - - Function: dump-emacs to-file from-file - This function dumps the current state of XEmacs into an executable - file TO-FILE. It takes symbols from FROM-FILE (this is normally - the executable file `temacs'). - - If you use this function in an XEmacs that was already dumped, you - must set `command-line-processed' to `nil' first for good results. - *Note Command Line Arguments::. - - - Function: run-emacs-from-temacs &rest args - This is the function that implements the `run-temacs' command-line - argument. It is called from `loadup.el' as appropriate. You - should most emphatically _not_ call this yourself; it will - reinitialize your XEmacs process and you'll be sorry. - - - Command: emacs-version - This function returns a string describing the version of XEmacs - that is running. It is useful to include this string in bug - reports. - - (emacs-version) - => "XEmacs 20.1 [Lucid] (i586-unknown-linux2.0.29) - of Mon Apr 7 1997 on altair.xemacs.org" - - Called interactively, the function prints the same information in - the echo area. - - - Variable: emacs-build-time - The value of this variable is the time at which XEmacs was built - at the local site. - - emacs-build-time "Mon Apr 7 20:28:52 1997" - => - - - Variable: emacs-version - The value of this variable is the version of Emacs being run. It - is a string, e.g. `"20.1 XEmacs Lucid"'. - - The following two variables did not exist before FSF GNU Emacs -version 19.23 and XEmacs version 19.10, which reduces their usefulness -at present, but we hope they will be convenient in the future. - - - Variable: emacs-major-version - The major version number of Emacs, as an integer. For XEmacs - version 20.1, the value is 20. - - - Variable: emacs-minor-version - The minor version number of Emacs, as an integer. For XEmacs - version 20.1, the value is 1. - - -File: lispref.info, Node: Pure Storage, Next: Garbage Collection, Prev: Building XEmacs, Up: Building XEmacs and Object Allocation - -Pure Storage -============ - - XEmacs Lisp uses two kinds of storage for user-created Lisp objects: -"normal storage" and "pure storage". Normal storage is where all the -new data created during an XEmacs 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 XEmacs. - - Pure storage is allocated only while `temacs' is loading the -standard preloaded Lisp libraries. In the file `xemacs', it is marked -as read-only (on operating systems that permit this), so that the -memory space can be shared by all the XEmacs jobs running on the machine -at once. Pure storage is not expandable; a fixed amount is allocated -when XEmacs is compiled, and if that is not sufficient for the preloaded -libraries, `temacs' aborts with an error message. If that happens, you -must increase the compilation parameter `PURESIZE' using the -`--puresize' option to `configure'. This normally won't happen unless -you try to preload additional libraries or add features to the standard -ones. - - - Function: purecopy object - This function makes a copy of 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 XEmacs is being built and - dumped; it is usually called only in the file - `xemacs/lisp/prim/loaddefs.el', but a few packages call it just in - case you decide to preload them. - - - Variable: pure-bytes-used - The value of this variable is the number of bytes of pure storage - allocated so far. Typically, in a dumped XEmacs, this number is - very close to the total amount of pure storage available--if it - were not, we would preallocate less. - - - Variable: purify-flag - This variable determines whether `defun' should make a copy of the - function definition in pure storage. If it is non-`nil', then the - function definition is copied into pure storage. - - This flag is `t' while loading all of the basic functions for - building XEmacs initially (allowing those functions to be sharable - and non-collectible). Dumping XEmacs as an executable always - writes `nil' in this variable, regardless of the value it actually - has before and after dumping. - - You should not change this flag in a running XEmacs. - diff --git a/info/lispref.info-46 b/info/lispref.info-46 index a1767fa..2e76962 100644 --- a/info/lispref.info-46 +++ b/info/lispref.info-46 @@ -50,6 +50,763 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Style Tips, Next: Compilation Tips, Up: Tips + +Writing Clean Lisp Programs +=========================== + + Here are some tips for avoiding common errors in writing Lisp code +intended for widespread use: + + * 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 XEmacs Lisp--even to `cadr'. + Believe it or not, there is more than one plausible way to define + `cadr'. Play it safe; append your name prefix to produce a name + like `foo-cadr' or `mylib-cadr' instead. + + If you write a function that you think ought to be added to Emacs + under a certain name, such as `twiddle-files', don't call it by + that name in your program. Call it `mylib-twiddle-files' in your + program, and send mail to `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, + `-'. This will be consistent with XEmacs itself and with most + Emacs Lisp programs. + + * It is often useful to put a call to `provide' in each separate + library program, at least if there is more than one entry point to + the program. + + * 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 `require' to make sure they are loaded. + + * If one file FOO uses a macro defined in another file BAR, FOO + should contain this expression before the first use of the macro: + + (eval-when-compile (require 'BAR)) + + (And BAR should contain `(provide 'BAR)', to make the `require' + work.) This will cause BAR to be loaded when you byte-compile + FOO. Otherwise, you risk compiling FOO without the necessary + macro loaded, and that would produce compiled code that won't work + right. *Note Compiling Macros::. + + Using `eval-when-compile' avoids loading BAR when the compiled + version of FOO is _used_. + + * If you define a major mode, make sure to run a hook variable using + `run-hooks', just as the existing major modes do. *Note Hooks::. + + * 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 + `p'. If the name is one word, add just `p'; if the name is + multiple words, add `-p'. Examples are `framep' and + `frame-live-p'. + + * If a user option variable records a true-or-false condition, give + it a name that ends in `-flag'. + + * Please do not define `C-c LETTER' as a key in your major modes. + These sequences are reserved for users; they are the *only* + sequences reserved for users, so we cannot do without them. + + Instead, define sequences consisting of `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. + + * Sequences consisting of `C-c' followed by `{', `}', `<', `>', `:' + or `;' are also reserved for major modes. + + * Sequences consisting of `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. + + * You should not bind `C-h' following any prefix character (including + `C-c'). If you don't bind `C-h', it is automatically available as + a help character for listing the subcommands of the prefix + character. + + * You should not bind a key sequence ending in except following + another . (That is, it is ok to bind a sequence ending in + ` '.) + + The reason for this rule is that a non-prefix binding for in + any context prevents recognition of escape sequences as function + keys in that context. + + * Applications should not bind mouse events based on button 1 with + the shift key held down. These events include `S-mouse-1', + `M-S-mouse-1', `C-S-mouse-1', and so on. They are reserved for + users. + + * Modes should redefine `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. + + * 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 `WHATEVER-mode' which turns the feature on + or off, and make it autoload (*note 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. + + * It is a bad idea to define aliases for the Emacs primitives. Use + the standard names instead. + + * 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. + + * If a file does replace any of the functions or library programs of + standard XEmacs, 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. + + * Please keep the names of your XEmacs 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. + + * Don't use `next-line' or `previous-line' in programs; nearly + always, `forward-line' is more convenient as well as more + predictable and robust. *Note Text Lines::. + + * 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. *Note The Mark::. + + In particular, don't use these functions: + + * `beginning-of-buffer', `end-of-buffer' + + * `replace-string', `replace-regexp' + + 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. + + * 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). + + * The recommended way to print a message in the echo area is with + the `message' function, not `princ'. *Note The Echo Area::. + + * When you encounter an error condition, call the function `error' + (or `signal'). The function `error' does not return. *Note + Signaling Errors::. + + Do not use `message', `throw', `sleep-for', or `beep' to report + errors. + + * An error message should start with a capital letter but should not + end with a period. + + * Try to avoid using recursive edits. Instead, do what the Rmail `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 + `edit-options' command does: switch to another buffer and let the + user switch back at will. *Note Recursive Editing::. + + * In some other systems there is a convention of choosing variable + names that begin and end with `*'. 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. + + * Indent each function with `C-M-q' (`indent-sexp') using the + default indentation parameters. + + * 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. + + * 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 XEmacs 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. + + +File: lispref.info, Node: Compilation Tips, Next: Documentation Tips, Prev: Style Tips, Up: Tips + +Tips for Making Compiled Code Fast +================================== + + Here are ways of improving the execution speed of byte-compiled Lisp +programs. + + * Use the `profile' library to profile your program. See the file + `profile.el' for instructions. + + * Use iteration rather than recursion whenever possible. Function + calls are slow in XEmacs Lisp even when a compiled function is + calling another compiled function. + + * Using the primitive list-searching functions `memq', `member', + `assq', or `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. + + * 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 `byte-compile' property. If the property is non-`nil', then + the function is handled specially. + + For example, the following input will show you that `aref' is + compiled specially (*note Array Functions::) while `elt' is not + (*note Sequence Functions::): + + (get 'aref 'byte-compile) + => byte-compile-two-args + + (get 'elt 'byte-compile) + => nil + + * 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. *Note Inline Functions::. + + +File: lispref.info, Node: Documentation Tips, Next: Comment Tips, Prev: Compilation Tips, Up: Tips + +Tips for Documentation Strings +============================== + + Here are some tips for the writing of documentation strings. + + * Every command, function, or variable intended for users to know + about should have a documentation string. + + * 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. + + * The first line of the documentation string should consist of one + or two complete sentences that stand on their own as a summary. + `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. + + * 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. + + * 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." + + * Avoid using the word "cause" (or its equivalents) unnecessarily. + Instead of, "Cause Emacs to display text in boldface," write just + "Display text in boldface." + + * Do not start or end a documentation string with whitespace. + + * 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. + + * *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! + + * A variable's documentation string should start with `*' 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 `*'. *Note Defining Variables::. + + * The documentation string for a variable that is a yes-or-no flag + should start with words such as "Non-nil means...", to make it + clear that all non-`nil' values are equivalent and indicate + explicitly what `nil' and non-`nil' mean. + + * 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 `/' refers to its second argument as + `DIVISOR', because the actual argument name is `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. + + * 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: `lambda'. There are two + exceptions: write t and nil without single-quotes. (In this + manual, we normally do use single-quotes for those symbols.) + + * Don't write key sequences directly in documentation strings. + Instead, use the `\\[...]' construct to stand for them. For + example, instead of writing `C-f', write `\\[forward-char]'. When + Emacs displays the documentation string, it substitutes whatever + key is currently bound to `forward-char'. (This is normally `C-f', + but it may be some other character if the user has moved key + bindings.) *Note Keys in Documentation::. + + * 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 `\\<...>' once in the + documentation string to specify which key map to use. Do this + before the first use of `\\[...]'. The text inside the `\\<...>' + should be the name of the variable containing the local keymap for + the major mode. + + It is not practical to use `\\[...]' 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 `\\{...}' to display the rest of the mode's keymap. + + +File: lispref.info, Node: Comment Tips, Next: Library Headers, Prev: Documentation Tips, Up: Tips + +Tips on Writing Comments +======================== + + We recommend these conventions for where to put comments and how to +indent them: + +`;' + Comments that start with a single semicolon, `;', 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 `M-;' + (`indent-for-comment') command automatically inserts such a `;' in + the right place, or aligns such a comment if it is already present. + + This and following examples are taken from the Emacs sources. + + (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 + +`;;' + Comments that start with two semicolons, `;;', 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: + + (prog1 (setq auto-fill-function + ... + ... + ;; update modeline + (redraw-modeline))) + + 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. + +`;;;' + Comments that start with three semicolons, `;;;', 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: + + ;;; This Lisp code is run in XEmacs + ;;; when it is to operate as a server + ;;; for other processes. + + 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. + + (defun foo (a) + ;;; This is no longer necessary. + ;;; (force-mode-line-update) + (message "Finished with %s" a)) + +`;;;;' + Comments that start with four semicolons, `;;;;', should be aligned + to the left margin and are used for headings of major sections of a + program. For example: + + ;;;; The kill ring + +The indentation commands of the Lisp modes in XEmacs, such as `M-;' +(`indent-for-comment') and (`lisp-indent-line') automatically +indent comments according to these conventions, depending on the number +of semicolons. *Note Manipulating Comments: (emacs)Comments. + + +File: lispref.info, Node: Library Headers, Prev: Comment Tips, Up: Tips + +Conventional Headers for XEmacs Libraries +========================================= + + XEmacs 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: + + ;;; lisp-mnt.el --- minor mode for Emacs Lisp maintainers + + ;; Copyright (C) 1992 Free Software Foundation, Inc. + + ;; Author: Eric S. Raymond + ;; Maintainer: Eric S. Raymond + ;; Created: 14 Jul 1992 + ;; Version: 1.2 + ;; Keywords: docs + + ;; This file is part of XEmacs. + COPYING PERMISSIONS... + + The very first line should have this format: + + ;;; FILENAME --- DESCRIPTION + +The description should be complete in one line. + + After the copyright notice come several "header comment" lines, each +beginning with `;; HEADER-NAME:'. Here is a table of the conventional +possibilities for HEADER-NAME: + +`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 `;;' and a tab character, like this: + + ;; Author: Ashwin Ram + ;; Dave Sill + ;; Dave Brennan + ;; Eric Raymond + +`Maintainer' + This line should contain a single name/address as in the Author + line, or an address only, or the string `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 `Author' and `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 `<...>' if you + include the person's full name as well as the network address. + +`Created' + This optional line gives the original creation date of the file. + For historical interest only. + +`Version' + If you wish to record version numbers for the individual Lisp + program, put them in this line. + +`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). + +`Keywords' + This line lists keywords for the `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. + + Just about every Lisp library ought to have the `Author' and +`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: + +`;;; Commentary:' + This begins introductory comments that explain how the library + works. It should come right after the copying permissions. + +`;;; 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 XEmacs, the change history is kept in the file + `ChangeLog' and not in the source file at all; these files do not + have a `;;; Change log:' line. + +`;;; Code:' + This begins the actual code of the program. + +`;;; FILENAME ends here' + This is the "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. + + +File: lispref.info, Node: Building XEmacs and Object Allocation, Next: Standard Errors, Prev: Tips, Up: Top + +Building XEmacs; Allocation of Objects +************************************** + + This chapter describes how the runnable XEmacs executable is dumped +with the preloaded Lisp libraries in it and how storage is allocated. + + There is an entire separate document, the `XEmacs Internals Manual', +devoted to the internals of XEmacs from the perspective of the C +programmer. It contains much more detailed information about the build +process, the allocation and garbage-collection process, and other +aspects related to the internals of XEmacs. + +* Menu: + +* Building XEmacs:: How to preload Lisp libraries into XEmacs. +* Pure Storage:: A kludge to make preloaded Lisp functions sharable. +* Garbage Collection:: Reclaiming space for Lisp objects no longer used. + + +File: lispref.info, Node: Building XEmacs, Next: Pure Storage, Up: Building XEmacs and Object Allocation + +Building XEmacs +=============== + + This section explains the steps involved in building the XEmacs +executable. You don't have to know this material to build and install +XEmacs, since the makefiles do all these things automatically. This +information is pertinent to XEmacs maintenance. + + The `XEmacs Internals Manual' contains more information about this. + + Compilation of the C source files in the `src' directory produces an +executable file called `temacs', also called a "bare impure XEmacs". +It contains the XEmacs Lisp interpreter and I/O routines, but not the +editing commands. + + Before XEmacs is actually usable, a number of Lisp files need to be +loaded. These define all the editing commands, plus most of the startup +code and many very basic Lisp primitives. This is accomplished by +loading the file `loadup.el', which in turn loads all of the other +standardly-loaded Lisp files. + + It takes a substantial time to load the standard Lisp files. +Luckily, you don't have to do this each time you run XEmacs; `temacs' +can dump out an executable program called `xemacs' that has these files +preloaded. `xemacs' starts more quickly because it does not need to +load the files. This is the XEmacs executable that is normally +installed. + + To create `xemacs', use the command `temacs -batch -l loadup dump'. +The purpose of `-batch' here is to tell `temacs' to run in +non-interactive, command-line mode. (`temacs' can _only_ run in this +fashion. Part of the code required to initialize frames and faces is +in Lisp, and must be loaded before XEmacs is able to create any frames.) +The argument `dump' tells `loadup.el' to dump a new executable named +`xemacs'. + + The dumping process is highly system-specific, and some operating +systems don't support dumping. On those systems, you must start XEmacs +with the `temacs -batch -l loadup run-temacs' 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. (In older versions of Emacs, you started +Emacs from `temacs' using `temacs -l loadup'.) + + You are free to start XEmacs directly from `temacs' if you want, +even if there is already a dumped `xemacs'. Normally you wouldn't want +to do that; but the Makefiles do this when you rebuild XEmacs using +`make all-elc', which builds XEmacs and simultaneously compiles any +out-of-date Lisp files. (You need `xemacs' in order to compile Lisp +files. However, you also need the compiled Lisp files in order to dump +out `xemacs'. If both of these are missing or corrupted, you are out +of luck unless you're able to bootstrap `xemacs' from `temacs'. Note +that `make all-elc' actually loads the alternative loadup file +`loadup-el.el', which works like `loadup.el' but disables the +pure-copying process and forces XEmacs to ignore any compiled Lisp +files even if they exist.) + + You can specify additional files to preload by writing a library +named `site-load.el' that loads them. You may need to increase the +value of `PURESIZE', in `src/puresize.h', to make room for the +additional files. You should _not_ modify this file directly, however; +instead, use the `--puresize' configuration option. (If you run out of +pure space while dumping `xemacs', you will be told how much pure space +you actually will need.) However, the advantage of preloading +additional files decreases as machines get faster. On modern machines, +it is often not advisable, especially if the Lisp code is on a file +system local to the machine running XEmacs. + + You can specify other Lisp expressions to execute just before dumping +by putting them in a library named `site-init.el'. However, if they +might alter the behavior that users expect from an ordinary unmodified +XEmacs, it is better to put them in `default.el', so that users can +override them if they wish. *Note Start-up Summary::. + + Before `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 +`Snarf-documentation' (*note Accessing Documentation::). These strings +were moved out of the `xemacs' executable to make it smaller. *Note +Documentation Basics::. + + - Function: dump-emacs to-file from-file + This function dumps the current state of XEmacs into an executable + file TO-FILE. It takes symbols from FROM-FILE (this is normally + the executable file `temacs'). + + If you use this function in an XEmacs that was already dumped, you + must set `command-line-processed' to `nil' first for good results. + *Note Command Line Arguments::. + + - Function: run-emacs-from-temacs &rest args + This is the function that implements the `run-temacs' command-line + argument. It is called from `loadup.el' as appropriate. You + should most emphatically _not_ call this yourself; it will + reinitialize your XEmacs process and you'll be sorry. + + - Command: emacs-version &optional arg + This function returns a string describing the version of XEmacs + that is running. It is useful to include this string in bug + reports. + + When called interactively with a prefix argument, insert string at + point. Don't use this function in programs to choose actions + according to the system configuration; look at + `system-configuration' instead. + + (emacs-version) + => "XEmacs 20.1 [Lucid] (i586-unknown-linux2.0.29) + of Mon Apr 7 1997 on altair.xemacs.org" + + Called interactively, the function prints the same information in + the echo area. + + - Variable: emacs-build-time + The value of this variable is the time at which XEmacs was built + at the local site. + + emacs-build-time "Mon Apr 7 20:28:52 1997" + => + + - Variable: emacs-version + The value of this variable is the version of Emacs being run. It + is a string, e.g. `"20.1 XEmacs Lucid"'. + + The following two variables did not exist before FSF GNU Emacs +version 19.23 and XEmacs version 19.10, which reduces their usefulness +at present, but we hope they will be convenient in the future. + + - Variable: emacs-major-version + The major version number of Emacs, as an integer. For XEmacs + version 20.1, the value is 20. + + - Variable: emacs-minor-version + The minor version number of Emacs, as an integer. For XEmacs + version 20.1, the value is 1. + + +File: lispref.info, Node: Pure Storage, Next: Garbage Collection, Prev: Building XEmacs, Up: Building XEmacs and Object Allocation + +Pure Storage +============ + + XEmacs Lisp uses two kinds of storage for user-created Lisp objects: +"normal storage" and "pure storage". Normal storage is where all the +new data created during an XEmacs 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 XEmacs. + + Pure storage is allocated only while `temacs' is loading the +standard preloaded Lisp libraries. In the file `xemacs', it is marked +as read-only (on operating systems that permit this), so that the +memory space can be shared by all the XEmacs jobs running on the machine +at once. Pure storage is not expandable; a fixed amount is allocated +when XEmacs is compiled, and if that is not sufficient for the preloaded +libraries, `temacs' aborts with an error message. If that happens, you +must increase the compilation parameter `PURESIZE' using the +`--puresize' option to `configure'. This normally won't happen unless +you try to preload additional libraries or add features to the standard +ones. + + - Function: purecopy object + This function makes a copy of 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 XEmacs is being built and + dumped; it is usually called only in the file + `xemacs/lisp/prim/loaddefs.el', but a few packages call it just in + case you decide to preload them. + + - Variable: pure-bytes-used + The value of this variable is the number of bytes of pure storage + allocated so far. Typically, in a dumped XEmacs, this number is + very close to the total amount of pure storage available--if it + were not, we would preallocate less. + + - Variable: purify-flag + This variable determines whether `defun' should make a copy of the + function definition in pure storage. If it is non-`nil', then the + function definition is copied into pure storage. + + This flag is `t' while loading all of the basic functions for + building XEmacs initially (allowing those functions to be sharable + and non-collectible). Dumping XEmacs as an executable always + writes `nil' in this variable, regardless of the value it actually + has before and after dumping. + + You should not change this flag in a running XEmacs. + + File: lispref.info, Node: Garbage Collection, Prev: Pure Storage, Up: Building XEmacs and Object Allocation Garbage Collection @@ -230,14 +987,6 @@ using `malloc' and `free'. not apply if XEmacs was configured with `--debug'. Therefore, be careful when setting `gc-cons-threshold' in that case!) - - Function: memory-limit - This function returns the address of the last byte XEmacs 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. - - Variable: pre-gc-hook This is a normal hook to be run just before each garbage collection. Interrupts, garbage collection, and errors are @@ -448,812 +1197,3 @@ mathematical functions. `"Arithmetic underflow error"' *Note Math Functions::. - -File: lispref.info, Node: Standard Buffer-Local Variables, Next: Standard Keymaps, Prev: Standard Errors, Up: Top - -Buffer-Local Variables -********************** - - 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. - -`abbrev-mode' - *note Abbrevs:: - -`auto-fill-function' - *note Auto Filling:: - -`buffer-auto-save-file-name' - *note Auto-Saving:: - -`buffer-backed-up' - *note Backup Files:: - -`buffer-display-table' - *note Display Tables:: - -`buffer-file-format' - *note Format Conversion:: - -`buffer-file-name' - *note Buffer File Name:: - -`buffer-file-number' - *note Buffer File Name:: - -`buffer-file-truename' - *note Buffer File Name:: - -`buffer-file-type' - *note Files and MS-DOS:: - -`buffer-invisibility-spec' - *note Invisible Text:: - -`buffer-offer-save' - *note Saving Buffers:: - -`buffer-read-only' - *note Read Only Buffers:: - -`buffer-saved-size' - *note Point:: - -`buffer-undo-list' - *note Undo:: - -`cache-long-line-scans' - *note Text Lines:: - -`case-fold-search' - *note Searching and Case:: - -`ctl-arrow' - *note Usual Display:: - -`comment-column' - *note Comments: (emacs)Comments. - -`default-directory' - *note System Environment:: - -`defun-prompt-regexp' - *note List Motion:: - -`fill-column' - *note Auto Filling:: - -`goal-column' - *note Moving Point: (emacs)Moving Point. - -`left-margin' - *note Indentation:: - -`local-abbrev-table' - *note Abbrevs:: - -`local-write-file-hooks' - *note Saving Buffers:: - -`major-mode' - *note Mode Help:: - -`mark-active' - *note The Mark:: - -`mark-ring' - *note The Mark:: - -`minor-modes' - *note Minor Modes:: - -`modeline-format' - *note Modeline Data:: - -`modeline-buffer-identification' - *note Modeline Variables:: - -`modeline-format' - *note Modeline Data:: - -`modeline-modified' - *note Modeline Variables:: - -`modeline-process' - *note Modeline Variables:: - -`mode-name' - *note Modeline Variables:: - -`overwrite-mode' - *note Insertion:: - -`paragraph-separate' - *note Standard Regexps:: - -`paragraph-start' - *note Standard Regexps:: - -`point-before-scroll' - Used for communication between mouse commands and scroll-bar - commands. - -`require-final-newline' - *note Insertion:: - -`selective-display' - *note Selective Display:: - -`selective-display-ellipses' - *note Selective Display:: - -`tab-width' - *note Usual Display:: - -`truncate-lines' - *note Truncation:: - -`vc-mode' - *note Modeline Variables:: - - -File: lispref.info, Node: Standard Keymaps, Next: Standard Hooks, Prev: Standard Buffer-Local Variables, Up: Top - -Standard Keymaps -**************** - - The following symbols are used as the names for various keymaps. -Some of these exist when XEmacs 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. - -`bookmark-map' - A keymap containing bindings to bookmark functions. - -`Buffer-menu-mode-map' - A keymap used by Buffer Menu mode. - -`c++-mode-map' - A keymap used by C++ mode. - -`c-mode-map' - A keymap used by C mode. A sparse keymap used by C mode. - -`command-history-map' - A keymap used by Command History mode. - -`ctl-x-4-map' - A keymap for subcommands of the prefix `C-x 4'. - -`ctl-x-5-map' - A keymap for subcommands of the prefix `C-x 5'. - -`ctl-x-map' - A keymap for `C-x' commands. - -`debugger-mode-map' - A keymap used by Debugger mode. - -`dired-mode-map' - A keymap for `dired-mode' buffers. - -`edit-abbrevs-map' - A keymap used in `edit-abbrevs'. - -`edit-tab-stops-map' - A keymap used in `edit-tab-stops'. - -`electric-buffer-menu-mode-map' - A keymap used by Electric Buffer Menu mode. - -`electric-history-map' - A keymap used by Electric Command History mode. - -`emacs-lisp-mode-map' - A keymap used by Emacs Lisp mode. - -`help-map' - A keymap for characters following the Help key. - -`Helper-help-map' - A keymap used by the help utility package. - It has the same keymap in its value cell and in its function cell. - -`Info-edit-map' - A keymap used by the `e' command of Info. - -`Info-mode-map' - A keymap containing Info commands. - -`isearch-mode-map' - A keymap that defines the characters you can type within - incremental search. - -`itimer-edit-map' - A keymap used when in Itimer Edit mode. - -`lisp-interaction-mode-map' - A keymap used by Lisp mode. - -`lisp-mode-map' - A keymap used by Lisp mode. - - A keymap for minibuffer input with completion. - -`minibuffer-local-isearch-map' - A keymap for editing isearch strings in the minibuffer. - -`minibuffer-local-map' - Default keymap to use when reading from the minibuffer. - -`minibuffer-local-must-match-map' - A keymap for minibuffer input with completion, for exact match. - -`mode-specific-map' - The keymap for characters following `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 `C-h b' - (`display-bindings'), where it describes the main use of the `C-c' - prefix key. - -`modeline-map' - The keymap consulted for mouse-clicks on the modeline of a window. - -`objc-mode-map' - A keymap used in Objective C mode as a local map. - -`occur-mode-map' - A local keymap used by Occur mode. - -`overriding-local-map' - A keymap that overrides all other local keymaps. - -`query-replace-map' - A local keymap used for responses in `query-replace' and related - commands; also for `y-or-n-p' and `map-y-or-n-p'. The functions - that use this map do not support prefix keys; they look up one - event at a time. - -`read-expression-map' - The minibuffer keymap used for reading Lisp expressions. - -`read-shell-command-map' - The minibuffer keymap used by shell-command and related commands. - -`shared-lisp-mode-map' - A keymap for commands shared by all sorts of Lisp modes. - -`text-mode-map' - A keymap used by Text mode. - -`toolbar-map' - The keymap consulted for mouse-clicks over a toolbar. - -`view-mode-map' - A keymap used by View mode. - - -File: lispref.info, Node: Standard Hooks, Next: Index, Prev: Standard Keymaps, Up: Top - -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 `-hook'. They are -"normal hooks", run by means of `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 `add-hook'. *Note Hooks::, for more information -about using hooks. - - The variables whose names end in `-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 -`-hook' even though they were not normal hooks.) - - The variables whose names end in `-hooks' or `-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). - -`activate-menubar-hook' - -`activate-popup-menu-hook' - -`ad-definition-hooks' - -`adaptive-fill-function' - -`add-log-current-defun-function' - -`after-change-functions' - -`after-delete-annotation-hook' - -`after-init-hook' - -`after-insert-file-functions' - -`after-revert-hook' - -`after-save-hook' - -`after-set-visited-file-name-hooks' - -`after-write-file-hooks' - -`auto-fill-function' - -`auto-save-hook' - -`before-change-functions' - -`before-delete-annotation-hook' - -`before-init-hook' - -`before-revert-hook' - -`blink-paren-function' - -`buffers-menu-switch-to-buffer-function' - -`c++-mode-hook' - -`c-delete-function' - -`c-mode-common-hook' - -`c-mode-hook' - -`c-special-indent-hook' - -`calendar-load-hook' - -`change-major-mode-hook' - -`command-history-hook' - -`comment-indent-function' - -`compilation-buffer-name-function' - -`compilation-exit-message-function' - -`compilation-finish-function' - -`compilation-parse-errors-function' - -`compilation-mode-hook' - -`create-console-hook' - -`create-device-hook' - -`create-frame-hook' - -`dabbrev-friend-buffer-function' - -`dabbrev-select-buffers-function' - -`delete-console-hook' - -`delete-device-hook' - -`delete-frame-hook' - -`deselect-frame-hook' - -`diary-display-hook' - -`diary-hook' - -`dired-after-readin-hook' - -`dired-before-readin-hook' - -`dired-load-hook' - -`dired-mode-hook' - -`disabled-command-hook' - -`display-buffer-function' - -`ediff-after-setup-control-frame-hook' - -`ediff-after-setup-windows-hook' - -`ediff-before-setup-control-frame-hook' - -`ediff-before-setup-windows-hook' - -`ediff-brief-help-message-function' - -`ediff-cleanup-hook' - -`ediff-control-frame-position-function' - -`ediff-display-help-hook' - -`ediff-focus-on-regexp-matches-function' - -`ediff-forward-word-function' - -`ediff-hide-regexp-matches-function' - -`ediff-keymap-setup-hook' - -`ediff-load-hook' - -`ediff-long-help-message-function' - -`ediff-make-wide-display-function' - -`ediff-merge-split-window-function' - -`ediff-meta-action-function' - -`ediff-meta-redraw-function' - -`ediff-mode-hook' - -`ediff-prepare-buffer-hook' - -`ediff-quit-hook' - -`ediff-registry-setup-hook' - -`ediff-select-hook' - -`ediff-session-action-function' - -`ediff-session-group-setup-hook' - -`ediff-setup-diff-regions-function' - -`ediff-show-registry-hook' - -`ediff-show-session-group-hook' - -`ediff-skip-diff-region-function' - -`ediff-split-window-function' - -`ediff-startup-hook' - -`ediff-suspend-hook' - -`ediff-toggle-read-only-function' - -`ediff-unselect-hook' - -`ediff-window-setup-function' - -`edit-picture-hook' - -`electric-buffer-menu-mode-hook' - -`electric-command-history-hook' - -`electric-help-mode-hook' - -`emacs-lisp-mode-hook' - -`fill-paragraph-function' - -`find-file-hooks' - -`find-file-not-found-hooks' - -`first-change-hook' - -`font-lock-after-fontify-buffer-hook' - -`font-lock-beginning-of-syntax-function' - -`font-lock-mode-hook' - -`fume-found-function-hook' - -`fume-list-mode-hook' - -`fume-rescan-buffer-hook' - -`fume-sort-function' - -`gnus-startup-hook' - -`hack-local-variables-hook' - -`highlight-headers-follow-url-function' - -`hyper-apropos-mode-hook' - -`indent-line-function' - -`indent-mim-hook' - -`indent-region-function' - -`initial-calendar-window-hook' - -`isearch-mode-end-hook' - -`isearch-mode-hook' - -`java-mode-hook' - -`kill-buffer-hook' - -`kill-buffer-query-functions' - -`kill-emacs-hook' - -`kill-emacs-query-functions' - -`kill-hooks' - -`LaTeX-mode-hook' - -`latex-mode-hook' - -`ledit-mode-hook' - -`lisp-indent-function' - -`lisp-interaction-mode-hook' - -`lisp-mode-hook' - -`list-diary-entries-hook' - -`load-read-function' - -`log-message-filter-function' - -`m2-mode-hook' - -`mail-citation-hook' - -`mail-mode-hook' - -`mail-setup-hook' - -`make-annotation-hook' - -`makefile-mode-hook' - -`map-frame-hook' - -`mark-diary-entries-hook' - -`medit-mode-hook' - -`menu-no-selection-hook' - -`mh-compose-letter-hook' - -`mh-folder-mode-hook' - -`mh-letter-mode-hook' - -`mim-mode-hook' - -`minibuffer-exit-hook' - -`minibuffer-setup-hook' - -`mode-motion-hook' - -`mouse-enter-frame-hook' - -`mouse-leave-frame-hook' - -`mouse-track-cleanup-hook' - -`mouse-track-click-hook' - -`mouse-track-down-hook' - -`mouse-track-drag-hook' - -`mouse-track-drag-up-hook' - -`mouse-track-up-hook' - -`mouse-yank-function' - -`news-mode-hook' - -`news-reply-mode-hook' - -`news-setup-hook' - -`nongregorian-diary-listing-hook' - -`nongregorian-diary-marking-hook' - -`nroff-mode-hook' - -`objc-mode-hook' - -`outline-mode-hook' - -`perl-mode-hook' - -`plain-TeX-mode-hook' - -`post-command-hook' - -`post-gc-hook' - -`pre-abbrev-expand-hook' - -`pre-command-hook' - -`pre-display-buffer-function' - -`pre-gc-hook' - -`pre-idle-hook' - -`print-diary-entries-hook' - -`prolog-mode-hook' - -`protect-innocence-hook' - -`remove-message-hook' - -`revert-buffer-function' - -`revert-buffer-insert-contents-function' - -`rmail-edit-mode-hook' - -`rmail-mode-hook' - -`rmail-retry-setup-hook' - -`rmail-summary-mode-hook' - -`scheme-indent-hook' - -`scheme-mode-hook' - -`scribe-mode-hook' - -`select-frame-hook' - -`send-mail-function' - -`shell-mode-hook' - -`shell-set-directory-error-hook' - -`special-display-function' - -`suspend-hook' - -`suspend-resume-hook' - -`temp-buffer-show-function' - -`term-setup-hook' - -`terminal-mode-hook' - -`terminal-mode-break-hook' - -`TeX-mode-hook' - -`tex-mode-hook' - -`text-mode-hook' - -`today-visible-calendar-hook' - -`today-invisible-calendar-hook' - -`tooltalk-message-handler-hook' - -`tooltalk-pattern-handler-hook' - -`tooltalk-unprocessed-message-hook' - -`unmap-frame-hook' - -`vc-checkin-hook' - -`vc-checkout-writable-buffer-hook' - -`vc-log-after-operation-hook' - -`vc-make-buffer-writable-hook' - -`view-hook' - -`vm-arrived-message-hook' - -`vm-arrived-messages-hook' - -`vm-chop-full-name-function' - -`vm-display-buffer-hook' - -`vm-edit-message-hook' - -`vm-forward-message-hook' - -`vm-iconify-frame-hook' - -`vm-inhibit-write-file-hook' - -`vm-key-functions' - -`vm-mail-hook' - -`vm-mail-mode-hook' - -`vm-menu-setup-hook' - -`vm-mode-hook' - -`vm-quit-hook' - -`vm-rename-current-buffer-function' - -`vm-reply-hook' - -`vm-resend-bounced-message-hook' - -`vm-resend-message-hook' - -`vm-retrieved-spooled-mail-hook' - -`vm-select-message-hook' - -`vm-select-new-message-hook' - -`vm-select-unread-message-hook' - -`vm-send-digest-hook' - -`vm-summary-mode-hook' - -`vm-summary-pointer-update-hook' - -`vm-summary-redo-hook' - -`vm-summary-update-hook' - -`vm-undisplay-buffer-hook' - -`vm-visit-folder-hook' - -`window-setup-hook' - -`write-contents-hooks' - -`write-file-data-hooks' - -`write-file-hooks' - -`write-region-annotate-functions' - -`x-lost-selection-hooks' - -`x-sent-selection-hooks' - -`zmacs-activate-region-hook' - -`zmacs-deactivate-region-hook' - -`zmacs-update-region-hook' diff --git a/info/lispref.info-47 b/info/lispref.info-47 index 508ad82..196b605 100644 --- a/info/lispref.info-47 +++ b/info/lispref.info-47 @@ -50,3452 +50,811 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  -File: lispref.info, Node: Index, Prev: Standard Hooks, Up: Top - -Index -***** - -* Menu: - -* " in printing: Output Functions. -* " in strings: String Type. -* #$: Docs and Compilation. -* #@COUNT: Docs and Compilation. -* $ in display: Truncation. -* $ in regexp: Syntax of Regexps. -* %: Arithmetic Operations. -* % in format: Formatting Strings. -* & in replacement: Replacing Match. -* &define (Edebug): Specification List. -* ¬ (Edebug): Specification List. -* &optional: Argument List. -* &optional (Edebug): Specification List. -* &or (Edebug): Specification List. -* &rest: Argument List. -* &rest (Edebug): Specification List. -* ' for quoting: Quoting. -* ( in regexp: Syntax of Regexps. -* (...) in lists: Cons Cell Type. -* ) in regexp: Syntax of Regexps. -* *: Arithmetic Operations. -* * in interactive: Using Interactive. -* * in regexp: Syntax of Regexps. -* *? in regexp: Syntax of Regexps. -* *PQfn: Unimplemented libpq Functions. -* *PQoidStatus: Unimplemented libpq Functions. -* *PQsetdb: Unimplemented libpq Functions. -* *PQsetdbLogin: Unimplemented libpq Functions. -* *scratch*: Auto Major Mode. -* +: Arithmetic Operations. -* + in regexp: Syntax of Regexps. -* +? in regexp: Syntax of Regexps. -* , (with Backquote): Backquote. -* ,@ (with Backquote): Backquote. -* -: Arithmetic Operations. -* . in lists: Dotted Pair Notation. -* . in regexp: Syntax of Regexps. -* .emacs: Init File. -* .emacs customization: Major Mode Conventions. -* /: Arithmetic Operations. -* /=: Comparison of Numbers. -* 1+: Arithmetic Operations. -* 1-: Arithmetic Operations. -* ; in comment: Comments. -* <: Comparison of Numbers. -* <=: Comparison of Numbers. -* : Functions for Key Lookup. -* =: Comparison of Numbers. -* >: Comparison of Numbers. -* >=: Comparison of Numbers. -* ? in character constant: Character Type. -* ? in regexp: Syntax of Regexps. -* ?? in regexp: Syntax of Regexps. -* @ in interactive: Using Interactive. -* [ in regexp: Syntax of Regexps. -* [...] (Edebug): Specification List. -* \ in character constant: Character Type. -* \ in display: Truncation. -* \ in printing: Output Functions. -* \ in regexp: Syntax of Regexps. -* \ in replacement: Replacing Match. -* \ in strings: String Type. -* \ in symbols: Symbol Type. -* \' in regexp: Syntax of Regexps. -* \(?: in regexp: Syntax of Regexps. -* \< in regexp: Syntax of Regexps. -* \= in regexp: Syntax of Regexps. -* \> in regexp: Syntax of Regexps. -* \` in regexp: Syntax of Regexps. -* \a: Character Type. -* \b: Character Type. -* \B in regexp: Syntax of Regexps. -* \b in regexp: Syntax of Regexps. -* \e: Character Type. -* \f: Character Type. -* \n: Character Type. -* \n in print: Output Variables. -* \N in replacement: Replacing Match. -* \r: Character Type. -* \S in regexp: Syntax of Regexps. -* \s in regexp: Syntax of Regexps. -* \t: Character Type. -* \v: Character Type. -* \W in regexp: Syntax of Regexps. -* \w in regexp: Syntax of Regexps. -* \{n,m\} in regexp: Syntax of Regexps. -* ] in regexp: Syntax of Regexps. -* ^ in regexp: Syntax of Regexps. -* _ in interactive: Using Interactive. -* `: Backquote. -* ` (Edebug): Debugging Backquote. -* ` (list substitution): Backquote. -* abbrev: Abbrevs. -* abbrev table: Abbrevs. -* abbrev tables in modes: Major Mode Conventions. -* abbrev-all-caps: Abbrev Expansion. -* abbrev-expansion: Abbrev Expansion. -* abbrev-file-name: Abbrev Files. -* abbrev-mode: Abbrev Mode. -* abbrev-prefix-mark: Abbrev Expansion. -* abbrev-start-location: Abbrev Expansion. -* abbrev-start-location-buffer: Abbrev Expansion. -* abbrev-symbol: Abbrev Expansion. -* abbrev-table-name-list: Abbrev Tables. -* abbreviate-file-name: Directory Names. -* abbrevs-changed: Abbrev Files. -* abort-recursive-edit: Recursive Editing. -* aborting: Recursive Editing. -* abs: Arithmetic Operations. -* absolute file name: Relative File Names. -* accelerate-menu: Menu Accelerator Functions. -* accept-process-output: Accepting Output. -* accessibility of a file: Testing Accessibility. -* accessible portion (of a buffer): Narrowing. -* accessible-keymaps: Scanning Keymaps. -* acos: Math Functions. -* acosh: Math Functions. -* activate-menubar-hook: Menubar. -* activate-popup-menu-hook: Pop-Up Menus. -* active display table: Active Display Table. -* active keymap: Active Keymaps. -* active-minibuffer-window: Minibuffer Misc. -* add-abbrev: Defining Abbrevs. -* add-hook: Hooks. -* add-menu: Modifying Menus. -* add-menu-button: Modifying Menus. -* add-menu-item: Modifying Menus. -* add-name-to-file: Changing File Attributes. -* add-spec-list-to-specifier: Adding Specifications. -* add-spec-to-specifier: Adding Specifications. -* add-submenu: Modifying Menus. -* add-text-properties: Changing Properties. -* add-timeout: Timers. -* add-to-list: Setting Variables. -* add-tooltalk-message-arg: Elisp Interface for Sending Messages. -* add-tooltalk-pattern-arg: Elisp Interface for Receiving Messages. -* add-tooltalk-pattern-attribute: Elisp Interface for Receiving Messages. -* address field of register: Cons Cell Type. -* after-change-function: Change Hooks. -* after-change-functions: Change Hooks. -* after-find-file: Subroutines of Visiting. -* after-init-hook: Init File. -* after-insert-file-functions: Saving Properties. -* after-load-alist: Hooks for Loading. -* after-revert-hook: Reverting. -* after-save-hook: Saving Buffers. -* aliases, for variables: Variable Aliases. -* alist: Association Lists. -* alist-to-plist: Converting Plists To/From Alists. -* all-annotations: Locating Annotations. -* all-completions: Basic Completion. -* and: Combining Conditions. -* annotation: Annotations. -* annotation hooks: Annotation Hooks. -* annotation-action: Annotation Properties. -* annotation-data: Annotation Properties. -* annotation-down-glyph: Annotation Properties. -* annotation-face: Annotation Properties. -* annotation-glyph: Annotation Properties. -* annotation-layout: Annotation Properties. -* annotation-list: Locating Annotations. -* annotation-menu: Annotation Properties. -* annotation-side: Annotation Properties. -* annotation-visible: Annotation Properties. -* annotation-width: Annotation Properties. -* annotationp: Annotation Primitives. -* annotations-at: Locating Annotations. -* annotations-in-region: Locating Annotations. -* anonymous function: Anonymous Functions. -* anonymous lambda expressions (Edebug): Instrumenting. -* apostrophe for quoting: Quoting. -* append: Building Lists. -* append-to-file: Writing to Files. -* apply: Calling Functions. -* apply, and debugging: Internals of Debugger. -* apropos: Help Functions. -* aref: Array Functions. -* argument binding: Argument List. -* argument descriptors: Using Interactive. -* argument evaluation form: Using Interactive. -* argument prompt: Using Interactive. -* arguments, reading: Minibuffers. -* arith-error example: Handling Errors. -* arith-error in division: Arithmetic Operations. -* arithmetic shift: Bitwise Operations. -* array: Arrays. -* array elements: Array Functions. -* arrayp: Array Functions. -* ASCII character codes: Character Type. -* aset: Array Functions. -* ash: Bitwise Operations. -* asin: Math Functions. -* asinh: Math Functions. -* ask-user-about-lock: File Locks. -* ask-user-about-supersession-threat: Modification Time. -* asking the user questions: Yes-or-No Queries. -* assoc: Association Lists. -* association list: Association Lists. -* assq: Association Lists. -* asynchronous subprocess: Asynchronous Processes. -* atan: Math Functions. -* atanh: Math Functions. -* atom <1>: List-related Predicates. -* atom: Cons Cell Type. -* atomic extent: Atomic Extents. -* atoms: List-related Predicates. -* attributes of text: Text Properties. -* Auto Fill mode: Auto Filling. -* auto-fill-function: Auto Filling. -* auto-lower-frame: Raising and Lowering. -* auto-mode-alist: Auto Major Mode. -* auto-raise-frame: Raising and Lowering. -* auto-save-default: Auto-Saving. -* auto-save-file-format: Format Conversion. -* auto-save-file-name-p: Auto-Saving. -* auto-save-hook: Auto-Saving. -* auto-save-interval: Auto-Saving. -* auto-save-list-file-name: Auto-Saving. -* auto-save-mode: Auto-Saving. -* auto-save-timeout: Auto-Saving. -* auto-save-visited-file-name: Auto-Saving. -* auto-saving: Auto-Saving. -* autoload <1>: Domain Specification. -* autoload: Autoload. -* autoload errors: Autoload. -* automatically buffer-local: Intro to Buffer-Local. -* available fonts: Font Instance Names. -* back-to-indentation: Motion by Indent. -* background pixmap: Merging Faces. -* backquote (Edebug): Debugging Backquote. -* backquote (list substitution): Backquote. -* backslash in character constant: Character Type. -* backslash in strings: String Type. -* backslash in symbols: Symbol Type. -* backspace: Character Type. -* backtrace: Internals of Debugger. -* backtrace-debug: Internals of Debugger. -* backtrace-frame: Internals of Debugger. -* backtracking: Backtracking. -* backup file: Backup Files. -* backup files, how to make them: Rename or Copy. -* backup-buffer: Making Backups. -* backup-by-copying: Rename or Copy. -* backup-by-copying-when-linked: Rename or Copy. -* backup-by-copying-when-mismatch: Rename or Copy. -* backup-enable-predicate: Making Backups. -* backup-file-name-p: Backup Names. -* backup-inhibited: Making Backups. -* backward-char: Character Motion. -* backward-delete-char-untabify: Deletion. -* backward-list: List Motion. -* backward-prefix-chars: Motion and Syntax. -* backward-sexp: List Motion. -* backward-to-indentation: Motion by Indent. -* backward-word: Word Motion. -* balancing parentheses: Blinking. -* barf-if-buffer-read-only: Read Only Buffers. -* base buffer: Indirect Buffers. -* base64: Transformations. -* base64-decode-region: Transformations. -* base64-decode-string: Transformations. -* base64-encode-region: Transformations. -* base64-encode-string: Transformations. -* batch mode: Batch Mode. -* batch-byte-compile: Compilation Functions. -* batch-byte-recompile-directory: Compilation Functions. -* beep: Beeping. -* beeping: Beeping. -* before point, insertion: Insertion. -* before-change-function: Change Hooks. -* before-change-functions: Change Hooks. -* before-init-hook: Init File. -* before-revert-hook: Reverting. -* beginning of line: Text Lines. -* beginning of line in regexp: Syntax of Regexps. -* beginning-of-buffer: Buffer End Motion. -* beginning-of-defun: List Motion. -* beginning-of-line: Text Lines. -* bell: Beeping. -* bell character: Character Type. -* bell-volume: Beeping. -* binary files and text files: Files and MS-DOS. -* binary-process-input: MS-DOS Subprocesses. -* binary-process-output: MS-DOS Subprocesses. -* bind-text-domain: Level 3 Primitives. -* binding arguments: Argument List. -* binding local variables: Local Variables. -* binding of a key: Keymap Terminology. -* bit vector: Bit Vectors. -* bit vector length: Sequence Functions. -* bit-vector: Bit Vector Functions. -* bit-vector-p: Bit Vector Functions. -* bitp: Bit Vector Functions. -* bitwise and: Bitwise Operations. -* bitwise exclusive or: Bitwise Operations. -* bitwise not: Bitwise Operations. -* bitwise or: Bitwise Operations. -* blink-matching-open: Blinking. -* blink-matching-paren: Blinking. -* blink-matching-paren-delay: Blinking. -* blink-matching-paren-distance: Blinking. -* blink-paren-function: Blinking. -* blink-paren-hook: Blinking. -* blinking: Blinking. -* bobp: Near Point. -* body of function: Lambda Components. -* bold: Font Instance Characteristics. -* bolp: Near Point. -* bookmark-map: Standard Keymaps. -* boolean: nil and t. -* boolean-specifier-p: Specifier Types. -* bootstrapping XEmacs from temacs: Building XEmacs. -* bottom-gutter: Specifying a Gutter. -* bottom-gutter-height: Other Gutter Variables. -* bottom-gutter-visible-p: Other Gutter Variables. -* bottom-toolbar: Specifying the Toolbar. -* bottom-toolbar-height: Other Toolbar Variables. -* bottom-toolbar-visible-p: Other Toolbar Variables. -* boundp: Void Variables. -* box diagrams, for lists: Cons Cell Type. -* box representation for lists: Lists as Boxes. -* break: Debugger. -* breakpoints: Breakpoints. -* bucket (in obarray): Creating Symbols. -* buffer: Buffers. -* buffer contents: Text. -* buffer file name: Buffer File Name. -* buffer input stream: Input Streams. -* buffer list: The Buffer List. -* buffer modification: Buffer Modification. -* buffer names: Buffer Names. -* buffer output stream: Output Streams. -* buffer text notation: Buffer Text Notation. -* buffer, read-only: Read Only Buffers. -* buffer-auto-save-file-name: Auto-Saving. -* buffer-backed-up: Making Backups. -* buffer-base-buffer: Indirect Buffers. -* buffer-disable-undo: Maintaining Undo. -* buffer-enable-undo: Maintaining Undo. -* buffer-end: Point. -* buffer-file-format: Format Conversion. -* buffer-file-name: Buffer File Name. -* buffer-file-number: Buffer File Name. -* buffer-file-truename: Buffer File Name. -* buffer-file-type: Files and MS-DOS. -* buffer-flush-undo: Maintaining Undo. -* buffer-glyph-p: Glyph Types. -* buffer-indirect-children: Indirect Buffers. -* buffer-invisibility-spec: Invisible Text. -* buffer-list: The Buffer List. -* buffer-live-p: Killing Buffers. -* buffer-local variables: Buffer-Local Variables. -* buffer-local variables in modes: Major Mode Conventions. -* buffer-local-variables: Creating Buffer-Local. -* Buffer-menu-mode-map: Standard Keymaps. -* buffer-modified-p: Buffer Modification. -* buffer-modified-tick: Buffer Modification. -* buffer-name: Buffer Names. -* buffer-offer-save <1>: Killing Buffers. -* buffer-offer-save: Saving Buffers. -* buffer-read-only: Read Only Buffers. -* buffer-saved-size <1>: Point. -* buffer-saved-size: Auto-Saving. -* buffer-size: Point. -* buffer-string: Buffer Contents. -* buffer-substring: Buffer Contents. -* buffer-undo-list: Undo. -* bufferp: Buffer Basics. -* buffers menu: Buffers Menu. -* buffers, controlled in windows: Buffers and Windows. -* buffers, creating: Creating Buffers. -* buffers, killing: Killing Buffers. -* buffers-menu-filter: Menu Filters. -* buffers-menu-max-size: Buffers Menu. -* buffers-menu-switch-to-buffer-function: Buffers Menu. -* building lists: Building Lists. -* building XEmacs: Building XEmacs. -* built-in function: What Is a Function. -* bury-buffer: The Buffer List. -* busy-pointer-glyph: Mouse Pointer. -* button-event-p: Event Predicates. -* button-press-event-p: Event Predicates. -* button-release-event-p: Event Predicates. -* bvconcat: Bit Vector Functions. -* byte-code <1>: Compilation Functions. -* byte-code: Byte Compilation. -* byte-code function: Compiled-Function Objects. -* byte-code interpreter: Compilation Functions. -* byte-compile: Compilation Functions. -* byte-compile-dynamic: Dynamic Loading. -* byte-compile-dynamic-docstrings: Docs and Compilation. -* byte-compile-file: Compilation Functions. -* byte-compiling macros: Compiling Macros. -* byte-compiling require: Named Features. -* byte-recompile-directory: Compilation Functions. -* byte-recompile-directory-ignore-errors-p: Compilation Functions. -* bytes: Strings and Characters. -* c++-mode-map: Standard Keymaps. -* C-c: Prefix Keys. -* C-g: Quitting. -* C-h: Prefix Keys. -* C-M-x: Instrumenting. -* c-mode-abbrev-table: Standard Abbrev Tables. -* c-mode-map: Standard Keymaps. -* c-mode-syntax-table: Standard Syntax Tables. -* C-q: Flow Control. -* C-s: Flow Control. -* C-x: Prefix Keys. -* C-x 4: Prefix Keys. -* C-x 5: Prefix Keys. -* C-x a: Prefix Keys. -* C-x n: Prefix Keys. -* C-x r: Prefix Keys. -* caaaar: List Elements. -* caaadr: List Elements. -* caaar: List Elements. -* caadar: List Elements. -* caaddr: List Elements. -* caadr: List Elements. -* caar: List Elements. -* cadaar: List Elements. -* cadadr: List Elements. -* cadar: List Elements. -* caddar: List Elements. -* cadddr: List Elements. -* caddr: List Elements. -* cadr: List Elements. -* call stack: Internals of Debugger. -* call-interactively: Interactive Call. -* call-process: Synchronous Processes. -* call-process-region: Synchronous Processes. -* calling a function: Calling Functions. -* cancel-debug-on-entry: Function Debugging. -* canonicalize-inst-list: Adding Specifications. -* canonicalize-inst-pair: Adding Specifications. -* canonicalize-lax-plist: Working With Lax Plists. -* canonicalize-plist: Working With Normal Plists. -* canonicalize-spec: Adding Specifications. -* canonicalize-spec-list: Adding Specifications. -* canonicalize-tag-set: Specifier Tag Functions. -* capitalization: Character Case. -* capitalize: Character Case. -* capitalize-region: Case Changes. -* capitalize-word: Case Changes. -* car: List Elements. -* car-safe: List Elements. -* case changes: Case Changes. -* case in replacements: Replacing Match. -* case-fold-search: Searching and Case. -* case-replace: Searching and Case. -* case-table-p: Case Tables. -* catch: Catch and Throw. -* category-designator-p: Category Tables. -* category-table: Category Tables. -* category-table-p: Category Tables. -* category-table-value-p: Category Tables. -* CBREAK: Flow Control. -* ccl-elapsed-time: Calling CCL. -* ccl-execute: Calling CCL. -* ccl-execute-on-string: Calling CCL. -* ccl-reset-elapsed-time: Calling CCL. -* cdaaar: List Elements. -* cdaadr: List Elements. -* cdaar: List Elements. -* cdadar: List Elements. -* cdaddr: List Elements. -* cdadr: List Elements. -* cdar: List Elements. -* cddaar: List Elements. -* cddadr: List Elements. -* cddar: List Elements. -* cdddar: List Elements. -* cddddr: List Elements. -* cdddr: List Elements. -* cddr: List Elements. -* CDE dt: CDE dt. -* cdr: List Elements. -* cdr-safe: List Elements. -* ceiling: Numeric Conversions. -* centering point: Vertical Scrolling. -* cerror: Signaling Errors. -* change hooks: Change Hooks. -* change-major-mode-hook: Major Mode Conventions. -* changing key bindings: Changing Key Bindings. -* changing to another buffer: Current Buffer. -* changing window size: Resizing Windows. -* char table type: Char Table Type. -* char-after: Near Point. -* char-before: Near Point. -* char-charset: MULE Characters. -* char-equal: Text Comparison. -* char-int: Character Codes. -* char-int confoundance disease: Character Type. -* char-int-p: Character Codes. -* char-octet: MULE Characters. -* char-or-char-int-p: Character Codes. -* char-or-string-p: Predicates for Strings. -* char-syntax: Syntax Table Functions. -* char-table-p: Char Tables. -* char-table-type: Char Table Types. -* char-table-type-list: Char Table Types. -* char-to-string: String Conversion. -* char=: Text Comparison. -* character arrays: Strings and Characters. -* character case: Character Case. -* character descriptor: Character Descriptors. -* character insertion: Commands for Insertion. -* character printing: Describing Characters. -* character set (in regexp): Syntax of Regexps. -* character to string: String Conversion. -* character-to-event: Converting Events. -* characteristics of font instances: Font Instance Characteristics. -* characterp: Predicates for Characters. -* characters: Strings and Characters. -* characters for interactive codes: Interactive Codes. -* character quote: Syntax Class Table. -* charset type: Charset Type. -* charset-ccl-program: Charset Property Functions. -* charset-chars: Charset Property Functions. -* charset-columns: Charset Property Functions. -* charset-dimension: Charset Property Functions. -* charset-direction: Charset Property Functions. -* charset-doc-string: Charset Property Functions. -* charset-final: Charset Property Functions. -* charset-from-attributes: Basic Charset Functions. -* charset-graphic: Charset Property Functions. -* charset-list: Basic Charset Functions. -* charset-name: Charset Property Functions. -* charset-property: Charset Property Functions. -* charset-registry: Charset Property Functions. -* charset-reverse-direction-charset: Basic Charset Functions. -* charsetp: Charsets. -* check-argument-type: Signaling Errors. -* check-gutter-button-syntax: Gutter Descriptor Format. -* check-toolbar-button-syntax: Toolbar Descriptor Format. -* check-valid-char-table-value: Working With Char Tables. -* check-valid-inst-list: Specifier Validation Functions. -* check-valid-instantiator: Specifier Validation Functions. -* check-valid-plist: Property Lists. -* check-valid-spec-list: Specifier Validation Functions. -* child process: Processes. -* children, of extent: Extent Parents. -* CL note--allocate more storage: Garbage Collection. -* CL note--case of letters: Symbol Type. -* CL note--default optional arg: Argument List. -* CL note--integers vrs eq: Comparison of Numbers. -* CL note--lack union, set: Sets And Lists. -* CL note--only throw in Emacs: Catch and Throw. -* CL note--rplaca vrs setcar: Modifying Lists. -* CL note--set local: Setting Variables. -* CL note--special forms compared: Special Forms. -* CL note--special variables: Variable Scoping. -* CL note--symbol in obarrays: Creating Symbols. -* cl-read: Reading in Edebug. -* cl-specs.el: Instrumenting. -* cl.el (Edebug): Instrumenting. -* cleanup forms: Cleanups. -* clear-abbrev-table: Abbrev Tables. -* clear-message: The Echo Area. -* clear-range-table: Working With Range Tables. -* clear-visited-file-modtime: Modification Time. -* close parenthesis: Blinking. -* close-database: Connecting to a Database. -* close parenthesis character: Syntax Class Table. -* closures not available: Extent. -* clrhash: Working With Hash Tables. -* codes, interactive, description of: Interactive Codes. -* coding standards: Tips. -* coding system type: Coding System Type. -* coding-category-list: Detection of Textual Encoding. -* coding-category-system: Detection of Textual Encoding. -* coding-priority-list: Detection of Textual Encoding. -* coding-system-base: Basic Coding System Functions. -* coding-system-doc-string: Coding System Property Functions. -* coding-system-list: Basic Coding System Functions. -* coding-system-name: Basic Coding System Functions. -* coding-system-p: Coding Systems. -* coding-system-property: Coding System Property Functions. -* coding-system-type: Coding System Property Functions. -* color instance type: Color Instance Type. -* color instances: Color Instances. -* color-instance-name: Color Instance Properties. -* color-instance-p: Color Instances. -* color-instance-rgb-components: Color Instance Properties. -* color-name: Color Convenience Functions. -* color-pixmap-image-instance-p: Image Instance Types. -* color-rgb-components: Color Convenience Functions. -* color-specifier-p <1>: Color Specifiers. -* color-specifier-p: Specifier Types. -* colorize-image-instance: Image Instance Functions. -* colors: Colors. -* columns: Columns. -* command: What Is a Function. -* command descriptions: A Sample Function Description. -* command history: Command History. -* command in keymap: Key Lookup. -* command line arguments: Command Line Arguments. -* command line options: Command Line Arguments. -* command loop: Command Loop. -* command loop, recursive: Recursive Editing. -* command-debug-status: Internals of Debugger. -* command-execute: Interactive Call. -* command-history: Command History. -* command-history-map: Standard Keymaps. -* command-line: Command Line Arguments. -* command-line-args: Command Line Arguments. -* command-line-functions: Command Line Arguments. -* command-line-processed: Command Line Arguments. -* command-switch-alist: Command Line Arguments. -* commandp: Interactive Call. -* commandp example: High-Level Completion. -* commands, defining: Defining Commands. -* comment syntax: Syntax Class Table. -* comments: Comments. -* comment ender: Syntax Class Table. -* comment starter: Syntax Class Table. -* Common Lisp: Lisp History. -* Common Lisp (Edebug): Instrumenting. -* compare-buffer-substrings: Comparing Text. -* comparing buffer text: Comparing Text. -* comparison of modification time: Modification Time. -* compilation: Byte Compilation. -* compilation functions: Compilation Functions. -* compile-defun: Compilation Functions. -* compiled function: Compiled-Function Objects. -* compiled-function-arglist: Compiled-Function Objects. -* compiled-function-constants: Compiled-Function Objects. -* compiled-function-doc-string: Compiled-Function Objects. -* compiled-function-domain: Compiled-Function Objects. -* compiled-function-instructions: Compiled-Function Objects. -* compiled-function-interactive: Compiled-Function Objects. -* compiled-function-p: What Is a Function. -* compiled-function-stack-size: Compiled-Function Objects. -* complete key: Keymap Terminology. -* completing-read: Minibuffer Completion. -* completion: Completion. -* completion, file name: File Name Completion. -* completion, user name: User Name Completion. -* completion-auto-help: Completion Commands. -* completion-ignore-case: Basic Completion. -* completion-ignored-extensions: File Name Completion. -* complex arguments: Minibuffers. -* complex command: Command History. -* complex-buffers-menu-p: Buffers Menu. -* compose-region: Composite Characters. -* composite-char-string: Composite Characters. -* concat: Creating Strings. -* concatenating lists: Rearrangement. -* concatenating strings: Creating Strings. -* cond: Conditionals. -* condition name: Error Symbols. -* condition-case: Handling Errors. -* conditional evaluation: Conditionals. -* cons: Building Lists. -* cons cell as box: Lists as Boxes. -* cons cells: Building Lists. -* consing: Building Lists. -* console-device-list: Basic Console Functions. -* console-disable-input: Console and Device I/O. -* console-enable-input: Console and Device I/O. -* console-list: Basic Console Functions. -* console-live-p: Connecting to a Console or Device. -* console-type-image-conversion-list: Image Instantiator Conversion. -* consolep: Consoles and Devices. -* consoles: Consoles and Devices. -* consp: List-related Predicates. -* continuation lines: Truncation. -* continuation-glyph: Redisplay Glyphs. -* continue-process: Signals to Processes. -* control character printing: Describing Characters. -* control characters: Character Type. -* control characters in display: Usual Display. -* control characters, reading: Quoted Character Input. -* control structures: Control Structures. -* control-arrow-glyph: Redisplay Glyphs. -* Control-X-prefix: Prefix Keys. -* conventions for writing minor modes: Minor Mode Conventions. -* conversion of image instantiators: Image Instantiator Conversion. -* conversion of strings: String Conversion. -* copy-alist: Association Lists. -* copy-category-table: Category Tables. -* copy-coding-system: Basic Coding System Functions. -* copy-event: Working With Events. -* copy-extent: Detached Extents. -* copy-face: Basic Face Functions. -* copy-file: Changing File Attributes. -* copy-hash-table: Introduction to Hash Tables. -* copy-keymap: Creating Keymaps. -* copy-marker: Creating Markers. -* copy-range-table: Introduction to Range Tables. -* copy-region-as-kill: Kill Functions. -* copy-sequence: Sequence Functions. -* copy-specifier: Other Specification Functions. -* copy-syntax-table: Syntax Table Functions. -* copying alists: Association Lists. -* copying bit vectors: Bit Vector Functions. -* copying files: Changing File Attributes. -* copying lists: Building Lists. -* copying sequences: Sequence Functions. -* copying strings: Creating Strings. -* copying vectors: Vector Functions. -* cos: Math Functions. -* cosh: Math Functions. -* count-lines: Text Lines. -* count-loop: A Sample Function Description. -* counting columns: Columns. -* coverage testing: Coverage Testing. -* create-device-hook: Connecting to a Console or Device. -* create-file-buffer: Subroutines of Visiting. -* create-frame-hook: Frame Hooks. -* create-tooltalk-message: Elisp Interface for Sending Messages. -* create-tooltalk-pattern: Elisp Interface for Receiving Messages. -* creating buffers: Creating Buffers. -* creating keymaps: Creating Keymaps. -* ctl-arrow: Usual Display. -* ctl-x-4-map <1>: Standard Keymaps. -* ctl-x-4-map: Prefix Keys. -* ctl-x-5-map <1>: Standard Keymaps. -* ctl-x-5-map: Prefix Keys. -* ctl-x-map <1>: Standard Keymaps. -* ctl-x-map: Prefix Keys. -* cube-root: Math Functions. -* current binding: Local Variables. -* current buffer: Current Buffer. -* current buffer excursion: Excursions. -* current buffer mark: The Mark. -* current buffer point and mark (Edebug): Edebug Display Update. -* current buffer position: Point. -* current command: Command Loop Info. -* current stack frame: Using Debugger. -* current-buffer: Current Buffer. -* current-case-table: Case Tables. -* current-column: Columns. -* current-display-table: Active Display Table. -* current-fill-column: Margins. -* current-frame-configuration: Frame Configurations. -* current-global-map: Active Keymaps. -* current-indentation: Primitive Indent. -* current-input-mode: Input Modes. -* current-justification: Filling. -* current-keymaps: Active Keymaps. -* current-kill: Low-Level Kill Ring. -* current-left-margin: Margins. -* current-local-map: Active Keymaps. -* current-menubar: Menubar. -* current-message: The Echo Area. -* current-minor-mode-maps: Active Keymaps. -* current-mouse-event: Command Loop Info. -* current-prefix-arg: Prefix Command Arguments. -* current-time: Time of Day. -* current-time-string: Time of Day. -* current-time-zone: Time of Day. -* current-window-configuration: Window Configurations. -* cursor (mouse): Mouse Pointer. -* cursor-in-echo-area: The Echo Area. -* cust-print: Printing in Edebug. -* cut buffer: X Selections. -* cyclic ordering of windows: Cyclic Window Ordering. -* data type: Lisp Data Types. -* data-directory: Accessing Documentation. -* database: Databases. -* database type: Database Type. -* database-file-name: Other Database Functions. -* database-last-error: Other Database Functions. -* database-live-p: Connecting to a Database. -* database-subtype: Other Database Functions. -* database-type: Other Database Functions. -* databasep: Databases. -* deallocate-event: Working With Events. -* debug: Invoking the Debugger. -* debug-allocation: Garbage Collection. -* debug-allocation-backtrace: Garbage Collection. -* debug-ignored-errors: Error Debugging. -* debug-on-entry: Function Debugging. -* debug-on-error: Error Debugging. -* debug-on-error use: Processing of Errors. -* debug-on-next-call: Internals of Debugger. -* debug-on-quit: Infinite Loops. -* debug-on-signal: Error Debugging. -* debug-on-signal use: Handling Errors. -* debugger <1>: Internals of Debugger. -* debugger: Debugger. -* debugger command list: Debugger Commands. -* debugger-mode-map: Standard Keymaps. -* debugging errors: Error Debugging. -* debugging specific functions: Function Debugging. -* decode-big5-char: Big5 and Shift-JIS Functions. -* decode-coding-region: Encoding and Decoding Text. -* decode-shift-jis-char: Big5 and Shift-JIS Functions. -* decode-time: Time Conversion. -* decoding file formats: Format Conversion. -* decompose-region: Composite Characters. -* decrement field of register: Cons Cell Type. -* dedicated window: Choosing Window. -* deep binding: Impl of Scope. -* def-edebug-spec: Instrumenting Macro Calls. -* defalias: Defining Functions. -* default argument string: Interactive Codes. -* default init file: Init File. -* default value: Default Value. -* default-abbrev-mode: Abbrev Mode. -* default-boundp: Default Value. -* default-buffer-file-type: Files and MS-DOS. -* default-case-fold-search: Searching and Case. -* default-ctl-arrow: Usual Display. -* default-deselect-frame-hook: Raising and Lowering. -* default-directory: File Name Expansion. -* default-file-modes: Changing File Attributes. -* default-fill-column: Margins. -* default-frame-name: Frame Name. -* default-frame-plist: Initial Properties. -* default-gutter: Specifying a Gutter. -* default-gutter-height: Other Gutter Variables. -* default-gutter-position: Specifying a Gutter. -* default-gutter-visible-p: Other Gutter Variables. -* default-gutter-width: Other Gutter Variables. -* default-justification: Filling. -* default-major-mode: Auto Major Mode. -* default-menubar: Menubar. -* default-minibuffer-frame: Minibuffers and Frames. -* default-modeline-format: Modeline Variables. -* default-popup-menu: Pop-Up Menus. -* default-select-frame-hook: Raising and Lowering. -* default-text-properties: Examining Properties. -* default-toolbar: Specifying the Toolbar. -* default-toolbar-height: Other Toolbar Variables. -* default-toolbar-position: Specifying the Toolbar. -* default-toolbar-visible-p: Other Toolbar Variables. -* default-toolbar-width: Other Toolbar Variables. -* default-truncate-lines: Truncation. -* default-value: Default Value. -* default-x-device: Resources. -* default.el: Start-up Summary. -* defconst <1>: Domain Specification. -* defconst: Defining Variables. -* defcustom: Variable Definitions. -* defgroup: Group Definitions. -* define-abbrev: Defining Abbrevs. -* define-abbrev-table: Abbrev Tables. -* define-derived-mode: Derived Modes. -* define-error: Error Symbols. -* define-function: Defining Functions. -* define-key: Changing Key Bindings. -* define-logical-name: Changing File Attributes. -* define-obsolete-function-alias: Obsoleteness. -* define-obsolete-variable-alias: Obsoleteness. -* define-prefix-command: Prefix Keys. -* define-specifier-tag: Specifier Tag Functions. -* defining a function: Defining Functions. -* defining commands: Defining Commands. -* defining-kbd-macro: Keyboard Macros. -* definition of a symbol: Definitions. -* defmacro: Defining Macros. -* defsubst: Inline Functions. -* defun: Defining Functions. -* defun-prompt-regexp: List Motion. -* defvar <1>: Domain Specification. -* defvar: Defining Variables. -* defvaralias: Variable Aliases. -* deiconify-frame: Visibility of Frames. -* delete: Sets And Lists. -* delete previous char: Deletion. -* delete-annotation: Annotation Primitives. -* delete-auto-save-file-if-necessary: Auto-Saving. -* delete-auto-save-files: Auto-Saving. -* delete-backward-char: Deletion. -* delete-blank-lines: User-Level Deletion. -* delete-char: Deletion. -* delete-device: Connecting to a Console or Device. -* delete-device-hook: Connecting to a Console or Device. -* delete-directory: Create/Delete Dirs. -* delete-exited-processes: Deleting Processes. -* delete-extent: Creating and Modifying Extents. -* delete-file: Changing File Attributes. -* delete-frame: Deleting Frames. -* delete-frame-hook: Frame Hooks. -* delete-horizontal-space: User-Level Deletion. -* delete-indentation: User-Level Deletion. -* delete-menu-item: Modifying Menus. -* delete-old-versions: Numbered Backups. -* delete-other-windows: Deleting Windows. -* delete-process: Deleting Processes. -* delete-region: Deletion. -* delete-to-left-margin: Margins. -* delete-window: Deleting Windows. -* delete-windows-on: Deleting Windows. -* deleting files: Changing File Attributes. -* deleting processes: Deleting Processes. -* deleting whitespace: User-Level Deletion. -* deleting windows: Deleting Windows. -* deletion of elements: Sets And Lists. -* deletion of frames: Deleting Frames. -* deletion vs killing: Deletion. -* delq: Sets And Lists. -* demibold: Font Instance Characteristics. -* describe-bindings: Scanning Keymaps. -* describe-bindings-internal: Scanning Keymaps. -* describe-buffer-case-table: Case Tables. -* describe-mode: Mode Help. -* describe-prefix-bindings: Help Functions. -* describe-tooltalk-message: Elisp Interface for Receiving Messages. -* description for interactive codes: Interactive Codes. -* description format: Format of Descriptions. -* deselect-frame-hook: Frame Hooks. -* destroy-tooltalk-message: Elisp Interface for Sending Messages. -* destroy-tooltalk-pattern: Elisp Interface for Receiving Messages. -* destructive-alist-to-plist: Converting Plists To/From Alists. -* destructive-plist-to-alist: Converting Plists To/From Alists. -* detach-extent: Detached Extents. -* detached extent: Detached Extents. -* detect-coding-region: Detection of Textual Encoding. -* device-baud-rate <1>: Terminal Output. -* device-baud-rate: Console and Device I/O. -* device-class: Console Types and Device Classes. -* device-frame-list <1>: Basic Device Functions. -* device-frame-list: Finding All Frames. -* device-list: Basic Device Functions. -* device-live-p: Connecting to a Console or Device. -* device-matches-specifier-tag-set-p: Specifier Tag Functions. -* device-matching-specifier-tag-list: Specifier Tag Functions. -* device-or-frame-p: Basic Device Functions. -* device-or-frame-type: Console Types and Device Classes. -* device-type: Console Types and Device Classes. -* device-x-display: Connecting to a Console or Device. -* devicep: Consoles and Devices. -* devices: Consoles and Devices. -* dgettext: Level 3 Primitives. -* diagrams, boxed, for lists: Cons Cell Type. -* dialog box: Dialog Boxes. -* digit-argument: Prefix Command Arguments. -* ding: Beeping. -* directory name: Directory Names. -* directory name abbreviation: Directory Names. -* directory part (of file name): File Name Components. -* directory-abbrev-alist: Directory Names. -* directory-file-name: Directory Names. -* directory-files: Contents of Directories. -* directory-oriented functions: Contents of Directories. -* dired-kept-versions: Numbered Backups. -* dired-mode-map: Standard Keymaps. -* disable undo: Maintaining Undo. -* disable-command: Disabling Commands. -* disable-menu-item: Modifying Menus. -* disable-timeout: Timers. -* disabled: Disabling Commands. -* disabled command: Disabling Commands. -* disabled-command-hook: Disabling Commands. -* disassemble: Disassembly. -* disassembled byte-code: Disassembly. -* discard input: Peeking and Discarding. -* discard-input: Peeking and Discarding. -* dispatch-event: Dispatching an Event. -* dispatching an event: Dispatching an Event. -* display columns: Size and Position. -* display lines: Size and Position. -* display order: Extent Endpoints. -* display table: Display Tables. -* display update: Refresh Screen. -* display-buffer: Choosing Window. -* display-buffer-function: Choosing Window. -* display-completion-list: Completion Commands. -* display-error: Processing of Errors. -* display-message: The Echo Area. -* display-warning: Warnings. -* display-warning-minimum-level: Warnings. -* display-warning-suppressed-classes: Warnings. -* displaying a buffer: Displaying Buffers. -* do-auto-save: Auto-Saving. -* DOC (documentation) file: Documentation Basics. -* doc-directory: Accessing Documentation. -* documentation: Accessing Documentation. -* documentation conventions: Documentation Basics. -* documentation for major mode: Mode Help. -* documentation notation: Evaluation Notation. -* documentation of function: Function Documentation. -* documentation strings: Documentation. -* documentation, keys in: Keys in Documentation. -* documentation-property: Accessing Documentation. -* domain: Level 3 Primitives. -* domain (in a specifier): Specifiers In-Depth. -* domain-of: Level 3 Primitives. -* dotted lists (Edebug): Specification List. -* dotted pair notation: Dotted Pair Notation. -* double-quote in strings: String Type. -* down-list: List Motion. -* downcase: Character Case. -* downcase-region: Case Changes. -* downcase-word: Case Changes. -* downcasing in lookup-key: Key Sequence Input. -* drag: Drag Interface. -* drag and drop: Drag and Drop. -* Drag API: Drag Interface. -* dribble file: Recording Input. -* drop: Drop Interface. -* Drop API: Drop Interface. -* dump-emacs: Building XEmacs. -* duplicable extent: Duplicable Extents. -* dynamic loading of documentation: Docs and Compilation. -* dynamic loading of functions: Dynamic Loading. -* dynamic scoping: Variable Scoping. -* echo area: The Echo Area. -* echo-keystrokes <1>: The Echo Area. -* echo-keystrokes: Command Loop Info. -* edebug: Embedded Breakpoints. -* Edebug: Edebug. -* Edebug execution modes: Edebug Execution Modes. -* Edebug mode: Edebug. -* Edebug specification list: Specification List. -* edebug-`: Debugging Backquote. -* edebug-all-defs <1>: Edebug Options. -* edebug-all-defs: Instrumenting. -* edebug-all-forms <1>: Edebug Options. -* edebug-all-forms: Instrumenting. -* edebug-continue-kbd-macro: Edebug Options. -* edebug-display-freq-count: Coverage Testing. -* edebug-eval-top-level-form: Instrumenting. -* edebug-global-break-condition <1>: Edebug Options. -* edebug-global-break-condition: Global Break Condition. -* edebug-initial-mode: Edebug Options. -* edebug-on-error <1>: Edebug Options. -* edebug-on-error: Trapping Errors. -* edebug-on-quit <1>: Edebug Options. -* edebug-on-quit: Trapping Errors. -* edebug-print-circle <1>: Edebug Options. -* edebug-print-circle: Printing in Edebug. -* edebug-print-length <1>: Edebug Options. -* edebug-print-length: Printing in Edebug. -* edebug-print-level <1>: Edebug Options. -* edebug-print-level: Printing in Edebug. -* edebug-print-trace-after <1>: Edebug Options. -* edebug-print-trace-after: Tracing. -* edebug-print-trace-before <1>: Edebug Options. -* edebug-print-trace-before: Tracing. -* edebug-save-displayed-buffer-points <1>: Edebug Options. -* edebug-save-displayed-buffer-points: Edebug Display Update. -* edebug-save-windows <1>: Edebug Options. -* edebug-save-windows: Edebug Display Update. -* edebug-set-global-break-condition: Global Break Condition. -* edebug-setup-hook: Edebug Options. -* edebug-test-coverage: Edebug Options. -* edebug-trace <1>: Edebug Options. -* edebug-trace: Tracing. -* edebug-tracing: Tracing. -* edebug-unwrap: Specification List. -* edebug-unwrap-results <1>: Edebug Options. -* edebug-unwrap-results: Debugging Backquote. -* edit-abbrevs-map: Standard Keymaps. -* edit-and-eval-command: Object from Minibuffer. -* edit-menu-filter: Menu Filters. -* edit-tab-stops-map: Standard Keymaps. -* editing types: Editing Types. -* editor command loop: Command Loop. -* eighth: List Elements. -* electric-buffer-menu-mode-map: Standard Keymaps. -* electric-future-map: A Sample Variable Description. -* electric-history-map: Standard Keymaps. -* element (of list): Lists. -* elements of sequences: Sequence Functions. -* elt: Sequence Functions. -* emacs-build-time: Building XEmacs. -* emacs-lisp-mode-map: Standard Keymaps. -* emacs-lisp-mode-syntax-table: Standard Syntax Tables. -* emacs-major-version: Building XEmacs. -* emacs-minor-version: Building XEmacs. -* emacs-pid: System Environment. -* emacs-version: Building XEmacs. -* EMACSLOADPATH environment variable: How Programs Do Loading. -* embedded breakpoints: Embedded Breakpoints. -* empty list: Cons Cell Type. -* enable-command: Disabling Commands. -* enable-flow-control: Flow Control. -* enable-flow-control-on: Flow Control. -* enable-local-eval: Auto Major Mode. -* enable-local-variables: Auto Major Mode. -* enable-menu-item: Modifying Menus. -* enable-recursive-minibuffers: Minibuffer Misc. -* encode-big5-char: Big5 and Shift-JIS Functions. -* encode-coding-region: Encoding and Decoding Text. -* encode-shift-jis-char: Big5 and Shift-JIS Functions. -* encode-time: Time Conversion. -* encoding file formats: Format Conversion. -* end of buffer marker: Creating Markers. -* end-of-buffer: Buffer End Motion. -* end-of-defun: List Motion. -* end-of-file: Input Functions. -* end-of-line: Text Lines. -* enlarge-window: Resizing Windows. -* enlarge-window-horizontally: Resizing Windows. -* enlarge-window-pixels: Resizing Windows. -* enqueue-eval-event: Reading One Event. -* environment: Intro Eval. -* environment variable access: System Environment. -* environment variables, subprocesses: Subprocess Creation. -* eobp: Near Point. -* eolp: Near Point. -* eq: Equality Predicates. -* equal: Equality Predicates. -* equality: Equality Predicates. -* erase-buffer: Deletion. -* error: Signaling Errors. -* error cleanup: Cleanups. -* error debugging: Error Debugging. -* error display: The Echo Area. -* error handler: Handling Errors. -* error in debug: Invoking the Debugger. -* error message notation: Error Messages. -* error name: Error Symbols. -* error symbol: Error Symbols. -* error-conditions: Error Symbols. -* error-message-string: Processing of Errors. -* errors: Errors. -* esc-map: Prefix Keys. -* ESC-prefix: Prefix Keys. -* escape <1>: Syntax Class Table. -* escape: Character Type. -* escape characters: Output Variables. -* escape characters in printing: Output Functions. -* escape sequence: Character Type. -* eval: Eval. -* eval, and debugging: Internals of Debugger. -* eval-and-compile: Eval During Compile. -* eval-buffer: Eval. -* eval-current-buffer (Edebug): Instrumenting. -* eval-defun (Edebug): Instrumenting. -* eval-event-p: Event Predicates. -* eval-expression (Edebug): Instrumenting. -* eval-minibuffer: Object from Minibuffer. -* eval-region: Eval. -* eval-region (Edebug): Instrumenting. -* eval-when-compile: Eval During Compile. -* evaluated expression argument: Interactive Codes. -* evaluation: Evaluation. -* evaluation error: Local Variables. -* evaluation list (Edebug): Eval List. -* evaluation notation: Evaluation Notation. -* evaluation of buffer contents: Eval. -* event printing: Describing Characters. -* event-buffer: Window-Level Event Position Info. -* event-button: Accessing Other Event Info. -* event-closest-point: Event Text Position Info. -* event-device: Accessing Other Event Info. -* event-frame: Frame-Level Event Position Info. -* event-function: Accessing Other Event Info. -* event-glyph-extent: Event Glyph Position Info. -* event-glyph-x-pixel: Event Glyph Position Info. -* event-glyph-y-pixel: Event Glyph Position Info. -* event-key: Accessing Other Event Info. -* event-live-p: Event Predicates. -* event-matches-key-specifier-p: Key Sequences. -* event-modifier-bits: Accessing Other Event Info. -* event-modifiers: Accessing Other Event Info. -* event-object: Accessing Other Event Info. -* event-over-border-p: Other Event Position Info. -* event-over-glyph-p: Event Glyph Position Info. -* event-over-modeline-p: Event Text Position Info. -* event-over-text-area-p: Event Text Position Info. -* event-over-toolbar-p: Event Toolbar Position Info. -* event-point: Event Text Position Info. -* event-process: Accessing Other Event Info. -* event-timestamp: Accessing Other Event Info. -* event-to-character: Converting Events. -* event-toolbar-button: Event Toolbar Position Info. -* event-type: Event Contents. -* event-window: Window-Level Event Position Info. -* event-window-x-pixel: Window-Level Event Position Info. -* event-window-y-pixel: Window-Level Event Position Info. -* event-x: Event Text Position Info. -* event-x-pixel: Frame-Level Event Position Info. -* event-y: Event Text Position Info. -* event-y-pixel: Frame-Level Event Position Info. -* eventp: Events. -* events: Events. -* events-to-keys: Converting Events. -* examining windows: Buffers and Windows. -* examples of using interactive: Interactive Examples. -* exchange-point-and-mark: The Mark. -* excursion: Excursions. -* exec-directory: Subprocess Creation. -* exec-path: Subprocess Creation. -* execute program: Subprocess Creation. -* execute with prefix argument: Interactive Call. -* execute-extended-command: Interactive Call. -* execute-kbd-macro: Keyboard Macros. -* executing-macro: Keyboard Macros. -* execution speed: Compilation Tips. -* exit: Recursive Editing. -* exit recursive editing: Recursive Editing. -* exit-minibuffer: Minibuffer Misc. -* exit-recursive-edit: Recursive Editing. -* exiting XEmacs: Getting Out. -* exp: Math Functions. -* expand-abbrev: Abbrev Expansion. -* expand-file-name: File Name Expansion. -* expansion of file names: File Name Expansion. -* expansion of macros: Expansion. -* expression: Intro Eval. -* expression prefix: Syntax Class Table. -* expt: Math Functions. -* extended-command-history: Minibuffer History. -* extent <1>: Extents. -* extent: Variable Scoping. -* extent children: Extent Parents. -* extent end position: Extent Endpoints. -* extent endpoint: Extent Endpoints. -* extent order: Extent Endpoints. -* extent parent: Extent Parents. -* extent priority: Intro to Extents. -* extent property: Extent Properties. -* extent replica: Duplicable Extents. -* extent start position: Extent Endpoints. -* extent, duplicable: Duplicable Extents. -* extent, unique: Duplicable Extents. -* extent-at: Finding Extents. -* extent-begin-glyph: Extent Properties. -* extent-begin-glyph-layout: Extent Properties. -* extent-children: Extent Parents. -* extent-descendants: Extent Parents. -* extent-detached-p: Detached Extents. -* extent-end-glyph: Extent Properties. -* extent-end-glyph-layout: Extent Properties. -* extent-end-position: Extent Endpoints. -* extent-face: Extent Properties. -* extent-in-region-p: Mapping Over Extents. -* extent-keymap: Extent Properties. -* extent-length: Extent Endpoints. -* extent-list: Finding Extents. -* extent-live-p: Creating and Modifying Extents. -* extent-mouse-face: Extent Properties. -* extent-object: Creating and Modifying Extents. -* extent-parent: Extent Parents. -* extent-priority: Extent Properties. -* extent-properties: Extent Properties. -* extent-property: Extent Properties. -* extent-start-position: Extent Endpoints. -* extentp: Extents. -* extents, locating: Finding Extents. -* extents, mapping: Mapping Over Extents. -* face type: Face Type. -* face-background: Face Convenience Functions. -* face-background-instance: Face Convenience Functions. -* face-background-pixmap: Face Convenience Functions. -* face-background-pixmap-instance: Face Convenience Functions. -* face-boolean-specifier-p: Specifier Types. -* face-differs-from-default-p: Other Face Display Functions. -* face-equal: Other Face Display Functions. -* face-font: Face Convenience Functions. -* face-font-instance: Face Convenience Functions. -* face-font-name: Face Convenience Functions. -* face-foreground: Face Convenience Functions. -* face-foreground-instance: Face Convenience Functions. -* face-list: Basic Face Functions. -* face-property: Face Properties. -* face-property-instance: Face Properties. -* face-underline-p: Face Convenience Functions. -* facep: Basic Face Functions. -* faces: Faces and Window-System Objects. -* fallback (in a specifier): Specifier Instancing. -* false: nil and t. -* fboundp: Function Cells. -* fceiling: Rounding Operations. -* featurep: Named Features. -* features: Named Features. -* fetch-bytecode: Dynamic Loading. -* ffloor: Rounding Operations. -* field width: Formatting Strings. -* fifth: List Elements. -* file accessibility: Testing Accessibility. -* file age: Testing Accessibility. -* file attributes: File Attributes. -* file format conversion: Format Conversion. -* file hard link: Changing File Attributes. -* file locks: File Locks. -* file mode specification error: Auto Major Mode. -* file modes and MS-DOS: Changing File Attributes. -* file modification time: Testing Accessibility. -* file name completion subroutines: File Name Completion. -* file name of buffer: Buffer File Name. -* file name of directory: Directory Names. -* file names: File Names. -* file names in directory: Contents of Directories. -* file open error: Subroutines of Visiting. -* file symbolic links: Kinds of Files. -* file types on MS-DOS: Files and MS-DOS. -* file with multiple names: Changing File Attributes. -* file-accessible-directory-p: Testing Accessibility. -* file-already-exists: Changing File Attributes. -* file-attributes: File Attributes. -* file-directory-p: Kinds of Files. -* file-error: How Programs Do Loading. -* file-executable-p: Testing Accessibility. -* file-exists-p: Testing Accessibility. -* file-local-copy: Magic File Names. -* file-locked: File Locks. -* file-locked-p: File Locks. -* file-menu-filter: Menu Filters. -* file-modes: File Attributes. -* file-name-absolute-p: Relative File Names. -* file-name-all-completions: File Name Completion. -* file-name-as-directory: Directory Names. -* file-name-buffer-file-type-alist: Files and MS-DOS. -* file-name-completion: File Name Completion. -* file-name-directory: File Name Components. -* file-name-history: Minibuffer History. -* file-name-nondirectory: File Name Components. -* file-name-sans-extension: File Name Components. -* file-name-sans-versions: File Name Components. -* file-newer-than-file-p: Testing Accessibility. -* file-newest-backup: Backup Names. -* file-nlinks: File Attributes. -* file-ownership-preserved-p: Testing Accessibility. -* file-precious-flag: Saving Buffers. -* file-readable-p: Testing Accessibility. -* file-regular-p: Kinds of Files. -* file-relative-name: File Name Expansion. -* file-supersession: Modification Time. -* file-symlink-p: Kinds of Files. -* file-truename: Truenames. -* file-writable-p: Testing Accessibility. -* fill-column: Margins. -* fill-individual-paragraphs: Filling. -* fill-individual-varying-indent: Filling. -* fill-paragraph: Filling. -* fill-paragraph-function: Filling. -* fill-prefix: Margins. -* fill-region: Filling. -* fill-region-as-paragraph: Filling. -* fillarray: Array Functions. -* filling a paragraph: Filling. -* filling, automatic: Auto Filling. -* filling, explicit: Filling. -* filter function: Filter Functions. -* find-backup-file-name: Backup Names. -* find-buffer-file-type: Files and MS-DOS. -* find-charset: Basic Charset Functions. -* find-charset-region: MULE Characters. -* find-charset-string: MULE Characters. -* find-coding-system: Basic Coding System Functions. -* find-file: Visiting Functions. -* find-file-binary: Files and MS-DOS. -* find-file-hooks: Visiting Functions. -* find-file-name-handler: Magic File Names. -* find-file-noselect: Visiting Functions. -* find-file-not-found-hooks: Visiting Functions. -* find-file-other-window: Visiting Functions. -* find-file-read-only: Visiting Functions. -* find-file-text: Files and MS-DOS. -* find-menu-item: Modifying Menus. -* finding files: Visiting Files. -* finding windows: Selecting Windows. -* first: List Elements. -* first-change-hook: Change Hooks. -* fixup-whitespace: User-Level Deletion. -* float: Numeric Conversions. -* float-output-format: Output Variables. -* floating-point numbers, printing: Output Variables. -* floatp: Predicates on Numbers. -* floor: Numeric Conversions. -* flow control characters: Flow Control. -* flush input: Peeking and Discarding. -* fmakunbound: Function Cells. -* focus-frame: Input Focus. -* following-char: Near Point. -* font instance characteristics: Font Instance Characteristics. -* font instance name: Font Instance Names. -* font instance size: Font Instance Size. -* font instance type: Font Instance Type. -* font-instance-name: Font Instance Names. -* font-instance-p: Font Instances. -* font-instance-properties: Font Instance Characteristics. -* font-instance-truename: Font Instance Names. -* font-name: Font Convenience Functions. -* font-properties: Font Convenience Functions. -* font-specifier-p <1>: Font Specifiers. -* font-specifier-p: Specifier Types. -* font-truename: Font Convenience Functions. -* fonts <1>: Fonts. -* fonts: Some Terms. -* fonts available: Font Instance Names. -* foo: A Sample Function Description. -* for: Argument Evaluation. -* force-cursor-redisplay: Refresh Screen. -* force-highlight-extent: Extents and Events. -* forcing redisplay: Waiting. -* format: Formatting Strings. -* format definition: Format Conversion. -* format of keymaps: Format of Keymaps. -* format of menus: Menu Format. -* format of the menubar: Menubar Format. -* format precision: Formatting Strings. -* format specification: Formatting Strings. -* format-alist: Format Conversion. -* format-buffers-menu-line: Buffers Menu. -* format-find-file: Format Conversion. -* format-insert-file: Format Conversion. -* format-time-string: Time Conversion. -* format-write-file: Format Conversion. -* formatting strings: Formatting Strings. -* formfeed: Character Type. -* forms: Intro Eval. -* forward-char: Character Motion. -* forward-comment: Parsing Expressions. -* forward-line: Text Lines. -* forward-list: List Motion. -* forward-sexp: List Motion. -* forward-to-indentation: Motion by Indent. -* forward-word: Word Motion. -* fourth: List Elements. -* frame: Frames. -* frame configuration: Frame Configurations. -* frame hooks: Frame Hooks. -* frame name: Frame Name. -* frame of terminal: Basic Windows. -* frame position: Size and Position. -* frame size: Size and Position. -* frame visibility: Visibility of Frames. -* frame-device: Basic Device Functions. -* frame-height: Size and Position. -* frame-icon-title-format: Frame Titles. -* frame-iconified-p: Visibility of Frames. -* frame-list: Finding All Frames. -* frame-live-p: Deleting Frames. -* frame-name: Frame Name. -* frame-pixel-height: Size and Position. -* frame-pixel-width: Size and Position. -* frame-properties: Property Access. -* frame-property: Property Access. -* frame-root-window: Frames and Windows. -* frame-selected-window: Frames and Windows. -* frame-title-format: Frame Titles. -* frame-top-window: Frames and Windows. -* frame-totally-visible-p: Visibility of Frames. -* frame-visible-p: Visibility of Frames. -* frame-width: Size and Position. -* framep: Frames. -* free list: Garbage Collection. -* frequency counts: Coverage Testing. -* fround: Rounding Operations. -* fset: Function Cells. -* ftp-login: Cleanups. -* ftruncate: Rounding Operations. -* funcall: Calling Functions. -* funcall, and debugging: Internals of Debugger. -* function <1>: Anonymous Functions. -* function: What Is a Function. -* function call: Function Forms. -* function call debugging: Function Debugging. -* function cell: Symbol Components. -* function cell in autoload: Autoload. -* function definition: Function Names. -* function descriptions: A Sample Function Description. -* function form evaluation: Function Forms. -* function input stream: Input Streams. -* function invocation: Calling Functions. -* function name: Function Names. -* function output stream: Output Streams. -* function quoting: Anonymous Functions. -* function-interactive: Using Interactive. -* function-key-map: Translating Input. -* function-obsoleteness-doc: Obsoleteness. -* functionals: Calling Functions. -* functions in modes: Major Mode Conventions. -* functions, making them interactive: Defining Commands. -* Fundamental mode: Major Modes. -* fundamental-mode: Auto Major Mode. -* fundamental-mode-abbrev-table: Standard Abbrev Tables. -* garbage collector: Garbage Collection. -* garbage-collect: Garbage Collection. -* gc-cons-threshold: Garbage Collection. -* gc-message: Garbage Collection. -* gc-pointer-glyph <1>: Garbage Collection. -* gc-pointer-glyph: Mouse Pointer. -* generate-new-buffer: Creating Buffers. -* generate-new-buffer-name: Buffer Names. -* generic-specifier-p: Specifier Types. -* get: Object Plists. -* get-buffer: Buffer Names. -* get-buffer-create: Creating Buffers. -* get-buffer-process: Process Buffers. -* get-buffer-window: Buffers and Windows. -* get-char-property: Examining Properties. -* get-char-table: Working With Char Tables. -* get-charset: Basic Charset Functions. -* get-coding-system: Basic Coding System Functions. -* get-database: Working With a Database. -* get-file-buffer: Buffer File Name. -* get-largest-window: Selecting Windows. -* get-lru-window: Selecting Windows. -* get-process: Process Information. -* get-range-char-table: Working With Char Tables. -* get-range-table: Working With Range Tables. -* get-register: Registers. -* get-text-property: Examining Properties. -* get-tooltalk-message-attribute: Elisp Interface for Sending Messages. -* getenv: System Environment. -* getf: Other Plists. -* gethash: Working With Hash Tables. -* gettext: Level 3 Primitives. -* global binding: Local Variables. -* global break condition: Global Break Condition. -* global keymap: Active Keymaps. -* global mark ring: The Mark. -* global variable: Global Variables. -* global-abbrev-table: Standard Abbrev Tables. -* global-key-binding: Functions for Key Lookup. -* global-map: Active Keymaps. -* global-mark-ring: The Mark. -* global-mode-string: Modeline Variables. -* global-popup-menu: Pop-Up Menus. -* global-set-key: Key Binding Commands. -* global-unset-key: Key Binding Commands. -* glyph type: Glyph Type. -* glyph-ascent: Glyph Dimensions. -* glyph-baseline: Glyph Convenience Functions. -* glyph-baseline-instance: Glyph Convenience Functions. -* glyph-contrib-p: Glyph Convenience Functions. -* glyph-contrib-p-instance: Glyph Convenience Functions. -* glyph-descent: Glyph Dimensions. -* glyph-face: Glyph Convenience Functions. -* glyph-height: Glyph Dimensions. -* glyph-image: Glyph Convenience Functions. -* glyph-image-instance: Glyph Convenience Functions. -* glyph-property: Glyph Properties. -* glyph-property-instance: Glyph Properties. -* glyph-type: Glyph Types. -* glyph-type-list: Glyph Types. -* glyph-width: Glyph Dimensions. -* glyphp: Glyphs. -* glyphs: Glyphs. -* goto-char: Character Motion. -* goto-line: Text Lines. -* gutter: Gutter. -* gutter-buttons-captioned-p: Other Gutter Variables. -* gutter-make-button-list: Gutter Descriptor Format. -* gutter-specifier-p: Specifying a Gutter. -* hack-local-variables: Auto Major Mode. -* handling errors: Handling Errors. -* hash notation: Printed Representation. -* hash table: Hash Tables. -* hash table type: Hash Table Type. -* hash table, weak: Weak Hash Tables. -* hash-table-count: Introduction to Hash Tables. -* hash-table-p: Hash Tables. -* hash-table-rehash-size: Introduction to Hash Tables. -* hash-table-rehash-threshold: Introduction to Hash Tables. -* hash-table-size: Introduction to Hash Tables. -* hash-table-test: Introduction to Hash Tables. -* hash-table-weakness: Introduction to Hash Tables. -* hashing: Creating Symbols. -* header comments: Library Headers. -* help for major mode: Mode Help. -* help-char: Help Functions. -* help-command: Help Functions. -* help-form: Help Functions. -* help-map <1>: Standard Keymaps. -* help-map: Help Functions. -* Helper-describe-bindings: Help Functions. -* Helper-help: Help Functions. -* Helper-help-map: Standard Keymaps. -* hide-annotation: Annotation Properties. -* highlight-extent: Extents and Events. -* history list: Minibuffer History. -* history of commands: Command History. -* HOME environment variable: Subprocess Creation. -* hooks: Hooks. -* hooks for loading: Hooks for Loading. -* hooks for text changes: Change Hooks. -* horizontal position: Columns. -* horizontal scrolling: Horizontal Scrolling. -* hscroll-glyph: Redisplay Glyphs. -* icon-glyph-p: Glyph Types. -* iconified frame: Visibility of Frames. -* iconify-frame: Visibility of Frames. -* identity: Calling Functions. -* IEEE floating point: Float Basics. -* if: Conditionals. -* ignore: Calling Functions. -* ignored-local-variables: Auto Major Mode. -* image instance type: Image Instance Type. -* image instance types: Image Instance Types. -* image instances: Image Instances. -* image instantiator conversion: Image Instantiator Conversion. -* image specifiers: Image Specifiers. -* image-instance-background: Image Instance Functions. -* image-instance-depth: Image Instance Functions. -* image-instance-domain: Image Instance Functions. -* image-instance-file-name: Image Instance Functions. -* image-instance-foreground: Image Instance Functions. -* image-instance-height: Image Instance Functions. -* image-instance-hotspot-x: Image Instance Functions. -* image-instance-hotspot-y: Image Instance Functions. -* image-instance-mask-file-name: Image Instance Functions. -* image-instance-name: Image Instance Functions. -* image-instance-p: Image Instances. -* image-instance-string: Image Instance Functions. -* image-instance-type: Image Instance Types. -* image-instance-type-list: Image Instance Types. -* image-instance-width: Image Instance Functions. -* image-instantiator-format-list: Image Specifiers. -* image-specifier-p <1>: Image Specifiers. -* image-specifier-p: Specifier Types. -* implicit progn: Sequencing. -* inc: Simple Macro. -* indent-according-to-mode: Mode-Specific Indent. -* indent-code-rigidly: Region Indent. -* indent-for-tab-command: Mode-Specific Indent. -* indent-line-function: Mode-Specific Indent. -* indent-region: Region Indent. -* indent-region-function: Region Indent. -* indent-relative: Relative Indent. -* indent-relative-maybe: Relative Indent. -* indent-rigidly: Region Indent. -* indent-tabs-mode: Primitive Indent. -* indent-to: Primitive Indent. -* indent-to-left-margin: Margins. -* indentation: Indentation. -* indenting with parentheses: Parsing Expressions. -* indirect buffers: Indirect Buffers. -* indirect specifications: Specification List. -* indirect variables: Variable Aliases. -* indirect-function: Function Indirection. -* indirect-variable: Variable Aliases. -* indirection: Function Indirection. -* infinite loops: Infinite Loops. -* infinite recursion: Local Variables. -* infinity: Float Basics. -* Info-edit-map: Standard Keymaps. -* Info-minibuffer-history: Minibuffer History. -* Info-mode-map: Standard Keymaps. -* inherit: Syntax Class Table. -* inheriting a keymap's bindings: Inheritance and Keymaps. -* inhibit-default-init: Init File. -* inhibit-file-name-handlers: Magic File Names. -* inhibit-file-name-operation: Magic File Names. -* inhibit-quit: Quitting. -* inhibit-read-only: Read Only Buffers. -* inhibit-startup-echo-area-message: Start-up Summary. -* inhibit-startup-message: Start-up Summary. -* init file: Init File. -* initial-frame-plist: Initial Properties. -* initial-gutter-spec: Other Gutter Variables. -* initial-major-mode: Auto Major Mode. -* initial-toolbar-spec: Other Toolbar Variables. -* initialization: Start-up Summary. -* inline functions: Inline Functions. -* innermost containing parentheses: Parsing Expressions. -* input events: Events. -* input focus: Input Focus. -* input modes: Input Modes. -* input stream: Input Streams. -* input-pending-p: Peeking and Discarding. -* insert: Insertion. -* insert-abbrev-table-description: Abbrev Tables. -* insert-before-markers: Insertion. -* insert-buffer: Commands for Insertion. -* insert-buffer-substring: Insertion. -* insert-char: Insertion. -* insert-default-directory: Reading File Names. -* insert-directory: Contents of Directories. -* insert-directory-program: Contents of Directories. -* insert-extent: Detached Extents. -* insert-file-contents: Reading from Files. -* insert-register: Registers. -* insert-string: Insertion. -* inserting killed text: Yank Commands. -* insertion before point: Insertion. -* insertion of text: Insertion. -* inside comment: Parsing Expressions. -* inside margin: Annotation Basics. -* inside string: Parsing Expressions. -* inst-list (in a specifier): Specifiers In-Depth. -* inst-pair (in a specifier): Specifiers In-Depth. -* installation-directory: System Environment. -* instance (in a specifier): Specifiers In-Depth. -* instancing (in a specifier): Specifiers In-Depth. -* instantiator (in a specifier): Specifiers In-Depth. -* int-char: Character Codes. -* int-to-string: String Conversion. -* integer to decimal: String Conversion. -* integer to hexadecimal: Formatting Strings. -* integer to octal: Formatting Strings. -* integer to string: String Conversion. -* integer-char-or-marker-p: Predicates on Markers. -* integer-or-char-p: Predicates for Characters. -* integer-or-marker-p: Predicates on Markers. -* integer-specifier-p: Specifier Types. -* integerp: Predicates on Numbers. -* integers: Numbers. -* interactive: Using Interactive. -* interactive call: Interactive Call. -* interactive code description: Interactive Codes. -* interactive commands (Edebug): Instrumenting. -* interactive completion: Interactive Codes. -* interactive function: Defining Commands. -* interactive, examples of using: Interactive Examples. -* interactive-p: Interactive Call. -* intern: Creating Symbols. -* intern-soft: Creating Symbols. -* internal-doc-file-name: Accessing Documentation. -* interning: Creating Symbols. -* interpreter: Evaluation. -* interpreter-mode-alist: Auto Major Mode. -* interprogram-cut-function: Low-Level Kill Ring. -* interprogram-paste-function: Low-Level Kill Ring. -* interrupt-process: Signals to Processes. -* invalid function: Function Indirection. -* invalid prefix key error: Changing Key Bindings. -* invalid-function: Function Indirection. -* invalid-read-syntax: Printed Representation. -* invalid-regexp: Syntax of Regexps. -* invert-face: Other Face Display Functions. -* invisible frame: Visibility of Frames. -* invisible text: Invisible Text. -* invisible-text-glyph: Redisplay Glyphs. -* invocation-directory: System Environment. -* invocation-name: System Environment. -* isearch-mode-map: Standard Keymaps. -* ISO Latin 1: Case Tables. -* ISO Latin-1 characters (input): Translating Input. -* iso-syntax: Case Tables. -* iso-transl: Translating Input. -* italic: Font Instance Characteristics. -* iteration: Iteration. -* itimer-edit-map: Standard Keymaps. -* joining lists: Rearrangement. -* just-one-space: User-Level Deletion. -* justify-current-line: Filling. -* kept-new-versions: Numbered Backups. -* kept-old-versions: Numbered Backups. -* key: Keymap Terminology. -* key binding: Keymap Terminology. -* key lookup: Key Lookup. -* key sequence: Key Sequence Input. -* key sequence error: Changing Key Bindings. -* key sequence input: Key Sequence Input. -* key sequences: Key Sequences. -* key translation function: Translating Input. -* key-binding: Functions for Key Lookup. -* key-description: Describing Characters. -* key-press-event-p: Event Predicates. -* key-translation-map: Translating Input. -* keyboard macro execution: Interactive Call. -* keyboard macro termination: Beeping. -* keyboard macros: Keyboard Macros. -* keyboard macros (Edebug): Edebug Execution Modes. -* keyboard menu accelerators: Menu Accelerators. -* keyboard-quit: Quitting. -* keymap: Keymaps. -* keymap entry: Key Lookup. -* keymap format: Format of Keymaps. -* keymap in keymap: Key Lookup. -* keymap inheritance: Inheritance and Keymaps. -* keymap parent: Inheritance and Keymaps. -* keymap-default-binding: Inheritance and Keymaps. -* keymap-fullness: Scanning Keymaps. -* keymap-name: Creating Keymaps. -* keymap-parents: Inheritance and Keymaps. -* keymap-prompt: Other Keymap Functions. -* keymapp: Format of Keymaps. -* keymaps in modes: Major Mode Conventions. -* keys in documentation strings: Keys in Documentation. -* keystroke: Keymap Terminology. -* keystroke command: What Is a Function. -* keywordp: Specification List. -* kill command repetition: Command Loop Info. -* kill ring: The Kill Ring. -* kill-all-local-variables: Creating Buffer-Local. -* kill-append: Low-Level Kill Ring. -* kill-buffer: Killing Buffers. -* kill-buffer-hook: Killing Buffers. -* kill-buffer-query-functions: Killing Buffers. -* kill-emacs: Killing XEmacs. -* kill-emacs-hook: Killing XEmacs. -* kill-emacs-query-functions: Killing XEmacs. -* kill-local-variable: Creating Buffer-Local. -* kill-new: Low-Level Kill Ring. -* kill-process: Signals to Processes. -* kill-region: Kill Functions. -* kill-ring: Internals of Kill Ring. -* kill-ring-max: Internals of Kill Ring. -* kill-ring-yank-pointer: Internals of Kill Ring. -* killing buffers: Killing Buffers. -* killing XEmacs: Killing XEmacs. -* lambda expression: Lambda Expressions. -* lambda expression in hook: Hooks. -* lambda in debug: Invoking the Debugger. -* lambda in keymap: Key Lookup. -* lambda list: Lambda Components. -* lambda-list (Edebug): Specification List. -* lambda-list-keywordp: Specification List. -* last-abbrev: Abbrev Expansion. -* last-abbrev-location: Abbrev Expansion. -* last-abbrev-text: Abbrev Expansion. -* last-command: Command Loop Info. -* last-command-char: Command Loop Info. -* last-command-event: Command Loop Info. -* last-input-char: Peeking and Discarding. -* last-input-event: Peeking and Discarding. -* last-kbd-macro: Keyboard Macros. -* Latin-1 character set (input): Translating Input. -* lax-plist-get: Working With Lax Plists. -* lax-plist-member: Working With Lax Plists. -* lax-plist-put: Working With Lax Plists. -* lax-plist-remprop: Working With Lax Plists. -* lax-plists-eq: Working With Lax Plists. -* lax-plists-equal: Working With Lax Plists. -* layout policy: Annotation Basics. -* layout types: Annotation Basics. -* lazy loading: Dynamic Loading. -* LDAP: LDAP Support. -* ldap-add: Low-level Operations on a LDAP Server. -* ldap-add-entries: The High-Level LDAP API. -* ldap-attribute-syntax-decoders: LDAP Internationalization Variables. -* ldap-attribute-syntax-encoders: LDAP Internationalization Variables. -* ldap-attribute-syntaxes-alist: LDAP Internationalization Variables. -* ldap-close: Opening and Closing a LDAP Connection. -* ldap-coding-system: LDAP Internationalization Variables. -* ldap-decode-address: Encoder/Decoder Functions. -* ldap-decode-attribute: LDAP Internationalization. -* ldap-decode-boolean: Encoder/Decoder Functions. -* ldap-decode-string: Encoder/Decoder Functions. -* ldap-default-attribute-decoder: LDAP Internationalization Variables. -* ldap-default-base: LDAP Variables. -* ldap-default-host: LDAP Variables. -* ldap-default-port: LDAP Variables. -* ldap-delete: Low-level Operations on a LDAP Server. -* ldap-delete-entries: The High-Level LDAP API. -* ldap-encode-address: Encoder/Decoder Functions. -* ldap-encode-boolean: Encoder/Decoder Functions. -* ldap-encode-string: Encoder/Decoder Functions. -* ldap-host: The LDAP Lisp Object. -* ldap-host-parameters-alist: LDAP Variables. -* ldap-ignore-attribute-codings: LDAP Internationalization Variables. -* ldap-live-p: The LDAP Lisp Object. -* ldap-modify: Low-level Operations on a LDAP Server. -* ldap-modify-entries: The High-Level LDAP API. -* ldap-open: Opening and Closing a LDAP Connection. -* ldap-search-basic: Low-level Operations on a LDAP Server. -* ldap-search-entries: The High-Level LDAP API. -* ldap-verbose: LDAP Variables. -* ldapp: The LDAP Lisp Object. -* left-gutter: Specifying a Gutter. -* left-gutter-visible-p: Other Gutter Variables. -* left-gutter-width: Other Gutter Variables. -* left-margin: Margins. -* left-margin-width: Margin Primitives. -* left-toolbar: Specifying the Toolbar. -* left-toolbar-visible-p: Other Toolbar Variables. -* left-toolbar-width: Other Toolbar Variables. -* length: Sequence Functions. -* let: Local Variables. -* let*: Local Variables. -* let-specifier: Adding Specifications. -* lexical binding (Edebug): Edebug Eval. -* lexical comparison: Text Comparison. -* library: Loading. -* library compilation: Compilation Functions. -* library header comments: Library Headers. -* line wrapping: Truncation. -* lines: Text Lines. -* lines in region: Text Lines. -* linking files: Changing File Attributes. -* Lisp debugger: Debugger. -* Lisp expression motion: List Motion. -* Lisp history: Lisp History. -* Lisp library: Loading. -* Lisp nesting error: Eval. -* Lisp object: Lisp Data Types. -* Lisp printer: Output Functions. -* Lisp reader: Streams Intro. -* lisp-interaction-mode-map: Standard Keymaps. -* lisp-mode-abbrev-table: Standard Abbrev Tables. -* lisp-mode-map: Standard Keymaps. -* lisp-mode.el: Example Major Modes. -* list <1>: Building Lists. -* list: Lists. -* list elements: List Elements. -* list form evaluation: Classifying Lists. -* list in keymap: Key Lookup. -* list length: Sequence Functions. -* list motion: List Motion. -* list structure: Cons Cells. -* list-buffers: The Buffer List. -* list-buffers-directory: Buffer File Name. -* list-fonts: Font Instance Names. -* list-processes: Process Information. -* listp: List-related Predicates. -* lists and cons cells: Cons Cells. -* lists as sets: Sets And Lists. -* lists represented as boxes: Lists as Boxes. -* literal evaluation: Self-Evaluating Forms. -* lmessage: The Echo Area. -* ln: Changing File Attributes. -* load: How Programs Do Loading. -* load error with require: Named Features. -* load errors: How Programs Do Loading. -* load-average: System Environment. -* load-default-sounds: Beeping. -* load-history: Unloading. -* load-ignore-elc-files: How Programs Do Loading. -* load-in-progress: How Programs Do Loading. -* load-path: How Programs Do Loading. -* load-read-function: How Programs Do Loading. -* load-sound-file: Beeping. -* load-warn-when-source-newer: How Programs Do Loading. -* load-warn-when-source-only: How Programs Do Loading. -* loading: Loading. -* loading hooks: Hooks for Loading. -* loadup.el: Building XEmacs. -* local binding: Local Variables. -* local keymap: Active Keymaps. -* local variables: Local Variables. -* local-abbrev-table: Standard Abbrev Tables. -* local-key-binding: Functions for Key Lookup. -* local-set-key: Key Binding Commands. -* local-unset-key: Key Binding Commands. -* local-variable-p: Creating Buffer-Local. -* local-write-file-hooks: Saving Buffers. -* locale (in a specifier): Specifiers In-Depth. -* locate-file: How Programs Do Loading. -* locate-file-clear-hashing: How Programs Do Loading. -* lock-buffer: File Locks. -* log: Math Functions. -* log-message-ignore-labels: The Echo Area. -* log-message-ignore-regexps: The Echo Area. -* log-message-max-size: The Echo Area. -* log-warning-minimum-level: Warnings. -* log-warning-suppressed-classes: Warnings. -* log10: Math Functions. -* logand: Bitwise Operations. -* logb: Float Basics. -* logical and: Bitwise Operations. -* logical exclusive or: Bitwise Operations. -* logical inclusive or: Bitwise Operations. -* logical not: Bitwise Operations. -* logical shift: Bitwise Operations. -* logior: Bitwise Operations. -* lognot: Bitwise Operations. -* logxor: Bitwise Operations. -* looking-at: Regexp Search. -* lookup-key: Functions for Key Lookup. -* loops, infinite: Infinite Loops. -* lower case: Character Case. -* lower-frame: Raising and Lowering. -* lowering a frame: Raising and Lowering. -* lsh: Bitwise Operations. -* lwarn: Warnings. -* M-x: Interactive Call. -* Maclisp: Lisp History. -* macro: What Is a Function. -* macro argument evaluation: Argument Evaluation. -* macro call: Expansion. -* macro call evaluation: Macro Forms. -* macro compilation: Compilation Functions. -* macro descriptions: A Sample Function Description. -* macro expansion: Expansion. -* macroexpand: Expansion. -* macros: Macros. -* magic file names: Magic File Names. -* mail-host-address: System Environment. -* major mode: Major Modes. -* major mode hook: Major Mode Conventions. -* major mode keymap: Active Keymaps. -* major-mode: Mode Help. -* make-abbrev-table: Abbrev Tables. -* make-annotation: Annotation Primitives. -* make-auto-save-file-name: Auto-Saving. -* make-backup-file-name: Backup Names. -* make-backup-files: Making Backups. -* make-bit-vector: Bit Vector Functions. -* make-boolean-specifier: Creating Specifiers. -* make-byte-code: Compiled-Function Objects. -* make-char: MULE Characters. -* make-char-table: Working With Char Tables. -* make-charset: Basic Charset Functions. -* make-coding-system: Basic Coding System Functions. -* make-color-specifier: Color Specifiers. -* make-composite-char: Composite Characters. -* make-device: Connecting to a Console or Device. -* make-directory: Create/Delete Dirs. -* make-display-table: Display Table Format. -* make-display-table-specifier: Creating Specifiers. -* make-event: Working With Events. -* make-extent: Creating and Modifying Extents. -* make-face: Basic Face Functions. -* make-face-boolean-specifier: Color Specifiers. -* make-file-part: Creating a Partial File. -* make-font-instance: Font Instances. -* make-font-specifier: Font Specifiers. -* make-frame: Creating Frames. -* make-frame-invisible: Visibility of Frames. -* make-frame-visible: Visibility of Frames. -* make-generic-specifier: Creating Specifiers. -* make-glyph: Creating Glyphs. -* make-glyph-internal: Creating Glyphs. -* make-gutter-size-specifier: Creating Gutter. -* make-gutter-specifier: Creating Gutter. -* make-gutter-visible-specifier: Creating Gutter. -* make-hash-table: Introduction to Hash Tables. -* make-icon-glyph: Creating Glyphs. -* make-image-instance: Image Instance Functions. -* make-image-specifier: Image Specifiers. -* make-indirect-buffer: Indirect Buffers. -* make-integer-specifier: Creating Specifiers. -* make-keymap: Creating Keymaps. -* make-list: Building Lists. -* make-local-hook: Hooks. -* make-local-variable: Creating Buffer-Local. -* make-marker: Creating Markers. -* make-natnum-specifier: Creating Specifiers. -* make-obsolete: Obsoleteness. -* make-obsolete-variable: Obsoleteness. -* make-pointer-glyph: Creating Glyphs. -* make-range-table: Introduction to Range Tables. -* make-reverse-direction-charset: Basic Charset Functions. -* make-sparse-keymap: Creating Keymaps. -* make-specifier: Creating Specifiers. -* make-specifier-and-init: Creating Specifiers. -* make-string: Creating Strings. -* make-symbol: Creating Symbols. -* make-symbolic-link: Changing File Attributes. -* make-syntax-table: Syntax Table Functions. -* make-temp-name: Unique File Names. -* make-toolbar-specifier: Creating Toolbar. -* make-tooltalk-message: Elisp Interface for Sending Messages. -* make-tooltalk-pattern: Elisp Interface for Receiving Messages. -* make-tty-device: Connecting to a Console or Device. -* make-variable-buffer-local: Creating Buffer-Local. -* make-vector: Vector Functions. -* make-weak-list: Weak Lists. -* make-x-device: Connecting to a Console or Device. -* makunbound: Void Variables. -* Manual-page-minibuffer-history: Minibuffer History. -* map-char-table: Working With Char Tables. -* map-database: Working With a Database. -* map-extent-children: Mapping Over Extents. -* map-extents: Mapping Over Extents. -* map-frame-hook: Frame Hooks. -* map-keymap: Scanning Keymaps. -* map-range-table: Working With Range Tables. -* map-specifier: Other Specification Functions. -* map-y-or-n-p: Multiple Queries. -* mapatoms: Creating Symbols. -* mapcar: Mapping Functions. -* mapcar-extents: Mapping Over Extents. -* mapconcat: Mapping Functions. -* maphash: Working With Hash Tables. -* mapping functions: Mapping Functions. -* margin: Annotation Basics. -* margin width: Margin Primitives. -* mark: The Mark. -* mark excursion: Excursions. -* mark ring: The Mark. -* mark, the: The Mark. -* mark-marker: The Mark. -* mark-ring: The Mark. -* mark-ring-max: The Mark. -* marker argument: Interactive Codes. -* marker garbage collection: Overview of Markers. -* marker input stream: Input Streams. -* marker output stream: Output Streams. -* marker relocation: Overview of Markers. -* marker-buffer: Information from Markers. -* marker-position: Information from Markers. -* markerp: Predicates on Markers. -* markers: Markers. -* markers as numbers: Overview of Markers. -* markers vs. extents: Overview of Markers. -* match data: Match Data. -* match-beginning: Simple Match Data. -* match-data: Entire Match Data. -* match-end: Simple Match Data. -* match-string: Simple Match Data. -* mathematical functions: Math Functions. -* max: Comparison of Numbers. -* max-lisp-eval-depth: Eval. -* max-specpdl-size: Local Variables. -* md5: Transformations. -* MD5 digests: Transformations. -* member: Sets And Lists. -* membership in a list: Sets And Lists. -* memory allocation: Garbage Collection. -* memory-limit: Garbage Collection. -* memq: Sets And Lists. -* menu: Menus. -* menu accelerators: Menu Accelerators. -* menu filters: Menu Filters. -* menu format: Menu Format. -* menu-accelerator-enabled: Menu Accelerator Functions. -* menu-accelerator-map: Menu Accelerator Functions. -* menu-accelerator-modifiers: Menu Accelerator Functions. -* menu-accelerator-prefix: Menu Accelerator Functions. -* menu-no-selection-hook: Menubar. -* menubar: Menubar. -* menubar format: Menubar Format. -* menubar-configuration: Menu Format. -* menubar-pointer-glyph: Mouse Pointer. -* menubar-show-keybindings: Menubar. -* message: The Echo Area. -* meta character printing: Describing Characters. -* meta-prefix-char: Functions for Key Lookup. -* min: Comparison of Numbers. -* minibuffer: Minibuffers. -* minibuffer history: Minibuffer History. -* minibuffer input: Recursive Editing. -* minibuffer window: Cyclic Window Ordering. -* minibuffer-complete: Completion Commands. -* minibuffer-complete-and-exit: Completion Commands. -* minibuffer-complete-word: Completion Commands. -* minibuffer-completion-confirm: Completion Commands. -* minibuffer-completion-help: Completion Commands. -* minibuffer-completion-predicate: Completion Commands. -* minibuffer-completion-table: Completion Commands. -* minibuffer-depth: Minibuffer Misc. -* minibuffer-exit-hook: Minibuffer Misc. -* minibuffer-frame-plist: Initial Properties. -* minibuffer-help-form: Minibuffer Misc. -* minibuffer-history: Minibuffer History. -* minibuffer-local-completion-map <1>: Standard Keymaps. -* minibuffer-local-completion-map: Completion Commands. -* minibuffer-local-isearch-map: Standard Keymaps. -* minibuffer-local-map <1>: Standard Keymaps. -* minibuffer-local-map: Text from Minibuffer. -* minibuffer-local-must-match-map <1>: Standard Keymaps. -* minibuffer-local-must-match-map: Completion Commands. -* minibuffer-prompt: Minibuffer Misc. -* minibuffer-prompt-width: Minibuffer Misc. -* minibuffer-scroll-window: Minibuffer Misc. -* minibuffer-setup-hook: Minibuffer Misc. -* minibuffer-window: Minibuffer Misc. -* minibuffer-window-active-p: Minibuffer Misc. -* minimum window size: Resizing Windows. -* minor mode: Minor Modes. -* minor mode conventions: Minor Mode Conventions. -* minor-mode-alist: Modeline Variables. -* minor-mode-key-binding: Functions for Key Lookup. -* minor-mode-map-alist: Active Keymaps. -* misc-user-event-p: Event Predicates. -* mod: Arithmetic Operations. -* mode: Modes. -* mode help: Mode Help. -* mode hook: Major Mode Conventions. -* mode loading: Major Mode Conventions. -* mode variable: Minor Mode Conventions. -* mode-class property: Major Mode Conventions. -* mode-name: Modeline Variables. -* mode-popup-menu: Pop-Up Menus. -* mode-specific-map <1>: Standard Keymaps. -* mode-specific-map: Prefix Keys. -* modeline: Modeline Format. -* modeline construct: Modeline Data. -* modeline-buffer-identification: Modeline Variables. -* modeline-format: Modeline Data. -* modeline-map <1>: Standard Keymaps. -* modeline-map: Active Keymaps. -* modeline-modified: Modeline Variables. -* modeline-pointer-glyph: Mouse Pointer. -* modeline-process: Modeline Variables. -* modification flag (of buffer): Buffer Modification. -* modification of lists: Rearrangement. -* modification time, comparison of: Modification Time. -* modify-syntax-entry: Syntax Table Functions. -* modulus: Arithmetic Operations. -* momentary-string-display: Temporary Displays. -* mono-pixmap-image-instance-p: Image Instance Types. -* motion-event-p: Event Predicates. -* mouse cursor: Mouse Pointer. -* mouse pointer: Mouse Pointer. -* mouse-event-p: Event Predicates. -* mouse-grabbed-buffer: Active Keymaps. -* mouse-highlight-priority: Extents and Events. -* move-marker: Changing Markers. -* move-to-column: Columns. -* move-to-left-margin: Margins. -* move-to-window-line: Screen Lines. -* MS-DOS and file modes: Changing File Attributes. -* MS-DOS file types: Files and MS-DOS. -* MSWindows OLE: MSWindows OLE. -* multilingual string formatting: Formatting Strings. -* multiple windows: Basic Windows. -* named function: Function Names. -* NaN: Float Basics. -* narrow-to-page: Narrowing. -* narrow-to-region: Narrowing. -* narrowing: Narrowing. -* natnum-specifier-p: Specifier Types. -* natnump: Predicates on Numbers. -* natural numbers: Predicates on Numbers. -* nconc: Rearrangement. -* negative infinity: Float Basics. -* negative-argument: Prefix Command Arguments. -* network connection: Network. -* new file message: Subroutines of Visiting. -* newline <1>: Commands for Insertion. -* newline: Character Type. -* newline and Auto Fill mode: Commands for Insertion. -* newline in print: Output Functions. -* newline in strings: String Type. -* newline-and-indent: Mode-Specific Indent. -* next input: Peeking and Discarding. -* next-command-event: Reading One Event. -* next-event: Reading One Event. -* next-extent: Finding Extents. -* next-frame: Finding All Frames. -* next-history-element: Minibuffer Misc. -* next-matching-history-element: Minibuffer Misc. -* next-property-change: Property Search. -* next-screen-context-lines: Vertical Scrolling. -* next-single-property-change: Property Search. -* next-window: Cyclic Window Ordering. -* nil: Constant Variables. -* nil and lists: Cons Cells. -* nil in keymap: Key Lookup. -* nil in lists: Cons Cell Type. -* nil input stream: Input Streams. -* nil output stream: Output Streams. -* nil, uses of: nil and t. -* ninth: List Elements. -* nlistp: List-related Predicates. -* no-catch: Catch and Throw. -* no-redraw-on-reenter: Refresh Screen. -* nondirectory part (of file name): File Name Components. -* noninteractive: Batch Mode. -* noninteractive use: Batch Mode. -* nonlocal exits: Nonlocal Exits. -* nonprinting characters, reading: Quoted Character Input. -* nontext-pointer-glyph: Mouse Pointer. -* normal-mode: Auto Major Mode. -* not: Combining Conditions. -* not-modified: Buffer Modification. -* nothing-image-instance-p: Image Instance Types. -* nreverse: Rearrangement. -* nth: List Elements. -* nthcdr: List Elements. -* null: List-related Predicates. -* number equality: Comparison of Numbers. -* number-char-or-marker-p: Predicates on Markers. -* number-or-marker-p: Predicates on Markers. -* number-to-string: String Conversion. -* numberp: Predicates on Numbers. -* numbers: Numbers. -* numeric prefix: Formatting Strings. -* numeric prefix argument: Prefix Command Arguments. -* numeric prefix argument usage: Interactive Codes. -* obarray: Creating Symbols. -* obarray in completion: Basic Completion. -* objc-mode-map: Standard Keymaps. -* object: Lisp Data Types. -* object to string: Output Functions. -* object-plist: Object Plists. -* oblique: Font Instance Characteristics. -* obsolete buffer: Modification Time. -* occur-mode-map: Standard Keymaps. -* octal character code: Character Type. -* octal character input: Quoted Character Input. -* octal-escape-glyph: Redisplay Glyphs. -* OffiX DND: OffiX DND. -* old-eq: Equality Predicates. -* one-window-p: Splitting Windows. -* only-global-abbrevs: Defining Abbrevs. -* open-database: Connecting to a Database. -* open-dribble-file: Recording Input. -* open-network-stream: Network. -* open-termscript: Terminal Output. -* open parenthesis character: Syntax Class Table. -* operating system environment: System Environment. -* option descriptions: A Sample Variable Description. -* optional arguments: Argument List. -* options on command line: Command Line Arguments. -* or: Combining Conditions. -* order of extents: Extent Endpoints. -* ordering of windows, cyclic: Cyclic Window Ordering. -* other-buffer: The Buffer List. -* other-window: Cyclic Window Ordering. -* other-window-scroll-buffer: Vertical Scrolling. -* Outline mode: Substitution. -* output from processes: Output from Processes. -* output stream: Output Streams. -* outside margin: Annotation Basics. -* overflow: Integer Basics. -* overlay arrow: Overlay Arrow. -* overlay-arrow-position: Overlay Arrow. -* overlay-arrow-string: Overlay Arrow. -* overriding-local-map <1>: Standard Keymaps. -* overriding-local-map: Active Keymaps. -* overriding-terminal-local-map: Active Keymaps. -* overwrite-mode: Commands for Insertion. -* padding: Formatting Strings. -* page-delimiter: Standard Regexps. -* paired delimiter: Syntax Class Table. -* paragraph-separate: Standard Regexps. -* paragraph-start: Standard Regexps. -* parent of a keymap: Inheritance and Keymaps. -* parent process: Processes. -* parent, of extent: Extent Parents. -* parenthesis: Cons Cell Type. -* parenthesis depth: Parsing Expressions. -* parenthesis matching: Blinking. -* parenthesis syntax: Syntax Class Table. -* parse state: Parsing Expressions. -* parse-partial-sexp: Parsing Expressions. -* parse-sexp-ignore-comments: Parsing Expressions. -* parsing: Syntax Tables. -* partial files: Partial Files. -* passwd-echo: Reading a Password. -* passwd-invert-frame-when-keyboard-grabbed: Reading a Password. -* passwords, reading: Reading a Password. -* PATH environment variable: Subprocess Creation. -* path-separator: System Environment. -* pausing: Waiting. -* peeking at input: Peeking and Discarding. -* percent symbol in modeline: Modeline Data. -* perform-replace: Search and Replace. -* performance analysis: Coverage Testing. -* permanent local variable: Creating Buffer-Local. -* permission: File Attributes. -* pg-coding-system: libpq Lisp Variables. -* pg:authtype: libpq Lisp Variables. -* pg:client-encoding: libpq Lisp Variables. -* pg:cost-heap: libpq Lisp Variables. -* pg:cost-index: libpq Lisp Variables. -* pg:database: libpq Lisp Variables. -* pg:date-style: libpq Lisp Variables. -* pg:geqo: libpq Lisp Variables. -* pg:host: libpq Lisp Variables. -* pg:options: libpq Lisp Variables. -* pg:port: libpq Lisp Variables. -* pg:realm: libpq Lisp Variables. -* pg:tty: libpq Lisp Variables. -* pg:tz: libpq Lisp Variables. -* pg:user: libpq Lisp Variables. -* pgres::polling-active: libpq Lisp Symbols and DataTypes. -* pgres::polling-failed: libpq Lisp Symbols and DataTypes. -* pgres::polling-ok: libpq Lisp Symbols and DataTypes. -* pgres::polling-reading: libpq Lisp Symbols and DataTypes. -* pgres::polling-writing: libpq Lisp Symbols and DataTypes. -* pipes: Asynchronous Processes. -* play-sound: Beeping. -* play-sound-file: Beeping. -* plist: Property Lists. -* plist, symbol: Symbol Properties. -* plist-get: Working With Normal Plists. -* plist-member: Working With Normal Plists. -* plist-put: Working With Normal Plists. -* plist-remprop: Working With Normal Plists. -* plist-to-alist: Converting Plists To/From Alists. -* plists-eq <1>: Other Plists. -* plists-eq: Working With Normal Plists. -* plists-equal <1>: Other Plists. -* plists-equal: Working With Normal Plists. -* point: Point. -* point excursion: Excursions. -* point in window: Window Point. -* point with narrowing: Point. -* point-marker: Creating Markers. -* point-max: Point. -* point-max-marker: Creating Markers. -* point-min: Point. -* point-min-marker: Creating Markers. -* pointer (mouse): Mouse Pointer. -* pointer-glyph-p: Glyph Types. -* pointer-image-instance-p: Image Instance Types. -* pop-global-mark: The Mark. -* pop-mark: The Mark. -* pop-to-buffer: Displaying Buffers. -* pop-up menu: Pop-Up Menus. -* pop-up-frame-function: Choosing Window. -* pop-up-frame-plist: Choosing Window. -* pop-up-frames: Choosing Window. -* pop-up-windows: Choosing Window. -* popup-buffer-menu: Pop-Up Menus. -* popup-dialog-box: Dialog Box Functions. -* popup-menu: Pop-Up Menus. -* popup-menu-titles: Pop-Up Menus. -* popup-menu-up-p: Pop-Up Menus. -* popup-menubar-menu: Pop-Up Menus. -* popup-mode-menu: Pop-Up Menus. -* pos-visible-in-window-p: Window Start. -* position (in buffer): Positions. -* position argument: Interactive Codes. -* position in window: Window Point. -* position of frame: Size and Position. -* position of window: Position of Window. -* positive infinity: Float Basics. -* posix-looking-at: POSIX Regexps. -* posix-search-backward: POSIX Regexps. -* posix-search-forward: POSIX Regexps. -* posix-string-match: POSIX Regexps. -* post-command-hook: Command Overview. -* post-gc-hook: Garbage Collection. -* PostgreSQL: PostgreSQL Support. -* pq-binary-tuples: libpq Lisp Symbols and DataTypes. -* pq-clear: Other libpq Functions. -* pq-client-encoding: Other libpq Functions. -* pq-cmd-status: libpq Lisp Symbols and DataTypes. -* pq-cmd-tuples: libpq Lisp Symbols and DataTypes. -* pq-conn-defaults: Other libpq Functions. -* pq-connect-poll: Asynchronous Interface Functions. -* pq-connect-start: Asynchronous Interface Functions. -* pq-connectdb: Synchronous Interface Functions. -* pq-consume-input: Asynchronous Interface Functions. -* pq-env-2-encoding: Other libpq Functions. -* pq-exec: Synchronous Interface Functions. -* pq-finish: Other libpq Functions. -* pq-flush: Asynchronous Interface Functions. -* pq-fmod: libpq Lisp Symbols and DataTypes. -* pq-fname: libpq Lisp Symbols and DataTypes. -* pq-fnumber: libpq Lisp Symbols and DataTypes. -* pq-fsize: libpq Lisp Symbols and DataTypes. -* pq-ftype: libpq Lisp Symbols and DataTypes. -* pq-get-is-null: libpq Lisp Symbols and DataTypes. -* pq-get-length: libpq Lisp Symbols and DataTypes. -* pq-get-result: Asynchronous Interface Functions. -* pq-get-value: libpq Lisp Symbols and DataTypes. -* pq-is-busy: Asynchronous Interface Functions. -* pq-is-nonblocking: Asynchronous Interface Functions. -* pq-lo-close: Unimplemented libpq Functions. -* pq-lo-creat: Unimplemented libpq Functions. -* pq-lo-export: Large Object Support. -* pq-lo-import: Large Object Support. -* pq-lo-lseek: Unimplemented libpq Functions. -* pq-lo-open: Unimplemented libpq Functions. -* pq-lo-read: Unimplemented libpq Functions. -* pq-lo-tell: Unimplemented libpq Functions. -* pq-lo-unlink: Unimplemented libpq Functions. -* pq-lo-write: Unimplemented libpq Functions. -* pq-make-empty-pgresult: libpq Lisp Symbols and DataTypes. -* pq-nfields: libpq Lisp Symbols and DataTypes. -* pq-notifies: Synchronous Interface Functions. -* pq-ntuples: libpq Lisp Symbols and DataTypes. -* pq-oid-value: libpq Lisp Symbols and DataTypes. -* pq-pgconn: libpq Lisp Symbols and DataTypes. -* pq-res-status: libpq Lisp Symbols and DataTypes. -* pq-reset: Synchronous Interface Functions. -* pq-reset-cancel: Asynchronous Interface Functions. -* pq-reset-poll: Asynchronous Interface Functions. -* pq-reset-start: Asynchronous Interface Functions. -* pq-result-error-message: libpq Lisp Symbols and DataTypes. -* pq-result-status: libpq Lisp Symbols and DataTypes. -* pq-send-query: Asynchronous Interface Functions. -* pq-set-client-encoding: Other libpq Functions. -* pq-set-nonblocking: Asynchronous Interface Functions. -* PQdisplayTuples: Unimplemented libpq Functions. -* PQmblen: Unimplemented libpq Functions. -* PQprint: Unimplemented libpq Functions. -* PQprintTuples: Unimplemented libpq Functions. -* PQsetenv: Synchronous Interface Functions. -* PQsetenvAbort: Asynchronous Interface Functions. -* PQsetenvPoll: Asynchronous Interface Functions. -* PQsetenvStart: Asynchronous Interface Functions. -* PQsocket: Unimplemented libpq Functions. -* PQtrace: Unimplemented libpq Functions. -* PQuntrace: Unimplemented libpq Functions. -* pre-abbrev-expand-hook: Abbrev Expansion. -* pre-command-hook: Command Overview. -* pre-gc-hook: Garbage Collection. -* preceding-char: Near Point. -* precision of formatted numbers: Formatting Strings. -* predicates: Type Predicates. -* prefix argument: Prefix Command Arguments. -* prefix argument unreading: Peeking and Discarding. -* prefix command: Prefix Keys. -* prefix key: Prefix Keys. -* prefix-arg: Prefix Command Arguments. -* prefix-help-command: Help Functions. -* prefix-numeric-value: Prefix Command Arguments. -* preventing backtracking: Specification List. -* preventing prefix key: Key Lookup. -* previous complete subexpression: Parsing Expressions. -* previous-extent: Finding Extents. -* previous-frame: Finding All Frames. -* previous-history-element: Minibuffer Misc. -* previous-matching-history-element: Minibuffer Misc. -* previous-property-change: Property Search. -* previous-single-property-change: Property Search. -* previous-window: Cyclic Window Ordering. -* primitive: What Is a Function. -* primitive type: Lisp Data Types. -* primitive types: Primitive Types. -* primitive-undo: Undo. -* prin1: Output Functions. -* prin1-to-string: Output Functions. -* princ: Output Functions. -* print: Output Functions. -* print example: Output Streams. -* print name cell: Symbol Components. -* print-escape-newlines: Output Variables. -* print-gensym: Output Variables. -* print-help-return-message: Help Functions. -* print-length: Output Variables. -* print-level: Output Variables. -* print-readably <1>: Output Variables. -* print-readably: Printing in Edebug. -* print-string-length: Output Variables. -* printed representation: Printed Representation. -* printed representation for characters: Character Type. -* printing: Streams Intro. -* printing (Edebug): Printing in Edebug. -* printing circular structures: Printing in Edebug. -* printing floating-point numbers: Output Variables. -* printing limits: Output Variables. -* printing notation: Printing Notation. -* printing readably: Output Variables. -* printing uninterned symbols: Output Variables. -* priority of an extent: Intro to Extents. -* process: Processes. -* process filter: Filter Functions. -* process input: Input to Processes. -* process output: Output from Processes. -* process sentinel: Sentinels. -* process signals: Signals to Processes. -* process window size: Process Window Size. -* process-buffer: Process Buffers. -* process-command: Process Information. -* process-connection-type: Asynchronous Processes. -* process-environment: System Environment. -* process-event-p: Event Predicates. -* process-exit-status: Process Information. -* process-filter: Filter Functions. -* process-id: Process Information. -* process-kill-without-query: Deleting Processes. -* process-kill-without-query-p: Process Information. -* process-list: Process Information. -* process-mark: Process Buffers. -* process-name: Process Information. -* process-send-eof: Input to Processes. -* process-send-region: Input to Processes. -* process-send-signal: Signals to Processes. -* process-send-string: Input to Processes. -* process-sentinel: Sentinels. -* process-status: Process Information. -* process-tty-name: Process Information. -* processp: Processes. -* profile.el: Compilation Tips. -* profiling: Compilation Tips. -* prog1: Sequencing. -* prog2: Sequencing. -* progn: Sequencing. -* program arguments: Subprocess Creation. -* program directories: Subprocess Creation. -* programmed completion: Programmed Completion. -* programming types: Programming Types. -* properties of strings: String Properties. -* properties of text: Text Properties. -* property list: Property Lists. -* property list cell (symbol): Symbol Components. -* property list, symbol: Symbol Properties. -* property lists vs association lists: Plists and Alists. -* property of an extent: Extent Properties. -* protected forms: Cleanups. -* provide: Named Features. -* providing features: Named Features. -* PTYs: Asynchronous Processes. -* punctuation character: Syntax Class Table. -* pure storage: Pure Storage. -* pure-bytes-used: Pure Storage. -* purecopy: Pure Storage. -* purify-flag: Pure Storage. -* push-mark: The Mark. -* put: Object Plists. -* put-char-table: Working With Char Tables. -* put-database: Working With a Database. -* put-range-table: Working With Range Tables. -* put-text-property: Changing Properties. -* putf: Other Plists. -* puthash: Working With Hash Tables. -* query-replace-history: Minibuffer History. -* query-replace-map <1>: Standard Keymaps. -* query-replace-map: Search and Replace. -* querying the user: Yes-or-No Queries. -* question mark in character constant: Character Type. -* quietly-read-abbrev-file: Abbrev Files. -* quit-flag: Quitting. -* quit-process: Signals to Processes. -* quitting: Quitting. -* quitting from infinite loop: Infinite Loops. -* quote: Quoting. -* quote character: Parsing Expressions. -* quoted character input: Quoted Character Input. -* quoted-insert suppression: Changing Key Bindings. -* quoting: Quoting. -* quoting characters in printing: Output Functions. -* quoting using apostrophe: Quoting. -* raise-frame: Raising and Lowering. -* raising a frame: Raising and Lowering. -* random: Random Numbers. -* random numbers: Random Numbers. -* range table type: Range Table Type. -* Range Tables: Range Tables. -* range-table-p: Range Tables. -* rassoc: Association Lists. -* rassq: Association Lists. -* raw prefix argument: Prefix Command Arguments. -* raw prefix argument usage: Interactive Codes. -* re-search-backward: Regexp Search. -* re-search-forward: Regexp Search. -* read: Input Functions. -* read command name: Interactive Call. -* read syntax: Printed Representation. -* read syntax for characters: Character Type. -* read-buffer: High-Level Completion. -* read-char: Reading One Event. -* read-command: High-Level Completion. -* read-expression: Object from Minibuffer. -* read-expression-history: Minibuffer History. -* read-expression-map: Standard Keymaps. -* read-file-name: Reading File Names. -* read-from-minibuffer: Text from Minibuffer. -* read-from-string: Input Functions. -* read-key-sequence: Key Sequence Input. -* read-minibuffer: Object from Minibuffer. -* read-only buffer: Read Only Buffers. -* read-only buffers in interactive: Using Interactive. -* read-passwd: Reading a Password. -* read-quoted-char: Quoted Character Input. -* read-quoted-char quitting: Quitting. -* read-shell-command-map: Standard Keymaps. -* read-string: Text from Minibuffer. -* read-variable: High-Level Completion. -* reading: Streams Intro. -* reading (Edebug): Reading in Edebug. -* reading interactive arguments: Interactive Codes. -* reading symbols: Creating Symbols. -* rearrangement of lists: Rearrangement. -* rebinding: Changing Key Bindings. -* receiving ToolTalk messages: Receiving Messages. -* recent-auto-save-p: Auto-Saving. -* recent-keys: Recording Input. -* recent-keys-ring-size: Recording Input. -* recenter: Vertical Scrolling. -* record command history: Interactive Call. -* recursion: Iteration. -* recursion-depth: Recursive Editing. -* recursive command loop: Recursive Editing. -* recursive editing level: Recursive Editing. -* recursive evaluation: Intro Eval. -* recursive-edit: Recursive Editing. -* redo: Undo. -* redraw-display: Refresh Screen. -* redraw-frame: Refresh Screen. -* redraw-modeline: Modeline Format. -* refresh display: Refresh Screen. -* regexp: Regular Expressions. -* regexp alternative: Syntax of Regexps. -* regexp grouping: Syntax of Regexps. -* regexp searching: Regexp Search. -* regexp-history: Minibuffer History. -* regexp-quote: Syntax of Regexps. -* regexps used standardly in editing: Standard Regexps. -* region argument: Interactive Codes. -* region, the: The Region. -* region-active-p: The Region. -* region-beginning: The Region. -* region-end: The Region. -* region-exists-p: The Region. -* register-alist: Registers. -* register-ccl-program: Calling CCL. -* register-tooltalk-pattern: Elisp Interface for Receiving Messages. -* registers: Registers. -* regular expression: Regular Expressions. -* regular expression searching: Regexp Search. -* reindent-then-newline-and-indent: Mode-Specific Indent. -* relabel-menu-item: Modifying Menus. -* relative file name: Relative File Names. -* remainder: Arithmetic Operations. -* remassoc: Association Lists. -* remassq: Association Lists. -* remhash: Working With Hash Tables. -* remove-database: Working With a Database. -* remove-face-property: Face Properties. -* remove-glyph-property: Glyph Properties. -* remove-hook: Hooks. -* remove-range-table: Working With Range Tables. -* remove-specifier: Other Specification Functions. -* remove-text-properties: Changing Properties. -* remprop: Object Plists. -* remrassoc: Association Lists. -* remrassq: Association Lists. -* rename-auto-save-file: Auto-Saving. -* rename-buffer: Buffer Names. -* rename-file: Changing File Attributes. -* renaming files: Changing File Attributes. -* repeated loading: Repeated Loading. -* replace bindings: Changing Key Bindings. -* replace characters: Substitution. -* replace-buffer-in-windows: Displaying Buffers. -* replace-match: Replacing Match. -* replacement: Search and Replace. -* repositioning format arguments: Formatting Strings. -* require: Named Features. -* require-final-newline: Saving Buffers. -* requiring features: Named Features. -* reset-char-table: Working With Char Tables. -* resize redisplay: Size and Position. -* rest arguments: Argument List. -* restriction (in a buffer): Narrowing. -* resume (cf. no-redraw-on-reenter): Refresh Screen. -* return: Character Type. -* return-tooltalk-message: Elisp Interface for Sending Messages. -* reveal-annotation: Annotation Properties. -* reverse: Building Lists. -* reversing a list: Rearrangement. -* revert-buffer: Reverting. -* revert-buffer-function: Reverting. -* revert-buffer-insert-file-contents-function: Reverting. -* right-gutter: Specifying a Gutter. -* right-gutter-visible-p: Other Gutter Variables. -* right-gutter-width: Other Gutter Variables. -* right-margin-width: Margin Primitives. -* right-toolbar: Specifying the Toolbar. -* right-toolbar-visible-p: Other Toolbar Variables. -* right-toolbar-width: Other Toolbar Variables. -* rm: Changing File Attributes. -* round: Numeric Conversions. -* rounding in conversions: Numeric Conversions. -* rounding without conversion: Rounding Operations. -* rplaca: Modifying Lists. -* rplacd: Modifying Lists. -* run time stack: Internals of Debugger. -* run-emacs-from-temacs: Building XEmacs. -* run-hooks: Hooks. -* runnable temacs: Building XEmacs. -* same-window-buffer-names: Choosing Window. -* same-window-regexps: Choosing Window. -* save-abbrevs: Abbrev Files. -* save-buffer: Saving Buffers. -* save-current-buffer: Excursions. -* save-excursion: Excursions. -* save-excursion (Edebug): Edebug Display Update. -* save-match-data: Saving Match Data. -* save-restriction: Narrowing. -* save-selected-frame: Input Focus. -* save-selected-window <1>: Excursions. -* save-selected-window: Selecting Windows. -* save-some-buffers: Saving Buffers. -* save-window-excursion: Window Configurations. -* saving text properties: Saving Properties. -* saving window information: Window Configurations. -* scan-lists: Parsing Expressions. -* scan-sexps: Parsing Expressions. -* scope: Variable Scoping. -* screen layout: Window Configuration Type. -* scroll-conservatively: Vertical Scrolling. -* scroll-down: Vertical Scrolling. -* scroll-left: Horizontal Scrolling. -* scroll-other-window: Vertical Scrolling. -* scroll-right: Horizontal Scrolling. -* scroll-step: Vertical Scrolling. -* scroll-up: Vertical Scrolling. -* scrollbar-pointer-glyph: Mouse Pointer. -* scrollbars: Scrollbars. -* scrolling vertically: Vertical Scrolling. -* search-backward: String Search. -* search-failed: String Search. -* search-forward: String Search. -* searching: Searching and Matching. -* searching and case: Searching and Case. -* searching for regexp: Regexp Search. -* second: List Elements. -* select-console: The Selected Console and Device. -* select-device: The Selected Console and Device. -* select-frame: Input Focus. -* select-frame-hook: Frame Hooks. -* select-window: Selecting Windows. -* selected frame: Input Focus. -* selected window: Basic Windows. -* selected-console: The Selected Console and Device. -* selected-device: The Selected Console and Device. -* selected-frame: Input Focus. -* selected-window: Selecting Windows. -* selecting a buffer: Current Buffer. -* selecting windows: Selecting Windows. -* selection (for X windows): X Selections. -* selection-pointer-glyph: Mouse Pointer. -* selective display: Selective Display. -* selective-display: Selective Display. -* selective-display-ellipses: Selective Display. -* self-evaluating form: Self-Evaluating Forms. -* self-insert-and-exit: Minibuffer Misc. -* self-insert-command: Commands for Insertion. -* self-insert-command override: Changing Key Bindings. -* self-insert-command, minor modes: Keymaps and Minor Modes. -* self-insertion: Commands for Insertion. -* send-string-to-terminal: Terminal Output. -* send-tooltalk-message: Elisp Interface for Sending Messages. -* sending signals: Signals to Processes. -* sending ToolTalk messages: Sending Messages. -* sentence-end: Standard Regexps. -* sentinel: Sentinels. -* sequence: Sequences Arrays Vectors. -* sequence length: Sequence Functions. -* sequencep: Sequence Functions. -* set: Setting Variables. -* set-annotation-action: Annotation Properties. -* set-annotation-data: Annotation Properties. -* set-annotation-down-glyph: Annotation Properties. -* set-annotation-face: Annotation Properties. -* set-annotation-glyph: Annotation Properties. -* set-annotation-layout: Annotation Properties. -* set-annotation-menu: Annotation Properties. -* set-auto-mode: Auto Major Mode. -* set-buffer: Current Buffer. -* set-buffer-auto-saved: Auto-Saving. -* set-buffer-major-mode: Auto Major Mode. -* set-buffer-menubar: Menubar. -* set-buffer-modified-p: Buffer Modification. -* set-case-syntax: Case Tables. -* set-case-syntax-delims: Case Tables. -* set-case-syntax-pair: Case Tables. -* set-case-table: Case Tables. -* set-category-table: Category Tables. -* set-charset-ccl-program: Charset Property Functions. -* set-coding-category-system: Detection of Textual Encoding. -* set-coding-priority-list: Detection of Textual Encoding. -* set-console-type-image-conversion-list: Image Instantiator Conversion. -* set-default: Default Value. -* set-default-file-modes: Changing File Attributes. -* set-default-gutter-position: Specifying a Gutter. -* set-default-toolbar-position: Specifying the Toolbar. -* set-device-baud-rate <1>: Terminal Output. -* set-device-baud-rate: Console and Device I/O. -* set-extent-begin-glyph: Extent Properties. -* set-extent-begin-glyph-layout: Extent Properties. -* set-extent-end-glyph: Extent Properties. -* set-extent-end-glyph-layout: Extent Properties. -* set-extent-endpoints: Extent Endpoints. -* set-extent-face: Extent Properties. -* set-extent-initial-redisplay-function: Extent Properties. -* set-extent-keymap: Extent Properties. -* set-extent-mouse-face: Extent Properties. -* set-extent-parent: Extent Parents. -* set-extent-priority: Extent Properties. -* set-extent-properties: Extent Properties. -* set-extent-property: Extent Properties. -* set-face-background: Face Convenience Functions. -* set-face-background-pixmap: Face Convenience Functions. -* set-face-font: Face Convenience Functions. -* set-face-foreground: Face Convenience Functions. -* set-face-property: Face Properties. -* set-face-underline-p: Face Convenience Functions. -* set-file-modes: Changing File Attributes. -* set-frame-configuration: Frame Configurations. -* set-frame-pointer: Mouse Pointer. -* set-frame-position: Size and Position. -* set-frame-properties: Property Access. -* set-frame-property: Property Access. -* set-frame-size: Size and Position. -* set-glyph-baseline: Glyph Convenience Functions. -* set-glyph-contrib-p: Glyph Convenience Functions. -* set-glyph-face: Glyph Convenience Functions. -* set-glyph-image: Glyph Convenience Functions. -* set-glyph-property: Glyph Properties. -* set-input-mode: Input Modes. -* set-keymap-default-binding: Inheritance and Keymaps. -* set-keymap-name: Creating Keymaps. -* set-keymap-parents: Inheritance and Keymaps. -* set-keymap-prompt: Other Keymap Functions. -* set-left-margin: Margins. -* set-mark: The Mark. -* set-marker: Changing Markers. -* set-match-data: Entire Match Data. -* set-menubar: Menubar. -* set-menubar-dirty-flag: Menubar. -* set-process-buffer: Process Buffers. -* set-process-filter: Filter Functions. -* set-process-sentinel: Sentinels. -* set-process-window-size: Process Window Size. -* set-recent-keys-ring-size: Recording Input. -* set-register: Registers. -* set-right-margin: Margins. -* set-specifier: Adding Specifications. -* set-standard-case-table: Case Tables. -* set-syntax-table: Syntax Table Functions. -* set-text-properties: Changing Properties. -* set-tooltalk-message-attribute: Elisp Interface for Sending Messages. -* set-visited-file-modtime: Modification Time. -* set-visited-file-name: Buffer File Name. -* set-weak-list-list: Weak Lists. -* set-window-buffer: Buffers and Windows. -* set-window-buffer-dedicated: Choosing Window. -* set-window-configuration: Window Configurations. -* set-window-dedicated-p: Choosing Window. -* set-window-hscroll: Horizontal Scrolling. -* set-window-point: Window Point. -* set-window-start: Window Start. -* setcar: Setcar. -* setcdr: Setcdr. -* setenv: System Environment. -* setplist: Object Plists. -* setprv: System Environment. -* setq: Setting Variables. -* setq-default: Default Value. -* sets: Sets And Lists. -* setting modes of files: Changing File Attributes. -* setting-constant: Constant Variables. -* seventh: List Elements. -* sexp motion: List Motion. -* shadowing of variables: Local Variables. -* shallow binding: Impl of Scope. -* shared-lisp-mode-map: Standard Keymaps. -* Shell mode modeline-format: Modeline Data. -* shell-command-history: Minibuffer History. -* shrink-window: Resizing Windows. -* shrink-window-horizontally: Resizing Windows. -* shrink-window-pixels: Resizing Windows. -* side effect: Intro Eval. -* signal: Signaling Errors. -* signal-error: Signaling Errors. -* signal-process: Signals to Processes. -* signaling errors: Signaling Errors. -* signals: Signals to Processes. -* sin: Math Functions. -* single-key-description: Describing Characters. -* sinh: Math Functions. -* sit-for: Waiting. -* site-init.el: Building XEmacs. -* site-load.el: Building XEmacs. -* site-run-file: Init File. -* site-start.el: Start-up Summary. -* sixth: List Elements. -* size of frame: Size and Position. -* size of window: Size of Window. -* skip-chars-backward: Skipping Characters. -* skip-chars-forward: Skipping Characters. -* skip-syntax-backward: Motion and Syntax. -* skip-syntax-forward: Motion and Syntax. -* skipping characters: Skipping Characters. -* skipping comments: Parsing Expressions. -* sleep-for: Waiting. -* Snarf-documentation: Accessing Documentation. -* sort: Rearrangement. -* sort-columns: Sorting. -* sort-fields: Sorting. -* sort-lines: Sorting. -* sort-numeric-fields: Sorting. -* sort-pages: Sorting. -* sort-paragraphs: Sorting. -* sort-regexp-fields: Sorting. -* sort-subr: Sorting. -* sorting lists: Rearrangement. -* sorting text: Sorting. -* sound: Beeping. -* sound-alist: Beeping. -* special: Major Mode Conventions. -* special form descriptions: A Sample Function Description. -* special form evaluation: Special Forms. -* special forms: Primitive Function Type. -* special forms (Edebug): Instrumenting. -* special forms for control structures: Control Structures. -* special-display-buffer-names: Choosing Window. -* special-display-frame-plist: Choosing Window. -* special-display-function: Choosing Window. -* special-display-popup-frame: Choosing Window. -* special-display-regexps: Choosing Window. -* specification (in a specifier): Specifiers In-Depth. -* specifier: Specifiers. -* specifier type: Specifier Type. -* specifier, domain: Specifiers In-Depth. -* specifier, fallback: Specifier Instancing. -* specifier, inst-list: Specifiers In-Depth. -* specifier, inst-pair: Specifiers In-Depth. -* specifier, instance: Specifiers In-Depth. -* specifier, instancing: Specifiers In-Depth. -* specifier, instantiator: Specifiers In-Depth. -* specifier, locale: Specifiers In-Depth. -* specifier, specification: Specifiers In-Depth. -* specifier, tag: Specifiers In-Depth. -* specifier, tag set: Specifiers In-Depth. -* specifier-fallback: Retrieving Specifications. -* specifier-instance: Specifier Instancing Functions. -* specifier-instance-from-inst-list: Specifier Instancing Functions. -* specifier-locale-type-from-locale: Other Specification Functions. -* specifier-spec-list: Retrieving Specifications. -* specifier-specs: Retrieving Specifications. -* specifier-tag-list: Specifier Tag Functions. -* specifier-tag-predicate: Specifier Tag Functions. -* specifier-type: Specifier Types. -* specifierp: Specifiers. -* speedups: Compilation Tips. -* splicing (with backquote): Backquote. -* split-height-threshold: Choosing Window. -* split-line: Commands for Insertion. -* split-path: Regexp Search. -* split-string: Regexp Search. -* split-window: Splitting Windows. -* split-window-horizontally: Splitting Windows. -* split-window-vertically: Splitting Windows. -* splitting windows: Splitting Windows. -* sqrt: Math Functions. -* stable sort: Rearrangement. -* standard regexps used in editing: Standard Regexps. -* standard-case-table: Case Tables. -* standard-category-table: Category Tables. -* standard-input: Input Functions. -* standard-output: Output Variables. -* standard-syntax-table: Standard Syntax Tables. -* standards of coding style: Tips. -* start up of XEmacs: Start-up Summary. -* start-process: Asynchronous Processes. -* start-process-shell-command: Asynchronous Processes. -* startup.el: Start-up Summary. -* stop points: Using Edebug. -* stop-process: Signals to Processes. -* stopping an infinite loop: Infinite Loops. -* stopping on events: Global Break Condition. -* store-match-data: Entire Match Data. -* stream (for printing): Output Streams. -* stream (for reading): Input Streams. -* string: Creating Strings. -* string equality: Text Comparison. -* string in keymap: Key Lookup. -* string input stream: Input Streams. -* string length: Sequence Functions. -* string length, maximum when printing: Output Variables. -* string properties: String Properties. -* string search: String Search. -* string to character: String Conversion. -* string to number: String Conversion. -* string to object: Input Functions. -* string, writing a doc string: Documentation Basics. -* string-equal: Text Comparison. -* string-lessp: Text Comparison. -* string-match: Regexp Search. -* string-modified-tick: Modifying Strings. -* string-to-char: String Conversion. -* string-to-int: String Conversion. -* string-to-number: String Conversion. -* string<: Text Comparison. -* string=: Text Comparison. -* stringp: Predicates for Strings. -* strings: Strings and Characters. -* strings, formatting them: Formatting Strings. -* strings, modifying: Modifying Strings. -* string quote: Syntax Class Table. -* subprocess: Processes. -* subr: What Is a Function. -* subrp: What Is a Function. -* subsidiary-coding-system: Basic Coding System Functions. -* subst-char-in-region: Substitution. -* substitute-command-keys: Keys in Documentation. -* substitute-in-file-name: File Name Expansion. -* substitute-key-definition: Changing Key Bindings. -* substituting keys in documentation: Keys in Documentation. -* substring: Creating Strings. -* subwindow type: Subwindow Type. -* subwindow-image-instance-p: Image Instance Types. -* subwindowp: Subwindows. -* suppress-keymap: Changing Key Bindings. -* suspend (cf. no-redraw-on-reenter): Refresh Screen. -* suspend evaluation: Recursive Editing. -* suspend-emacs: Suspending XEmacs. -* suspend-hook: Suspending XEmacs. -* suspend-resume-hook: Suspending XEmacs. -* suspending XEmacs: Suspending XEmacs. -* switch-to-buffer: Displaying Buffers. -* switch-to-buffer-other-window: Displaying Buffers. -* switches on command line: Command Line Arguments. -* switching to a buffer: Displaying Buffers. -* symbol: Symbols. -* symbol components: Symbol Components. -* symbol equality: Creating Symbols. -* symbol evaluation: Symbol Forms. -* symbol function indirection: Function Indirection. -* symbol in keymap: Key Lookup. -* symbol name hashing: Creating Symbols. -* symbol-function: Function Cells. -* symbol-name: Creating Symbols. -* symbol-plist: Object Plists. -* symbol-value: Accessing Variables. -* symbolp: Symbols. -* symbol constituent: Syntax Class Table. -* synchronous subprocess: Synchronous Processes. -* syntax classes: Syntax Descriptors. -* syntax descriptor: Syntax Descriptors. -* syntax error (Edebug): Backtracking. -* syntax flags: Syntax Flags. -* syntax for characters: Character Type. -* syntax table: Syntax Tables. -* syntax table example: Example Major Modes. -* syntax table internals: Syntax Table Internals. -* syntax tables in modes: Major Mode Conventions. -* syntax-table: Syntax Table Functions. -* syntax-table-p: Syntax Basics. -* system-configuration: System Environment. -* system-name: System Environment. -* system-type: System Environment. -* t: Constant Variables. -* t and truth: nil and t. -* t input stream: Input Streams. -* t output stream: Output Streams. -* tab: Character Type. -* tab deletion: Deletion. -* tab-stop-list: Indent Tabs. -* tab-to-tab-stop: Indent Tabs. -* tab-width: Usual Display. -* tabs stops for indentation: Indent Tabs. -* tag (in a specifier): Specifiers In-Depth. -* tag on run time stack: Catch and Throw. -* tag set (in a specifier): Specifiers In-Depth. -* tan: Math Functions. -* tanh: Math Functions. -* TCP: Network. -* temacs: Building XEmacs. -* temp-buffer-show-function: Temporary Displays. -* temp-directory: Unique File Names. -* tenth: List Elements. -* TERM environment variable: Terminal-Specific. -* term-file-prefix: Terminal-Specific. -* term-setup-hook: Terminal-Specific. -* Termcap: Terminal-Specific. -* terminal frame <1>: Frames. -* terminal frame: Basic Windows. -* terminal input: Terminal Input. -* terminal input modes: Input Modes. -* terminal output: Terminal Output. -* terminal-device: Console Types and Device Classes. -* terminal-specific initialization: Terminal-Specific. -* terminate keyboard macro: Peeking and Discarding. -* termscript file: Terminal Output. -* terpri: Output Functions. -* testing types: Type Predicates. -* text: Text. -* text files and binary files: Files and MS-DOS. -* text insertion: Insertion. -* text parsing: Syntax Tables. -* text properties: Text Properties. -* text properties in files: Saving Properties. -* text-char-description: Describing Characters. -* text-image-instance-p: Image Instance Types. -* text-mode-abbrev-table: Standard Abbrev Tables. -* text-mode-map: Standard Keymaps. -* text-mode-syntax-table: Standard Syntax Tables. -* text-pointer-glyph: Mouse Pointer. -* text-properties-at: Examining Properties. -* text-property-any: Property Search. -* text-property-not-all: Property Search. -* third: List Elements. -* this-command: Command Loop Info. -* this-command-keys: Command Loop Info. -* throw: Catch and Throw. -* throw example: Recursive Editing. -* tiled windows: Basic Windows. -* timeout-event-p: Event Predicates. -* timing programs: Compilation Tips. -* tips: Tips. -* toggle-read-only: Read Only Buffers. -* toolbar: Toolbar. -* toolbar button type: Toolbar Button Type. -* toolbar-buttons-captioned-p: Other Toolbar Variables. -* toolbar-make-button-list: Toolbar Descriptor Format. -* toolbar-map <1>: Standard Keymaps. -* toolbar-map: Active Keymaps. -* toolbar-pointer-glyph: Mouse Pointer. -* toolbar-specifier-p <1>: Specifier Types. -* toolbar-specifier-p: Specifying the Toolbar. -* ToolTalk: ToolTalk Support. -* ToolTalk message: Sending Messages. -* ToolTalk pattern: Receiving Messages. -* top-gutter: Specifying a Gutter. -* top-gutter-height: Other Gutter Variables. -* top-gutter-visible-p: Other Gutter Variables. -* top-level: Recursive Editing. -* top-level form: Loading. -* top-toolbar: Specifying the Toolbar. -* top-toolbar-height: Other Toolbar Variables. -* top-toolbar-visible-p: Other Toolbar Variables. -* tq-close: Transaction Queues. -* tq-create: Transaction Queues. -* tq-enqueue: Transaction Queues. -* tracing: Tracing. -* transaction queue: Transaction Queues. -* transcendental functions: Math Functions. -* translate-region: Substitution. -* translating input events: Translating Input. -* transpose-regions: Transposition. -* true: nil and t. -* truename (of file): Truenames. -* truncate: Numeric Conversions. -* truncate-lines: Truncation. -* truncate-partial-width-windows: Truncation. -* truncation-glyph: Redisplay Glyphs. -* truth value: nil and t. -* try-completion: Basic Completion. -* two's complement: Integer Basics. -* type: Lisp Data Types. -* type checking: Type Predicates. -* type predicates: Type Predicates. -* type-of: Type Predicates. -* unbinding keys: Key Binding Commands. -* undefined: Functions for Key Lookup. -* undefined in keymap: Key Lookup. -* undefined key: Keymap Terminology. -* undo avoidance: Substitution. -* undo-boundary: Undo. -* undo-limit: Maintaining Undo. -* undo-strong-limit: Maintaining Undo. -* unexec: Building XEmacs. -* unhandled-file-name-directory: Magic File Names. -* unintern: Creating Symbols. -* uninterned symbol: Creating Symbols. -* uninterned symbols, printing: Output Variables. -* unique extents: Duplicable Extents. -* universal-argument: Prefix Command Arguments. -* unload-feature: Unloading. -* unloading: Unloading. -* unlock-buffer: File Locks. -* unmap-frame-hook: Frame Hooks. -* unread-command-event: Peeking and Discarding. -* unread-command-events: Peeking and Discarding. -* unreading: Input Streams. -* unregister-tooltalk-pattern: Elisp Interface for Receiving Messages. -* unwind-protect: Cleanups. -* unwinding: Cleanups. -* up-list: List Motion. -* upcase: Character Case. -* upcase-region: Case Changes. -* upcase-word: Case Changes. -* update display: Refresh Screen. -* update-directory-autoloads: Autoload. -* update-file-autoloads: Autoload. -* upper case: Character Case. -* upper case key sequence: Key Sequence Input. -* use-global-map: Active Keymaps. -* use-hard-newlines: Filling. -* use-left-overflow: Margin Primitives. -* use-local-map: Active Keymaps. -* use-right-overflow: Margin Primitives. -* user name completion subroutines: User Name Completion. -* user option: Defining Variables. -* user-defined error: Error Symbols. -* user-full-name: User Identification. -* user-home-directory: User Identification. -* user-login-name: User Identification. -* user-mail-address: User Identification. -* user-name-all-completions: User Name Completion. -* user-name-completion: User Name Completion. -* user-name-completion-1: User Name Completion. -* user-real-login-name: User Identification. -* user-real-uid: User Identification. -* user-uid: User Identification. -* user-variable-p: Defining Variables. -* user-variable-p example: High-Level Completion. -* valid-char-table-type-p: Char Table Types. -* valid-char-table-value-p: Working With Char Tables. -* valid-device-class-p: Console Types and Device Classes. -* valid-device-type-p: Console Types and Device Classes. -* valid-glyph-type-p: Glyph Types. -* valid-image-instance-type-p: Image Instance Types. -* valid-image-instantiator-format-p: Image Specifiers. -* valid-inst-list-p: Specifier Validation Functions. -* valid-instantiator-p: Specifier Validation Functions. -* valid-plist-p: Property Lists. -* valid-spec-list-p: Specifier Validation Functions. -* valid-specifier-domain-p: Specifier Validation Functions. -* valid-specifier-locale-p: Specifier Validation Functions. -* valid-specifier-locale-type-p: Specifier Validation Functions. -* valid-specifier-tag-p <1>: Specifier Validation Functions. -* valid-specifier-tag-p: Specifier Tag Functions. -* valid-specifier-tag-set-p: Specifier Tag Functions. -* valid-specifier-type-p: Specifier Validation Functions. -* value cell: Symbol Components. -* value of expression: Evaluation. -* values: Eval. -* variable: Variables. -* variable aliases: Variable Aliases. -* variable definition: Defining Variables. -* variable descriptions: A Sample Variable Description. -* variable limit error: Local Variables. -* variable-alias: Variable Aliases. -* variable-documentation: Documentation Basics. -* variable-obsoleteness-doc: Obsoleteness. -* variables, buffer-local: Buffer-Local Variables. -* variables, indirect: Variable Aliases. -* vc-mode: Modeline Variables. -* vconcat: Vector Functions. -* vector <1>: Vector Functions. -* vector: Vectors. -* vector evaluation: Self-Evaluating Forms. -* vector length: Sequence Functions. -* vectorp: Vector Functions. -* verify-visited-file-modtime: Modification Time. -* version number (in file name): File Name Components. -* version-control: Numbered Backups. -* vertical scrolling: Vertical Scrolling. -* vertical tab: Character Type. -* vertical-motion: Screen Lines. -* vertical-motion-pixels: Screen Lines. -* view-file: Visiting Functions. -* view-mode-map: Standard Keymaps. -* view-register: Registers. -* visible frame: Visibility of Frames. -* visible-bell: Beeping. -* visible-frame-list: Finding All Frames. -* visited file: Buffer File Name. -* visited file mode: Auto Major Mode. -* visited-file-modtime: Modification Time. -* visiting files: Visiting Files. -* void function: Function Indirection. -* void function cell: Function Cells. -* void variable: Void Variables. -* void-function: Function Cells. -* void-variable: Void Variables. -* waiting: Waiting. -* waiting for command key input: Peeking and Discarding. -* waiting-for-user-input-p: Sentinels. -* wakeup: Subprocess Creation. -* walk-windows: Cyclic Window Ordering. -* weak hash table: Weak Hash Tables. -* weak list: Weak Lists. -* weak list type: Weak List Type. -* weak-list-list: Weak Lists. -* weak-list-p: Weak Lists. -* weak-list-type: Weak Lists. -* where-is-internal: Scanning Keymaps. -* while: Iteration. -* whitespace: Character Type. -* whitespace character: Syntax Class Table. -* widen: Narrowing. -* widening: Narrowing. -* widget-image-instance-p: Image Instance Types. -* window: Basic Windows. -* window configuration (Edebug): Edebug Display Update. -* window configurations: Window Configurations. -* window excursions: Excursions. -* window ordering, cyclic: Cyclic Window Ordering. -* window point: Window Point. -* window position <1>: Position of Window. -* window position: Window Point. -* window resizing: Resizing Windows. -* window size: Size of Window. -* window size, changing: Resizing Windows. -* window splitting: Splitting Windows. -* window system types: Window-System Types. -* window top line: Window Start. -* window-buffer: Buffers and Windows. -* window-configuration-p: Window Configurations. -* window-dedicated-p: Choosing Window. -* window-displayed-text-pixel-height: Size of Window. -* window-end: Window Start. -* window-frame: Frames and Windows. -* window-height: Size of Window. -* window-highest-p: Position of Window. -* window-hscroll: Horizontal Scrolling. -* window-left-margin-pixel-width: Margin Primitives. -* window-live-p: Deleting Windows. -* window-lowest-p: Position of Window. -* window-min-height: Resizing Windows. -* window-min-width: Resizing Windows. -* window-minibuffer-p: Minibuffer Misc. -* window-pixel-edges: Position of Window. -* window-pixel-height: Size of Window. -* window-pixel-width: Size of Window. -* window-point: Window Point. -* window-right-margin-pixel-width: Margin Primitives. -* window-setup-hook: Terminal-Specific. -* window-size-change-functions: Resizing Windows. -* window-start: Window Start. -* window-system objects: Faces and Window-System Objects. -* window-text-area-pixel-edges: Position of Window. -* window-text-area-pixel-height: Size of Window. -* window-text-area-pixel-width: Size of Window. -* window-width: Size of Window. -* windowp: Basic Windows. -* windows, controlling precisely: Buffers and Windows. -* with-current-buffer: Excursions. -* with-output-to-temp-buffer: Temporary Displays. -* with-selected-frame: Input Focus. -* with-temp-file: Excursions. -* word search: String Search. -* word-search-backward: String Search. -* word-search-forward: String Search. -* words-include-escapes: Word Motion. -* word constituent: Syntax Class Table. -* write-abbrev-file: Abbrev Files. -* write-char: Output Functions. -* write-contents-hooks: Saving Buffers. -* write-file: Saving Buffers. -* write-file-hooks: Saving Buffers. -* write-region: Writing to Files. -* write-region-annotate-functions: Saving Properties. -* writing a documentation string: Documentation Basics. -* wrong-number-of-arguments: Argument List. -* wrong-type-argument: Type Predicates. -* X: X-Windows. -* X resource type: X Resource Type. -* X window frame: Frames. -* x-allow-sendevents: X Miscellaneous. -* x-bitmap-file-path <1>: X Miscellaneous. -* x-bitmap-file-path: Image Specifiers. -* x-debug-events: X Miscellaneous. -* x-debug-mode: X Miscellaneous. -* x-disown-selection: X Selections. -* x-display-visual-class: Server Data. -* x-emacs-application-class: Resources. -* x-find-larger-font: Font Instance Size. -* x-find-smaller-font: Font Instance Size. -* x-font-size: Font Instance Size. -* x-get-cutbuffer: X Selections. -* x-get-resource: Resources. -* x-get-selection: X Selections. -* x-grab-keyboard: Grabs. -* x-grab-pointer: Grabs. -* x-library-search-path: X Miscellaneous. -* x-make-font-bold: Font Instance Characteristics. -* x-make-font-bold-italic: Font Instance Characteristics. -* x-make-font-italic: Font Instance Characteristics. -* x-make-font-unbold: Font Instance Characteristics. -* x-make-font-unitalic: Font Instance Characteristics. -* x-own-selection: X Selections. -* x-put-resource: Resources. -* x-server-vendor: Server Data. -* x-server-version: Server Data. -* x-set-frame-icon-pixmap: Frame Titles. -* x-store-cutbuffer: X Selections. -* x-ungrab-keyboard: Grabs. -* x-ungrab-pointer: Grabs. -* x-valid-keysym-name-p: X Miscellaneous. -* x-window-id: X Miscellaneous. -* X-Windows: X-Windows. -* XEmacs event standard notation: Describing Characters. -* xpm-color-symbols: Image Specifiers. -* y-or-n-p: Yes-or-No Queries. -* y-or-n-p-maybe-dialog-box: Yes-or-No Queries. -* yank: Yank Commands. -* yank suppression: Changing Key Bindings. -* yank-pop: Yank Commands. -* yes-or-no questions: Yes-or-No Queries. -* yes-or-no-p: Yes-or-No Queries. -* yes-or-no-p-dialog-box: Yes-or-No Queries. -* yes-or-no-p-maybe-dialog-box: Yes-or-No Queries. -* zero-length extent: Extent Endpoints. -* zerop: Predicates on Numbers. -* zmacs-activate-region: The Region. -* zmacs-activate-region-hook: The Region. -* zmacs-deactivate-region: The Region. -* zmacs-deactivate-region-hook: The Region. -* zmacs-region-stays: The Region. -* zmacs-regions: The Region. -* zmacs-update-region: The Region. -* zmacs-update-region-hook: The Region. -* | in regexp: Syntax of Regexps. +File: lispref.info, Node: Standard Buffer-Local Variables, Next: Standard Keymaps, Prev: Standard Errors, Up: Top +Buffer-Local Variables +********************** + 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. + +`abbrev-mode' + *note Abbrevs:: + +`auto-fill-function' + *note Auto Filling:: + +`buffer-auto-save-file-name' + *note Auto-Saving:: + +`buffer-backed-up' + *note Backup Files:: + +`buffer-display-table' + *note Display Tables:: + +`buffer-file-format' + *note Format Conversion:: + +`buffer-file-name' + *note Buffer File Name:: + +`buffer-file-number' + *note Buffer File Name:: + +`buffer-file-truename' + *note Buffer File Name:: + +`buffer-file-type' + *note Files and MS-DOS:: + +`buffer-invisibility-spec' + *note Invisible Text:: + +`buffer-offer-save' + *note Saving Buffers:: + +`buffer-read-only' + *note Read Only Buffers:: + +`buffer-saved-size' + *note Point:: + +`buffer-undo-list' + *note Undo:: + +`cache-long-line-scans' + *note Text Lines:: + +`case-fold-search' + *note Searching and Case:: + +`ctl-arrow' + *note Usual Display:: + +`comment-column' + *note Comments: (emacs)Comments. + +`default-directory' + *note System Environment:: + +`defun-prompt-regexp' + *note List Motion:: + +`fill-column' + *note Auto Filling:: + +`goal-column' + *note Moving Point: (emacs)Moving Point. + +`left-margin' + *note Indentation:: + +`local-abbrev-table' + *note Abbrevs:: + +`local-write-file-hooks' + *note Saving Buffers:: + +`major-mode' + *note Mode Help:: + +`mark-active' + *note The Mark:: + +`mark-ring' + *note The Mark:: + +`minor-modes' + *note Minor Modes:: + +`modeline-format' + *note Modeline Data:: + +`modeline-buffer-identification' + *note Modeline Variables:: + +`modeline-format' + *note Modeline Data:: + +`modeline-modified' + *note Modeline Variables:: + +`modeline-process' + *note Modeline Variables:: + +`mode-name' + *note Modeline Variables:: + +`overwrite-mode' + *note Insertion:: + +`paragraph-separate' + *note Standard Regexps:: + +`paragraph-start' + *note Standard Regexps:: + +`point-before-scroll' + Used for communication between mouse commands and scroll-bar + commands. + +`require-final-newline' + *note Insertion:: + +`selective-display' + *note Selective Display:: + +`selective-display-ellipses' + *note Selective Display:: + +`tab-width' + *note Usual Display:: + +`truncate-lines' + *note Truncation:: + +`vc-mode' + *note Modeline Variables:: + + +File: lispref.info, Node: Standard Keymaps, Next: Standard Hooks, Prev: Standard Buffer-Local Variables, Up: Top + +Standard Keymaps +**************** + + The following symbols are used as the names for various keymaps. +Some of these exist when XEmacs 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. + +`bookmark-map' + A keymap containing bindings to bookmark functions. + +`Buffer-menu-mode-map' + A keymap used by Buffer Menu mode. + +`c++-mode-map' + A keymap used by C++ mode. + +`c-mode-map' + A keymap used by C mode. A sparse keymap used by C mode. + +`command-history-map' + A keymap used by Command History mode. + +`ctl-x-4-map' + A keymap for subcommands of the prefix `C-x 4'. + +`ctl-x-5-map' + A keymap for subcommands of the prefix `C-x 5'. + +`ctl-x-map' + A keymap for `C-x' commands. + +`debugger-mode-map' + A keymap used by Debugger mode. + +`dired-mode-map' + A keymap for `dired-mode' buffers. + +`edit-abbrevs-map' + A keymap used in `edit-abbrevs'. + +`edit-tab-stops-map' + A keymap used in `edit-tab-stops'. + +`electric-buffer-menu-mode-map' + A keymap used by Electric Buffer Menu mode. + +`electric-history-map' + A keymap used by Electric Command History mode. + +`emacs-lisp-mode-map' + A keymap used by Emacs Lisp mode. + +`help-map' + A keymap for characters following the Help key. + +`Helper-help-map' + A keymap used by the help utility package. + It has the same keymap in its value cell and in its function cell. + +`Info-edit-map' + A keymap used by the `e' command of Info. + +`Info-mode-map' + A keymap containing Info commands. + +`isearch-mode-map' + A keymap that defines the characters you can type within + incremental search. + +`itimer-edit-map' + A keymap used when in Itimer Edit mode. + +`lisp-interaction-mode-map' + A keymap used by Lisp mode. + +`lisp-mode-map' + A keymap used by Lisp mode. + + A keymap for minibuffer input with completion. + +`minibuffer-local-isearch-map' + A keymap for editing isearch strings in the minibuffer. + +`minibuffer-local-map' + Default keymap to use when reading from the minibuffer. + +`minibuffer-local-must-match-map' + A keymap for minibuffer input with completion, for exact match. + +`mode-specific-map' + The keymap for characters following `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 `C-h b' + (`display-bindings'), where it describes the main use of the `C-c' + prefix key. + +`modeline-map' + The keymap consulted for mouse-clicks on the modeline of a window. + +`objc-mode-map' + A keymap used in Objective C mode as a local map. + +`occur-mode-map' + A local keymap used by Occur mode. + +`overriding-local-map' + A keymap that overrides all other local keymaps. + +`query-replace-map' + A local keymap used for responses in `query-replace' and related + commands; also for `y-or-n-p' and `map-y-or-n-p'. The functions + that use this map do not support prefix keys; they look up one + event at a time. + +`read-expression-map' + The minibuffer keymap used for reading Lisp expressions. + +`read-shell-command-map' + The minibuffer keymap used by `shell-command' and related commands. + +`shared-lisp-mode-map' + A keymap for commands shared by all sorts of Lisp modes. + +`text-mode-map' + A keymap used by Text mode. + +`toolbar-map' + The keymap consulted for mouse-clicks over a toolbar. + +`view-mode-map' + A keymap used by View mode. + + +File: lispref.info, Node: Standard Hooks, Next: Index, Prev: Standard Keymaps, Up: Top + +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 `-hook'. They are +"normal hooks", run by means of `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 `add-hook'. *Note Hooks::, for more information +about using hooks. + + The variables whose names end in `-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 +`-hook' even though they were not normal hooks.) + + The variables whose names end in `-hooks' or `-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). + +`activate-menubar-hook' + +`activate-popup-menu-hook' + +`ad-definition-hooks' + +`adaptive-fill-function' + +`add-log-current-defun-function' + +`after-change-functions' + +`after-delete-annotation-hook' + +`after-init-hook' + +`after-insert-file-functions' + +`after-revert-hook' + +`after-save-hook' + +`after-set-visited-file-name-hooks' + +`after-write-file-hooks' + +`auto-fill-function' + +`auto-save-hook' + +`before-change-functions' + +`before-delete-annotation-hook' + +`before-init-hook' + +`before-revert-hook' + +`blink-paren-function' + +`buffers-menu-switch-to-buffer-function' + +`c++-mode-hook' + +`c-delete-function' + +`c-mode-common-hook' + +`c-mode-hook' + +`c-special-indent-hook' + +`calendar-load-hook' + +`change-major-mode-hook' + +`command-history-hook' + +`comment-indent-function' + +`compilation-buffer-name-function' + +`compilation-exit-message-function' + +`compilation-finish-function' + +`compilation-parse-errors-function' + +`compilation-mode-hook' + +`create-console-hook' + +`create-device-hook' + +`create-frame-hook' + +`dabbrev-friend-buffer-function' + +`dabbrev-select-buffers-function' + +`delete-console-hook' + +`delete-device-hook' + +`delete-frame-hook' + +`deselect-frame-hook' + +`diary-display-hook' + +`diary-hook' + +`dired-after-readin-hook' + +`dired-before-readin-hook' + +`dired-load-hook' + +`dired-mode-hook' + +`disabled-command-hook' + +`display-buffer-function' + +`ediff-after-setup-control-frame-hook' + +`ediff-after-setup-windows-hook' + +`ediff-before-setup-control-frame-hook' + +`ediff-before-setup-windows-hook' + +`ediff-brief-help-message-function' + +`ediff-cleanup-hook' + +`ediff-control-frame-position-function' + +`ediff-display-help-hook' + +`ediff-focus-on-regexp-matches-function' + +`ediff-forward-word-function' + +`ediff-hide-regexp-matches-function' + +`ediff-keymap-setup-hook' + +`ediff-load-hook' + +`ediff-long-help-message-function' + +`ediff-make-wide-display-function' + +`ediff-merge-split-window-function' + +`ediff-meta-action-function' + +`ediff-meta-redraw-function' + +`ediff-mode-hook' + +`ediff-prepare-buffer-hook' + +`ediff-quit-hook' + +`ediff-registry-setup-hook' + +`ediff-select-hook' + +`ediff-session-action-function' + +`ediff-session-group-setup-hook' + +`ediff-setup-diff-regions-function' + +`ediff-show-registry-hook' + +`ediff-show-session-group-hook' + +`ediff-skip-diff-region-function' + +`ediff-split-window-function' + +`ediff-startup-hook' + +`ediff-suspend-hook' + +`ediff-toggle-read-only-function' + +`ediff-unselect-hook' + +`ediff-window-setup-function' + +`edit-picture-hook' + +`electric-buffer-menu-mode-hook' + +`electric-command-history-hook' + +`electric-help-mode-hook' + +`emacs-lisp-mode-hook' + +`fill-paragraph-function' + +`find-file-hooks' + +`find-file-not-found-hooks' + +`first-change-hook' + +`font-lock-after-fontify-buffer-hook' + +`font-lock-beginning-of-syntax-function' + +`font-lock-mode-hook' + +`fume-found-function-hook' + +`fume-list-mode-hook' + +`fume-rescan-buffer-hook' + +`fume-sort-function' + +`gnus-startup-hook' + +`hack-local-variables-hook' + +`highlight-headers-follow-url-function' + +`hyper-apropos-mode-hook' + +`indent-line-function' + +`indent-mim-hook' + +`indent-region-function' + +`initial-calendar-window-hook' + +`isearch-mode-end-hook' + +`isearch-mode-hook' + +`java-mode-hook' + +`kill-buffer-hook' + +`kill-buffer-query-functions' + +`kill-emacs-hook' + +`kill-emacs-query-functions' + +`kill-hooks' + +`LaTeX-mode-hook' + +`latex-mode-hook' + +`ledit-mode-hook' + +`lisp-indent-function' + +`lisp-interaction-mode-hook' + +`lisp-mode-hook' + +`list-diary-entries-hook' + +`load-read-function' + +`log-message-filter-function' + +`m2-mode-hook' + +`mail-citation-hook' + +`mail-mode-hook' + +`mail-setup-hook' + +`make-annotation-hook' + +`makefile-mode-hook' + +`map-frame-hook' + +`mark-diary-entries-hook' + +`medit-mode-hook' + +`menu-no-selection-hook' + +`mh-compose-letter-hook' + +`mh-folder-mode-hook' + +`mh-letter-mode-hook' + +`mim-mode-hook' + +`minibuffer-exit-hook' + +`minibuffer-setup-hook' + +`mode-motion-hook' + +`mouse-enter-frame-hook' + +`mouse-leave-frame-hook' + +`mouse-track-cleanup-hook' + +`mouse-track-click-hook' + +`mouse-track-down-hook' + +`mouse-track-drag-hook' + +`mouse-track-drag-up-hook' + +`mouse-track-up-hook' + +`mouse-yank-function' + +`news-mode-hook' + +`news-reply-mode-hook' + +`news-setup-hook' + +`nongregorian-diary-listing-hook' + +`nongregorian-diary-marking-hook' + +`nroff-mode-hook' + +`objc-mode-hook' + +`outline-mode-hook' + +`perl-mode-hook' + +`plain-TeX-mode-hook' + +`post-command-hook' + +`post-gc-hook' + +`pre-abbrev-expand-hook' + +`pre-command-hook' + +`pre-display-buffer-function' + +`pre-gc-hook' + +`pre-idle-hook' + +`print-diary-entries-hook' + +`prolog-mode-hook' + +`protect-innocence-hook' + +`remove-message-hook' + +`revert-buffer-function' + +`revert-buffer-insert-contents-function' + +`rmail-edit-mode-hook' + +`rmail-mode-hook' + +`rmail-retry-setup-hook' + +`rmail-summary-mode-hook' + +`scheme-indent-hook' + +`scheme-mode-hook' + +`scribe-mode-hook' + +`select-frame-hook' + +`send-mail-function' + +`shell-mode-hook' + +`shell-set-directory-error-hook' + +`special-display-function' + +`suspend-hook' + +`suspend-resume-hook' + +`temp-buffer-show-function' + +`term-setup-hook' + +`terminal-mode-hook' + +`terminal-mode-break-hook' + +`TeX-mode-hook' + +`tex-mode-hook' + +`text-mode-hook' + +`today-visible-calendar-hook' + +`today-invisible-calendar-hook' + +`tooltalk-message-handler-hook' + +`tooltalk-pattern-handler-hook' + +`tooltalk-unprocessed-message-hook' + +`unmap-frame-hook' + +`vc-checkin-hook' + +`vc-checkout-writable-buffer-hook' + +`vc-log-after-operation-hook' + +`vc-make-buffer-writable-hook' + +`view-hook' + +`vm-arrived-message-hook' + +`vm-arrived-messages-hook' + +`vm-chop-full-name-function' + +`vm-display-buffer-hook' + +`vm-edit-message-hook' + +`vm-forward-message-hook' + +`vm-iconify-frame-hook' + +`vm-inhibit-write-file-hook' + +`vm-key-functions' + +`vm-mail-hook' + +`vm-mail-mode-hook' + +`vm-menu-setup-hook' + +`vm-mode-hook' + +`vm-quit-hook' + +`vm-rename-current-buffer-function' + +`vm-reply-hook' + +`vm-resend-bounced-message-hook' + +`vm-resend-message-hook' + +`vm-retrieved-spooled-mail-hook' + +`vm-select-message-hook' + +`vm-select-new-message-hook' + +`vm-select-unread-message-hook' + +`vm-send-digest-hook' + +`vm-summary-mode-hook' + +`vm-summary-pointer-update-hook' + +`vm-summary-redo-hook' + +`vm-summary-update-hook' + +`vm-undisplay-buffer-hook' + +`vm-visit-folder-hook' + +`window-setup-hook' + +`write-contents-hooks' + +`write-file-data-hooks' + +`write-file-hooks' + +`write-region-annotate-functions' + +`x-lost-selection-hooks' + +`x-sent-selection-hooks' + +`zmacs-activate-region-hook' + +`zmacs-deactivate-region-hook' + +`zmacs-update-region-hook' diff --git a/info/lispref.info-5 b/info/lispref.info-5 index b423272..95a8a55 100644 --- a/info/lispref.info-5 +++ b/info/lispref.info-5 @@ -142,9 +142,10 @@ putting strings together, or by taking them apart. `bit-vector' (*note Bit Vectors::). This function has not been available in XEmacs prior to 21.0 and FSF Emacs prior to 20.3. - - Function: make-string count character - This function returns a string made up of COUNT repetitions of - CHARACTER. If COUNT is negative, an error is signaled. + - Function: make-string length character + This function returns a new string consisting entirely of LENGTH + successive copies of CHARACTER. LENGTH must be a non-negative + integer. (make-string 5 ?x) => "xxxxx" @@ -284,7 +285,7 @@ File: lispref.info, Node: Character Codes, Next: Text Comparison, Prev: Predi Character Codes =============== - - Function: char-int ch + - Function: char-int character This function converts a character into an equivalent integer. The resulting integer will always be non-negative. The integers in the range 0 - 255 map to characters as follows: @@ -327,10 +328,11 @@ File: lispref.info, Node: Text Comparison, Next: String Conversion, Prev: Cha Comparison of Characters and Strings ==================================== - - Function: char-equal character1 character2 + - Function: char-equal character1 character2 &optional buffer This function returns `t' if the arguments represent the same character, `nil' otherwise. This function ignores differences in - case if `case-fold-search' is non-`nil'. + case if the value of `case-fold-search' is non-`nil' in BUFFER, + which defaults to the current buffer. (char-equal ?x ?x) => t @@ -491,12 +493,12 @@ functions are used primarily for making help messages. See also the function `format' in *Note Formatting Strings::. - Function: string-to-number string &optional base - This function returns the numeric value of the characters in - STRING, read in BASE. It skips spaces and tabs at the beginning - of STRING, then reads as much of STRING as it can interpret as a + This function returns the numeric value represented by STRING, + read in BASE. It skips spaces and tabs at the beginning of + STRING, then reads as much of 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 + 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. If BASE is not specified, it defaults to ten. With BASE other @@ -793,7 +795,7 @@ that are passed to them as arguments. The examples below use the characters `X' and `x' which have ASCII codes 88 and 120 respectively. - - Function: downcase string-or-char + - Function: downcase string-or-char &optional buffer This function converts a character or a string to lower case. When the argument to `downcase' is a string, the function creates @@ -804,6 +806,9 @@ codes 88 and 120 respectively. XEmacs 19.) If the original character is lower case, or is not a letter, then the value equals the original character. + Optional second arg BUFFER specifies which buffer's case tables to + use, and defaults to the current buffer. + (downcase "The cat in the hat") => "the cat in the hat" @@ -811,7 +816,7 @@ codes 88 and 120 respectively. => ?x ;; Under XEmacs 20. => 120 ;; Under XEmacs 19. - - Function: upcase string-or-char + - Function: upcase string-or-char &optional buffer This function converts a character or a string to upper case. When the argument to `upcase' is a string, the function creates @@ -824,6 +829,9 @@ codes 88 and 120 respectively. case, or is not a letter, then the value equals the original character. + Optional second arg BUFFER specifies which buffer's case tables to + use, and defaults to the current buffer. + (upcase "The cat in the hat") => "THE CAT IN THE HAT" @@ -831,7 +839,7 @@ codes 88 and 120 respectively. => ?X ;; Under XEmacs 20. => 88 ;; Under XEmacs 19. - - Function: capitalize string-or-char + - Function: capitalize string-or-char &optional buffer This function capitalizes strings or characters. If STRING-OR-CHAR is a string, the function creates and returns a new string, whose contents are a copy of STRING-OR-CHAR in which each @@ -846,6 +854,9 @@ codes 88 and 120 respectively. When the argument to `capitalize' is a character, `capitalize' has the same result as `upcase'. + Optional second arg BUFFER specifies which buffer's case tables to + use, and defaults to the current buffer. + (capitalize "The cat in the hat") => "The Cat In The Hat" @@ -910,18 +921,19 @@ Changing the standard case table doesn't affect any existing buffers. - Function: case-table-p object This predicate returns non-`nil' if OBJECT is a valid case table. - - Function: set-standard-case-table table - This function makes TABLE the standard case table, so that it will - apply to any buffers created subsequently. + - Function: set-standard-case-table case-table + This function makes CASE-TABLE the standard case table, so that it + will apply to any buffers created subsequently. - Function: standard-case-table This returns the standard case table. - - Function: current-case-table - This function returns the current buffer's case table. + - Function: current-case-table &optional buffer + This function returns the case table of BUFFER, which defaults to + the current buffer. - - Function: set-case-table table - This sets the current buffer's case table to TABLE. + - Function: set-case-table case-table + This sets the current buffer's case table to CASE-TABLE. The following three functions are convenient subroutines for packages that define non-ASCII character sets. They modify a string @@ -1026,8 +1038,8 @@ different sorts of values. The different char table types are character. Higher-level Lisp functions are provided for working with syntax tables. The valid values are integers. - - Function: char-table-type table - This function returns the type of char table TABLE. + - Function: char-table-type char-table + This function returns the type of char table CHAR-TABLE. - Function: char-table-type-list This function returns a list of the recognized char table types. @@ -1046,8 +1058,9 @@ Working With Char Tables should be a symbol, one of `char', `category', `display', `generic', or `syntax'. - - Function: put-char-table range val table - This function sets the value for chars in RANGE to be VAL in TABLE. + - Function: put-char-table range value char-table + This function sets the value for chars in RANGE to be VALUE in + CHAR-TABLE. RANGE specifies one or more characters to be affected and should be one of the following: @@ -1061,21 +1074,21 @@ Working With Char Tables * A single character - VAL must be a value appropriate for the type of TABLE. + VALUE must be a value appropriate for the type of CHAR-TABLE. - - Function: get-char-table ch table - This function finds the value for char CH in TABLE. + - Function: get-char-table character char-table + This function finds the value for CHARACTER in CHAR-TABLE. - - Function: get-range-char-table range table &optional multi - This function finds the value for a range in TABLE. If there is - more than one value, MULTI is returned (defaults to `nil'). + - Function: get-range-char-table range char-table &optional multi + This function finds the value for a range in CHAR-TABLE. If there + is more than one value, MULTI is returned (defaults to `nil'). - - Function: reset-char-table table - This function resets a char table to its default state. + - Function: reset-char-table char-table + This function resets CHAR-TABLE to its default state. - - Function: map-char-table function table &optional range - This function maps FUNCTION over entries in TABLE, calling it with - two args, each key and value in the table. + - Function: map-char-table function char-table &optional range + This function maps FUNCTION over entries in CHAR-TABLE, calling it + with two args, each key and value in the table. RANGE specifies a subrange to map over and is in the same format as the RANGE argument to `put-range-table'. If omitted or `t', it diff --git a/info/lispref.info-6 b/info/lispref.info-6 index 1145cac..4273b1d 100644 --- a/info/lispref.info-6 +++ b/info/lispref.info-6 @@ -403,9 +403,9 @@ Altering List Elements with `setcar' a list, `setcar' replaces one element of a list with a different element. - - Function: setcar cons object - This function stores OBJECT as the new CAR of CONS, replacing its - previous CAR. It returns the value OBJECT. For example: + - Function: setcar cons-cell object + This function stores OBJECT as the new CAR of CONS-CELL, replacing + its previous CAR. It returns the value OBJECT. For example: (setq x '(1 2)) => (1 2) @@ -481,9 +481,9 @@ Altering the CDR of a List The lowest-level primitive for modifying a CDR is `setcdr': - - Function: setcdr cons object - This function stores OBJECT as the new CDR of CONS, replacing its - previous CDR. It returns the value OBJECT. + - Function: setcdr cons-cell object + This function stores OBJECT as the new CDR of CONS-CELL, replacing + its previous CDR. It returns the value OBJECT. Here is an example of replacing the CDR of a list with a different list. All but the first element of the list are removed in favor of a @@ -1082,26 +1082,28 @@ File: lispref.info, Node: Working With Normal Plists, Next: Working With Lax P Working With Normal Plists -------------------------- - - Function: plist-get plist prop &optional default + - Function: plist-get plist property &optional default This function extracts a value from a property list. The function - returns the value corresponding to the given PROP, or DEFAULT if - PROP is not one of the properties on the list. - - - Function: plist-put plist prop val - This function changes the value in PLIST of PROP to VAL. If PROP - is already a property on the list, its value is set to VAL, - otherwise the new PROP VAL pair is added. The new plist is - returned; use `(setq x (plist-put x prop val))' to be sure to use - the new value. The PLIST is modified by side effects. - - - Function: plist-remprop plist prop - This function removes from PLIST the property PROP and its value. - The new plist is returned; use `(setq x (plist-remprop x prop - val))' to be sure to use the new value. The PLIST is modified by - side effects. + returns the value corresponding to the given PROPERTY, or DEFAULT + if PROPERTY is not one of the properties on the list. + + - Function: plist-put plist property value + This function changes the value in PLIST of PROPERTY to VALUE. If + PROPERTY is already a property on the list, its value is set to + VALUE, otherwise the new PROPERTY VALUE pair is added. The new + plist is returned; use `(setq x (plist-put x property value))' to + be sure to use the new value. The PLIST is modified by side + effects. + + - Function: plist-remprop plist property + This function removes from PLIST the property PROPERTY and its + value. The new plist is returned; use `(setq x (plist-remprop x + property))' to be sure to use the new value. The PLIST is + modified by side effects. - - Function: plist-member plist prop - This function returns `t' if PROP has a value specified in PLIST. + - Function: plist-member plist property + This function returns `t' if PROPERTY has a value specified in + PLIST. In the following functions, if optional arg NIL-MEANS-NOT-PRESENT is non-`nil', then a property with a `nil' value is ignored or removed. @@ -1135,22 +1137,22 @@ Working With Lax Plists Recall that a "lax plist" is a property list whose keys are compared using `equal' instead of `eq'. - - Function: lax-plist-get lax-plist prop &optional default + - Function: lax-plist-get lax-plist property &optional default This function extracts a value from a lax property list. The - function returns the value corresponding to the given PROP, or - DEFAULT if PROP is not one of the properties on the list. + function returns the value corresponding to the given PROPERTY, or + DEFAULT if PROPERTY is not one of the properties on the list. - - Function: lax-plist-put lax-plist prop val - This function changes the value in LAX-PLIST of PROP to VAL. + - Function: lax-plist-put lax-plist property value + This function changes the value in LAX-PLIST of PROPERTY to VALUE. - - Function: lax-plist-remprop lax-plist prop - This function removes from LAX-PLIST the property PROP and its + - Function: lax-plist-remprop lax-plist property + This function removes from LAX-PLIST the property PROPERTY and its value. The new plist is returned; use `(setq x (lax-plist-remprop - x prop val))' to be sure to use the new value. The LAX-PLIST is + x property))' to be sure to use the new value. The LAX-PLIST is modified by side effects. - - Function: lax-plist-member lax-plist prop - This function returns `t' if PROP has a value specified in + - Function: lax-plist-member lax-plist property + This function returns `t' if PROPERTY has a value specified in LAX-PLIST. In the following functions, if optional arg NIL-MEANS-NOT-PRESENT is diff --git a/info/lispref.info-7 b/info/lispref.info-7 index 2e16da4..5bc2e97 100644 --- a/info/lispref.info-7 +++ b/info/lispref.info-7 @@ -471,19 +471,20 @@ Functions That Operate on Bit Vectors - Function: bitp object This function returns `t' if OBJECT is either 0 or 1. - - Function: bit-vector &rest objects + - Function: bit-vector &rest bits This function creates and returns a bit vector whose elements are - the arguments OBJECTS. The elements must be either of the two - integers 0 or 1. + the arguments BITS. Each argument must be a bit, i.e. one of the + two integers 0 or 1. (bit-vector 0 0 0 1 0 0 0 0 1 0) => #*0001000010 (bit-vector) => #* - - Function: make-bit-vector length object + - Function: make-bit-vector length bit This function creates and returns a bit vector consisting of - LENGTH elements, each initialized to OBJECT. + LENGTH elements, each initialized to BIT, which must be one of the + two integers 0 or 1. (setq picket-fence (make-bit-vector 9 1)) => #*111111111 @@ -999,7 +1000,7 @@ stored in places other than symbols: (getf '(foo 4) 'foo) => 4 - - Function: putf plist property value + - Macro: putf plist property value This stores VALUE as the value of the PROPERTY property in the property list PLIST. It may modify PLIST destructively, or it may construct a new list structure without altering the old. The diff --git a/info/lispref.info-8 b/info/lispref.info-8 index e9ddbe6..333739c 100644 --- a/info/lispref.info-8 +++ b/info/lispref.info-8 @@ -191,11 +191,11 @@ symbol function indirection when calling `erste'. The built-in function `indirect-function' provides an easy way to perform symbol function indirection explicitly. - - Function: indirect-function function - This function returns the meaning of FUNCTION as a function. If - FUNCTION is a symbol, then it finds FUNCTION's function definition - and starts over with that value. If FUNCTION is not a symbol, - then it returns FUNCTION itself. + - Function: indirect-function object + This function returns the meaning of OBJECT as a function. If + OBJECT is a symbol, then it finds OBJECT's function definition and + starts over with that value. If OBJECT is not a symbol, then it + returns OBJECT itself. Here is how you could define `indirect-function' in Lisp: @@ -980,18 +980,125 @@ and others. Quitting, which happens when the user types `C-g', is not considered an error, but it is handled almost like an error. *Note Quitting::. - - Function: error format-string &rest args - This function signals an error with an error message constructed by - applying `format' (*note String Conversion::) to FORMAT-STRING and - ARGS. + XEmacs has a rich hierarchy of error symbols predefined via +`deferror'. + + error + syntax-error + invalid-read-syntax + list-formation-error + malformed-list + malformed-property-list + circular-list + circular-property-list + + invalid-argument + wrong-type-argument + args-out-of-range + wrong-number-of-arguments + invalid-function + no-catch + + invalid-state + void-function + cyclic-function-indirection + void-variable + cyclic-variable-indirection + + invalid-operation + invalid-change + setting-constant + editing-error + beginning-of-buffer + end-of-buffer + buffer-read-only + io-error + end-of-file + arith-error + range-error + domain-error + singularity-error + overflow-error + underflow-error + + The five most common errors you will probably use or base your new +errors off of are `syntax-error', `invalid-argument', `invalid-state', +`invalid-operation', and `invalid-change'. Note the semantic +differences: + + * `syntax-error' is for errors in complex structures: parsed strings, + lists, and the like. + + * `invalid-argument' is for errors in a simple value. Typically, the + entire value, not just one part of it, is wrong. + + * `invalid-state' means that some settings have been changed in such + a way that their current state is unallowable. More and more, + code is being written more carefully, and catches the error when + the settings are being changed, rather than afterwards. This + leads us to the next error: + + * `invalid-change' means that an attempt is being made to change some + settings into an invalid state. `invalid-change' is a type of + `invalid-operation'. + + * `invalid-operation' refers to all cases where code is trying to do + something that's disallowed. This includes file errors, buffer + errors (e.g. running off the end of a buffer), `invalid-change' as + just mentioned, and arithmetic errors. + + - Function: error datum &rest args + This function signals a non-continuable error. + + DATUM should normally be an error symbol, i.e. a symbol defined + using `define-error'. ARGS will be made into a list, and DATUM + and ARGS passed as the two arguments to `signal', the most basic + error handling function. This error is not continuable: you cannot continue execution after - the error using the debugger `r' or `c' commands. If you wish the - user to be able to continue execution, use `cerror' or `signal' - instead. + the error using the debugger `r' command. See also `cerror'. + + The correct semantics of ARGS varies from error to error, but for + most errors that need to be generated in Lisp code, the first + argument should be a string describing the *context* of the error + (i.e. the exact operation being performed and what went wrong), + and the remaining arguments or \"frobs\" (most often, there is + one) specify the offending object(s) and/or provide additional + details such as the exact error when a file error occurred, e.g.: + + * the buffer in which an editing error occurred. + + * an invalid value that was encountered. (In such cases, the + string should describe the purpose or \"semantics\" of the + value [e.g. if the value is an argument to a function, the + name of the argument; if the value is the value corresponding + to a keyword, the name of the keyword; if the value is + supposed to be a list length, say this and say what the + purpose of the list is; etc.] as well as specifying why the + value is invalid, if that's not self-evident.) + + * the file in which an error occurred. (In such cases, there + should be a second frob, probably a string, specifying the + exact error that occurred. This does not occur in the string + that precedes the first frob, because that frob describes the + exact operation that was happening. + + For historical compatibility, DATUM can also be a string. In this + case, DATUM and ARGS are passed together as the arguments to + `format', and then an error is signalled using the error symbol + `error' and formatted string. Although this usage of `error' is + very common, it is deprecated because it totally defeats the + purpose of having structured errors. There is now a rich set of + defined errors to use. + + See also `cerror', `signal', and `signal-error'." These examples show typical uses of `error': + (error 'syntax-error + "Dialog descriptor must supply at least one button" + descriptor) + (error "You have committed an error. Try something else.") error--> You have committed an error. @@ -1000,17 +1107,12 @@ an error, but it is handled almost like an error. *Note Quitting::. (error "You have committed %d errors." 10) error--> You have committed 10 errors. - `error' works by calling `signal' with two arguments: the error - symbol `error', and a list containing the string returned by - `format'. This is repeated in an endless loop, to ensure that - `error' never returns. - If you want to use your own string as an error message verbatim, don't just write `(error STRING)'. If STRING contains `%', it will be interpreted as a format specifier, with undesirable results. Instead, use `(error "%s" STRING)'. - - Function: cerror format-string &rest args + - Function: cerror datum &rest args This function behaves like `error', except that the error it signals is continuable. That means that debugger commands `c' and `r' can resume execution. @@ -1118,163 +1220,3 @@ Debugging::) is non-`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. - -File: lispref.info, Node: Handling Errors, Next: Error Symbols, Prev: Processing of Errors, Up: Errors - -Writing Code to Handle Errors -............................. - - The usual effect of signaling an error is to terminate the command -that is running and return immediately to the XEmacs 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 -`condition-case'. A simple example looks like this: - - (condition-case nil - (delete-file filename) - (error nil)) - -This deletes the file named FILENAME, catching any error and returning -`nil' if an error occurs. - - The second argument of `condition-case' is called the "protected -form". (In the example above, the protected form is a call to -`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 -`signal' and `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 "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, -`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 `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, XEmacs unbinds all variable bindings made by binding -constructs that are being exited and executes the cleanups of all -`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 `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. - - `condition-case' is often used to trap errors that are predictable, -such as failure to open a file in a call to `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. - - Even when an error is handled, the debugger may still be called if -the variable `debug-on-signal' (*note Error Debugging::) is non-`nil'. -Note that this may yield unpredictable results with code that traps -expected errors as normal part of its operation. Do not set -`debug-on-signal' unless you know what you are doing. - - Error signaling and handling have some resemblance to `throw' and -`catch', but they are entirely separate facilities. An error cannot be -caught by a `catch', and a `throw' cannot be handled by an error -handler (though using `throw' when there is no suitable `catch' signals -an error that can be handled). - - - Special Form: condition-case var protected-form handlers... - This special form establishes the error handlers HANDLERS around - the execution of PROTECTED-FORM. If PROTECTED-FORM executes - without error, the value it returns becomes the value of the - `condition-case' form; in this case, the `condition-case' has no - effect. The `condition-case' form makes a difference when an - error occurs during PROTECTED-FORM. - - Each of the HANDLERS is a list of the form `(CONDITIONS BODY...)'. - Here CONDITIONS is an error condition name to be handled, or a - list of condition names; BODY is one or more Lisp expressions to - be executed when this handler handles an error. Here are examples - of handlers: - - (error nil) - - (arith-error (message "Division by zero")) - - ((arith-error file-error) - (message - "Either division by zero or failure to open a file")) - - Each error that occurs has an "error symbol" that describes what - kind of error it is. The `error-conditions' property of this - symbol is a list of condition names (*note Error Symbols::). Emacs - searches all the active `condition-case' forms for a handler that - specifies one or more of these condition names; the innermost - matching `condition-case' handles the error. Within this - `condition-case', the first applicable handler handles the error. - - After executing the body of the handler, the `condition-case' - returns normally, using the value of the last form in the handler - body as the overall value. - - The argument VAR is a variable. `condition-case' does not bind - this variable when executing the PROTECTED-FORM, only when it - handles an error. At that time, it binds VAR locally to a list of - the form `(ERROR-SYMBOL . 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 DATA--the third element of VAR. - - If VAR is `nil', that means no variable is bound. Then the error - symbol and associated data are not available to the handler. - - Here is an example of using `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. - - (defun safe-divide (dividend divisor) - (condition-case err - ;; Protected form. - (/ dividend divisor) - ;; The handler. - (arith-error ; Condition. - (princ (format "Arithmetic error: %s" err)) - 1000000))) - => safe-divide - - (safe-divide 5 0) - -| Arithmetic error: (arith-error) - => 1000000 - -The handler specifies condition name `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 `condition-case'. Thus, - - (safe-divide nil 3) - error--> Wrong type argument: integer-or-marker-p, nil - - Here is a `condition-case' that catches all kinds of errors, -including those signaled with `error': - - (setq baz 34) - => 34 - - (condition-case err - (if (eq baz 35) - t - ;; This is a call to the function `error'. - (error "Rats! The variable %s was %s, not 35" 'baz baz)) - ;; This is the handler; it is not a form. - (error (princ (format "The error was: %s" err)) - 2)) - -| The error was: (error "Rats! The variable baz was 34, not 35") - => 2 - diff --git a/info/lispref.info-9 b/info/lispref.info-9 index d9a7549..a0554c4 100644 --- a/info/lispref.info-9 +++ b/info/lispref.info-9 @@ -50,6 +50,166 @@ may be included in a translation approved by the Free Software Foundation instead of in the original English.  +File: lispref.info, Node: Handling Errors, Next: Error Symbols, Prev: Processing of Errors, Up: Errors + +Writing Code to Handle Errors +............................. + + The usual effect of signaling an error is to terminate the command +that is running and return immediately to the XEmacs 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 +`condition-case'. A simple example looks like this: + + (condition-case nil + (delete-file filename) + (error nil)) + +This deletes the file named FILENAME, catching any error and returning +`nil' if an error occurs. + + The second argument of `condition-case' is called the "protected +form". (In the example above, the protected form is a call to +`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 +`signal' and `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 "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, +`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 `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, XEmacs unbinds all variable bindings made by binding +constructs that are being exited and executes the cleanups of all +`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 `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. + + `condition-case' is often used to trap errors that are predictable, +such as failure to open a file in a call to `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. + + Even when an error is handled, the debugger may still be called if +the variable `debug-on-signal' (*note Error Debugging::) is non-`nil'. +Note that this may yield unpredictable results with code that traps +expected errors as normal part of its operation. Do not set +`debug-on-signal' unless you know what you are doing. + + Error signaling and handling have some resemblance to `throw' and +`catch', but they are entirely separate facilities. An error cannot be +caught by a `catch', and a `throw' cannot be handled by an error +handler (though using `throw' when there is no suitable `catch' signals +an error that can be handled). + + - Special Form: condition-case var protected-form handlers... + This special form establishes the error handlers HANDLERS around + the execution of PROTECTED-FORM. If PROTECTED-FORM executes + without error, the value it returns becomes the value of the + `condition-case' form; in this case, the `condition-case' has no + effect. The `condition-case' form makes a difference when an + error occurs during PROTECTED-FORM. + + Each of the HANDLERS is a list of the form `(CONDITIONS BODY...)'. + Here CONDITIONS is an error condition name to be handled, or a + list of condition names; BODY is one or more Lisp expressions to + be executed when this handler handles an error. Here are examples + of handlers: + + (error nil) + + (arith-error (message "Division by zero")) + + ((arith-error file-error) + (message + "Either division by zero or failure to open a file")) + + Each error that occurs has an "error symbol" that describes what + kind of error it is. The `error-conditions' property of this + symbol is a list of condition names (*note Error Symbols::). Emacs + searches all the active `condition-case' forms for a handler that + specifies one or more of these condition names; the innermost + matching `condition-case' handles the error. Within this + `condition-case', the first applicable handler handles the error. + + After executing the body of the handler, the `condition-case' + returns normally, using the value of the last form in the handler + body as the overall value. + + The argument VAR is a variable. `condition-case' does not bind + this variable when executing the PROTECTED-FORM, only when it + handles an error. At that time, it binds VAR locally to a list of + the form `(ERROR-SYMBOL . 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 DATA--the third element of VAR. + + If VAR is `nil', that means no variable is bound. Then the error + symbol and associated data are not available to the handler. + + Here is an example of using `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. + + (defun safe-divide (dividend divisor) + (condition-case err + ;; Protected form. + (/ dividend divisor) + ;; The handler. + (arith-error ; Condition. + (princ (format "Arithmetic error: %s" err)) + 1000000))) + => safe-divide + + (safe-divide 5 0) + -| Arithmetic error: (arith-error) + => 1000000 + +The handler specifies condition name `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 `condition-case'. Thus, + + (safe-divide nil 3) + error--> Wrong type argument: integer-or-marker-p, nil + + Here is a `condition-case' that catches all kinds of errors, +including those signaled with `error': + + (setq baz 34) + => 34 + + (condition-case err + (if (eq baz 35) + t + ;; This is a call to the function `error'. + (error "Rats! The variable %s was %s, not 35" 'baz baz)) + ;; This is the handler; it is not a form. + (error (princ (format "The error was: %s" err)) + 2)) + -| The error was: (error "Rats! The variable baz was 34, not 35") + => 2 + + File: lispref.info, Node: Error Symbols, Prev: Handling Errors, Up: Errors Error Symbols and Condition Names @@ -1044,171 +1204,3 @@ important customization method. * Default Value:: The default value is seen in buffers that don't have their own local values. - -File: lispref.info, Node: Intro to Buffer-Local, Next: Creating Buffer-Local, Up: Buffer-Local Variables - -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 `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 `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 -`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. - - A more powerful operation is to mark the variable as "automatically -buffer-local" by calling `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 `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 `setq'; you need to use -`setq-default' to do that. - - Local variables in a file you edit are also represented by -buffer-local bindings for the buffer that holds the file within XEmacs. -*Note Auto Major Mode::. - - -File: lispref.info, Node: Creating Buffer-Local, Next: Default Value, Prev: Intro to Buffer-Local, Up: Buffer-Local Variables - -Creating and Deleting Buffer-Local Bindings -------------------------------------------- - - - Command: make-local-variable variable - This function creates a buffer-local binding in the current buffer - for VARIABLE (a symbol). Other buffers are not affected. The - value returned is VARIABLE. - - The buffer-local value of VARIABLE starts out as the same value - VARIABLE previously had. If VARIABLE was void, it remains void. - - ;; In buffer `b1': - (setq foo 5) ; Affects all buffers. - => 5 - (make-local-variable 'foo) ; Now it is local in `b1'. - => foo - foo ; That did not change - => 5 ; the value. - (setq foo 6) ; Change the value - => 6 ; in `b1'. - foo - => 6 - - ;; In buffer `b2', the value hasn't changed. - (save-excursion - (set-buffer "b2") - foo) - => 5 - - Making a variable buffer-local within a `let'-binding for that - variable does not work. This is because `let' does not distinguish - between different kinds of bindings; it knows only which variable - the binding was made for. - - *Please note:* do not use `make-local-variable' for a hook - variable. Instead, use `make-local-hook'. *Note Hooks::. - - - Command: make-variable-buffer-local variable - This function marks 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 VARIABLE. - - - Function: local-variable-p variable &optional buffer - This returns `t' if VARIABLE is buffer-local in buffer BUFFER - (which defaults to the current buffer); otherwise, `nil'. - - - Function: buffer-local-variables &optional buffer - This function returns a list describing the buffer-local variables - in buffer BUFFER. It returns an association list (*note - Association Lists::) in which each association contains one - buffer-local variable and its value. When a buffer-local variable - is void in BUFFER, then it appears directly in the resulting list. - If BUFFER is omitted, the current buffer is used. - - (make-local-variable 'foobar) - (makunbound 'foobar) - (make-local-variable 'bind-me) - (setq bind-me 69) - (setq lcl (buffer-local-variables)) - ;; First, built-in variables local in all buffers: - => ((mark-active . nil) - (buffer-undo-list nil) - (mode-name . "Fundamental") - ... - ;; Next, non-built-in local variables. - ;; This one is local and void: - foobar - ;; This one is local and nonvoid: - (bind-me . 69)) - - Note that storing new values into the CDRs of cons cells in this - list does _not_ change the local values of the variables. - - - Command: kill-local-variable variable - This function deletes the buffer-local binding (if any) for - VARIABLE (a symbol) in the current buffer. As a result, the - global (default) binding of VARIABLE becomes visible in this - buffer. Usually this results in a change in the value of - 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. - - `kill-local-variable' returns 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. - - - Function: 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 `nil', the syntax table to - the value of `standard-syntax-table', and the abbrev table to the - value of `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. - - `kill-all-local-variables' returns `nil'. - - A local variable is "permanent" if the variable name (a symbol) has a -`permanent-local' property that is non-`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. - diff --git a/info/new-users-guide.info b/info/new-users-guide.info index 1f01bd3..f3d6418 100644 --- a/info/new-users-guide.info +++ b/info/new-users-guide.info @@ -20,7 +20,7 @@ preserved on all copies. Indirect: new-users-guide.info-1: 635 new-users-guide.info-2: 50468 -new-users-guide.info-3: 100029 +new-users-guide.info-3: 100033  Tag Table: (Indirect) @@ -58,19 +58,19 @@ Node: Files65082 Node: File Names65804 Node: Visiting67607 Node: Saving Files69731 -Node: Other Customizations73108 -Node: Setting Variables75584 -Node: Init File78793 -Node: Select and Move84263 -Node: Selecting Text85217 -Node: Mouse86730 -Node: Region Operation88055 -Node: Moving Text89315 -Node: Accumulating text90555 -Node: Search and Replace92876 -Node: Key Index96740 -Node: Command Index100029 -Node: Variable Index104131 -Node: Concept Index104708 +Node: Other Customizations73110 +Node: Setting Variables75586 +Node: Init File78795 +Node: Select and Move84265 +Node: Selecting Text85219 +Node: Mouse86732 +Node: Region Operation88057 +Node: Moving Text89317 +Node: Accumulating text90557 +Node: Search and Replace92878 +Node: Key Index96744 +Node: Command Index100033 +Node: Variable Index104135 +Node: Concept Index104712  End Tag Table diff --git a/info/new-users-guide.info-2 b/info/new-users-guide.info-2 index 858df8e..f996446 100644 --- a/info/new-users-guide.info-2 +++ b/info/new-users-guide.info-2 @@ -542,7 +542,7 @@ saved by reading the text from the file again (called "reverting"). For more information on this option, *Note Reverting: (xemacs)Reverting. When you save a file in Emacs, it destroys its old contents. However, -if you set the variable MAKE-BACKUP-FILES to non-NIL i.e. `t', Emacs +if you set the variable MAKE-BACKUP-FILES to non-`nil' i.e. `t', Emacs will create a "backup" file. Select the Describe variable option from the Help menu and look at the documentation for this variable. Its default value should be `t'. However, if its not then use `M-x @@ -1096,7 +1096,7 @@ complete typing the whole string. All searches in Emacs ignore the case of the text they are searching, i.e. if you are searching for "String", then "string" will also be one of the selections. If you want a case sensitive search select the Case Sensitive Search from the Option menu. -You can also set the variable CASE-FOLD-SEARCH to NIL for making +You can also set the variable CASE-FOLD-SEARCH to `nil' for making searches case-sensitive. For information on setting variables, *Note Setting Variables::. The two commands for searching for strings in XEmacs are: diff --git a/info/widget.info b/info/widget.info index 652d4f1..425627c 100644 --- a/info/widget.info +++ b/info/widget.info @@ -94,7 +94,7 @@ and the HTML form support in the `w3' browser. The advantages for a programmer of using the `widget' package to implement forms are: - 1. More complex field than just editable text are supported. + 1. More complex fields than just editable text are supported. 2. You can give the user immediate feedback if he enters invalid data in a text field, and sometimes prevent entering invalid data. @@ -416,7 +416,7 @@ Basic Types NAME ::= (NAME [KEYWORD ARGUMENT]... ARGS) | NAME - Where, NAME is a widget name, KEYWORD is the name of a property, + where NAME is a widget name, KEYWORD is the name of a property, ARGUMENT is the value of the property, and ARGS are interpreted in a widget specific way. @@ -490,7 +490,8 @@ widget specific way. The value of the symbol is expanded according to this table. `:doc' - The string inserted by the `%d' escape in the format string. + The string inserted by the `%d' or `%h' escape in the format + string. `:tag' The string inserted by the `%t' escape in the format string. @@ -538,7 +539,7 @@ widget specific way. specified value. `:validate' - A function which takes a widget as an argument, and return nil if + A function which takes a widget as an argument, and returns nil if the widget's current value is valid for the widget. Otherwise it should return the widget containing the invalid data, and set that widget's `:error' property to a string explaining the error. @@ -685,8 +686,10 @@ widget will match all string values. The following extra properties are recognized. `:size' - The width of the editable field. - By default the field will reach to the end of the line. + The minimum width of the editable field. + By default the field will reach to the end of the line. If the + content is too large, the displayed representation will expand to + contain it. The content is not truncated to size. `:value-face' Face used for highlighting the editable field. Default is @@ -705,7 +708,7 @@ widget will match all string values. `:keymap' Keymap used in the editable field. The default value is `widget-field-keymap', which allows you to use all the normal - editing commands, even if the buffers major mode suppress some of + editing commands, even if the buffer's major mode suppress some of them. Pressing return invokes the function specified by `:action'.  @@ -1517,35 +1520,35 @@ Wishlist Tag Table: Node: Top211 Node: Introduction591 -Node: User Interface4074 -Node: Programming Example8969 -Node: Setting Up the Buffer13119 -Node: Basic Types14836 -Node: link20881 -Node: url-link21395 -Node: info-link21707 -Node: push-button21998 -Node: editable-field22571 -Node: text23910 -Node: menu-choice24208 -Node: radio-button-choice25061 -Node: item26628 -Node: choice-item27016 -Node: toggle27514 -Node: checkbox28251 -Node: checklist28557 -Node: editable-list30001 -Node: group31183 -Node: Sexp Types31470 -Node: constants31783 -Node: generic32862 -Node: atoms33395 -Node: composite35342 -Node: Widget Properties37812 -Node: Defining New Widgets40877 -Node: Widget Browser46177 -Node: Widget Minor Mode47035 -Node: Utilities47592 -Node: Widget Wishlist48073 +Node: User Interface4075 +Node: Programming Example8970 +Node: Setting Up the Buffer13120 +Node: Basic Types14837 +Node: link20895 +Node: url-link21409 +Node: info-link21721 +Node: push-button22012 +Node: editable-field22585 +Node: text24068 +Node: menu-choice24366 +Node: radio-button-choice25219 +Node: item26786 +Node: choice-item27174 +Node: toggle27672 +Node: checkbox28409 +Node: checklist28715 +Node: editable-list30159 +Node: group31341 +Node: Sexp Types31628 +Node: constants31941 +Node: generic33020 +Node: atoms33553 +Node: composite35500 +Node: Widget Properties37970 +Node: Defining New Widgets41035 +Node: Widget Browser46335 +Node: Widget Minor Mode47193 +Node: Utilities47750 +Node: Widget Wishlist48231  End Tag Table diff --git a/info/xemacs-faq.info b/info/xemacs-faq.info index 99ec491..836f830 100644 --- a/info/xemacs-faq.info +++ b/info/xemacs-faq.info @@ -9,257 +9,260 @@ END-INFO-DIR-ENTRY  Indirect: xemacs-faq.info-1: 205 -xemacs-faq.info-2: 50174 -xemacs-faq.info-3: 99767 -xemacs-faq.info-4: 149758 -xemacs-faq.info-5: 199303 +xemacs-faq.info-2: 49999 +xemacs-faq.info-3: 99617 +xemacs-faq.info-4: 149492 +xemacs-faq.info-5: 199354  Tag Table: (Indirect) Node: Top205 -Node: Introduction16499 -Node: Q1.0.119941 -Node: Q1.0.220477 -Node: Q1.0.321022 -Node: Q1.0.421284 -Node: Q1.0.522734 -Node: Q1.0.623423 -Node: Q1.0.724429 -Node: Q1.0.824682 -Node: Q1.0.924897 -Node: Q1.0.1025175 -Node: Q1.0.1125418 -Node: Q1.0.1225807 -Node: Q1.0.1326175 -Node: Q1.0.1426424 -Node: Q1.1.126934 -Node: Q1.1.227976 -Node: Q1.1.328369 -Node: Q1.2.129320 -Node: Q1.2.230376 -Node: Q1.2.330810 -Node: Q1.3.131894 -Node: Q1.3.232545 -Node: Q1.3.333009 -Node: Q1.3.433250 -Node: Q1.3.534023 -Node: Q1.3.636428 -Node: Q1.3.737959 -Node: Q1.4.138894 -Node: Q1.4.239756 -Node: Q1.4.340097 -Node: Q1.4.440516 -Node: Q1.4.542056 -Node: Q1.4.642360 -Node: Installation43353 -Node: Q2.0.145716 -Node: Q2.0.246516 -Node: Q2.0.348284 -Node: Q2.0.449582 -Node: Q2.0.550174 -Node: Q2.0.650522 -Node: Q2.0.750903 -Node: Q2.0.851284 -Node: Q2.0.952861 -Node: Q2.0.1054299 -Node: Q2.0.1155143 -Node: Q2.0.1256084 -Node: Q2.1.157606 -Node: Q2.1.260348 -Node: Q2.1.361525 -Node: Q2.1.462818 -Node: Q2.1.563617 -Node: Q2.1.663979 -Node: Q2.1.764456 -Node: Q2.1.864809 -Node: Q2.1.966343 -Node: Q2.1.1066765 -Node: Q2.1.1167522 -Node: Q2.1.1268387 -Node: Q2.1.1369342 -Node: Q2.1.1470373 -Node: Q2.1.1571484 -Node: Q2.1.1678516 -Node: Q2.1.1779210 -Node: Q2.1.1879807 -Node: Q2.1.1979934 -Node: Q2.1.2080464 -Node: Q2.1.2180846 -Node: Q2.1.2281039 -Node: Q2.1.2382336 -Node: Q2.1.2483004 -Node: Customization83460 -Node: Q3.0.188298 -Node: Q3.0.289004 -Node: Q3.0.389568 -Node: Q3.0.489985 -Node: Q3.0.590818 -Node: Q3.0.691599 -Node: Q3.0.792179 -Node: Q3.0.892843 -Node: Q3.0.993801 -Node: Q3.1.194362 -Node: Q3.1.295099 -Node: Q3.1.395530 -Node: Q3.1.495719 -Node: Q3.1.595908 -Node: Q3.1.696292 -Node: Q3.1.797001 -Node: Q3.1.899225 -Node: Q3.2.199767 -Node: Q3.2.2101420 -Node: Q3.2.3102219 -Node: Q3.2.4102821 -Node: Q3.2.5103855 -Node: Q3.2.6104322 -Node: Q3.3.1105247 -Node: Q3.3.2105677 -Node: Q3.3.3106308 -Node: Q3.3.4106689 -Node: Q3.3.5107790 -Node: Q3.4.1109284 -Node: Q3.4.2109927 -Node: Q3.5.1110439 -Node: Q3.5.2111888 -Node: Q3.5.3112306 -Node: Q3.5.4113144 -Node: Q3.5.5113976 -Node: Q3.5.6115116 -Node: Q3.5.7116106 -Node: Q3.5.8117546 -Node: Q3.5.9118293 -Node: Q3.5.10119073 -Node: Q3.5.11119709 -Node: Q3.6.1120262 -Node: Q3.6.2121007 -Node: Q3.6.3121435 -Node: Q3.7.1121935 -Node: Q3.7.2122823 -Node: Q3.7.3123482 -Node: Q3.7.4123904 -Node: Q3.7.5124247 -Node: Q3.7.6124715 -Node: Q3.7.7125430 -Node: Q3.7.8126450 -Node: Q3.8.1126869 -Node: Q3.8.2127329 -Node: Q3.8.3127792 -Node: Q3.8.4128398 -Node: Q3.8.5129117 -Node: Q3.9.1129902 -Node: Q3.9.2130842 -Node: Q3.9.3131440 -Node: Q3.9.4132102 -Node: Q3.10.1132981 -Node: Q3.10.2133799 -Node: Q3.10.3134804 -Node: Q3.10.4135532 -Node: Q3.10.5135915 -Node: Subsystems136967 -Node: Q4.0.1139454 -Node: Q4.0.2139979 -Node: Q4.0.3140537 -Node: Q4.0.4140858 -Node: Q4.0.5141100 -Node: Q4.0.6141331 -Node: Q4.0.7141919 -Node: Q4.0.8142244 -Node: Q4.0.9143471 -Node: Q4.0.10145509 -Node: Q4.0.11145998 -Node: Q4.0.12146876 -Node: Q4.1.1147849 -Node: Q4.1.2148252 -Node: Q4.1.3148579 -Node: Q4.2.1148888 -Node: Q4.2.2149518 -Node: Q4.2.3149758 -Node: Q4.2.4150302 -Node: Q4.3.1150955 -Node: Q4.3.2151539 -Node: Q4.3.3153020 -Node: Q4.3.4153292 -Node: Q4.3.5153969 -Node: Q4.4.1154597 -Node: Q4.4.2156083 -Node: Q4.5.1157287 -Node: Q4.6.1158056 -Node: Q4.7.1163316 -Node: Q4.7.2164271 -Node: Q4.7.3164568 -Node: Q4.7.4164754 -Node: Q4.7.5165638 -Node: Q4.7.6167279 -Node: Miscellaneous167568 -Node: Q5.0.1170981 -Node: Q5.0.2171720 -Node: Q5.0.3172574 -Node: Q5.0.4173276 -Node: Q5.0.5174215 -Node: Q5.0.6176195 -Node: Q5.0.7176852 -Node: Q5.0.8177457 -Node: Q5.0.9177976 -Node: Q5.0.10178490 -Node: Q5.0.11178738 -Node: Q5.0.12179276 -Node: Q5.0.13180193 -Node: Q5.0.14180877 -Node: Q5.0.15181642 -Node: Q5.0.16181939 -Node: Q5.0.17182451 -Node: Q5.0.18182716 -Node: Q5.0.19182910 -Node: Q5.0.20183334 -Node: Q5.1.1184249 -Node: Q5.1.2186318 -Node: Q5.1.3187054 -Node: Q5.1.4190448 -Node: Q5.1.5190983 -Node: Q5.1.6193107 -Node: Q5.1.7194593 -Node: Q5.1.8196186 -Node: Q5.1.9196738 -Node: Q5.1.10197623 -Node: Q5.1.11198754 -Node: Q5.2.1199303 -Node: Q5.2.2199873 -Node: Q5.2.3200290 -Node: Q5.2.4200525 -Node: Q5.3.1201435 -Node: Q5.3.2202656 -Node: Q5.3.3203432 -Node: Q5.3.4203916 -Node: Q5.3.5204583 -Node: Q5.3.6205452 -Node: Q5.3.7205697 -Node: Q5.3.8207887 -Node: Q5.3.9208134 -Node: Q5.3.10209087 -Node: Q5.3.11211171 -Node: Q5.3.12212762 -Node: MS Windows214036 -Node: Q6.0.1215513 -Node: Q6.0.2216260 -Node: Q6.0.3216725 -Node: Q6.0.4217005 -Node: Q6.1.1219284 -Node: Q6.1.2220155 -Node: Q6.1.3220610 -Node: Q6.1.4220892 -Node: Q6.1.5221270 -Node: Q6.1.6222138 -Node: Q6.2.1224444 -Node: Q6.2.2225345 -Node: Q6.2.3225757 -Node: Q6.3.1226046 -Node: Q6.3.2227140 -Node: Q6.3.3230321 -Node: Q6.4.1230590 -Node: Current Events231925 -Node: Q7.0.1232579 -Node: Q7.0.2233218 -Node: Q7.0.3234291 -Node: Q7.0.4234519 +Node: Introduction16704 +Node: Q1.0.120146 +Node: Q1.0.220682 +Node: Q1.0.321227 +Node: Q1.0.421489 +Node: Q1.0.522939 +Node: Q1.0.623628 +Node: Q1.0.724634 +Node: Q1.0.824887 +Node: Q1.0.925102 +Node: Q1.0.1025380 +Node: Q1.0.1125623 +Node: Q1.0.1226012 +Node: Q1.0.1326380 +Node: Q1.0.1426629 +Node: Q1.1.127139 +Node: Q1.1.228181 +Node: Q1.1.328574 +Node: Q1.2.129525 +Node: Q1.2.230581 +Node: Q1.2.331015 +Node: Q1.3.132099 +Node: Q1.3.232750 +Node: Q1.3.333214 +Node: Q1.3.433455 +Node: Q1.3.534228 +Node: Q1.3.636633 +Node: Q1.3.738164 +Node: Q1.4.139099 +Node: Q1.4.239961 +Node: Q1.4.340302 +Node: Q1.4.440721 +Node: Q1.4.542261 +Node: Q1.4.642565 +Node: Installation43558 +Node: Q2.0.146133 +Node: Q2.0.246933 +Node: Q2.0.348701 +Node: Q2.0.449999 +Node: Q2.0.550591 +Node: Q2.0.650939 +Node: Q2.0.751320 +Node: Q2.0.851701 +Node: Q2.0.953278 +Node: Q2.0.1054716 +Node: Q2.0.1155560 +Node: Q2.0.1256501 +Node: Q2.0.1358024 +Node: Q2.0.1458513 +Node: Q2.1.159571 +Node: Q2.1.262313 +Node: Q2.1.363490 +Node: Q2.1.464783 +Node: Q2.1.565582 +Node: Q2.1.665944 +Node: Q2.1.766421 +Node: Q2.1.866774 +Node: Q2.1.968308 +Node: Q2.1.1068730 +Node: Q2.1.1169487 +Node: Q2.1.1270352 +Node: Q2.1.1371307 +Node: Q2.1.1472338 +Node: Q2.1.1573449 +Node: Q2.1.1680481 +Node: Q2.1.1781175 +Node: Q2.1.1881772 +Node: Q2.1.1981899 +Node: Q2.1.2082429 +Node: Q2.1.2182811 +Node: Q2.1.2283004 +Node: Q2.1.2384301 +Node: Q2.1.2484969 +Node: Q2.1.2585441 +Node: Customization86076 +Node: Q3.0.190914 +Node: Q3.0.291620 +Node: Q3.0.392184 +Node: Q3.0.492601 +Node: Q3.0.593434 +Node: Q3.0.694215 +Node: Q3.0.794795 +Node: Q3.0.895459 +Node: Q3.0.996417 +Node: Q3.1.196978 +Node: Q3.1.297715 +Node: Q3.1.398146 +Node: Q3.1.498335 +Node: Q3.1.598524 +Node: Q3.1.698908 +Node: Q3.1.799617 +Node: Q3.1.8101841 +Node: Q3.2.1102383 +Node: Q3.2.2104036 +Node: Q3.2.3104835 +Node: Q3.2.4105437 +Node: Q3.2.5106471 +Node: Q3.2.6106938 +Node: Q3.3.1107863 +Node: Q3.3.2108293 +Node: Q3.3.3108924 +Node: Q3.3.4109305 +Node: Q3.3.5110406 +Node: Q3.4.1111900 +Node: Q3.4.2112543 +Node: Q3.5.1113055 +Node: Q3.5.2114504 +Node: Q3.5.3114922 +Node: Q3.5.4115760 +Node: Q3.5.5116592 +Node: Q3.5.6117732 +Node: Q3.5.7118722 +Node: Q3.5.8120162 +Node: Q3.5.9120909 +Node: Q3.5.10121689 +Node: Q3.5.11122325 +Node: Q3.6.1122878 +Node: Q3.6.2123623 +Node: Q3.6.3124051 +Node: Q3.7.1124551 +Node: Q3.7.2125439 +Node: Q3.7.3126098 +Node: Q3.7.4126520 +Node: Q3.7.5126863 +Node: Q3.7.6127331 +Node: Q3.7.7128046 +Node: Q3.7.8129066 +Node: Q3.8.1129485 +Node: Q3.8.2129945 +Node: Q3.8.3130408 +Node: Q3.8.4131014 +Node: Q3.8.5131733 +Node: Q3.9.1132518 +Node: Q3.9.2133458 +Node: Q3.9.3134056 +Node: Q3.9.4134718 +Node: Q3.10.1135597 +Node: Q3.10.2136415 +Node: Q3.10.3137420 +Node: Q3.10.4138148 +Node: Q3.10.5138531 +Node: Subsystems139583 +Node: Q4.0.1142070 +Node: Q4.0.2142595 +Node: Q4.0.3143153 +Node: Q4.0.4143474 +Node: Q4.0.5143716 +Node: Q4.0.6143947 +Node: Q4.0.7144535 +Node: Q4.0.8144860 +Node: Q4.0.9146087 +Node: Q4.0.10148125 +Node: Q4.0.11148614 +Node: Q4.0.12149492 +Node: Q4.1.1150465 +Node: Q4.1.2150868 +Node: Q4.1.3151195 +Node: Q4.2.1151504 +Node: Q4.2.2152134 +Node: Q4.2.3152374 +Node: Q4.2.4152918 +Node: Q4.3.1153571 +Node: Q4.3.2154155 +Node: Q4.3.3155636 +Node: Q4.3.4155908 +Node: Q4.3.5156585 +Node: Q4.4.1157213 +Node: Q4.4.2158699 +Node: Q4.5.1159903 +Node: Q4.6.1160672 +Node: Q4.7.1165932 +Node: Q4.7.2166887 +Node: Q4.7.3167184 +Node: Q4.7.4167370 +Node: Q4.7.5168254 +Node: Q4.7.6169895 +Node: Miscellaneous170184 +Node: Q5.0.1173597 +Node: Q5.0.2174336 +Node: Q5.0.3175190 +Node: Q5.0.4175892 +Node: Q5.0.5176831 +Node: Q5.0.6178811 +Node: Q5.0.7179468 +Node: Q5.0.8180073 +Node: Q5.0.9180592 +Node: Q5.0.10181106 +Node: Q5.0.11181354 +Node: Q5.0.12181892 +Node: Q5.0.13182809 +Node: Q5.0.14183493 +Node: Q5.0.15184258 +Node: Q5.0.16184555 +Node: Q5.0.17185067 +Node: Q5.0.18185332 +Node: Q5.0.19185526 +Node: Q5.0.20185950 +Node: Q5.1.1186865 +Node: Q5.1.2188934 +Node: Q5.1.3189670 +Node: Q5.1.4193064 +Node: Q5.1.5193599 +Node: Q5.1.6195723 +Node: Q5.1.7197209 +Node: Q5.1.8198802 +Node: Q5.1.9199354 +Node: Q5.1.10200239 +Node: Q5.1.11201370 +Node: Q5.2.1201919 +Node: Q5.2.2202489 +Node: Q5.2.3202906 +Node: Q5.2.4203141 +Node: Q5.3.1204051 +Node: Q5.3.2205272 +Node: Q5.3.3206048 +Node: Q5.3.4206532 +Node: Q5.3.5207199 +Node: Q5.3.6208068 +Node: Q5.3.7208313 +Node: Q5.3.8210503 +Node: Q5.3.9210750 +Node: Q5.3.10211703 +Node: Q5.3.11213787 +Node: Q5.3.12215378 +Node: MS Windows216652 +Node: Q6.0.1218129 +Node: Q6.0.2218876 +Node: Q6.0.3219341 +Node: Q6.0.4219621 +Node: Q6.1.1221900 +Node: Q6.1.2222771 +Node: Q6.1.3223226 +Node: Q6.1.4223508 +Node: Q6.1.5223886 +Node: Q6.1.6224754 +Node: Q6.2.1227060 +Node: Q6.2.2227961 +Node: Q6.2.3228373 +Node: Q6.3.1228662 +Node: Q6.3.2229756 +Node: Q6.3.3232937 +Node: Q6.4.1233206 +Node: Current Events234541 +Node: Q7.0.1235195 +Node: Q7.0.2235834 +Node: Q7.0.3236907 +Node: Q7.0.4237135  End Tag Table diff --git a/info/xemacs-faq.info-1 b/info/xemacs-faq.info-1 index 6401a38..791fbce 100644 --- a/info/xemacs-faq.info-1 +++ b/info/xemacs-faq.info-1 @@ -97,6 +97,8 @@ Installation and Trouble Shooting * Q2.0.10:: After I run configure I find a coredump, is something wrong? * Q2.0.11:: XEmacs can't resolve host names. * Q2.0.12:: Why can't I strip XEmacs? +* Q2.0.13:: I don't need no steenkin' packages. Do I? (NEW) +* Q2.0.14:: How do I figure out which packages to install? (NEW) Trouble Shooting: * Q2.1.1:: XEmacs just crashed on me! @@ -123,6 +125,7 @@ Trouble Shooting: * Q2.1.22:: XEmacs seems to take a really long time to do some things. * Q2.1.23:: Movemail on Linux does not work for XEmacs 19.15 and later. * Q2.1.24:: XEmacs won't start without network. (NEW) +* Q2.1.25:: After upgrading, XEmacs won't do `foo' any more! (NEW) Customization and Options @@ -1115,6 +1118,8 @@ Installation: * Q2.0.10:: After I run configure I find a coredump, is something wrong? * Q2.0.11:: XEmacs can't resolve host names. * Q2.0.12:: Why can't I strip XEmacs? +* Q2.0.13:: I don't need no steenkin' packages. Do I? (NEW) +* Q2.0.14:: I don't want to install a million .els one at a time! (NEW) Trouble Shooting: * Q2.1.1:: XEmacs just crashed on me! @@ -1141,6 +1146,7 @@ Trouble Shooting: * Q2.1.22:: XEmacs seems to take a really long time to do some things. * Q2.1.23:: Movemail on Linux does not work for XEmacs 19.15 and later. * Q2.1.24:: XEmacs won't start without network. (NEW) +* Q2.1.25:: After upgrading, XEmacs won't do `foo' any more! (NEW)  File: xemacs-faq.info, Node: Q2.0.1, Next: Q2.0.2, Prev: Installation, Up: Installation @@ -1236,21 +1242,3 @@ else, so if you see references to NAS or Network Audio System, it's the same thing. It also might be found at `ftp://ftp.x.org/contrib/audio/nas/'. - -File: xemacs-faq.info, Node: Q2.0.4, Next: Q2.0.5, Prev: Q2.0.3, Up: Installation - -Q2.0.4: Problems with Linux and ncurses. ----------------------------------------- - - On Linux 1.3.98 with termcap 2.0.8 and the ncurses that came with -libc 5.2.18, XEmacs 20.0b20 is unable to open a tty device: - - src/xemacs -nw -q - Initialization error: - Terminal type `xterm' undefined (or can't access database?) - - Ben Wing writes: - - Your ncurses configuration is messed up. Your /usr/lib/terminfo - is a bad pointer, perhaps to a CD-ROM that is not inserted. - diff --git a/info/xemacs-faq.info-2 b/info/xemacs-faq.info-2 index 6f1f39f..66252fd 100644 --- a/info/xemacs-faq.info-2 +++ b/info/xemacs-faq.info-2 @@ -7,6 +7,24 @@ START-INFO-DIR-ENTRY END-INFO-DIR-ENTRY  +File: xemacs-faq.info, Node: Q2.0.4, Next: Q2.0.5, Prev: Q2.0.3, Up: Installation + +Q2.0.4: Problems with Linux and ncurses. +---------------------------------------- + + On Linux 1.3.98 with termcap 2.0.8 and the ncurses that came with +libc 5.2.18, XEmacs 20.0b20 is unable to open a tty device: + + src/xemacs -nw -q + Initialization error: + Terminal type `xterm' undefined (or can't access database?) + + Ben Wing writes: + + Your ncurses configuration is messed up. Your /usr/lib/terminfo + is a bad pointer, perhaps to a CD-ROM that is not inserted. + + File: xemacs-faq.info, Node: Q2.0.5, Next: Q2.0.6, Prev: Q2.0.4, Up: Installation Q2.0.5: Do I need X11 to run XEmacs? @@ -169,7 +187,7 @@ that stock SunOS systems do not ship with DNS resolver code in libc. then proceed to link against the DNS resolver library code.  -File: xemacs-faq.info, Node: Q2.0.12, Next: Q2.1.1, Prev: Q2.0.11, Up: Installation +File: xemacs-faq.info, Node: Q2.0.12, Next: Q2.0.13, Prev: Q2.0.11, Up: Installation Q2.0.12: Why can't I strip XEmacs? ---------------------------------- @@ -212,7 +230,49 @@ Q2.0.12: Why can't I strip XEmacs? /usr/local/lib/xemacs-19.16/i586-unknown-linuxaout  -File: xemacs-faq.info, Node: Q2.1.1, Next: Q2.1.2, Prev: Q2.0.12, Up: Installation +File: xemacs-faq.info, Node: Q2.0.13, Next: Q2.0.14, Prev: Q2.0.12, Up: Installation + +Q2.0.13: I don't need no steenkin' packages. Do I? (NEW) +--------------------------------------------------------- + + Strictly speaking, no. XEmacs will build and install just fine +without any packages installed. However, only the most basic editing +functions will be available with no packages installed, so installing +packages is an essential part of making your installed XEmacs _useful_. + + +File: xemacs-faq.info, Node: Q2.0.14, Next: Q2.1.1, Prev: Q2.0.13, Up: Installation + +Q2.0.12: How do I figure out which packages to install? (NEW) +------------------------------------------------------------- + + Many people really liked the old way that packages were bundled and +do not want to mess with packages at all. You can grab all the +packages at once like you used to with old XEmacs versions. Download +the file + + `xemacs-sumo.tar.gz' + + For an XEmacs compiled with Mule you also need + + `xemacs-mule-sumo.tar.gz' + + from the `packages' directory on your XEmacs mirror archive. N.B. +They are called 'Sumo Tarballs' for good reason. They are currently +about 15MB and 2.3MB (gzipped) respectively. + + Install them by + + `cd $prefix/lib/xemacs ; gunzip -c | tar xf -' + + See README.packages for more detailed installation instructions. + + As the Sumo tarballs are not regenerated as often as the individual +packages, it is recommended that you use the automatic package tools +afterwards to pick up any recent updates. + + +File: xemacs-faq.info, Node: Q2.1.1, Next: Q2.1.2, Prev: Q2.0.14, Up: Installation 2.1: Trouble Shooting ===================== @@ -874,7 +934,7 @@ and 20.x. I am using Linux. #define MAIL_USE_FLOCK  -File: xemacs-faq.info, Node: Q2.1.24, Prev: Q2.1.23, Up: Installation +File: xemacs-faq.info, Node: Q2.1.24, Next: Q2.1.25, Prev: Q2.1.23, Up: Installation Q2.1.24: XEmacs won't start without network. (NEW) --------------------------------------------------- @@ -888,6 +948,19 @@ not on the network, you may be missing a "localhost" entry in your Add that line, and XEmacs will be happy.  +File: xemacs-faq.info, Node: Q2.1.25, Prev: Q2.1.24, Up: Installation + +Q2.1.25:: After upgrading, XEmacs won't do `foo' any more! (NEW) +----------------------------------------------------------------- + + You have been used to doing `foo', but now when you invoke it (or +click the toolbar button or select the menu item), nothing (or an error) +happens. The simplest explanation is that you are missing a package +that is essential to you. You can either track it down and install it +(there is a list of packages and brief descriptions of their contents in +`etc/PACKAGES'), or install the `Sumo Tarball' (see *note Q2.0.14::). + + File: xemacs-faq.info, Node: Customization, Next: Subsystems, Prev: Installation, Up: Top 3 Customization and Options @@ -1242,65 +1315,3 @@ directory/name of the current buffer file and not just the name. That is, use the file name, or the dired-directory, or the buffer name. - -File: xemacs-faq.info, Node: Q3.1.7, Next: Q3.1.8, Prev: Q3.1.6, Up: Customization - -Q3.1.7: `xemacs -name junk' doesn't work? ------------------------------------------ - - When I run `xterm -name junk', I get an xterm whose class name -according to xprop, is `junk'. This is the way it's supposed to work, -I think. When I run `xemacs -name junk' the class name is not set to -`junk'. It's still `emacs'. What does `xemacs -name' really do? The -reason I ask is that my window manager (fvwm) will make a window sticky -and I use XEmacs to read my mail. I want that XEmacs window to be -sticky, without having to use the window manager's function to set the -window sticky. What gives? - - `xemacs -name' sets the application name for the program (that is, -the thing which normally comes from `argv[0]'). Using `-name' is the -same as making a copy of the executable with that new name. The -`WM_CLASS' property on each frame is set to the frame-name, and the -application-class. So, if you did `xemacs -name FOO' and then created -a frame named BAR, you'd get an X window with WM_CLASS = `( "BAR", -"Emacs")'. However, the resource hierarchy for this widget would be: - - Name: FOO .shell .container .BAR - Class: Emacs .TopLevelEmacsShell.EmacsManager.EmacsFrame - - instead of the default - - Name: xemacs.shell .container .emacs - Class: Emacs .TopLevelEmacsShell.EmacsManager.EmacsFrame - - It is arguable that the first element of WM_CLASS should be set to -the application-name instead of the frame-name, but I think that's less -flexible, since it does not give you the ability to have multiple frames -with different WM_CLASS properties. Another possibility would be for -the default frame name to come from the application name instead of -simply being `emacs'. However, at this point, making that change would -be troublesome: it would mean that many users would have to make yet -another change to their resource files (since the default frame name -would suddenly change from `emacs' to `xemacs', or whatever the -executable happened to be named), so we'd rather avoid it. - - To make a frame with a particular name use: - - (make-frame '((name . "the-name"))) - - -File: xemacs-faq.info, Node: Q3.1.8, Next: Q3.2.1, Prev: Q3.1.7, Up: Customization - -Q3.1.8: `-iconic' doesn't work. -------------------------------- - - When I start up XEmacs using `-iconic' it doesn't work right. Using -`-unmapped' on the command line, and setting the `initiallyUnmapped' X -Resource don't seem to help much either... - - Ben Wing writes: - - Ugh, this stuff is such an incredible mess that I've about given up - getting it to work. The principal problem is numerous - window-manager bugs... - diff --git a/info/xemacs-faq.info-3 b/info/xemacs-faq.info-3 index ec0f670..8fa7ecf 100644 --- a/info/xemacs-faq.info-3 +++ b/info/xemacs-faq.info-3 @@ -7,6 +7,68 @@ START-INFO-DIR-ENTRY END-INFO-DIR-ENTRY  +File: xemacs-faq.info, Node: Q3.1.7, Next: Q3.1.8, Prev: Q3.1.6, Up: Customization + +Q3.1.7: `xemacs -name junk' doesn't work? +----------------------------------------- + + When I run `xterm -name junk', I get an xterm whose class name +according to xprop, is `junk'. This is the way it's supposed to work, +I think. When I run `xemacs -name junk' the class name is not set to +`junk'. It's still `emacs'. What does `xemacs -name' really do? The +reason I ask is that my window manager (fvwm) will make a window sticky +and I use XEmacs to read my mail. I want that XEmacs window to be +sticky, without having to use the window manager's function to set the +window sticky. What gives? + + `xemacs -name' sets the application name for the program (that is, +the thing which normally comes from `argv[0]'). Using `-name' is the +same as making a copy of the executable with that new name. The +`WM_CLASS' property on each frame is set to the frame-name, and the +application-class. So, if you did `xemacs -name FOO' and then created +a frame named BAR, you'd get an X window with WM_CLASS = `( "BAR", +"Emacs")'. However, the resource hierarchy for this widget would be: + + Name: FOO .shell .container .BAR + Class: Emacs .TopLevelEmacsShell.EmacsManager.EmacsFrame + + instead of the default + + Name: xemacs.shell .container .emacs + Class: Emacs .TopLevelEmacsShell.EmacsManager.EmacsFrame + + It is arguable that the first element of WM_CLASS should be set to +the application-name instead of the frame-name, but I think that's less +flexible, since it does not give you the ability to have multiple frames +with different WM_CLASS properties. Another possibility would be for +the default frame name to come from the application name instead of +simply being `emacs'. However, at this point, making that change would +be troublesome: it would mean that many users would have to make yet +another change to their resource files (since the default frame name +would suddenly change from `emacs' to `xemacs', or whatever the +executable happened to be named), so we'd rather avoid it. + + To make a frame with a particular name use: + + (make-frame '((name . "the-name"))) + + +File: xemacs-faq.info, Node: Q3.1.8, Next: Q3.2.1, Prev: Q3.1.7, Up: Customization + +Q3.1.8: `-iconic' doesn't work. +------------------------------- + + When I start up XEmacs using `-iconic' it doesn't work right. Using +`-unmapped' on the command line, and setting the `initiallyUnmapped' X +Resource don't seem to help much either... + + Ben Wing writes: + + Ugh, this stuff is such an incredible mess that I've about given up + getting it to work. The principal problem is numerous + window-manager bugs... + + File: xemacs-faq.info, Node: Q3.2.1, Next: Q3.2.2, Prev: Q3.1.8, Up: Customization 3.2: Textual Fonts & Colors @@ -1331,86 +1393,3 @@ Q4.0.11: How do I make VM or mh-e display graphical smilies? (autoload 'smiley-buffer "smiley" nil t) (add-hook 'mime-viewer/plain-text-preview-hook 'smiley-buffer) - -File: xemacs-faq.info, Node: Q4.0.12, Next: Q4.1.1, Prev: Q4.0.11, Up: Subsystems - -Q4.0.12: Customization of VM not covered in the manual, or here. ----------------------------------------------------------------- - - giacomo boffi writes: - - The meta-answer is to look into the file `vm-vars.el', in the vm - directory of the lisp library. - - `vm-vars.el' contains, initializes and carefully describes, with - examples of usage, the plethora of user options that _fully_ - control VM's behavior. - - Enter vm-vars, `forward-search' for toolbar, find the variables - that control the toolbar placement, appearance, existence, copy to - your `.emacs' or `.vm' and modify according to the detailed - instructions. - - The above also applies to all the various features of VM: search - for some keywords, maybe the first you conjure isn't appropriate, - find the appropriate variables, copy and experiment. - - -File: xemacs-faq.info, Node: Q4.1.1, Next: Q4.1.2, Prev: Q4.0.12, Up: Subsystems - -4.1: Web browsing with W3 -========================= - -Q4.1.1: What is W3? -------------------- - - W3 is an advanced graphical browser written in Emacs lisp that runs -on XEmacs. It has full support for cascaded style sheets, and more... - - It has a home web page at -`http://www.cs.indiana.edu/elisp/w3/docs.html'. - - -File: xemacs-faq.info, Node: Q4.1.2, Next: Q4.1.3, Prev: Q4.1.1, Up: Subsystems - -Q4.1.2: How do I run W3 from behind a firewall? ------------------------------------------------ - - There is a long, well-written, detailed section in the W3 manual that -describes how to do this. Look in the section entitled "Firewalls". - - -File: xemacs-faq.info, Node: Q4.1.3, Next: Q4.2.1, Prev: Q4.1.2, Up: Subsystems - -Q4.1.3: Is it true that W3 supports style sheets and tables? ------------------------------------------------------------- - - Yes, and much more. W3, as distributed with the latest XEmacs is a -full-featured web browser. - - -File: xemacs-faq.info, Node: Q4.2.1, Next: Q4.2.2, Prev: Q4.1.3, Up: Subsystems - -4.2: Reading Netnews and Mail with Gnus -======================================= - -Q4.2.1: GNUS, (ding) Gnus, Gnus 5, September Gnus, Red Gnus, Quassia Gnus, argh! --------------------------------------------------------------------------------- - - The Gnus numbering issues are not meant for mere mortals to know -them. If you feel you _must_ enter the muddy waters of Gnus, visit the -excellent FAQ, maintained by Justin Sheehy, at: - - `http://www.ccs.neu.edu/software/contrib/gnus/' - - See also Gnus home page - `http://www.gnus.org/' - - -File: xemacs-faq.info, Node: Q4.2.2, Next: Q4.2.3, Prev: Q4.2.1, Up: Subsystems - -Q4.2.2: This question intentionally left blank. ------------------------------------------------ - - Obsolete question, left blank to avoid renumbering. - diff --git a/info/xemacs-faq.info-4 b/info/xemacs-faq.info-4 index 89a2b7d..7e671ec 100644 --- a/info/xemacs-faq.info-4 +++ b/info/xemacs-faq.info-4 @@ -7,6 +7,89 @@ START-INFO-DIR-ENTRY END-INFO-DIR-ENTRY  +File: xemacs-faq.info, Node: Q4.0.12, Next: Q4.1.1, Prev: Q4.0.11, Up: Subsystems + +Q4.0.12: Customization of VM not covered in the manual, or here. +---------------------------------------------------------------- + + giacomo boffi writes: + + The meta-answer is to look into the file `vm-vars.el', in the vm + directory of the lisp library. + + `vm-vars.el' contains, initializes and carefully describes, with + examples of usage, the plethora of user options that _fully_ + control VM's behavior. + + Enter vm-vars, `forward-search' for toolbar, find the variables + that control the toolbar placement, appearance, existence, copy to + your `.emacs' or `.vm' and modify according to the detailed + instructions. + + The above also applies to all the various features of VM: search + for some keywords, maybe the first you conjure isn't appropriate, + find the appropriate variables, copy and experiment. + + +File: xemacs-faq.info, Node: Q4.1.1, Next: Q4.1.2, Prev: Q4.0.12, Up: Subsystems + +4.1: Web browsing with W3 +========================= + +Q4.1.1: What is W3? +------------------- + + W3 is an advanced graphical browser written in Emacs lisp that runs +on XEmacs. It has full support for cascaded style sheets, and more... + + It has a home web page at +`http://www.cs.indiana.edu/elisp/w3/docs.html'. + + +File: xemacs-faq.info, Node: Q4.1.2, Next: Q4.1.3, Prev: Q4.1.1, Up: Subsystems + +Q4.1.2: How do I run W3 from behind a firewall? +----------------------------------------------- + + There is a long, well-written, detailed section in the W3 manual that +describes how to do this. Look in the section entitled "Firewalls". + + +File: xemacs-faq.info, Node: Q4.1.3, Next: Q4.2.1, Prev: Q4.1.2, Up: Subsystems + +Q4.1.3: Is it true that W3 supports style sheets and tables? +------------------------------------------------------------ + + Yes, and much more. W3, as distributed with the latest XEmacs is a +full-featured web browser. + + +File: xemacs-faq.info, Node: Q4.2.1, Next: Q4.2.2, Prev: Q4.1.3, Up: Subsystems + +4.2: Reading Netnews and Mail with Gnus +======================================= + +Q4.2.1: GNUS, (ding) Gnus, Gnus 5, September Gnus, Red Gnus, Quassia Gnus, argh! +-------------------------------------------------------------------------------- + + The Gnus numbering issues are not meant for mere mortals to know +them. If you feel you _must_ enter the muddy waters of Gnus, visit the +excellent FAQ, maintained by Justin Sheehy, at: + + `http://www.ccs.neu.edu/software/contrib/gnus/' + + See also Gnus home page + `http://www.gnus.org/' + + +File: xemacs-faq.info, Node: Q4.2.2, Next: Q4.2.3, Prev: Q4.2.1, Up: Subsystems + +Q4.2.2: This question intentionally left blank. +----------------------------------------------- + + Obsolete question, left blank to avoid renumbering. + + File: xemacs-faq.info, Node: Q4.2.3, Next: Q4.2.4, Prev: Q4.2.2, Up: Subsystems Q4.2.3: How do I make Gnus stay within a single frame? @@ -1241,68 +1324,3 @@ fact that it is an interpreter. Please try not to make your code much uglier to gain a very small speed gain. It's not usually worth it. - -File: xemacs-faq.info, Node: Q5.1.9, Next: Q5.1.10, Prev: Q5.1.8, Up: Miscellaneous - -Q5.1.9: How do I put a glyph as annotation in a buffer? -------------------------------------------------------- - - Here is a solution that will insert the glyph annotation at the -beginning of buffer: - - (make-annotation (make-glyph '([FORMAT :file FILE] - [string :data "fallback-text"])) - (point-min) - 'text - (current-buffer)) - - Replace `FORMAT' with an unquoted symbol representing the format of -the image (e.g. `xpm', `xbm', `gif', `jpeg', etc.) Instead of `FILE', -use the image file name (e.g. -`/usr/local/lib/xemacs-20.2/etc/recycle.xpm'). - - You can turn this to a function (that optionally prompts you for a -file name), and inserts the glyph at `(point)' instead of `(point-min)'. - - -File: xemacs-faq.info, Node: Q5.1.10, Next: Q5.1.11, Prev: Q5.1.9, Up: Miscellaneous - -Q5.1.10: `map-extents' won't traverse all of my extents! --------------------------------------------------------- - - I tried to use `map-extents' to do an operation on all the extents -in a region. However, it seems to quit after processing a random number -of extents. Is it buggy? - - No. The documentation of `map-extents' states that it will iterate -across the extents as long as FUNCTION returns `nil'. Unexperienced -programmers often forget to return `nil' explicitly, which results in -buggy code. For instance, the following code is supposed to delete all -the extents in a buffer, and issue as many `fubar!' messages. - - (map-extents (lambda (ext ignore) - (delete-extent ext) - (message "fubar!"))) - - Instead, it will delete only the first extent, and stop right there - -because `message' will return a non-nil value. The correct code is: - - (map-extents (lambda (ext ignore) - (delete-extent ext) - (message "fubar!") - nil)) - - -File: xemacs-faq.info, Node: Q5.1.11, Next: Q5.2.1, Prev: Q5.1.10, Up: Miscellaneous - -Q5.1.11: My elisp program is horribly slow. Is there ------------------------------------------------------ - - an easy way to find out where it spends time? - - zHrvoje Niksic writes: - Under XEmacs 20.4 and later you can use `M-x - profile-key-sequence', press a key (say in the Gnus Group - buffer), and get the results using `M-x profile-results'. It - should give you an idea of where the time is being spent. - diff --git a/info/xemacs-faq.info-5 b/info/xemacs-faq.info-5 index b6a080c..ccfd040 100644 --- a/info/xemacs-faq.info-5 +++ b/info/xemacs-faq.info-5 @@ -7,6 +7,71 @@ START-INFO-DIR-ENTRY END-INFO-DIR-ENTRY  +File: xemacs-faq.info, Node: Q5.1.9, Next: Q5.1.10, Prev: Q5.1.8, Up: Miscellaneous + +Q5.1.9: How do I put a glyph as annotation in a buffer? +------------------------------------------------------- + + Here is a solution that will insert the glyph annotation at the +beginning of buffer: + + (make-annotation (make-glyph '([FORMAT :file FILE] + [string :data "fallback-text"])) + (point-min) + 'text + (current-buffer)) + + Replace `FORMAT' with an unquoted symbol representing the format of +the image (e.g. `xpm', `xbm', `gif', `jpeg', etc.) Instead of `FILE', +use the image file name (e.g. +`/usr/local/lib/xemacs-20.2/etc/recycle.xpm'). + + You can turn this to a function (that optionally prompts you for a +file name), and inserts the glyph at `(point)' instead of `(point-min)'. + + +File: xemacs-faq.info, Node: Q5.1.10, Next: Q5.1.11, Prev: Q5.1.9, Up: Miscellaneous + +Q5.1.10: `map-extents' won't traverse all of my extents! +-------------------------------------------------------- + + I tried to use `map-extents' to do an operation on all the extents +in a region. However, it seems to quit after processing a random number +of extents. Is it buggy? + + No. The documentation of `map-extents' states that it will iterate +across the extents as long as FUNCTION returns `nil'. Unexperienced +programmers often forget to return `nil' explicitly, which results in +buggy code. For instance, the following code is supposed to delete all +the extents in a buffer, and issue as many `fubar!' messages. + + (map-extents (lambda (ext ignore) + (delete-extent ext) + (message "fubar!"))) + + Instead, it will delete only the first extent, and stop right there - +because `message' will return a non-nil value. The correct code is: + + (map-extents (lambda (ext ignore) + (delete-extent ext) + (message "fubar!") + nil)) + + +File: xemacs-faq.info, Node: Q5.1.11, Next: Q5.2.1, Prev: Q5.1.10, Up: Miscellaneous + +Q5.1.11: My elisp program is horribly slow. Is there +----------------------------------------------------- + + an easy way to find out where it spends time? + + zHrvoje Niksic writes: + Under XEmacs 20.4 and later you can use `M-x + profile-key-sequence', press a key (say in the Gnus Group + buffer), and get the results using `M-x profile-results'. It + should give you an idea of where the time is being spent. + + File: xemacs-faq.info, Node: Q5.2.1, Next: Q5.2.2, Prev: Q5.1.11, Up: Miscellaneous Q5.2.1: How do I turn off the sound? diff --git a/info/xemacs.info b/info/xemacs.info index b753711..7123481 100644 --- a/info/xemacs.info +++ b/info/xemacs.info @@ -32,390 +32,391 @@ translation approved by the author instead of in the original English.  Indirect: xemacs.info-1: 1350 -xemacs.info-2: 48878 -xemacs.info-3: 98489 -xemacs.info-4: 147801 -xemacs.info-5: 197397 -xemacs.info-6: 246837 -xemacs.info-7: 296794 -xemacs.info-8: 345041 -xemacs.info-9: 392811 -xemacs.info-10: 442411 -xemacs.info-11: 490852 -xemacs.info-12: 538047 -xemacs.info-13: 586228 -xemacs.info-14: 636005 -xemacs.info-15: 685652 -xemacs.info-16: 734792 -xemacs.info-17: 783205 -xemacs.info-18: 830803 -xemacs.info-19: 862297 -xemacs.info-20: 893951 -xemacs.info-21: 943355 -xemacs.info-22: 985941 +xemacs.info-2: 48895 +xemacs.info-3: 98506 +xemacs.info-4: 147816 +xemacs.info-5: 197412 +xemacs.info-6: 246852 +xemacs.info-7: 296809 +xemacs.info-8: 345202 +xemacs.info-9: 392972 +xemacs.info-10: 442574 +xemacs.info-11: 491015 +xemacs.info-12: 538210 +xemacs.info-13: 586468 +xemacs.info-14: 634794 +xemacs.info-15: 684331 +xemacs.info-16: 731876 +xemacs.info-17: 780201 +xemacs.info-18: 826586 +xemacs.info-19: 867946 +xemacs.info-20: 899600 +xemacs.info-21: 949004 +xemacs.info-22: 991590  Tag Table: (Indirect) Node: Top1350 -Node: License22773 -Node: Distrib36055 -Node: Intro37719 -Node: Frame40590 -Node: Point44534 -Node: Echo Area46501 -Node: Mode Line48878 -Node: XEmacs under X53309 -Node: Keystrokes56486 -Node: Intro to Keystrokes57330 -Node: Representing Keystrokes59433 -Node: Key Sequences60790 -Node: String Key Sequences64131 -Node: Meta Key64514 -Node: Super and Hyper Keys65987 -Node: Character Representation72232 -Node: Commands73252 -Node: Pull-down Menus76101 -Node: File Menu79450 -Node: Edit Menu83272 -Node: Apps Menu85655 -Node: Options Menu86145 -Node: Buffers Menu90163 -Node: Tools Menu90470 -Node: Help Menu90961 -Node: Menu Customization91362 -Node: Entering Emacs95592 -Node: Exiting98489 -Node: Command Switches102962 -Node: Startup Paths112326 -Node: Basic119653 -Node: Inserting Text121062 -Node: Moving Point124058 -Node: Erasing127664 -Node: Basic Files128969 -Node: Basic Help130891 -Node: Blank Lines131486 -Node: Continuation Lines133062 -Node: Position Info134729 -Node: Arguments138145 -Node: Undo142244 -Node: Minibuffer145191 -Node: Minibuffer File147801 -Node: Minibuffer Edit149606 -Node: Completion152547 -Node: Completion Example154478 -Node: Completion Commands155573 -Node: Strict Completion158549 -Node: Completion Options160330 -Node: Minibuffer History161838 -Node: Repetition165022 -Node: M-x167867 -Node: Help172961 -Node: Help Summary174371 -Node: Key Help177157 -Node: Name Help178116 -Node: Apropos180761 -Node: Library Keywords183880 -Node: Help Mode186201 -Node: Misc Help186698 -Node: Mark189846 -Node: Setting Mark191700 -Node: Using Region194822 -Node: Marking Objects195559 -Node: Mark Ring197397 -Node: Mouse Selection199113 -Node: Additional Mouse Operations201120 -Node: Killing205324 -Node: Yanking210960 -Node: Kill Ring211763 -Node: Appending Kills213365 -Node: Earlier Kills215402 -Node: Using X Selections218015 -Node: X Clipboard Selection219265 -Node: X Selection Commands221442 -Node: X Cut Buffers222528 -Node: Active Regions223887 -Node: Accumulating Text228467 -Node: Rectangles231540 -Node: Registers235059 -Node: RegPos236513 -Node: RegText237669 -Node: RegRect238775 -Node: RegConfig239654 -Node: RegNumbers240594 -Node: RegFiles241312 -Node: Bookmarks241970 -Node: Display245342 -Node: Scrolling246837 -Node: Horizontal Scrolling250980 -Node: Selective Display252175 -Node: Display Vars253394 -Node: Search256072 -Node: Incremental Search257265 -Node: Non-Incremental Search266193 -Node: Word Search267635 -Node: Regexp Search269253 -Node: Regexps271623 -Node: Search Case285620 -Node: Replace286401 -Node: Unconditional Replace287349 -Node: Regexp Replace288484 -Node: Replacement and Case289419 -Node: Query Replace290399 -Node: Other Repeating Search293626 -Node: Fixit294881 -Node: Kill Errors295461 -Node: Transpose296794 -Node: Fixing Case299198 -Node: Spelling299844 -Node: Files301305 -Node: File Names302615 -Node: Visiting306952 -Node: Saving313638 -Node: Backup318561 -Node: Backup Names319957 -Node: Backup Deletion321440 -Node: Backup Copying322590 -Node: Interlocking324296 -Node: Reverting328424 -Node: Auto Save330336 -Node: Auto Save Files331303 -Node: Auto Save Control333144 -Node: Recover334982 -Node: Version Control336137 -Node: Concepts of VC338175 -Node: Editing with VC339785 -Node: Variables for Check-in/out345041 -Node: Log Entries346940 -Node: Change Logs and VC348120 -Node: Old Versions351387 -Node: VC Status353390 -Node: Renaming and VC355104 -Node: Snapshots355783 -Node: Making Snapshots356284 -Node: Snapshot Caveats357577 -Node: Version Headers359386 -Node: ListDir362085 -Node: Comparing Files364134 -Node: Dired365667 -Node: Dired Enter366338 -Node: Dired Edit367163 -Node: Dired Deletion368910 -Node: Dired Immed372133 -Node: Misc File Ops373409 -Node: Buffers375897 -Node: Select Buffer378055 -Node: List Buffers379850 -Node: Misc Buffer381608 -Node: Kill Buffer383251 -Node: Several Buffers384381 -Node: Windows388248 -Node: Basic Window388959 -Node: Split Window390678 -Node: Other Window392811 -Node: Pop Up Window395240 -Node: Change Window396745 -Node: Mule399653 -Node: Mule Intro400916 -Node: Language Environments401932 -Node: Input Methods404039 -Node: Select Input Method407759 -Node: Coding Systems409914 -Node: Recognize Coding414100 -Node: Specify Coding417426 -Node: Major Modes422357 -Node: Choosing Modes424576 -Node: Indentation426966 -Node: Indentation Commands429061 -Node: Tab Stops431790 -Node: Just Spaces433639 -Node: Text434454 -Node: Text Mode436437 -Node: Nroff Mode438516 -Node: TeX Mode440159 -Node: TeX Editing442411 -Node: TeX Print445845 -Node: Outline Mode449064 -Node: Outline Format450545 -Node: Outline Motion453345 -Node: Outline Visibility454898 -Node: Words457819 -Node: Sentences460766 -Node: Paragraphs462962 -Node: Pages465250 -Node: Filling467850 -Node: Auto Fill468421 -Node: Fill Commands470568 -Node: Fill Prefix472733 -Node: Case474921 -Node: Programs476949 -Node: Program Modes479499 -Node: Lists481731 -Node: Defuns487571 -Node: Grinding490224 -Node: Basic Indent490852 -Node: Multi-line Indent492873 -Node: Lisp Indent494489 -Node: C Indent497939 -Node: Matching503179 -Node: Comments504701 -Node: Balanced Editing511153 -Node: Lisp Completion512167 -Node: Documentation513182 -Node: Change Log514421 -Node: Tags516999 -Node: Tag Syntax518648 -Node: Create Tags Table522592 -Node: Etags Regexps526652 -Node: Select Tags Table531310 -Node: Find Tag535083 -Node: Tags Search538047 -Node: List Tags541503 -Node: Fortran542532 -Node: Fortran Motion543608 -Node: Fortran Indent544428 -Node: ForIndent Commands545113 -Node: ForIndent Num546258 -Node: ForIndent Conv547532 -Node: ForIndent Vars548308 -Node: Fortran Comments549476 -Node: Fortran Columns553074 -Node: Fortran Abbrev554497 -Node: Asm Mode555406 -Node: Running555958 -Node: Compilation556928 -Node: Lisp Modes561778 -Node: Lisp Libraries563051 -Node: Loading563605 -Node: Compiling Libraries568065 -Node: Mocklisp570956 -Node: Lisp Eval571633 -Node: Lisp Debug575273 -Node: Lisp Interaction580700 -Node: External Lisp582055 -Node: Packages584129 -Node: Package Terminology584870 -Node: Using Packages586228 -Node: Building Packages595106 -Node: Abbrevs597628 -Node: Defining Abbrevs599828 -Node: Expanding Abbrevs602275 -Node: Editing Abbrevs604977 -Node: Saving Abbrevs606850 -Node: Dynamic Abbrevs608805 -Node: Picture610107 -Node: Basic Picture612540 -Node: Insert in Picture614825 -Node: Tabs in Picture616247 -Node: Rectangles in Picture617768 -Node: Sending Mail619676 -Node: Mail Format621387 -Node: Mail Headers622737 -Node: Mail Mode629145 -Node: Reading Mail632758 -Node: Calendar/Diary634333 -Node: Calendar Motion636005 -Node: Calendar Unit Motion636888 -Node: Move to Beginning or End639211 -Node: Specified Dates640344 -Node: Scroll Calendar641232 -Node: Mark and Region643023 -Node: General Calendar644929 -Node: LaTeX Calendar646537 -Node: Holidays648551 -Node: Sunrise/Sunset651653 -Node: Lunar Phases654692 -Node: Other Calendars656077 -Node: Calendar Systems657564 -Node: To Other Calendar660675 -Node: From Other Calendar662666 -Node: Mayan Calendar664971 -Node: Diary668166 -Node: Diary Commands669915 -Node: Format of Diary File673238 -Node: Date Formats676108 -Node: Adding to Diary678682 -Node: Special Diary Entries680313 -Node: Calendar Customization685652 -Node: Calendar Customizing686514 -Node: Holiday Customizing689749 -Node: Date Display Format696236 -Node: Time Display Format697194 -Node: Daylight Savings698332 -Node: Diary Customizing701520 -Node: Hebrew/Islamic Entries706141 -Node: Fancy Diary Display709481 -Node: Included Diary Files711397 -Node: Sexp Diary Entries712378 -Node: Appt Customizing717468 -Node: Sorting718514 -Node: Shell723320 -Node: Single Shell724613 -Node: Interactive Shell726227 -Node: Shell Mode729992 -Node: Terminal emulator732483 -Node: Term Mode734792 -Node: Paging in Term735706 -Node: Narrowing736504 -Node: Hardcopy738454 -Node: Recursive Edit739426 -Node: Dissociated Press742413 -Node: CONX744976 -Node: Amusements746000 -Node: Emulation746480 -Node: Customization748340 -Node: Minor Modes750156 -Node: Variables751788 -Node: Examining753744 -Node: Easy Customization755205 -Node: Customization Groups756219 -Node: Changing an Option759148 -Node: Face Customization765418 -Node: Specific Customization767182 -Node: Edit Options769789 -Node: Locals771373 -Node: File Variables774552 -Node: Keyboard Macros779102 -Node: Basic Kbd Macro781273 -Node: Save Kbd Macro783205 -Node: Kbd Macro Query784863 -Node: Key Bindings786805 -Node: Keymaps787679 -Node: Rebinding791529 -Node: Interactive Rebinding792228 -Node: Programmatic Rebinding794417 -Node: Key Bindings Using Strings797224 -Node: Disabling798851 -Node: Syntax800630 -Node: Syntax Entry801511 -Node: Syntax Change805595 -Node: Init File807764 -Node: Init Syntax809228 -Node: Init Examples811579 -Node: Terminal Init815769 -Node: Audible Bell817506 -Node: Faces820937 -Node: Frame Components825779 -Node: X Resources826224 -Node: Geometry Resources827883 -Node: Iconic Resources830331 -Node: Resource List830803 -Node: Face Resources837310 -Node: Widgets840987 -Node: Menubar Resources841926 -Node: Quitting843440 -Node: Lossage846418 -Node: Stuck Recursive847062 -Node: Screen Garbled847768 -Node: Text Garbled848902 -Node: Unasked-for Search849541 -Node: Emergency Escape850326 -Node: Total Frustration852105 -Node: Bugs852736 -Node: Glossary862297 -Node: Manifesto893951 -Node: Key Index917428 -Node: Command Index943355 -Node: Variable Index985941 -Node: Concept Index1002027 +Node: License22790 +Node: Distrib36072 +Node: Intro37736 +Node: Frame40607 +Node: Point44551 +Node: Echo Area46518 +Node: Mode Line48895 +Node: XEmacs under X53326 +Node: Keystrokes56503 +Node: Intro to Keystrokes57347 +Node: Representing Keystrokes59450 +Node: Key Sequences60807 +Node: String Key Sequences64148 +Node: Meta Key64531 +Node: Super and Hyper Keys66004 +Node: Character Representation72249 +Node: Commands73269 +Node: Pull-down Menus76118 +Node: File Menu79467 +Node: Edit Menu83289 +Node: Apps Menu85672 +Node: Options Menu86162 +Node: Buffers Menu90180 +Node: Tools Menu90487 +Node: Help Menu90978 +Node: Menu Customization91379 +Node: Entering Emacs95609 +Node: Exiting98506 +Node: Command Switches102979 +Node: Startup Paths112343 +Node: Basic119673 +Node: Inserting Text121077 +Node: Moving Point124073 +Node: Erasing127679 +Node: Basic Files128984 +Node: Basic Help130906 +Node: Blank Lines131501 +Node: Continuation Lines133077 +Node: Position Info134744 +Node: Arguments138160 +Node: Undo142259 +Node: Minibuffer145206 +Node: Minibuffer File147816 +Node: Minibuffer Edit149621 +Node: Completion152562 +Node: Completion Example154493 +Node: Completion Commands155588 +Node: Strict Completion158564 +Node: Completion Options160345 +Node: Minibuffer History161853 +Node: Repetition165037 +Node: M-x167882 +Node: Help172976 +Node: Help Summary174386 +Node: Key Help177172 +Node: Name Help178131 +Node: Apropos180776 +Node: Library Keywords183895 +Node: Help Mode186216 +Node: Misc Help186713 +Node: Mark189861 +Node: Setting Mark191715 +Node: Using Region194837 +Node: Marking Objects195574 +Node: Mark Ring197412 +Node: Mouse Selection199128 +Node: Additional Mouse Operations201135 +Node: Killing205339 +Node: Yanking210975 +Node: Kill Ring211778 +Node: Appending Kills213380 +Node: Earlier Kills215417 +Node: Using X Selections218030 +Node: X Clipboard Selection219280 +Node: X Selection Commands221457 +Node: X Cut Buffers222543 +Node: Active Regions223902 +Node: Accumulating Text228482 +Node: Rectangles231555 +Node: Registers235074 +Node: RegPos236528 +Node: RegText237684 +Node: RegRect238790 +Node: RegConfig239669 +Node: RegNumbers240609 +Node: RegFiles241327 +Node: Bookmarks241985 +Node: Display245357 +Node: Scrolling246852 +Node: Horizontal Scrolling250995 +Node: Selective Display252190 +Node: Display Vars253409 +Node: Search256087 +Node: Incremental Search257280 +Node: Non-Incremental Search266208 +Node: Word Search267650 +Node: Regexp Search269268 +Node: Regexps271638 +Node: Search Case285635 +Node: Replace286416 +Node: Unconditional Replace287364 +Node: Regexp Replace288499 +Node: Replacement and Case289434 +Node: Query Replace290414 +Node: Other Repeating Search293641 +Node: Fixit294896 +Node: Kill Errors295476 +Node: Transpose296809 +Node: Fixing Case299213 +Node: Spelling299859 +Node: Files301320 +Node: File Names302630 +Node: Visiting306967 +Node: Saving313799 +Node: Backup318722 +Node: Backup Names320118 +Node: Backup Deletion321601 +Node: Backup Copying322751 +Node: Interlocking324457 +Node: Reverting328585 +Node: Auto Save330497 +Node: Auto Save Files331464 +Node: Auto Save Control333305 +Node: Recover335143 +Node: Version Control336298 +Node: Concepts of VC338336 +Node: Editing with VC339946 +Node: Variables for Check-in/out345202 +Node: Log Entries347101 +Node: Change Logs and VC348281 +Node: Old Versions351548 +Node: VC Status353551 +Node: Renaming and VC355265 +Node: Snapshots355944 +Node: Making Snapshots356445 +Node: Snapshot Caveats357738 +Node: Version Headers359547 +Node: ListDir362246 +Node: Comparing Files364295 +Node: Dired365828 +Node: Dired Enter366499 +Node: Dired Edit367324 +Node: Dired Deletion369071 +Node: Dired Immed372294 +Node: Misc File Ops373570 +Node: Buffers376058 +Node: Select Buffer378216 +Node: List Buffers380011 +Node: Misc Buffer381769 +Node: Kill Buffer383412 +Node: Several Buffers384542 +Node: Windows388409 +Node: Basic Window389120 +Node: Split Window390839 +Node: Other Window392972 +Node: Pop Up Window395403 +Node: Change Window396908 +Node: Mule399816 +Node: Mule Intro401079 +Node: Language Environments402095 +Node: Input Methods404202 +Node: Select Input Method407922 +Node: Coding Systems410077 +Node: Recognize Coding414263 +Node: Specify Coding417589 +Node: Major Modes422520 +Node: Choosing Modes424739 +Node: Indentation427129 +Node: Indentation Commands429224 +Node: Tab Stops431953 +Node: Just Spaces433802 +Node: Text434617 +Node: Text Mode436600 +Node: Nroff Mode438679 +Node: TeX Mode440322 +Node: TeX Editing442574 +Node: TeX Print446008 +Node: Outline Mode449227 +Node: Outline Format450708 +Node: Outline Motion453508 +Node: Outline Visibility455061 +Node: Words457982 +Node: Sentences460929 +Node: Paragraphs463125 +Node: Pages465413 +Node: Filling468013 +Node: Auto Fill468584 +Node: Fill Commands470731 +Node: Fill Prefix472896 +Node: Case475084 +Node: Programs477112 +Node: Program Modes479662 +Node: Lists481894 +Node: Defuns487734 +Node: Grinding490387 +Node: Basic Indent491015 +Node: Multi-line Indent493036 +Node: Lisp Indent494652 +Node: C Indent498102 +Node: Matching503342 +Node: Comments504864 +Node: Balanced Editing511316 +Node: Lisp Completion512330 +Node: Documentation513345 +Node: Change Log514584 +Node: Tags517162 +Node: Tag Syntax518811 +Node: Create Tags Table522755 +Node: Etags Regexps526815 +Node: Select Tags Table531473 +Node: Find Tag535246 +Node: Tags Search538210 +Node: List Tags541666 +Node: Fortran542695 +Node: Fortran Motion543771 +Node: Fortran Indent544591 +Node: ForIndent Commands545276 +Node: ForIndent Num546421 +Node: ForIndent Conv547695 +Node: ForIndent Vars548471 +Node: Fortran Comments549639 +Node: Fortran Columns553237 +Node: Fortran Abbrev554660 +Node: Asm Mode555569 +Node: Running556121 +Node: Compilation557090 +Node: Lisp Modes561940 +Node: Lisp Libraries563213 +Node: Loading563767 +Node: Compiling Libraries568227 +Node: Mocklisp571118 +Node: Lisp Eval571795 +Node: Lisp Debug575435 +Node: Lisp Interaction580862 +Node: External Lisp582217 +Node: Packages584291 +Node: Package Terminology585110 +Node: Using Packages586468 +Node: Building Packages595346 +Node: Available Packages597895 +Node: Abbrevs603278 +Node: Defining Abbrevs605477 +Node: Expanding Abbrevs607924 +Node: Editing Abbrevs610626 +Node: Saving Abbrevs612499 +Node: Dynamic Abbrevs614454 +Node: Picture615756 +Node: Basic Picture618189 +Node: Insert in Picture620474 +Node: Tabs in Picture621896 +Node: Rectangles in Picture623417 +Node: Sending Mail625325 +Node: Mail Format627036 +Node: Mail Headers628386 +Node: Mail Mode634794 +Node: Reading Mail638407 +Node: Calendar/Diary639982 +Node: Calendar Motion641654 +Node: Calendar Unit Motion642537 +Node: Move to Beginning or End644860 +Node: Specified Dates645993 +Node: Scroll Calendar646881 +Node: Mark and Region648672 +Node: General Calendar650578 +Node: LaTeX Calendar652186 +Node: Holidays654200 +Node: Sunrise/Sunset657302 +Node: Lunar Phases660341 +Node: Other Calendars661726 +Node: Calendar Systems663213 +Node: To Other Calendar666324 +Node: From Other Calendar668315 +Node: Mayan Calendar670620 +Node: Diary673815 +Node: Diary Commands675564 +Node: Format of Diary File678887 +Node: Date Formats681757 +Node: Adding to Diary684331 +Node: Special Diary Entries685962 +Node: Calendar Customization691301 +Node: Calendar Customizing692163 +Node: Holiday Customizing695398 +Node: Date Display Format701885 +Node: Time Display Format702843 +Node: Daylight Savings703981 +Node: Diary Customizing707169 +Node: Hebrew/Islamic Entries711790 +Node: Fancy Diary Display715130 +Node: Included Diary Files717046 +Node: Sexp Diary Entries718027 +Node: Appt Customizing723117 +Node: Sorting724163 +Node: Shell728969 +Node: Single Shell730262 +Node: Interactive Shell731876 +Node: Shell Mode735641 +Node: Terminal emulator738132 +Node: Term Mode740441 +Node: Paging in Term741355 +Node: Narrowing742153 +Node: Hardcopy744103 +Node: Recursive Edit745075 +Node: Dissociated Press748062 +Node: CONX750625 +Node: Amusements751649 +Node: Emulation752129 +Node: Customization753989 +Node: Minor Modes755805 +Node: Variables757437 +Node: Examining759393 +Node: Easy Customization760854 +Node: Customization Groups761868 +Node: Changing an Option764797 +Node: Face Customization771067 +Node: Specific Customization772831 +Node: Edit Options775438 +Node: Locals777022 +Node: File Variables780201 +Node: Keyboard Macros784751 +Node: Basic Kbd Macro786922 +Node: Save Kbd Macro788854 +Node: Kbd Macro Query790512 +Node: Key Bindings792454 +Node: Keymaps793328 +Node: Rebinding797178 +Node: Interactive Rebinding797877 +Node: Programmatic Rebinding800066 +Node: Key Bindings Using Strings802873 +Node: Disabling804500 +Node: Syntax806279 +Node: Syntax Entry807160 +Node: Syntax Change811244 +Node: Init File813413 +Node: Init Syntax814877 +Node: Init Examples817228 +Node: Terminal Init821418 +Node: Audible Bell823155 +Node: Faces826586 +Node: Frame Components831428 +Node: X Resources831873 +Node: Geometry Resources833532 +Node: Iconic Resources835980 +Node: Resource List836452 +Node: Face Resources842959 +Node: Widgets846636 +Node: Menubar Resources847575 +Node: Quitting849089 +Node: Lossage852067 +Node: Stuck Recursive852711 +Node: Screen Garbled853417 +Node: Text Garbled854551 +Node: Unasked-for Search855190 +Node: Emergency Escape855975 +Node: Total Frustration857754 +Node: Bugs858385 +Node: Glossary867946 +Node: Manifesto899600 +Node: Key Index923077 +Node: Command Index949004 +Node: Variable Index991590 +Node: Concept Index1007676  End Tag Table diff --git a/info/xemacs.info-1 b/info/xemacs.info-1 index 378b1c7..ad6342f 100644 --- a/info/xemacs.info-1 +++ b/info/xemacs.info-1 @@ -70,7 +70,8 @@ Important General Concepts * Command Switches:: Hairy startup options. * Startup Paths:: - How XEmacs finds Directories and Files + How XEmacs finds Directories and Files. +* Packages:: How XEmacs organizes its high-level functionality. Fundamental Editing Commands * Basic:: The most basic editing commands. @@ -109,7 +110,6 @@ Advanced Features * Text:: Commands and modes for editing English. * Programs:: Commands and modes for editing programs. * Running:: Compiling, running and debugging programs. -* Packages:: How to add new packages to XEmacs. * Abbrevs:: How to define text abbreviations to reduce the number of characters you must type. * Picture:: Editing pictures made up of characters @@ -175,6 +175,13 @@ Pull-down Menus * Menu Customization:: Adding and removing menu items and related operations. +Packages + +* Packages:: Introduction to XEmacs Packages. +* Package Terminology:: Understanding different kinds of packages. +* Using Packages:: How to install and use packages. +* Building Packages:: Building packages from sources. + Basic Editing Commands * Blank Lines:: Commands to make or delete blank lines. @@ -444,13 +451,6 @@ Lisp Libraries * Compiling Libraries:: Compiling a library makes it load and run faster. * Mocklisp:: Converting Mocklisp to Lisp so XEmacs can run it. -Packages - -* Packages:: Introduction to XEmacs Packages. -* Package Terminology:: Understanding different kinds of packages. -* Using Packages:: How to install and use packages. -* Building Packages:: Building packages from sources. - Abbrevs * Defining Abbrevs:: Defining an abbrev, so it will expand when typed. diff --git a/info/xemacs.info-12 b/info/xemacs.info-12 index 6c87c0a..ce1f2c4 100644 --- a/info/xemacs.info-12 +++ b/info/xemacs.info-12 @@ -486,7 +486,7 @@ defines these commands: comments in assembler syntax.  -File: xemacs.info, Node: Running, Next: Packages, Prev: Programs, Up: Top +File: xemacs.info, Node: Running, Next: Abbrevs, Prev: Programs, Up: Top Compiling and Testing Programs ****************************** @@ -558,7 +558,7 @@ the word `run' or `exit' in the parentheses to tell you whether compilation is finished. You do not have to keep this buffer visible; compilation continues in any case. - To kill the compilation process, type `M-x-kill-compilation'. The + To kill the compilation process, type `M-x kill-compilation'. 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 occur at any time. Starting a new @@ -1096,7 +1096,7 @@ doing so is different according to where the relevant Lisp environment is found. *Note Lisp Modes::.  -File: xemacs.info, Node: Packages, Next: Abbrevs, Prev: Running, Up: Top +File: xemacs.info, Node: Packages, Next: Basic, Prev: Startup Paths, Up: Top Packages ======== @@ -1114,6 +1114,7 @@ local needs with safe removal of unnecessary code. * Package Terminology:: Understanding different kinds of packages. * Using Packages:: How to install and use packages. * Building Packages:: Building packages from sources. +* Available Packages:: A brief, out-of-date, directory of packaged LISP.  File: xemacs.info, Node: Package Terminology, Next: Using Packages, Up: Packages diff --git a/info/xemacs.info-13 b/info/xemacs.info-13 index 7e83eef..bfce027 100644 --- a/info/xemacs.info-13 +++ b/info/xemacs.info-13 @@ -271,7 +271,7 @@ it's best to exit XEmacs before upgrading an existing package.  -File: xemacs.info, Node: Building Packages, Prev: Using Packages, Up: Packages +File: xemacs.info, Node: Building Packages, Next: Available Packages, Prev: Using Packages, Up: Packages Source packages are available from the `packages/source-packages' subdirectory of your favorite XEmacs distribution site. Alternatively, @@ -334,7 +334,270 @@ to others. of use by XEmacs maintainers producing files for distribution.  -File: xemacs.info, Node: Abbrevs, Next: Picture, Prev: Packages, Up: Top +File: xemacs.info, Node: Available Packages, Prev: Building Packages, Up: Packages + + This section is surely out-of-date. If you're sure that XEmacs is +able to do something, but your installed XEmacs won't do it for you, +it's probably in a package. If you can't find it in this section, +that's a bug--please report it. It is very hard to keep this section +up-to-date; your reports, comments, and questions will help a lot. + + This data is up-to-date as of 10 February 1999. (Ouch! I told you!) + +Library Packages (libs) +----------------------- + + These packages are required to build and support most of the rest of +XEmacs. By design, xemacs-base is a `regular' package. Use restraint +when adding new files there as it is required by almost everything. + +`Sun' + Support for Sparcworks. + +`apel' + A Portable Emacs Library. Used by XEmacs MIME support. + +`edebug' + A Lisp debugger. + +`dired' + The DIRectory EDitor is for manipulating, and running commands on + files in a directory. + +`efs' + Treat files on remote systems the same as local files. + +`mail-lib' + Fundamental lisp files for providing email support. + +`tooltalk' + Support for building with Tooltalk. + +`xemacs-base' + Fundamental XEmacs support. Install this unless you wish a totally + naked XEmacs. + +`xemacs-devel' + XEmacs Lisp developer support. This package contains utilities for + supporting Lisp development. It is a single-file package so it + may be tailored. + +Communications Packages (comm) +------------------------------ + + These packages provide support for various communications, primarily +email and usenet. + +`footnote' + Footnoting in mail message editing modes. + +`gnats' + XEmacs bug reports. + +`gnus' + The Gnus Newsreader and Mailreader. + +`mailcrypt' + Support for messaging encryption with PGP. + +`mh-e' + Front end support for MH. + +`net-utils' + Miscellaneous Networking Utilities. This is a single-file package + and files may be deleted at will. + +`ph' + Emacs implementation of the ph client to CCSO/qi directory servers. + +`rmail' + An obsolete Emacs mailer. If you do not already use it don't + start. + +`supercite' + An Emacs citation tool. Useful with all Emacs Mailers and + Newsreaders. + +`tm' + Emacs MIME support. + +`vm' + An Emacs mailer. + +`w3' + A Web browser. + +Games and Amusements (games) +---------------------------- + +`cookie' + Spook and Yow (Zippy quotes). + +`games' + Tetris, Sokoban, and Snake. + +`mine' + Minehunt. + +`misc-games' + Other amusements and diversions. + +Mule Support (mule) +------------------- + +`egg-its' + Wnn (4.2 and 6) support. SJ3 support. Must be installed prior to + XEmacs build. + +`leim' + Quail. Used for everything other than English and Japanese. + +`locale' + Used for localized menubars (French and Japanese) and localized + splash screens (Japanese). + +`mule-base' + Basic Mule support. Must be installed prior to building with Mule. + +`skk' + Another Japanese Language Input Method. Can be used without a + separate process running as a dictionary server. + +Productivity Packages (oa) +-------------------------- + +`calendar' + Calendar and diary support. + +`edit-utils' + Single file lisp packages for various XEmacs goodies. Load this + and weed out the junk you don't want. + +`forms' + Forms editing support (obsolete, use the builtin Widget instead). + +`frame-icon' + Provide a WM icon based on major mode. + +`hm--html-menus' + HTML editing. + +`ispell' + Spell-checking with ispell. + +`pc' + PC style interface emulation. + +`psgml' + Validated HTML/SGML editing. + +`sgml' + SGML/Linuxdoc-SGML editing. + +`slider' + User interface tool. + +`speedbar' + ??? Document me. + +`strokes' + Mouse enhancement utility. + +`text-modes' + Various single file lisp packages for editing text files. + +`time' + Display time & date on the modeline. + +Operating System Utilities (os) +------------------------------- + +`eterm' + Terminal emulator. + +`igrep' + Enhanced front-end for Grep. + +`ilisp' + Front-end for Inferior Lisp. + +`os-utils' + Miscellaneous single-file O/S utilities, for printing, archiving, + compression, remote shells, etc. + +`view-process' + A Unix process browsing tool. + +Program Editing Support (prog) +------------------------------ + +`ada' + Ada language support. + +`c-support' + Basic single-file add-ons for editing C code. + +`cc-mode' + C, C++ and Java language support. + +`debug' + GUD, gdb, dbx debugging support. + +`ediff' + Interface over patch. + +`emerge' + Another interface over patch. + +`pcl-cvs' + CVS frontend. + +`prog-modes' + Miscellaneous single-file lisp files for various programming + languages. + +`scheme' + Front-end support for Inferior Scheme. + +`sh-script' + Support for editing shell scripts. + +`vc' + Version Control for Free systems. + +`vc-cc' + Version Control for ClearCase. This package must be installed + prior to building XEmacs [broken as of XEmacs 20.5-beta19]. + +`vhdl' + Support for VHDL. + +Word Processing (wp) +-------------------- + +`auctex' + Basic TeX/LaTeX support. + +`crisp' + Crisp/Brief emulation. + +`edt' + DEC EDIT/EDT emulation. + +`texinfo' + XEmacs TeXinfo support. + +`textools' + Single-file TeX support. + +`tpu' + DEC EDIT/TPU support. + +`viper' + VI emulation support. + + +File: xemacs.info, Node: Abbrevs, Next: Picture, Prev: Running, Up: Top Abbrevs ******* @@ -1073,161 +1336,3 @@ a string naming a file. Each time you start to edit a message to send, an `FCC' field is entered for that file. Unless you remove the `FCC' field, every message is written into that file when it is sent. - -File: xemacs.info, Node: Mail Mode, Prev: Mail Headers, Up: Sending Mail - -Mail Mode -========= - - The major mode used in the `*mail*' buffer is Mail mode. Mail mode -is similar to Text mode, but several commands are provided on the `C-c' -prefix. These commands all deal 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-w' - Insert the file `~/.signature' at the end of the message text - (`mail-signature'). - -`C-c C-y' - Yank the selected message (`mail-yank-original'). - -`C-c C-q' - Fill all paragraphs of yanked old messages, each individually - (`mail-fill-yanked-message'). - -`' - Pops up a menu of useful mail-mode commands. - - There are two ways to send a message. `C-c C-c' -(`mail-send-and-exit') is the usual way to send the message. It sends -the message and then deletes the window (if there is another window) or -switches to another buffer. It puts the `*mail*' buffer at the lowest -priority for automatic reselection, since you are finished with using -it. `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. - - Mail mode provides some other special commands that are useful for -editing the headers and text of the message before you send it. There -are three 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, and `C-c C-f C-c' (`mail-cc') -for the `CC' field. These fields have special motion commands because -they are edited most frequently. - - `C-c C-w' (`mail-signature') adds a standard piece of 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. - - When you use an Rmail command to send mail from the Rmail mail -reader, you can use `C-c C-y' `mail-yank-original' inside the `*mail*' -buffer to insert the text of the message you are replying to. Normally -Rmail 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. - - 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 separately. - - Clicking the right mouse button in a mail buffer pops up a menu of -the above commands, for easy access. - - Turning on Mail mode (which `C-x m' does automatically) calls the -value of `text-mode-hook', if it is not void or `nil', and then calls -the value of `mail-mode-hook' if that is not void or `nil'. - - -File: xemacs.info, Node: Reading Mail, Next: Calendar/Diary, Prev: Sending Mail, Up: Top - -Reading Mail -************ - - XEmacs provides three separate mail-reading packages. Each one -comes with its own manual, which is included standard with the XEmacs -distribution. - - The recommended mail-reading package for new users is VM. VM works -with standard Unix-mail-format folders and was designed as a replacement -for the older Rmail. - - XEmacs also provides a sophisticated and comfortable front-end to the -MH mail-processing system, called `mh-e'. Unlike in other mail -programs, folders in MH are stored as file-system directories, with -each message occupying one (numbered) file. This facilitates working -with mail using shell commands, and many other features of MH are also -designed to integrate well with the shell and with shell scripts. Keep -in mind, however, that in order to use mh-e you must have the MH -mail-processing system installed on your computer. - - Finally, XEmacs provides the Rmail package. Rmail is (currently) the -only mail reading package distributed with FSF GNU Emacs, and is -powerful in its own right. However, it stores mail folders in a special -format called `Babyl', that is incompatible with all other -frequently-used mail programs. A utility program is provided for -converting Babyl folders to standard Unix-mail format; however, unless -you already have mail in Babyl-format folders, you should consider -using VM or mh-e instead. (If at times you have to use FSF Emacs, it is -not hard to obtain and install VM for that editor.) - - -File: xemacs.info, Node: Calendar/Diary, Next: Sorting, Prev: Reading Mail, Up: Top - -Calendar Mode 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. - - `Button2' in the calendar brings up a menu of operations on a -particular date; `Buttons3' 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. -* Mark and Region:: Remembering dates, the mark ring. -* General Calendar:: Exiting or recomputing the calendar. -* LaTeX Calendar:: Print a calendar using LaTeX. -* 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. -* Calendar Customization:: Altering the behavior of the features above. - diff --git a/info/xemacs.info-14 b/info/xemacs.info-14 index d071965..f3b8478 100644 --- a/info/xemacs.info-14 +++ b/info/xemacs.info-14 @@ -30,6 +30,164 @@ versions, except that the sections entitled "The GNU Manifesto", translation approved by the author instead of in the original English.  +File: xemacs.info, Node: Mail Mode, Prev: Mail Headers, Up: Sending Mail + +Mail Mode +========= + + The major mode used in the `*mail*' buffer is Mail mode. Mail mode +is similar to Text mode, but several commands are provided on the `C-c' +prefix. These commands all deal 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-w' + Insert the file `~/.signature' at the end of the message text + (`mail-signature'). + +`C-c C-y' + Yank the selected message (`mail-yank-original'). + +`C-c C-q' + Fill all paragraphs of yanked old messages, each individually + (`mail-fill-yanked-message'). + +`' + Pops up a menu of useful mail-mode commands. + + There are two ways to send a message. `C-c C-c' +(`mail-send-and-exit') is the usual way to send the message. It sends +the message and then deletes the window (if there is another window) or +switches to another buffer. It puts the `*mail*' buffer at the lowest +priority for automatic reselection, since you are finished with using +it. `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. + + Mail mode provides some other special commands that are useful for +editing the headers and text of the message before you send it. There +are three 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, and `C-c C-f C-c' (`mail-cc') +for the `CC' field. These fields have special motion commands because +they are edited most frequently. + + `C-c C-w' (`mail-signature') adds a standard piece of 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. + + When you use an Rmail command to send mail from the Rmail mail +reader, you can use `C-c C-y' `mail-yank-original' inside the `*mail*' +buffer to insert the text of the message you are replying to. Normally +Rmail 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. + + 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 separately. + + Clicking the right mouse button in a mail buffer pops up a menu of +the above commands, for easy access. + + Turning on Mail mode (which `C-x m' does automatically) calls the +value of `text-mode-hook', if it is not void or `nil', and then calls +the value of `mail-mode-hook' if that is not void or `nil'. + + +File: xemacs.info, Node: Reading Mail, Next: Calendar/Diary, Prev: Sending Mail, Up: Top + +Reading Mail +************ + + XEmacs provides three separate mail-reading packages. Each one +comes with its own manual, which is included standard with the XEmacs +distribution. + + The recommended mail-reading package for new users is VM. VM works +with standard Unix-mail-format folders and was designed as a replacement +for the older Rmail. + + XEmacs also provides a sophisticated and comfortable front-end to the +MH mail-processing system, called `mh-e'. Unlike in other mail +programs, folders in MH are stored as file-system directories, with +each message occupying one (numbered) file. This facilitates working +with mail using shell commands, and many other features of MH are also +designed to integrate well with the shell and with shell scripts. Keep +in mind, however, that in order to use mh-e you must have the MH +mail-processing system installed on your computer. + + Finally, XEmacs provides the Rmail package. Rmail is (currently) the +only mail reading package distributed with FSF GNU Emacs, and is +powerful in its own right. However, it stores mail folders in a special +format called `Babyl', that is incompatible with all other +frequently-used mail programs. A utility program is provided for +converting Babyl folders to standard Unix-mail format; however, unless +you already have mail in Babyl-format folders, you should consider +using VM or mh-e instead. (If at times you have to use FSF Emacs, it is +not hard to obtain and install VM for that editor.) + + +File: xemacs.info, Node: Calendar/Diary, Next: Sorting, Prev: Reading Mail, Up: Top + +Calendar Mode 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. + + `Button2' in the calendar brings up a menu of operations on a +particular date; `Buttons3' 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. +* Mark and Region:: Remembering dates, the mark ring. +* General Calendar:: Exiting or recomputing the calendar. +* LaTeX Calendar:: Print a calendar using LaTeX. +* 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. +* Calendar Customization:: Altering the behavior of the features above. + + File: xemacs.info, Node: Calendar Motion, Next: Scroll Calendar, Prev: Calendar/Diary, Up: Calendar/Diary Movement in the Calendar @@ -1099,168 +1257,3 @@ 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: xemacs.info, 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: xemacs.info, 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 "sexp 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 sexp 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 sexp -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: - - The effect of `i a' is to add a `diary-anniversary' sexp to your -diary file. You can also add one manually, for instance: - - %%(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. - - The sexp feature of the diary allows you to specify diary entries -based on any Emacs Lisp expression. You can use the library of built-in -functions or you can write your own functions. The built-in functions -include the ones shown in this section, plus a few others (*note Sexp -Diary Entries::). - - The generality of sexps lets you specify any diary entry that you can -describe algorithmically. Suppose you get paid on the 21st of the month -if it is a weekday, and to the Friday before if the 21st is on a -weekend. The diary entry - - &%%(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 - -to just those dates. This example illustrates how the sexp can depend -on the variable `date'; this variable is a list (MONTH DAY YEAR) that -gives the Gregorian date for which the diary entries are being found. -If the value of the sexp is `t', the entry applies to that date. If -the sexp evaluates to `nil', the entry does _not_ apply to that date. - diff --git a/info/xemacs.info-15 b/info/xemacs.info-15 index 08b6d30..e790bcd 100644 --- a/info/xemacs.info-15 +++ b/info/xemacs.info-15 @@ -30,6 +30,171 @@ versions, except that the sections entitled "The GNU Manifesto", translation approved by the author instead of in the original English.  +File: xemacs.info, 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: xemacs.info, 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 "sexp 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 sexp 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 sexp +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: + + The effect of `i a' is to add a `diary-anniversary' sexp to your +diary file. You can also add one manually, for instance: + + %%(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. + + The sexp feature of the diary allows you to specify diary entries +based on any Emacs Lisp expression. You can use the library of built-in +functions or you can write your own functions. The built-in functions +include the ones shown in this section, plus a few others (*note Sexp +Diary Entries::). + + The generality of sexps lets you specify any diary entry that you can +describe algorithmically. Suppose you get paid on the 21st of the month +if it is a weekday, and to the Friday before if the 21st is on a +weekend. The diary entry + + &%%(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 + +to just those dates. This example illustrates how the sexp can depend +on the variable `date'; this variable is a list (MONTH DAY YEAR) that +gives the Gregorian date for which the diary entries are being found. +If the value of the sexp is `t', the entry applies to that date. If +the sexp evaluates to `nil', the entry does _not_ apply to that date. + + File: xemacs.info, Node: Calendar Customization, Prev: Diary, Up: Calendar/Diary Customizing the Calendar and Diary @@ -988,194 +1153,3 @@ initializations in your init file. *Note Init File::. command completes. You can quit with `C-g'; that terminates the shell command. - -File: xemacs.info, Node: Interactive Shell, Next: Shell Mode, Prev: Single Shell, Up: Shell - -Interactive Inferior Shell --------------------------- - - To run a subshell interactively with its typescript in an XEmacs -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 -will go 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 -. - - XEmacs 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 XEmacs -has time to process it; this happens whenever XEmacs is waiting for -keyboard input or for time to elapse. - - To get multiple subshells, change the name of buffer `*shell*' to -something different by using `M-x rename-buffer'. The next use of `M-x -shell' creates a new buffer `*shell*' with its own subshell. By -renaming 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 (*note -Single Shell Commands: Single Shell.). - - 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 `csh', the file sent to it is `~/.emacs_csh'. - - `cd', `pushd', and `popd' commands given to the inferior shell are -watched by XEmacs 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 XEmacs 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'. - - `M-x shell-resync-dirs' queries the shell and resynchronizes XEmacs' -idea of what the current directory stack is. `M-x -shell-dirtrack-toggle' turns directory tracking on and off. - - XEmacs keeps a history of the most recent commands you have typed in -the `*shell*' buffer. If you are at the beginning of a shell command -line and type , the previous shell input is inserted into the -buffer before point. Immediately typing again deletes that input -and inserts the one before it. By repeating you can move -backward through your commands until you find one you want to repeat. -You may then edit the command before typing if you wish. -moves forward through the command history, in case you moved backward -past the one you wanted while using . If you type the first few -characters of a previous command and then type , the most recent -shell input starting with those characters is inserted. This can be -very convenient when you are repeating a sequence of shell commands. -The variable `input-ring-size' controls how many commands are saved in -your input history. The default is 30. - - -File: xemacs.info, Node: Shell Mode, Next: Terminal emulator, Prev: Interactive Shell, Up: Shell - -Shell Mode ----------- - - The shell buffer uses 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 -XEmacs, except that you must type `C-c' first. Here is a list of the -special key bindings of Shell mode: - -`' - At end of buffer send line as input; otherwise, copy current line - to end of buffer and send it (`send-shell-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 you use in - your subshell. - -`C-c C-d' - Send end-of-file as input, probably causing the shell or its - current subjob to finish (`shell-send-eof'). - -`C-d' - If point is not at the end of the buffer, delete the next - character just like most other modes. If point is at the end of - the buffer, send end-of-file as input, instead of generating an - error as in other modes (`comint-delchar-or-maybe-eof'). - -`C-c C-u' - Kill all text that has yet to be sent as input - (`kill-shell-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 - (`interrupt-shell-subjob'). - -`C-c C-z' - Stop the shell or its current subjob if any (`stop-shell-subjob'). - -`C-c C-\' - Send quit signal to the shell or its current subjob if any - (`quit-shell-subjob'). - -`C-c C-o' - Delete last batch of output from shell (`kill-output-from-shell'). - -`C-c C-r' - Scroll top of last batch of output to top of window - (`show-output-from-shell'). - -`C-c C-y' - Copy the previous bunch of shell input and insert it into the - buffer before point (`copy-last-shell-input'). No final newline - is inserted, and the input copied is not resubmitted until you type - . - -`M-p' - Move backward through the input history. Search for a matching - command if you have typed the beginning of a command - (`comint-previous-input'). - -`M-n' - Move forward through the input history. Useful when you are using - quickly and go past the desired command - (`comint-next-input'). - -`' - Complete the file name preceding point (`comint-dynamic-complete'). - - -File: xemacs.info, Node: Terminal emulator, Next: Term Mode, Prev: Shell Mode, Up: Shell - -Interactive Inferior Shell with Terminal Emulator -------------------------------------------------- - - To run a subshell in a terminal emulator, putting its typescript in -an XEmacs buffer, use `M-x term'. This creates (or reuses) a buffer -named `*term*' and runs a subshell with input coming from your keyboard -and output going to that buffer. - - All the normal keys that you type are sent without any interpretation -by XEmacs directly to the subshell, as "terminal input." Any "echo" of -your input is the responsibility of the subshell. (The exception is -the terminal escape character, which by default is `C-c'. *note Term -Mode::.) Any "terminal output" from the subshell goes into the buffer, -advancing point. - - Some programs (such as XEmacs itself) need to control the appearance -on the terminal screen in detail. They do this by sending special -control codes. The exact control codes needed vary from terminal to -terminal, but nowadays most terminals and terminal emulators (including -xterm) understand the so-called "ANSI escape sequences" (first -popularized by the Digital's VT100 family of terminal). The term mode -also understands these escape sequences, and for each control code does -the appropriate thing to change the buffer so that the appearance of -the window will match what it would be on a real terminal. Thus you -can actually run XEmacs inside an XEmacs Term window! - - XEmacs 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 XEmacs -has time to process it; this happens whenever XEmacs is waiting for -keyboard input or for time to elapse. - - To make multiple terminal emulators, rename the buffer `*term*' to -something different using `M-x rename-uniquely', just as with Shell -mode. - - The file name used to load the subshell is determined the same way -as for Shell mode. - - Unlike Shell mode, Term mode does not track the current directory by -examining your input. Instead, if you use a programmable shell, you -can have it tell Term what the current directory is. This is done -automatically by bash for version 1.15 and later. - diff --git a/info/xemacs.info-16 b/info/xemacs.info-16 index dbcc287..07d3445 100644 --- a/info/xemacs.info-16 +++ b/info/xemacs.info-16 @@ -30,6 +30,197 @@ versions, except that the sections entitled "The GNU Manifesto", translation approved by the author instead of in the original English.  +File: xemacs.info, Node: Interactive Shell, Next: Shell Mode, Prev: Single Shell, Up: Shell + +Interactive Inferior Shell +-------------------------- + + To run a subshell interactively with its typescript in an XEmacs +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 +will go 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 +. + + XEmacs 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 XEmacs +has time to process it; this happens whenever XEmacs is waiting for +keyboard input or for time to elapse. + + To get multiple subshells, change the name of buffer `*shell*' to +something different by using `M-x rename-buffer'. The next use of `M-x +shell' creates a new buffer `*shell*' with its own subshell. By +renaming 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 (*note +Single Shell Commands: Single Shell.). + + 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 `csh', the file sent to it is `~/.emacs_csh'. + + `cd', `pushd', and `popd' commands given to the inferior shell are +watched by XEmacs 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 XEmacs 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'. + + `M-x shell-resync-dirs' queries the shell and resynchronizes XEmacs' +idea of what the current directory stack is. `M-x +shell-dirtrack-toggle' turns directory tracking on and off. + + XEmacs keeps a history of the most recent commands you have typed in +the `*shell*' buffer. If you are at the beginning of a shell command +line and type , the previous shell input is inserted into the +buffer before point. Immediately typing again deletes that input +and inserts the one before it. By repeating you can move +backward through your commands until you find one you want to repeat. +You may then edit the command before typing if you wish. +moves forward through the command history, in case you moved backward +past the one you wanted while using . If you type the first few +characters of a previous command and then type , the most recent +shell input starting with those characters is inserted. This can be +very convenient when you are repeating a sequence of shell commands. +The variable `input-ring-size' controls how many commands are saved in +your input history. The default is 30. + + +File: xemacs.info, Node: Shell Mode, Next: Terminal emulator, Prev: Interactive Shell, Up: Shell + +Shell Mode +---------- + + The shell buffer uses 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 +XEmacs, except that you must type `C-c' first. Here is a list of the +special key bindings of Shell mode: + +`' + At end of buffer send line as input; otherwise, copy current line + to end of buffer and send it (`send-shell-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 you use in + your subshell. + +`C-c C-d' + Send end-of-file as input, probably causing the shell or its + current subjob to finish (`shell-send-eof'). + +`C-d' + If point is not at the end of the buffer, delete the next + character just like most other modes. If point is at the end of + the buffer, send end-of-file as input, instead of generating an + error as in other modes (`comint-delchar-or-maybe-eof'). + +`C-c C-u' + Kill all text that has yet to be sent as input + (`kill-shell-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 + (`interrupt-shell-subjob'). + +`C-c C-z' + Stop the shell or its current subjob if any (`stop-shell-subjob'). + +`C-c C-\' + Send quit signal to the shell or its current subjob if any + (`quit-shell-subjob'). + +`C-c C-o' + Delete last batch of output from shell (`kill-output-from-shell'). + +`C-c C-r' + Scroll top of last batch of output to top of window + (`show-output-from-shell'). + +`C-c C-y' + Copy the previous bunch of shell input and insert it into the + buffer before point (`copy-last-shell-input'). No final newline + is inserted, and the input copied is not resubmitted until you type + . + +`M-p' + Move backward through the input history. Search for a matching + command if you have typed the beginning of a command + (`comint-previous-input'). + +`M-n' + Move forward through the input history. Useful when you are using + quickly and go past the desired command + (`comint-next-input'). + +`' + Complete the file name preceding point (`comint-dynamic-complete'). + + +File: xemacs.info, Node: Terminal emulator, Next: Term Mode, Prev: Shell Mode, Up: Shell + +Interactive Inferior Shell with Terminal Emulator +------------------------------------------------- + + To run a subshell in a terminal emulator, putting its typescript in +an XEmacs buffer, use `M-x term'. This creates (or reuses) a buffer +named `*term*' and runs a subshell with input coming from your keyboard +and output going to that buffer. + + All the normal keys that you type are sent without any interpretation +by XEmacs directly to the subshell, as "terminal input." Any "echo" of +your input is the responsibility of the subshell. (The exception is +the terminal escape character, which by default is `C-c'. *note Term +Mode::.) Any "terminal output" from the subshell goes into the buffer, +advancing point. + + Some programs (such as XEmacs itself) need to control the appearance +on the terminal screen in detail. They do this by sending special +control codes. The exact control codes needed vary from terminal to +terminal, but nowadays most terminals and terminal emulators (including +xterm) understand the so-called "ANSI escape sequences" (first +popularized by the Digital's VT100 family of terminal). The term mode +also understands these escape sequences, and for each control code does +the appropriate thing to change the buffer so that the appearance of +the window will match what it would be on a real terminal. Thus you +can actually run XEmacs inside an XEmacs Term window! + + XEmacs 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 XEmacs +has time to process it; this happens whenever XEmacs is waiting for +keyboard input or for time to elapse. + + To make multiple terminal emulators, rename the buffer `*term*' to +something different using `M-x rename-uniquely', just as with Shell +mode. + + The file name used to load the subshell is determined the same way +as for Shell mode. + + Unlike Shell mode, Term mode does not track the current directory by +examining your input. Instead, if you use a programmable shell, you +can have it tell Term what the current directory is. This is done +automatically by bash for version 1.15 and later. + + File: xemacs.info, Node: Term Mode, Next: Paging in Term, Prev: Terminal emulator, Up: Shell Term Mode @@ -976,198 +1167,3 @@ explicitly, as in the case of: (default-value 'fill-column) - -File: xemacs.info, Node: File Variables, Prev: Locals, Up: Variables - -Local Variables in Files ------------------------- - - A file can contain a "local variables list", which specifies the -values to use for certain Emacs variables when that file is edited. -Visiting the file checks for a local variables list and makes each -variable in the list local to the buffer in which the file is visited, -with the value specified in the file. - - 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. - - The line which starts the local variables list does not have to say -just `Local Variables:'. If there is other text before `Local -Variables:', that text is called the "prefix", and if there is other -text after, that is called the "suffix". If a prefix or suffix are -present, each entry in the local variables list should have the prefix -before it and the suffix after it. This includes the `End:' line. The -prefix and suffix are included to disguise the local variables list as -a comment so the compiler or text formatter will ignore it. If you do -not need to disguise the local variables list as a comment in this way, -there is no need to include a prefix or a suffix. - - Two "variable" names are special in a local variables list: a value -for the variable `mode' sets the major mode, and a value for the -variable `eval' is simply evaluated as an expression and the value is -ignored. These are not real variables; setting them in any other -context does not have the same effect. If `mode' is used in a local -variables list, it should be the first entry in the list. - - Here is an example of a local variables list: - ;;; Local Variables: *** - ;;; mode:lisp *** - ;;; comment-column:0 *** - ;;; comment-start: ";;; " *** - ;;; comment-end:"***" *** - ;;; End: *** - - Note that the prefix is `;;; ' and the suffix is ` ***'. Note also -that comments in the file begin with and end with the same strings. -Presumably the file contains code in a language which is enough like -Lisp for Lisp mode to be useful but in which comments start and end -differently. The prefix and suffix are used in the local variables -list to make the list look like several lines of comments when the -compiler or interpreter for that language reads the file. - - 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 is twofold: a stray `Local Variables:' not in the -last page does not confuse Emacs, and Emacs never needs to search a -long file that contains no page markers and has no local variables list. - - You may be tempted to turn on Auto Fill mode with a local variable -list. That is inappropriate. Whether you use Auto Fill mode or not is -a matter of personal taste, not a matter of the contents of particular -files. If you want to use Auto Fill, set up major mode hooks with your -init 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 working with the file. - - XEmacs allows you to specify local variables in the first line of a -file, in addition to specifying them in the `Local Variables' section -at the end of a file. - - If the first line of a file contains two occurrences of ``-*-'', -XEmacs uses the information between them to determine what the major -mode and variable settings should be. For example, these are all legal: - - ;;; -*- mode: emacs-lisp -*- - ;;; -*- mode: postscript; version-control: never -*- - ;;; -*- tags-file-name: "/foo/bar/TAGS" -*- - - For historical reasons, the syntax ``-*- modename -*-'' is allowed -as well; for example, you can use: - - ;;; -*- emacs-lisp -*- - - The variable `enable-local-variables' controls the use of local -variables lists in files you visit. The value can be `t', `nil', or -something else. A value of `t' means local variables lists are obeyed; -`nil' means they are ignored; anything else means query. - - The command `M-x normal-mode' always obeys local variables lists and -ignores this variable. - - -File: xemacs.info, Node: Keyboard Macros, Next: Key Bindings, Prev: Variables, Up: Customization - -Keyboard Macros -=============== - - A "keyboard macro" is a command defined by the user to abbreviate a -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 invoke `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. - - Keyboard macros differ from other 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 -general or complex. For such things, Lisp must be used. - - You define a keyboard macro by executing the commands which are its -definition. Put differently, as you are defining a keyboard macro, the -definition is being executed for the first time. This way, you see -what the effects of your commands are, and don't have to figure them -out in your head. When you are finished, the keyboard macro is defined -and also has been executed once. You can then execute the same set of -commands 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: xemacs.info, Node: Basic Kbd Macro, Next: Save Kbd Macro, Up: Keyboard Macros - -Basic Use ---------- - - To start defining a keyboard macro, type `C-x (' -(`start-kbd-macro'). From then on, anything you type continues to be -executed, but also becomes 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'. - - You can give `C-x )' 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). If you give `C-x )' an argument of 4, it 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'). - - Once you have defined a macro, you can invoke it again with the `C-x -e' command (`call-last-kbd-macro'). You can give the command a repeat -count numeric argument to execute the macro many times. - - 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. Repeating the macro will then 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. - diff --git a/info/xemacs.info-17 b/info/xemacs.info-17 index 8326642..0b7a7a7 100644 --- a/info/xemacs.info-17 +++ b/info/xemacs.info-17 @@ -30,6 +30,201 @@ versions, except that the sections entitled "The GNU Manifesto", translation approved by the author instead of in the original English.  +File: xemacs.info, Node: File Variables, Prev: Locals, Up: Variables + +Local Variables in Files +------------------------ + + A file can contain a "local variables list", which specifies the +values to use for certain Emacs variables when that file is edited. +Visiting the file checks for a local variables list and makes each +variable in the list local to the buffer in which the file is visited, +with the value specified in the file. + + 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. + + The line which starts the local variables list does not have to say +just `Local Variables:'. If there is other text before `Local +Variables:', that text is called the "prefix", and if there is other +text after, that is called the "suffix". If a prefix or suffix are +present, each entry in the local variables list should have the prefix +before it and the suffix after it. This includes the `End:' line. The +prefix and suffix are included to disguise the local variables list as +a comment so the compiler or text formatter will ignore it. If you do +not need to disguise the local variables list as a comment in this way, +there is no need to include a prefix or a suffix. + + Two "variable" names are special in a local variables list: a value +for the variable `mode' sets the major mode, and a value for the +variable `eval' is simply evaluated as an expression and the value is +ignored. These are not real variables; setting them in any other +context does not have the same effect. If `mode' is used in a local +variables list, it should be the first entry in the list. + + Here is an example of a local variables list: + ;;; Local Variables: *** + ;;; mode:lisp *** + ;;; comment-column:0 *** + ;;; comment-start: ";;; " *** + ;;; comment-end:"***" *** + ;;; End: *** + + Note that the prefix is `;;; ' and the suffix is ` ***'. Note also +that comments in the file begin with and end with the same strings. +Presumably the file contains code in a language which is enough like +Lisp for Lisp mode to be useful but in which comments start and end +differently. The prefix and suffix are used in the local variables +list to make the list look like several lines of comments when the +compiler or interpreter for that language reads the file. + + 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 is twofold: a stray `Local Variables:' not in the +last page does not confuse Emacs, and Emacs never needs to search a +long file that contains no page markers and has no local variables list. + + You may be tempted to turn on Auto Fill mode with a local variable +list. That is inappropriate. Whether you use Auto Fill mode or not is +a matter of personal taste, not a matter of the contents of particular +files. If you want to use Auto Fill, set up major mode hooks with your +init 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 working with the file. + + XEmacs allows you to specify local variables in the first line of a +file, in addition to specifying them in the `Local Variables' section +at the end of a file. + + If the first line of a file contains two occurrences of ``-*-'', +XEmacs uses the information between them to determine what the major +mode and variable settings should be. For example, these are all legal: + + ;;; -*- mode: emacs-lisp -*- + ;;; -*- mode: postscript; version-control: never -*- + ;;; -*- tags-file-name: "/foo/bar/TAGS" -*- + + For historical reasons, the syntax ``-*- modename -*-'' is allowed +as well; for example, you can use: + + ;;; -*- emacs-lisp -*- + + The variable `enable-local-variables' controls the use of local +variables lists in files you visit. The value can be `t', `nil', or +something else. A value of `t' means local variables lists are obeyed; +`nil' means they are ignored; anything else means query. + + The command `M-x normal-mode' always obeys local variables lists and +ignores this variable. + + +File: xemacs.info, Node: Keyboard Macros, Next: Key Bindings, Prev: Variables, Up: Customization + +Keyboard Macros +=============== + + A "keyboard macro" is a command defined by the user to abbreviate a +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 invoke `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. + + Keyboard macros differ from other 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 +general or complex. For such things, Lisp must be used. + + You define a keyboard macro by executing the commands which are its +definition. Put differently, as you are defining a keyboard macro, the +definition is being executed for the first time. This way, you see +what the effects of your commands are, and don't have to figure them +out in your head. When you are finished, the keyboard macro is defined +and also has been executed once. You can then execute the same set of +commands 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: xemacs.info, Node: Basic Kbd Macro, Next: Save Kbd Macro, Up: Keyboard Macros + +Basic Use +--------- + + To start defining a keyboard macro, type `C-x (' +(`start-kbd-macro'). From then on, anything you type continues to be +executed, but also becomes 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'. + + You can give `C-x )' 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). If you give `C-x )' an argument of 4, it 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'). + + Once you have defined a macro, you can invoke it again with the `C-x +e' command (`call-last-kbd-macro'). You can give the command a repeat +count numeric argument to execute the macro many times. + + 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. Repeating the macro will then 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. + + File: xemacs.info, Node: Save Kbd Macro, Next: Kbd Macro Query, Prev: Basic Kbd Macro, Up: Keyboard Macros Naming and Saving Keyboard Macros @@ -978,254 +1173,3 @@ kernel of Emacs uses. `yes-or-no-p' You type something other than `yes' or `no' - -File: xemacs.info, Node: Faces, Next: Frame Components, Prev: Audible Bell, Up: Customization - -Faces -===== - - XEmacs has objects called extents and faces. An "extent" is a -region of text and a "face" is a collection of textual attributes, such -as fonts and colors. Every extent is displayed in some face; -therefore, changing the properties of a face immediately updates the -display of all associated extents. Faces can be frame-local: you can -have a region of text that displays with completely different -attributes when its buffer is viewed from a different X window. - - The display attributes of faces may be specified either in Lisp or -through the X resource manager. - -Customizing Faces ------------------ - - You can change the face of an extent with the functions in this -section. All the functions prompt for a FACE as an argument; use -completion for a list of possible values. - -`M-x invert-face' - Swap the foreground and background colors of the given FACE. - -`M-x make-face-bold' - Make the font of the given FACE bold. When called from a program, - returns `nil' if this is not possible. - -`M-x make-face-bold-italic' - Make the font of the given FACE bold italic. When called from a - program, returns `nil' if not possible. - -`M-x make-face-italic' - Make the font of the given FACE italic. When called from a - program, returns `nil' if not possible. - -`M-x make-face-unbold' - Make the font of the given FACE non-bold. When called from a - program, returns `nil' if not possible. - -`M-x make-face-unitalic' - Make the font of the given FACE non-italic. When called from a - program, returns `nil' if not possible. - -`M-x make-face-larger' - Make the font of the given FACE a little larger. When called from - a program, returns `nil' if not possible. - -`M-x make-face-smaller' - Make the font of the given FACE a little smaller. When called - from a program, returns `nil' if not possible. - -`M-x set-face-background' - Change the background color of the given FACE. - -`M-x set-face-background-pixmap' - Change the background pixmap of the given FACE. - -`M-x set-face-font' - Change the font of the given FACE. - -`M-x set-face-foreground' - Change the foreground color of the given FACE. - -`M-x set-face-underline-p' - Change whether the given FACE is underlined. - - You can exchange the foreground and background color of the selected -FACE with the function `invert-face'. If the face does not specify both -foreground and background, then its foreground and background are set -to the background and foreground of the default face. When calling -this from a program, you can supply the optional argument FRAME to -specify which frame is affected; otherwise, all frames are affected. - - You can set the background color of the specified FACE with the -function `set-face-background'. The argument `color' should be a -string, the name of a color. When called from a program, if the -optional FRAME argument is provided, the face is changed only in that -frame; otherwise, it is changed in all frames. - - You can set the background pixmap of the specified FACE with the -function `set-face-background-pixmap'. The pixmap argument NAME should -be a string, the name of a file of pixmap data. The directories listed -in the `x-bitmap-file-path' variable are searched. The bitmap may also -be a list of the form `(WIDTH HEIGHT DATA)', where WIDTH and HEIGHT are -the size in pixels, and DATA is a string containing the raw bits of the -bitmap. If the optional FRAME argument is provided, the face is -changed only in that frame; otherwise, it is changed in all frames. - - The variable `x-bitmap-file-path' takes as a value a list of the -directories in which X bitmap files may be found. If the value is -`nil', the list is initialized from the `*bitmapFilePath' resource. - - If the environment variable XBMLANGPATH is set, then it is consulted -before the `x-bitmap-file-path' variable. - - You can set the font of the specified FACE with the function -`set-face-font'. The FONT argument should be a string, the name of a -font. When called from a program, if the optional FRAME argument is -provided, the face is changed only in that frame; otherwise, it is -changed in all frames. - - You can set the foreground color of the specified FACE with the -function `set-face-foreground'. The argument COLOR should be a string, -the name of a color. If the optional FRAME argument is provided, the -face is changed only in that frame; otherwise, it is changed in all -frames. - - You can set underline the specified FACE with the function -`set-face-underline-p'. The argument UNDERLINE-P can be used to make -underlining an attribute of the face or not. If the optional FRAME -argument is provided, the face is changed only in that frame; -otherwise, it is changed in all frames. - - -File: xemacs.info, Node: Frame Components, Next: X Resources, Prev: Faces, Up: Customization - -Frame Components -================ - - You can control the presence and position of most frame components, -such as the menubar, toolbars, and gutters. - - This section is not written yet. Try the Lisp Reference Manual: -*Note Menubar: (lispref)Menubar, *Note Toolbar Intro: (lispref)Toolbar -Intro, and *Note Gutter Intro: (lispref)Gutter Intro. - - -File: xemacs.info, Node: X Resources, Prev: Frame Components, Up: Customization - -X Resources -=========== - - Historically, XEmacs has used the X resource application class -`Emacs' for its resources. Unfortunately, GNU Emacs uses the same -application class, and resources are not compatible between the two -Emacsen. This sharing of the application class often leads to trouble -if you want to run both variants. - - Starting with XEmacs 21, XEmacs uses the class `XEmacs' if it finds -any XEmacs resources in the resource database when the X connection is -initialized. Otherwise, it will use the class `Emacs' for backwards -compatibility. The variable X-EMACS-APPLICATION-CLASS may be consulted -to determine the application class being used. - - The examples in this section assume the application class is `Emacs'. - - The Emacs resources are generally set per-frame. Each Emacs frame -can have its own name or the same name as another, depending on the -name passed to the `make-frame' function. - - You can specify resources for all frames with the syntax: - - Emacs*parameter: value - -or - - Emacs*EmacsFrame.parameter:value - -You can specify resources for a particular frame with the syntax: - - Emacs*FRAME-NAME.parameter: value - -* Menu: - -* Geometry Resources:: Controlling the size and position of frames. -* Iconic Resources:: Controlling whether frames come up iconic. -* Resource List:: List of resources settable on a frame or device. -* Face Resources:: Controlling faces using resources. -* Widgets:: The widget hierarchy for XEmacs. -* Menubar Resources:: Specifying resources for the menubar. - - -File: xemacs.info, Node: Geometry Resources, Next: Iconic Resources, Up: X Resources - -Geometry Resources ------------------- - - To make the default size of all Emacs frames be 80 columns by 55 -lines, do this: - - Emacs*EmacsFrame.geometry: 80x55 - -To set the geometry of a particular frame named `fred', do this: - - Emacs*fred.geometry: 80x55 - -Important! Do not use the following syntax: - - Emacs*geometry: 80x55 - -You should never use `*geometry' with any X application. It does not -say "make the geometry of Emacs be 80 columns by 55 lines." It really -says, "make Emacs and all subwindows thereof be 80x55 in whatever units -they care to measure in." In particular, that is both telling the -Emacs text pane to be 80x55 in characters, and telling the menubar pane -to be 80x55 pixels, which is surely not what you want. - - As a special case, this geometry specification also works (and sets -the default size of all Emacs frames to 80 columns by 55 lines): - - Emacs.geometry: 80x55 - -since that is the syntax used with most other applications (since most -other applications have only one top-level window, unlike Emacs). In -general, however, the top-level shell (the unmapped ApplicationShell -widget named `Emacs' that is the parent of the shell widgets that -actually manage the individual frames) does not have any interesting -resources on it, and you should set the resources on the frames instead. - - The `-geometry' command-line argument sets only the geometry of the -initial frame created by Emacs. - - A more complete explanation of geometry-handling is - - * The `-geometry' command-line option sets the `Emacs.geometry' - resource, that is, the geometry of the ApplicationShell. - - * For the first frame created, the size of the frame is taken from - the ApplicationShell if it is specified, otherwise from the - geometry of the frame. - - * For subsequent frames, the order is reversed: First the frame, and - then the ApplicationShell. - - * For the first frame created, the position of the frame is taken - from the ApplicationShell (`Emacs.geometry') if it is specified, - otherwise from the geometry of the frame. - - * For subsequent frames, the position is taken only from the frame, - and never from the ApplicationShell. - - This is rather complicated, but it does seem to provide the most -intuitive behavior with respect to the default sizes and positions of -frames created in various ways. - - -File: xemacs.info, Node: Iconic Resources, Next: Resource List, Prev: Geometry Resources, Up: X Resources - -Iconic Resources ----------------- - - Analogous to `-geometry', the `-iconic' command-line option sets the -iconic flag of the ApplicationShell (`Emacs.iconic') and always applies -to the first frame created regardless of its name. However, it is -possible to set the iconic flag on particular frames (by name) by using -the `Emacs*FRAME-NAME.iconic' resource. - diff --git a/info/xemacs.info-18 b/info/xemacs.info-18 index 48e15c5..1983b65 100644 --- a/info/xemacs.info-18 +++ b/info/xemacs.info-18 @@ -30,6 +30,257 @@ versions, except that the sections entitled "The GNU Manifesto", translation approved by the author instead of in the original English.  +File: xemacs.info, Node: Faces, Next: Frame Components, Prev: Audible Bell, Up: Customization + +Faces +===== + + XEmacs has objects called extents and faces. An "extent" is a +region of text and a "face" is a collection of textual attributes, such +as fonts and colors. Every extent is displayed in some face; +therefore, changing the properties of a face immediately updates the +display of all associated extents. Faces can be frame-local: you can +have a region of text that displays with completely different +attributes when its buffer is viewed from a different X window. + + The display attributes of faces may be specified either in Lisp or +through the X resource manager. + +Customizing Faces +----------------- + + You can change the face of an extent with the functions in this +section. All the functions prompt for a FACE as an argument; use +completion for a list of possible values. + +`M-x invert-face' + Swap the foreground and background colors of the given FACE. + +`M-x make-face-bold' + Make the font of the given FACE bold. When called from a program, + returns `nil' if this is not possible. + +`M-x make-face-bold-italic' + Make the font of the given FACE bold italic. When called from a + program, returns `nil' if not possible. + +`M-x make-face-italic' + Make the font of the given FACE italic. When called from a + program, returns `nil' if not possible. + +`M-x make-face-unbold' + Make the font of the given FACE non-bold. When called from a + program, returns `nil' if not possible. + +`M-x make-face-unitalic' + Make the font of the given FACE non-italic. When called from a + program, returns `nil' if not possible. + +`M-x make-face-larger' + Make the font of the given FACE a little larger. When called from + a program, returns `nil' if not possible. + +`M-x make-face-smaller' + Make the font of the given FACE a little smaller. When called + from a program, returns `nil' if not possible. + +`M-x set-face-background' + Change the background color of the given FACE. + +`M-x set-face-background-pixmap' + Change the background pixmap of the given FACE. + +`M-x set-face-font' + Change the font of the given FACE. + +`M-x set-face-foreground' + Change the foreground color of the given FACE. + +`M-x set-face-underline-p' + Change whether the given FACE is underlined. + + You can exchange the foreground and background color of the selected +FACE with the function `invert-face'. If the face does not specify both +foreground and background, then its foreground and background are set +to the background and foreground of the default face. When calling +this from a program, you can supply the optional argument FRAME to +specify which frame is affected; otherwise, all frames are affected. + + You can set the background color of the specified FACE with the +function `set-face-background'. The argument `color' should be a +string, the name of a color. When called from a program, if the +optional FRAME argument is provided, the face is changed only in that +frame; otherwise, it is changed in all frames. + + You can set the background pixmap of the specified FACE with the +function `set-face-background-pixmap'. The pixmap argument NAME should +be a string, the name of a file of pixmap data. The directories listed +in the `x-bitmap-file-path' variable are searched. The bitmap may also +be a list of the form `(WIDTH HEIGHT DATA)', where WIDTH and HEIGHT are +the size in pixels, and DATA is a string containing the raw bits of the +bitmap. If the optional FRAME argument is provided, the face is +changed only in that frame; otherwise, it is changed in all frames. + + The variable `x-bitmap-file-path' takes as a value a list of the +directories in which X bitmap files may be found. If the value is +`nil', the list is initialized from the `*bitmapFilePath' resource. + + If the environment variable XBMLANGPATH is set, then it is consulted +before the `x-bitmap-file-path' variable. + + You can set the font of the specified FACE with the function +`set-face-font'. The FONT argument should be a string, the name of a +font. When called from a program, if the optional FRAME argument is +provided, the face is changed only in that frame; otherwise, it is +changed in all frames. + + You can set the foreground color of the specified FACE with the +function `set-face-foreground'. The argument COLOR should be a string, +the name of a color. If the optional FRAME argument is provided, the +face is changed only in that frame; otherwise, it is changed in all +frames. + + You can set underline the specified FACE with the function +`set-face-underline-p'. The argument UNDERLINE-P can be used to make +underlining an attribute of the face or not. If the optional FRAME +argument is provided, the face is changed only in that frame; +otherwise, it is changed in all frames. + + +File: xemacs.info, Node: Frame Components, Next: X Resources, Prev: Faces, Up: Customization + +Frame Components +================ + + You can control the presence and position of most frame components, +such as the menubar, toolbars, and gutters. + + This section is not written yet. Try the Lisp Reference Manual: +*Note Menubar: (lispref)Menubar, *Note Toolbar Intro: (lispref)Toolbar +Intro, and *Note Gutter Intro: (lispref)Gutter Intro. + + +File: xemacs.info, Node: X Resources, Prev: Frame Components, Up: Customization + +X Resources +=========== + + Historically, XEmacs has used the X resource application class +`Emacs' for its resources. Unfortunately, GNU Emacs uses the same +application class, and resources are not compatible between the two +Emacsen. This sharing of the application class often leads to trouble +if you want to run both variants. + + Starting with XEmacs 21, XEmacs uses the class `XEmacs' if it finds +any XEmacs resources in the resource database when the X connection is +initialized. Otherwise, it will use the class `Emacs' for backwards +compatibility. The variable X-EMACS-APPLICATION-CLASS may be consulted +to determine the application class being used. + + The examples in this section assume the application class is `Emacs'. + + The Emacs resources are generally set per-frame. Each Emacs frame +can have its own name or the same name as another, depending on the +name passed to the `make-frame' function. + + You can specify resources for all frames with the syntax: + + Emacs*parameter: value + +or + + Emacs*EmacsFrame.parameter:value + +You can specify resources for a particular frame with the syntax: + + Emacs*FRAME-NAME.parameter: value + +* Menu: + +* Geometry Resources:: Controlling the size and position of frames. +* Iconic Resources:: Controlling whether frames come up iconic. +* Resource List:: List of resources settable on a frame or device. +* Face Resources:: Controlling faces using resources. +* Widgets:: The widget hierarchy for XEmacs. +* Menubar Resources:: Specifying resources for the menubar. + + +File: xemacs.info, Node: Geometry Resources, Next: Iconic Resources, Up: X Resources + +Geometry Resources +------------------ + + To make the default size of all Emacs frames be 80 columns by 55 +lines, do this: + + Emacs*EmacsFrame.geometry: 80x55 + +To set the geometry of a particular frame named `fred', do this: + + Emacs*fred.geometry: 80x55 + +Important! Do not use the following syntax: + + Emacs*geometry: 80x55 + +You should never use `*geometry' with any X application. It does not +say "make the geometry of Emacs be 80 columns by 55 lines." It really +says, "make Emacs and all subwindows thereof be 80x55 in whatever units +they care to measure in." In particular, that is both telling the +Emacs text pane to be 80x55 in characters, and telling the menubar pane +to be 80x55 pixels, which is surely not what you want. + + As a special case, this geometry specification also works (and sets +the default size of all Emacs frames to 80 columns by 55 lines): + + Emacs.geometry: 80x55 + +since that is the syntax used with most other applications (since most +other applications have only one top-level window, unlike Emacs). In +general, however, the top-level shell (the unmapped ApplicationShell +widget named `Emacs' that is the parent of the shell widgets that +actually manage the individual frames) does not have any interesting +resources on it, and you should set the resources on the frames instead. + + The `-geometry' command-line argument sets only the geometry of the +initial frame created by Emacs. + + A more complete explanation of geometry-handling is + + * The `-geometry' command-line option sets the `Emacs.geometry' + resource, that is, the geometry of the ApplicationShell. + + * For the first frame created, the size of the frame is taken from + the ApplicationShell if it is specified, otherwise from the + geometry of the frame. + + * For subsequent frames, the order is reversed: First the frame, and + then the ApplicationShell. + + * For the first frame created, the position of the frame is taken + from the ApplicationShell (`Emacs.geometry') if it is specified, + otherwise from the geometry of the frame. + + * For subsequent frames, the position is taken only from the frame, + and never from the ApplicationShell. + + This is rather complicated, but it does seem to provide the most +intuitive behavior with respect to the default sizes and positions of +frames created in various ways. + + +File: xemacs.info, Node: Iconic Resources, Next: Resource List, Prev: Geometry Resources, Up: X Resources + +Iconic Resources +---------------- + + Analogous to `-geometry', the `-iconic' command-line option sets the +iconic flag of the ApplicationShell (`Emacs.iconic') and always applies +to the first frame created regardless of its name. However, it is +possible to set the iconic flag on particular frames (by name) by using +the `Emacs*FRAME-NAME.iconic' resource. + + File: xemacs.info, Node: Resource List, Next: Face Resources, Prev: Iconic Resources, Up: X Resources Resource List diff --git a/info/xemacs.info-3 b/info/xemacs.info-3 index 80127b0..6c41e8f 100644 --- a/info/xemacs.info-3 +++ b/info/xemacs.info-3 @@ -393,7 +393,7 @@ command line arguments. Emacs only.  -File: xemacs.info, Node: Startup Paths, Next: Basic, Prev: Command Switches, Up: Top +File: xemacs.info, Node: Startup Paths, Next: Packages, Prev: Command Switches, Up: Top How XEmacs finds Directories and Files ====================================== @@ -555,7 +555,7 @@ aiding in debugging any problems which come up. package data directories as well as `data-directory'.  -File: xemacs.info, Node: Basic, Next: Undo, Prev: Startup Paths, Up: Top +File: xemacs.info, Node: Basic, Next: Undo, Prev: Packages, Up: Top Basic Editing Commands ********************** diff --git a/info/xemacs.info-7 b/info/xemacs.info-7 index 3cdf13a..ceaf16b 100644 --- a/info/xemacs.info-7 +++ b/info/xemacs.info-7 @@ -343,9 +343,11 @@ symbolic link anywhere in its directory path. In other words, the the `find-file' command will check the `buffer-file-truename' of all visited files when deciding whether a given file is already in a buffer, instead of just `buffer-file-name'. If you attempt to visit -another file which is a hard-link or symbolic-link to a file that is -already in a buffer, the existing buffer will be found instead of a -newly created one. +another file which is a symbolic link to a file that is already in a +buffer, the existing buffer will be found instead of a newly created +one. This works if any component of the pathname (including a +non-terminal component) is a symbolic link as well, but doesn't work +with hard links (nothing does). If you want to create a file, just visit it. Emacs prints `(New File)' in the echo area, but in other respects behaves as if you had diff --git a/info/xemacs.info-9 b/info/xemacs.info-9 index 9d4fa44..fd04303 100644 --- a/info/xemacs.info-9 +++ b/info/xemacs.info-9 @@ -56,8 +56,8 @@ top to bottom and left to right. From the rightmost and bottommost window, it goes back to the one at the upper left corner. A numeric argument, N, moves several steps in the cyclic order of windows. A negative numeric argument moves around the cycle in the opposite order. -If the optional second argument ALL-FRAMES is non-`nil', the function -cycles through all frames. When the minibuffer is active, the +If the optional second argument WHICH-FRAMES is non-`nil', the +function cycles through all frames. 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 diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index ced3d7c..cc9cbcd 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -11,6 +11,14 @@ * update-elc.sh (ignore_dirs): Ignore lisp/utf-2000 subdirectory. +2000-11-14 Martin Buchholz + + * XEmacs 21.2.37 is released. + +2000-09-01 Katsumi Yamaoka + + * make-po.c (BUFSIZE): Increase value to 32768. + 2000-10-04 Martin Buchholz * XEmacs 21.2.36 is released. diff --git a/lib-src/make-po.c b/lib-src/make-po.c index 3db1189..37bb4fa 100644 --- a/lib-src/make-po.c +++ b/lib-src/make-po.c @@ -18,7 +18,8 @@ #endif /* #define BUFSIZE 8192 */ -#define BUFSIZE 16384 +/* #define BUFSIZE 16384 */ +#define BUFSIZE 32768 #define NEWSTRING 31 /* Character signalling start of new doc string */ #define LINEEND "\\n" #define ENDSTRING "\"\n" diff --git a/lib-src/qsort.c b/lib-src/qsort.c index ff8ef60..404469a 100644 --- a/lib-src/qsort.c +++ b/lib-src/qsort.c @@ -64,7 +64,7 @@ typedef struct stack. Assuming a 32-bit integer, this needs only 32 * sizeof (stack_node) == 136 bits. Pretty cheap, actually. - 2. Chose the pivot element using a median-of-three decision tree. + 2. Choose the pivot element using a median-of-three decision tree. This reduces the probability of selecting a bad pivot value and eliminates certain extraneous comparisons. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f4a6aaf..9b8a4f0 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -470,6 +470,381 @@ * files.el (insert-file-contents-literally): Treat file as binary; call file-name-handlers. [sync with Emacs 20.3.10] +2000-11-14 Martin Buchholz + + * XEmacs 21.2.37 is released. + +2000-11-13 Katsumi Yamaoka + + * code-cmds.el: Provide the feature. + +2000-07-21 Jan Vroonhof + + * dumped-lisp.el (preloaded-file-list): Load code-cmds.el + + * code-cmds.el: New file + * mule/mule-cmds.el: + * mule/mule-misc.el + (coding-keymap): New keymap. Define coding system keyboard + commands on file-coding builds too. + (coding-system-change-eol-conversion): + (universal-coding-system-argument): + (set-default-coding-systems): + (prefer-coding-system): Moved from mule-cmds.el + (set-buffer-process-coding-system): Moved from mule-misc.el + +2000-09-15 Stephen Carney + + * etags.el (buffer-tag-table-files): Use append instead of nconc. + +2000-11-09 Steve Youngs + + * package-get.el (package-get-download-sites): Add a pre-release + site for experimental packages. + + * auto-autoloads.el: Regenerated. + +2000-08-01 Andy Piper + + * gutter-items.el (buffers-tab-omit-function): reference + buffers-tab-select-visible-buffers. + (buffers-tab-filter-functions): new variable, by default uses + buffers-tab-selection-function and buffers-tab-omit-function. + (select-buffers-tab-buffers-by-mode): invert arguments. + (buffers-tab-select-visible-buffers): new function. Invert calling + of buffers-menu-omit-invisible-buffers. + (buffers-tab-items): rewrite to use + buffers-tab-filter-functions. Rewrite docstring. + (gutter-buffers-tab-extent): delete. + (add-tab-to-gutter): always build a new extent when adding the + tabs. + (update-tab-in-gutter): make gutter dirty when orientation + changes. + +2000-11-07 Martin Buchholz + + * bytecomp.el (byte-compile-defvar-or-defconst): + Only do loadhist recording if defvar form includes a value. + +2000-11-02 Martin Buchholz + + * bytecomp.el (byte-compile-initial-macro-environment): + `eval-when-compile' should not compile its body. + +2000-11-02 Stephen J. Turnbull + + * mule/cyrillic.el: Add Windows 1251 code page encoding (by + Sergey Groznyh in <863diqaygu.fsf@fct.ru>). Fix + some Japanese English. Remove some ancient FSF comments, and + improve docstrings. Use symbols not vectors for tables. + +2000-11-03 Martin Buchholz + + * keymap.el: + (local-key-binding): + (global-key-binding): + Add an optional `accept-defaults' parameter, just like `lookup-key'. + + * lisp.el: + (backward-sexp): Slightly simpler code. + (mark-sexp): Make arg optional, like FSF Emacs. + (forward-list): Slightly simpler code. + (backward-list): Slightly simpler code. + (down-list): Make arg optional, like FSF Emacs. + (up-list): Make arg optional, like FSF Emacs. + (backward-up-list): Make arg optional, like FSF Emacs. + (kill-sexp): Make arg optional, like FSF Emacs. + (backward-kill-sexp): Make arg optional, like FSF Emacs. + + * font-menu.el (font-menu-change-face): + Take continuable errors into account. + + * abbrev.el: + * abbrev.el (clear-abbrev-table): + * abbrev.el (define-abbrev-table): + * abbrev.el (define-abbrev): + * abbrev.el (insert-abbrev-table-description): + * apropos.el (apropos-documentation-check-doc-file): + * apropos.el (apropos-documentation-check-elc-file): + * buff-menu.el (list-buffers): + * buff-menu.el (list-buffers-noselect): + * bytecomp.el (byte-recompile-directory): + * bytecomp.el (batch-byte-compile): + * cl-macs.el (typep): + * code-files.el (find-coding-system-magic-cookie): + * code-files.el (insert-file-contents): + * cus-edit.el (customize-set-variable): + * cus-edit.el (customize-save-variable): + * cus-face.el (custom-set-face-font-size): + * cus-face.el (custom-set-face-update-spec): + * cus-face.el (custom-reset-faces): + * custom.el (custom-check-theme): + * custom.el (copy-upto-last): + * fill.el (canonically-space-region): + * fill.el (fill-paragraph): + * fill.el (fill-region): + * fill.el (find-space-insertable-point): + * fill.el (justify-current-line): + * faces.el (face-spec-update-all-matching): + * faces.el (set-face-stipple): + * files-nomule.el (insert-file-contents): + * files.el (insert-file-contents-literally): + * files.el (hack-local-variables-last-page): + * files.el (basic-save-buffer): + * files.el (insert-directory): + * font-menu.el (font-menu-change-face): + * font.el (font-spatial-to-canonical): + * format.el (format-encode-region): + * format.el (format-insert-file): + * format.el (format-replace-strings): + * gutter.el (set-gutter-element): + * help.el (key-or-menu-binding): + * help.el (describe-bindings): + * help.el (with-syntax-table): + * indent.el (indent-rigidly): + * indent.el (delete-to-left-margin): + * info.el: + * info.el (Info-extract-dir-entry-from): + * info.el (Info-build-dir-anew): + * info.el (Info-rebuild-dir): + * info.el (Info-batch-rebuild-dir): + * info.el (Info-read-subfile): + * info.el (Info-build-node-completions): + * info.el (Info-extract-menu-node-name): + * isearch-mode.el (isearch-range-invisible): + * isearch-mode.el (isearch-restore-invisible-extents): + * itimer.el (itimerp): + * itimer.el (itimer-live-p): + * keymap.el: + * keymap.el (substitute-key-definition): + * keymap.el (read-command-or-command-sexp): + * keymap.el (local-key-binding): + * keymap.el (global-key-binding): + * keymap.el (global-set-key): + * keymap.el (local-set-key): + * ldap.el: + * ldap.el (ldap-add-entries): + * ldap.el (ldap-delete-entries): + * lisp.el (backward-sexp): + * lisp.el (mark-sexp): + * lisp.el (forward-list): + * lisp.el (backward-list): + * lisp.el (down-list): + * lisp.el (backward-up-list): + * lisp.el (up-list): + * lisp.el (kill-sexp): + * lisp.el (backward-kill-sexp): + * menubar.el (add-menu-button): + * menubar.el (add-submenu): + * menubar.el (delete-menu-item): + * menubar.el (relabel-menu-item): + * mouse.el (narrow-window-to-region): + * obsolete.el (define-obsolete-variable-alias): + * obsolete.el (store-substring): + * package-admin.el: + * package-admin.el (package-admin-install-function): + * package-admin.el (package-admin-install-function-mswindows): + * package-admin.el (package-admin-default-install-function): + * package-get.el (package-get-update-base-entries): + * packages.el (packages-load-package-dumped-lisps): + * packages.el (packages-collect-package-dumped-lisps): + * printer.el (generic-print-buffer): + * printer.el (generic-print-region): + * replace.el (occur-mode-mouse-goto): + * replace.el (perform-replace): + * select.el (get-selection-no-error): + * simple.el: + * simple.el (newline): + * simple.el (open-line): + * simple.el (edit-and-eval-command): + * simple.el (goto-line): + * simple.el (undo): + * simple.el (kill-region): + * simple.el (copy-region-as-kill): + * simple.el (kill-ring-save): + * simple.el (set-mark): + * simple.el (next-line): + * simple.el (previous-line): + * simple.el (line-move): + * simple.el (set-goal-column): + * simple.el (comment-region): + * subr.el: + * subr.el (putf): + * syntax.el (modify-syntax-entry): + * syntax.el (map-syntax-table): + * view-less.el (view-file): + * view-less.el (view-buffer): + * view-less.el (view-file-other-window): + * window-xemacs.el (backward-other-window): + * window.el: + * window.el (one-window-p): + * window.el (walk-windows): + * window.el (window-list): + * x-mouse.el (x-mouse-kill): + * x-select.el (x-get-cutbuffer): + * x-select.el (x-store-cutbuffer): + * term/bg-mouse.el (bg-mouse-line-to-center): + * term/sun-mouse.el (window-line-end): + * term/sun-mouse.el (sun-select-region): + * term/sun.el (kill-region-and-unmark): + * mule/mule-category.el: + * mule/mule-category.el (modify-category-entry): + * mule/mule-category.el (char-category-list): + * mule/mule-coding.el (coding-system-force-on-output): + * mule/mule-misc.el (coding-system-put): + Docstring arglist/Texinfo fixes. See man/ChangeLog for details. + +2000-11-02 Stephen J. Turnbull + + * cus-face.el: Typo fixes and tiny clarifications. + * custom.el: ditto + +2000-10-27 Yoshiki Hayashi + + * startup.el (auto-save-list-file-prefix): Moved to fileio.c. + * startup.el (normal-top-level): Setup auto-save-list-file-name + if auto-save-list-file-prefix is non-nil. + +2000-10-25 Yoshiki Hayashi + + * files.el (auto-mode-alist): Allow mixed case suffix for idlwave-mode. + +2000-01-05 Yoshiki Hayashi + + * hyper-apropos.el (hyper-apropos-this-symbol): Don't always + get symbol at point-min. + +2000-10-24 Didier Verna + + * info.el (Info-emacs-info-file-name): defconst it. + * info.el (Info-footnote-tag): defcustom it. + * info.el (Info-no-description-string): ditto. + * info.el (Info-find-node): adapt to new semantics of + 'Info-suffixed-file (don't do the case variants stuff). + * info.el (Info-insert-dir): rewrite the dir file variants code. + * info.el (Info-directory-files): New. Return the list of info + files in a directory. + * info.el (Info-dir-outdated-p): use it. + * info.el (Info-parse-dir-entries): ditto. + * info.el (Info-build-dir-anew): don't restrict to files ending + with a ".info.*" extension. + * info.el (Info-set-mode-line): ditto. + * info.el (Info-read-subfile): adapt to new semantics of + 'Info-suffixed-file (append 'exact argument). + * info.el (Info-all-case-regexp): New. Return a regexp matching a + string independently of the case. + * info.el (Info-suffixed-file): use it (match all possible case + for the file name). + * info.el (Info-insert-file-contents): code cleanup. + * info.el (Info-rebuild-dir): cosmetics only. Fit code in 80 + columns. + * info.el (Info-batch-rebuild-dir): ditto. + * info.el (Info-read-node-name-1): ditto. + * info.el (Info-search): ditto. + * info.el (Info-fontify-node): ditto. + + +2000-10-24 Didier Verna + + * process.el (shell-command): when called from a program, avoid + 'push-mark's "mark-set" message. + +2000-10-15 MIYASHITA Hisashi + + * mule/thai-xtis.el (tis-620): Specify coding-system's ccl-program + by a symbol, not by a vector. + * mule/vietnamese.el (vscii): Likewise. + (viscii): Likewise. + * mule/cyrillic.el (koi8-r): Likewise. + + * mule/chinese.el (chinese-big5-1): Specify charset's ccl-program + by a symbol, not by a vector. + (chinese-big5-2): Likewise. + * mule/ethiopic.el (ethiopic): Likewise. + * mule/vietnamese.el (vietnamese-viscii-lower): Likewise. + (vietnamese-viscii-upper): Likewise. + +2000-10-12 Yoshiki Hayashi + + * files.el (auto-mode-alist): Remove obsolete entry for html3-mode. + +2000-10-13 Yoshiki Hayashi + + * byte-optimize.el (byte-optimize-car): New function. + (byte-optimize-cdr): Ditto. + +2000-10-12 Yoshiki Hayashi + + * byte-optimize.el: Partial synch with FSF 20.7. + Optimize constant concatenation. + Add keymapp as a side effect free function. It is a built-in. + (byte-after-unbind-pos): Remove byte-equal. + +2000-10-13 Gunnar Evermann + + * update-elc-2.el: Quote regexps correctly. + +2000-10-05 MIYASHITA Hisashi + + * mule/mule-ccl.el: Sync up with Emacs 21.0.90. + (ccl-compile): Apply integerp, not integer-or-char-p to + check the type of the buffer magnification + (ccl-compile-write-string): Encode a string with binary + coding system. + (ccl-compile-write-repeat): Likewise. + +2000-09-25 Robert Pluim + + * buff-menu.el: + * bytecomp.el: + * coding.el: + * faces.el: + * files.el: + * fill.el: + * float-sup.el: + * font-lock.el: + * help.el: + * iso8859-1.el: + * loaddefs.el: + * menubar-items.el: + * menubar.el: + * modeline.el: + * msw-font-menu.el: + * paragraphs.el: + * paths.el: + * replace.el: + * simple.el: + * sound.el: + * startup.el: + * version.el: + * x-faces.el: + * x-font-menu.el: + Remove purecopy. + +2000-10-03 Daniel Pittman + + * simple.el (do-auto-fill): Use the function pointer to by + `comment-line-break-function', not `indent-new-comment-line'. This + fixes an issue with cc-mode comment continuation. + +2000-10-11 Martin Buchholz + + * simple.el (turn-on-auto-fill): Add (interactive). + * mwheel.el (mwheel-install): Add (interactive). + * font-lock.el (turn-on-font-lock): Add (interactive). + (turn-off-font-lock): Add (interactive). + +2000-10-03 Karl M. Hegbloom + + * packages.el (packages-special-base-regexp): Add `man'. + +2000-10-08 Adrian Aichner + + * wid-edit.el (widget-specify-active): map over extents in current + buffer like `widget-specify-inactive' does. Mapping over the + inactive extent object does not work since the current extent is + ignored by `map-extents'. + 2000-10-04 Martin Buchholz * XEmacs 21.2.36 is released. @@ -544,13 +919,13 @@ * easymenu.el: doc fixes. (easy-menu-do-define): Use backquote. - (easy-menu-change): - (easy-menu-add): + (easy-menu-change): + (easy-menu-add): `when' seems much clearer than `if' here. (easy-menu-remove): - (easy-menu-add-item): - (easy-menu-item-present-p): - (easy-menu-remove-item): + (easy-menu-add-item): + (easy-menu-item-present-p): + (easy-menu-remove-item): Wrap using (when (featurep 'menubar) ...) 2000-09-16 Martin Buchholz @@ -563,7 +938,7 @@ * window.el (save-selected-window): Use backquote. - * bytecomp.el (byte-compile-file-form-defvar-or-defconst): + * bytecomp.el (byte-compile-file-form-defvar-or-defconst): Renamed from `byte-compile-file-form-defvar'. * bytecomp.el (byte-compile-defvar-or-defconst): Only cons onto current-load-list in top-level forms. @@ -579,9 +954,9 @@ Remove unneeded defvar by rearranging order of let* forms. * mule/mule-ccl.el (ccl-get-next-code): - * menubar-items.el (bookmark-menu-filter): - (language-environment-menu-filter): - (tutorials-menu-filter): + * menubar-items.el (bookmark-menu-filter): + (language-environment-menu-filter): + (tutorials-menu-filter): * toolbar-items.el (toolbar-compile): * byte-optimize.el (disassemble-offset): Use (declare (special ...)) instead of `defvar'. @@ -621,13 +996,13 @@ problems. also undo the kludge of using a separate "*Show*" buffer for display when there's a temp-buffer-show-function; we can avoid this by just being a little smarter. - + * dialog-items.el: * dialog-items.el (search-dialog-regexp): New. * dialog-items.el (search-dialog-callback): * dialog-items.el (make-search-dialog): add a regexp option to the dialog and clean up a bit. - + * dialog.el: * dialog.el (yes-or-no-p-dialog-box): * dialog.el (get-dialog-box-response): @@ -640,12 +1015,12 @@ modal dialog boxes, giving the standard window-system feedback. (e.g. under windows, clicking on a disabled frame causes a beep and makes the dialog box flash three times.) - + * dragdrop.el: header keyword frobbing. - + * dumped-lisp.el (preloaded-file-list): renamed winnt.el to win32-native.el. - + * faces.el (face-property): * faces.el (set-face-property): * faces.el (frob-face-property): @@ -665,20 +1040,20 @@ something that required 'term. (Adrian, now you can use stack-trace- on-error to find the exact place where things are going wrong instead of having to laboriously binary-search your way through.) - + * finder.el (finder-known-keywords): cleaned up -- properly sorted, clarified the meanings of many of the keywords, and added a few -- mswin, gui, content, build, www, user, services. the last two try to distinguish between a package that's used directly by the user, and a package that provides support services to other packages. - + * font-lock.el (lisp-font-lock-keywords-2): update list of lisp control structures to include everything, including new ones i introduced. - + * gutter.el: header keyword frobbing. - + * isearch-mode.el (isearch-ring-adjust1): M-p to recall the most recent isearch element was not doing so! you got the second-most- recent instead. @@ -687,7 +1062,7 @@ more menubar cleanups. * lisp-mode.el (with-selected-window): make it indent properly. - + * menubar-items.el (default-menubar): lots of menubar cleanups. rearranged the options menu the most, e.g. splitting up the Keyboard/Mouse menu into a new Editing menu and combining the @@ -702,7 +1077,7 @@ better and better ways to group menu items. When we eventually move the options menu to a property sheet, the existing structure will probably be preserved fairly well. - + * minibuf.el (next-history-element): fix problems with pressing down arrow in repeat-complex-command. @@ -711,19 +1086,19 @@ added custom variable for controlling the 3d modeline. the corresponding Options item has been present for a long time, but commented out with "fix me!" comments. it's fixed now. - + * obsolete.el (add-menu): remove bogus gettexts. - + * process.el (shell-quote-argument): handle this correctly under Windows native with COMMAND.COM/CMD.EXE. For bash under Windows native, see below. - + * simple.el: * simple.el (display-warning-buffer): Fixed the handling of warning display to eliminate the annoying *Show* buffer, like was done for byte-compiler output above. - + * simple.el (debug-print): New. Simple function for sending debug messages to the console and/or other debug places. @@ -736,7 +1111,7 @@ duplicated the entire logic. The new version is smaller, easier to understand, much more robust, and has extended features -- those of replace-match.) - + * window.el: * window.el (with-selected-window): New. An obvious complement to the existing `with-selected-frame' and @@ -752,7 +1127,7 @@ version, I tried hard to do what I thought was correct. But more thought is needed, and ideally the volunteer work of people with these configurations that they generally run on.) - + * x-font-menu.el (x-font-menu-font-data): Put in defvar's to fix byte-compiler warnings. @@ -787,7 +1162,7 @@ * files.el (auto-mode-alist): Add .spec for RPM. 2000-07-31 Andy Piper - + * gutter-items.el (update-tab-in-gutter): deprecate :properties. 2000-07-31 Yoshiki Hayashi @@ -838,7 +1213,7 @@ 2000-07-10 Andy Piper * dialog-items.el: sync with Ben's patch. - + * gutter-items.el (buffers-tab-switch-to-buffer): remove now-bogus comment. (progress-text-glyph): deleted. @@ -984,13 +1359,13 @@ * help.el (variable-at-point): * help.el (variable-at-event): New. * help.el (describe-variable): - Major overhaul. - - Make functions and variables be mousable. - - Middle button hyperlinks. + Major overhaul. + - Make functions and variables be mousable. + - Middle button hyperlinks. - New context-menu entries. * keydefs.el: - * keydefs.el (global-map): + * keydefs.el (global-map): New key bindings to move lines up and down. * lisp-mode.el: @@ -1014,7 +1389,7 @@ * menubar-items.el (popup-buffer-menu): Removed. * menubar-items.el (popup-menubar-menu): Removed. Move to menubar.el. - + * menubar.el: * menubar.el (global-popup-menu): New. * menubar.el (mode-popup-menu): New. @@ -1027,10 +1402,10 @@ Move non-content functions here. Add support for context menu items on extents. - * minibuf.el (minibuffer-history-uniquify): + * minibuf.el (minibuffer-history-uniquify): Typo fix. - * minibuf.el (read-file-name-1): + * minibuf.el (read-file-name-1): Call new file dialog box if it exists. * minibuf.el (mouse-rfn-setup-vars): @@ -1134,14 +1509,14 @@ 2000-07-16 Martin Buchholz - * apropos.el (apropos-documentation-check-doc-file): + * apropos.el (apropos-documentation-check-doc-file): `doc' variable should be let-bound, as was presumably intended. - * cus-edit.el (custom-variable-reset-saved): - (custom-variable-reset-standard): + * cus-edit.el (custom-variable-reset-saved): + (custom-variable-reset-standard): Remove unused variable comment-widget. Twice. - * toolbar.el (toolbar-blank-press-function): + * toolbar.el (toolbar-blank-press-function): Add a real defvar with initial value nil and proper docstring. (press-toolbar-button): No need to check for boundp-ness anymore. @@ -1150,7 +1525,7 @@ * info.el (Info-find-node): This function needs an autoload cookie. - * mule/mule-x-init.el (x-use-halfwidth-roman-font): + * mule/mule-x-init.el (x-use-halfwidth-roman-font): Use let* since the second form referred to the first. 2000-07-16 Adrian Aichner @@ -1199,19 +1574,19 @@ 2000-07-15 Martin Buchholz - * mule/mule-category.el (defined-category-hashtable): + * mule/mule-category.el (defined-category-hashtable): Use make-hash-table instead of make-hashtable * buff-menu.el: Byte-compiler warning fix. - * isearch-mode.el (isearch-highlight-all-cleanup): + * isearch-mode.el (isearch-highlight-all-cleanup): Remove unused variable `isearch-highlight-all-start'. * etags.el (add-to-tag-completion-table): Byte-compiler warning fix. * itimer.el (itimer-edit-mode): Byte-compiler warning fixes. - * cus-dep.el (Custom-make-dependencies): + * cus-dep.el (Custom-make-dependencies): Add autoload cookie for custom-add-loads to generated custom-load.el. * autoload.el (autoload-package-name): Warning suppression. @@ -1219,7 +1594,7 @@ * custom.el: Add autoload for custom-declare-face. Allow `xemacs -no-autoloads -l bytecomp -f batch-byte-compile ...' - * cl.el (cl-hack-byte-compiler): + * cl.el (cl-hack-byte-compiler): Allow `xemacs -no-autoloads -l bytecomp -f batch-byte-compile ...' to work properly. @@ -1304,7 +1679,7 @@ only when necessary. 2000-06-30 Charles G Waldman - + * cl-macs.el: fix cl-transform-function-property kludge so that it does not require a random feature. @@ -1321,10 +1696,10 @@ * package-ui.el (defgroup pui): Correct a misspelling (pui-toggle-package-delete): Change `seleted' to `selected' - + 2000-06-12 Jan Vroonhof - * package-get.el (package-get-update-base): + * package-get.el (package-get-update-base): (package-get): Use insert-file-contents-literally always. (package-get-maybe-save-index): Force coding system for writing to binary. @@ -1425,7 +1800,7 @@ Rewrite deferral code to handle any number of changes, merging them properly. Remove hacked-up code for revert-buffer, now unnecessary. - + * menubar-items.el (default-menubar): In Options->Edit Init File, don't switch to emacs-lisp-mode unless necessary; doing this turns off font-lock. @@ -1460,14 +1835,14 @@ * gutter-items.el (raw-append-progress-display): Further fixes. Use set-glyph-image not set-image-instance-property, to fix problems with multiple windows in a frame. - + * menubar-items.el (tutorials-menu-filter): Fix typo. - + * startup.el (early-error-handler): Display message box under windows; otherwise, message will disappear before it can be viewed. - + * update-elc.el: Fix bug in NEEDTODUMP processing. @@ -1495,7 +1870,7 @@ * faces.el (set-face-blinking-p): * faces.el (set-face-reverse-p): doc string changes. - + * glyphs.el: * glyphs.el (make-image-specifier): * glyphs.el (glyph-property): @@ -1511,7 +1886,7 @@ conventions elsewhere in XEmacs and in general is a lot more obvious of a place to look. sometimes the make-foo-specifier function needs to be created in the process. - + * gutter.el: * gutter.el (make-gutter-specifier): New. * gutter.el (make-gutter-size-specifier): New. @@ -1574,7 +1949,7 @@ Restore M-up, M-down to 21.1 state. Put *ward-sentence on C-M-left, C-M-right instead. Define C-M-up, C-M-down to scroll the window without moving point. - + * simple.el: * simple.el (scroll-up-one): New. * simple.el (scroll-down-one): New. @@ -1586,9 +1961,9 @@ 2000-04-29 Martin Buchholz - * dialog.el (yes-or-no-p-dialog-box): + * dialog.el (yes-or-no-p-dialog-box): Fix docstring. - Fix following horrible bug in X11 mode with focus-follows-mouse: + Fix following horrible bug in X11 mode with focus-follows-mouse: 1. Visit two files in two different frames. 2. do File->Revert Buffer in one of those frames. 3. Dialog box appears. @@ -1596,7 +1971,7 @@ frame, then to the dialog box, and click on "Yes". 5. The file contents end up in the *wrong* buffer! Add TODO comment. - + 2000-04-28 Ben Wing * help.el (describe-installation): correct typo introduced @@ -1605,17 +1980,17 @@ * etags.el (buffer-tag-table-list): canonicalize filenames to Unix format so that tag-table-alist searching works under Windows. - + * autoload.el: Bowdlerize the supposedly objectionable words "who couldn't quite manage to cleanly modify batch-update-autoloads". - + * gutter-items.el (set-progress-display-style): * gutter-items.el (search-dialog-callback): * gutter-items.el (make-search-dialog): Change to new callback-ex api. -2000-04-26 Björn Torkelsson +2000-04-26 Bjrn Torkelsson * help.el: (describe-installation): decode-coding-string is not defined in a non MULE environment. @@ -1655,7 +2030,7 @@ when quick-building. add commented-out code for profiling loadup. - + * update-elc.el (preloaded-file-list): add bytecomp.el, since it is required in order to build xemacs. @@ -1670,7 +2045,7 @@ * update-elc.el: compute whether any dumped .el or .elc files are newer than the dumped exe, and touch the file ../src/NEEDTODUMP if so. - + * update-elc.el (update-elc-files-to-compile): always change NOBYTECOMPILE in the src directory rather than current dir, so it will work under NT. @@ -1701,21 +2076,21 @@ 2000-04-16 Ben Wing * printer.el: New file. - + * dumped-lisp.el (preloaded-file-list): Declare printer.el. - + * help.el (describe-installation): Fix decoding for Windows. - + * menubar-items.el: * menubar-items.el (default-menubar): * menubar-items.el (tutorials-menu-filter): New. * menubar-items.el (popup-menubar-menu): Add authorship. Redo Help menu and Tutorials filter. - + * menubar.el: Correct comment. - + * modeline.el (modeline-buffer-identification): Correct doc string. - + * simple.el: * simple.el (printing): Removed. * simple.el (printer-name): Removed. @@ -1742,7 +2117,7 @@ (gutter-element-visibility-changed-hook): ditto. (set-gutter-element): ditto. (remove-gutter-element): ditto. - (set-gutter-element-visible-p): ditto. + (set-gutter-element-visible-p): ditto. (gutter-element-visible-p): ditto. (init-gutter): ditto. @@ -1761,9 +2136,9 @@ without constantly being prompted for the tag. * simple.el: Added a number of section headings, to clarify the organization of this file. - * simple.el (activate-region): - * simple.el (region-exists-p): - * simple.el (region-active-p): + * simple.el (activate-region): + * simple.el (region-exists-p): + * simple.el (region-active-p): Moved these three function down to the other side of the case-changing functions, so they join the rest of the region code. @@ -1772,10 +2147,10 @@ * simple.el (generic-print-buffer): New. New functions, a very simple prototype for a unified printing interface. - + * process.el (call-process-internal): Real fix for null BUFFER, other problems with BUFFER specs. - + * menubar-items.el: Fixed up File->Print to use new printing functions. Various corrections and expansions to Grep/Compile menus. @@ -1893,13 +2268,13 @@ (append-progress-display): ditto. 2000-03-20 Jeff Miller - + * lisp/make-docfile.el: call-process-internal is now implemented in process.el. 2000-03-21 Ben Wing - * mule\mule-cmds.el (set-language-info-alist): + * mule\mule-cmds.el (set-language-info-alist): Fix to correspond to new menu arrangement. 2000-03-21 Ben Wing @@ -1915,7 +2290,7 @@ * lisp-mode.el (lisp-interaction-mode-menubar-menu): New. * lisp-mode.el (lisp-interaction-mode): Put back Lisp Interaction menubar for Jan V's sake. - + * simple.el: * simple.el (mark-ring): * simple.el (dont-record-current-mark): New. @@ -1926,7 +2301,7 @@ * simple.el (push-mark): * simple.el (handle-pre-motion-command): Implement scheme for not recording unimportant marks. - + * subr.el: * subr.el (function-allows-args): New. New function function-allows-args. @@ -2046,12 +2421,12 @@ vassoc moved to alist.el. Accelerators added to all menus. Unused bound var new-props removed. - + * keydefs.el: I did a whole lot of rearranging to put things in a more consistent order and fixed a number of cases where key combinations involving up, down, left, right and so on were defined but the corresponding keypad combinations were not - defined. + defined. * lisp-mode.el: * lisp-mode.el (lisp-interaction-mode-popup-menu): @@ -2119,14 +2494,14 @@ b) I combined the top level Tools and Apps menus into a single Tools menu, because the distinction between the two is not obvious, and the items on the menus are not used often enough that - putting some of them onto submenus is a problem. + putting some of them onto submenus is a problem. c) I created two new top level menus called View and Cmds because there were too many items on the File and Edit menus, and I'm going to be adding more items to these menus. In contrast to the Tools menu, the items on these menus may be used quite often during an editing session, and so should be available with fewer - keystrokes. + keystrokes. d) I added a number of options to the options menu, including one for controlling whether the alt key can be used to traverse to @@ -2136,18 +2511,18 @@ options, and various other things. I also did a bit of rearranging, for example, combining the keyboard and mouse options into a single keyboard and mouse submenu to facilitate the - accelerators on that level. + accelerators on that level. e) I changed the variable buffers-menu-format-buffer-line-function to take two arguments instead of one, the second argument being the line number for use in creating an accelerator. I added a hack to support existing functions with one argument (although I - doubt that very many of these exist), for backward compatibility. + doubt that very many of these exist), for backward compatibility. f) I moved the top level mule menu to be a submenu of the edit menu. I think that most of the items on this menu are fairly useless and there are certainly not enough frequently used items - to justify this being its own top level menu. + to justify this being its own top level menu. g) I combined most of the items in big-menubar.el into the main menu. If people think the main menu is too big, it would be possible to @@ -2168,23 +2543,23 @@ a) Fixing the problem where closing the dialog box by clicking on the close button of the window didn't properly exit the - minibuffer. + minibuffer. b) Fixing the problem that if you typed part of a file name, and then clicked on a completion with the mouse, the file was not - correctly selected. + correctly selected. c) Changing the title of the dialog box to reflect the operation being done in accordance with user interface conventions, rather - than the name of the dialog box buffer, which is rather useless. + than the name of the dialog box buffer, which is rather useless. d) Remove the words "possible completions are" which didn't - belong. + belong. e) Fix things so that the completions scroll off the end of the completions windows only to the right, rather than both to the right and down, which is in accordance with Windows user interface - conventions. + conventions. * msw-init.el (init-post-mswindows-win): Added a binding for meta-F4, which is the standard windows binding @@ -2252,7 +2627,7 @@ * simple.el (capitalize-string-as-title): * simple.el (capitalize-region-as-title): New. - + * subr.el (add-hook): * subr.el (make-local-hook): New. diff --git a/lisp/abbrev.el b/lisp/abbrev.el index 110de33..eaf3c8b 100644 --- a/lisp/abbrev.el +++ b/lisp/abbrev.el @@ -67,38 +67,36 @@ This causes `save-some-buffers' to offer to save the abbrevs.") nil) -(defun define-abbrev-table (name defs) - "Define TABNAME (a symbol) as an abbrev table name. +(defun define-abbrev-table (table-name definitions) + "Define TABLE-NAME (a symbol) as an abbrev table name. Define abbrevs in it according to DEFINITIONS, which is a list of elements of the form (ABBREVNAME EXPANSION HOOK USECOUNT)." - (let ((table (and (boundp name) (symbol-value name)))) + (let ((table (and (boundp table-name) (symbol-value table-name)))) (cond ((vectorp table)) ((not table) (setq table (make-abbrev-table)) - (set name table) - (setq abbrev-table-name-list (cons name abbrev-table-name-list))) + (set table-name table) + (setq abbrev-table-name-list (cons table-name abbrev-table-name-list))) (t - (setq table (signal 'wrong-type-argument (list 'vectorp table))) - (set name table))) - (while defs - (apply (function define-abbrev) table (car defs)) - (setq defs (cdr defs))))) + (setq table (wrong-type-argument 'vectorp table)) + (set table-name table))) + (while definitions + (apply (function define-abbrev) table (car definitions)) + (setq definitions (cdr definitions))))) (defun define-abbrev (table name &optional expansion hook count) "Define an abbrev in TABLE named NAME, to expand to EXPANSION or call HOOK. NAME and EXPANSION are strings. Hook is a function or `nil'. To undefine an abbrev, define it with an expansion of `nil'." - (or (not expansion) - (stringp expansion) - (setq expansion (signal 'wrong-type-argument - (list 'stringp expansion)))) - (or (not count) - (integerp count) - (setq count (signal 'wrong-type-argument - (list 'fixnump count)))) - (or (vectorp table) - (setq table (signal 'wrong-type-argument - (list 'vectorp table)))) + (unless (or (null expansion) (stringp expansion)) + (setq expansion (wrong-type-argument 'stringp expansion))) + + (unless (or (null count) (integerp count)) + (setq count (wrong-type-argument 'fixnump count))) + + (unless (vectorp table) + (setq table (wrong-type-argument 'vectorp table))) + (let* ((sym (intern name table)) (oexp (and (boundp sym) (symbol-value sym))) (ohook (and (fboundp sym) (symbol-function sym)))) @@ -207,13 +205,13 @@ is not undone." -(defun insert-abbrev-table-description (name human-readable) +(defun insert-abbrev-table-description (name &optional human-readable) "Insert before point a full description of abbrev table named NAME. NAME is a symbol whose value is an abbrev table. -If optional 2nd arg HUMAN is non-nil, insert a human-readable description. -Otherwise the description is an expression, -a call to `define-abbrev-table', which would -define the abbrev table NAME exactly as it is currently defined." +If optional second argument HUMAN-READABLE is non-nil, insert a +human-readable description. Otherwise the description is an +expression, a call to `define-abbrev-table', which would define the +abbrev table NAME exactly as it is currently defined." (let ((table (symbol-value name)) (stream (current-buffer))) (message "Abbrev-table %s..." name) @@ -268,7 +266,7 @@ define the abbrev table NAME exactly as it is currently defined." (defun abbrev-mode (arg) "Toggle abbrev mode. -With argument ARG, turn abbrev mode on iff ARG is positive. +With argument ARG, enable abbrev mode if ARG is positive, else disable. In abbrev mode, inserting an abbreviation causes it to expand and be replaced by its expansion." (interactive "P") @@ -391,7 +389,7 @@ Optional second argument QUIETLY non-nil means don't print anything." (setq save-abbrevs t abbrevs-changed nil)) (defun quietly-read-abbrev-file (&optional file) - "Read abbrev definitions from file written with write-abbrev-file. + "Read abbrev definitions from file written with `write-abbrev-file'. Optional argument FILE is the name of the file to read; it defaults to the value of `abbrev-file-name'. Does not print anything." @@ -460,6 +458,13 @@ Don't use this function in a Lisp program; use `define-abbrev' instead." (add-abbrev global-abbrev-table "Global" arg)) (defun add-abbrev (table type arg) + "Add an abbreviation to abbrev table TABLE. +TYPE is a string describing in English the kind of abbrev this will be +(typically, \"global\" or \"mode-specific\"); this is used in +prompting the user. ARG is the number of words in the expansion. + +Return the symbol that internally represents the new abbrev, or nil if +the user declines to confirm redefining an existing abbrev." ;; XEmacs change: (let ((exp (abbrev-string-to-be-defined arg)) name) diff --git a/lisp/apropos.el b/lisp/apropos.el index 0b535d8..76be36b 100644 --- a/lisp/apropos.el +++ b/lisp/apropos.el @@ -377,7 +377,7 @@ Returns list of symbols and documentation found." ;; Finds all documentation related to APROPOS-REGEXP in internal-doc-file-name. (defun apropos-documentation-check-doc-file () - (let (type symbol (sepa 2) sepb beg end doc) + (let (type symbol (sepa 2) sepb start end doc) (insert ?\^_) (backward-char) (insert-file-contents (concat doc-directory internal-doc-file-name)) @@ -390,14 +390,14 @@ Returns list of symbols and documentation found." (narrow-to-region (point) (1- sepb)) (re-search-forward apropos-regexp nil t)) (progn - (setq beg (match-beginning 0) + (setq start (match-beginning 0) end (point)) (goto-char (1+ sepa)) (or (setq type (if (eq ?F (preceding-char)) 1 ; function documentation 2) ; variable documentation symbol (read) - beg (- beg (point) 1) + start (- start (point) 1) end (- end (point) 1) doc (buffer-substring (1+ (point)) (1- sepb)) apropos-item (assq symbol apropos-accumulator)) @@ -405,32 +405,32 @@ Returns list of symbols and documentation found." apropos-accumulator (cons apropos-item apropos-accumulator))) (if apropos-match-face - (put-text-property beg end 'face apropos-match-face doc)) + (put-text-property start end 'face apropos-match-face doc)) (setcar (nthcdr type apropos-item) doc))) (setq sepa (goto-char sepb))))) (defun apropos-documentation-check-elc-file (file) (if (member file apropos-files-scanned) nil - (let (symbol doc beg end this-is-a-variable) + (let (symbol doc start end this-is-a-variable) (setq apropos-files-scanned (cons file apropos-files-scanned)) (erase-buffer) (insert-file-contents file) (while (search-forward "\n#@" nil t) ;; Read the comment length, and advance over it. (setq end (read) - beg (1+ (point)) + start (1+ (point)) end (+ (point) end -1)) (forward-char) (if (save-restriction ;; match ^ and $ relative to doc string - (narrow-to-region beg end) + (narrow-to-region start end) (re-search-forward apropos-regexp nil t)) (progn (goto-char (+ end 2)) - (setq doc (buffer-substring beg end) - end (- (match-end 0) beg) - beg (- (match-beginning 0) beg) + (setq doc (buffer-substring start end) + end (- (match-end 0) start) + start (- (match-beginning 0) start) this-is-a-variable (looking-at "(def\\(var\\|const\\) ") symbol (progn (skip-chars-forward "(a-z") @@ -448,7 +448,7 @@ Returns list of symbols and documentation found." apropos-accumulator (cons apropos-item apropos-accumulator))) (if apropos-match-face - (put-text-property beg end 'face apropos-match-face + (put-text-property start end 'face apropos-match-face doc)) (setcar (nthcdr (if this-is-a-variable 2 1) apropos-item) diff --git a/lisp/auto-autoloads.el b/lisp/auto-autoloads.el index b303ad3..cec581d 100644 --- a/lisp/auto-autoloads.el +++ b/lisp/auto-autoloads.el @@ -131,16 +131,19 @@ be used only with -batch." nil nil) ;;;### (autoloads (build-report) "build-report" "lisp/build-report.el") (autoload 'build-report "build-report" "\ -Initializes a fresh mail composition buffer using `compose-mail' -with the contents of XEmacs Installation file and excerpts from XEmacs -make output and errors and leaves point at the beginning of the mail text. - See also -`compose-mail', `mail-user-agent', -`build-report-destination', -`build-report-keep-regexp', -`build-report-delete-regexp', -`build-report-make-output-file' and -`build-report-installation-file'." t nil) +Composes a fresh mail message with the contents of the built XEmacs +Installation file and excerpts from XEmacs make output. +`compose-mail' is used to create the mail message. Point is left at +the beginning of the mail text. You may add some personal notes if +you like and send the report. +See also + `compose-mail', `mail-user-agent', + `build-report-destination', + `build-report-keep-regexp', + `build-report-delete-regexp', + `build-report-make-output-dir', + `build-report-make-output-files', and + `build-report-installation-file'." t nil) ;;;*** @@ -153,8 +156,8 @@ Files in subdirectories of DIRECTORY are processed also." t nil) (autoload 'byte-recompile-directory "bytecomp" "\ Recompile every `.el' file in DIRECTORY that needs recompilation. This is if a `.elc' file exists but is older than the `.el' file. -Files in subdirectories of DIRECTORY are processed also unless argument -NORECURSION is non-nil. +Files in subdirectories of DIRECTORY are also processed unless +optional argument NORECURSION is non-nil. If the `.elc' file does not exist, normally the `.el' file is *not* compiled. But a prefix argument (optional second arg) means ask user, @@ -163,7 +166,7 @@ don't ask and compile the file anyway. A nonzero prefix argument also means ask about each subdirectory. -If the fourth argument FORCE is non-nil, +If the fourth optional argument FORCE is non-nil, recompile every `.el' file that already has a `.elc' file." t nil) (autoload 'byte-recompile-file "bytecomp" "\ @@ -219,7 +222,7 @@ Run `byte-compile-file' on the files remaining on the command line. Use this from the command line, with `-batch'; it won't work in an interactive Emacs. Each file is processed even if an error occurred previously. -For example, invoke \"xemacs -batch -f batch-byte-compile $emacs/ ~/*.el\"" nil nil) +For example, invoke \"xemacs -batch -f batch-byte-compile $emacs/ ~/*.el\"." nil nil) (autoload 'batch-byte-compile-one-file "bytecomp" "\ Run `byte-compile-file' on a single file remaining on the command line. @@ -595,7 +598,7 @@ If VARIABLE has a `custom-type' property, it must be a widget and the If given a prefix (or a COMMENT argument), also prompt for a comment." t nil) (autoload 'customize-set-variable "cus-edit" "\ -Set the default for VARIABLE to VALUE. VALUE is a Lisp object. +Set the default for VARIABLE to VALUE. VALUE is any Lisp object. If VARIABLE has a `custom-set' property, that is used for setting VARIABLE, otherwise `set-default' is used. @@ -730,7 +733,7 @@ Like `defface', but FACE is evaluated as a normal argument." nil nil) (autoload 'custom-set-face-update-spec "cus-face" "\ Customize the FACE for display types matching DISPLAY, merging - in the new items from PLIST" nil nil) + in the new items from PLIST." nil nil) (autoload 'custom-set-faces "cus-face" "\ Initialize faces according to user preferences. @@ -761,7 +764,7 @@ FACE. Nil otherwise." nil nil) Reset the value of the face to values previously defined. Associate this setting with the 'user' theme. -ARGS is defined as for `custom-theme-reset-faces'" nil nil) +ARGS is defined as for `custom-theme-reset-faces'." nil nil) ;;;*** @@ -1048,7 +1051,7 @@ A list defining the keywords for `font-lock-mode' to highlight. For example, an element of the first form highlights (if not already highlighted): - \"\\\\\" Discrete occurrences of \"foo\" in the value + \"\\\\\\=\" Discrete occurrences of \"foo\" in the value of the variable `font-lock-keyword-face'. (\"fu\\\\(bar\\\\)\" . 1) Substring \"bar\" within all occurrences of @@ -1067,7 +1070,7 @@ For example, an element of the first form highlights (if not already highlighted `fubar-match' finds and matches in the value of `fubar-face'. - (\"\\\\\" (0 anchor-face) (\"\\\\\" nil nil (0 item-face))) + (\"\\\\\\=\" (0 anchor-face) (\"\\\\\\=\" nil nil (0 item-face))) -------------- --------------- ------------ --- --- ------------- | | | | | | MATCHER | ANCHOR-MATCHER | +------+ MATCH-HIGHLIGHT @@ -1138,10 +1141,10 @@ size, you can use \\[font-lock-fontify-buffer]. See the variable `font-lock-keywords' for customization." t nil) (autoload 'turn-on-font-lock "font-lock" "\ -Unconditionally turn on Font Lock mode." nil nil) +Unconditionally turn on Font Lock mode." t nil) (autoload 'turn-off-font-lock "font-lock" "\ -Unconditionally turn off Font Lock mode." nil nil) +Unconditionally turn off Font Lock mode." t nil) (autoload 'font-lock-fontify-buffer "font-lock" "\ Fontify the current buffer the way `font-lock-mode' would. @@ -1168,7 +1171,7 @@ Generates the `Font', `Size', and `Weight' submenus for the Options menu. This is run the first time that a font-menu is needed for each device. If you don't like the lazy invocation of this function, you can add it to `create-device-hook' and that will make the font menus respond more quickly -when they are selected for the first time. If you add fonts to your system, +when they are selected for the first time. If you add fonts to your system, or if you change your font path, you can call this to re-initialize the menus." nil nil) (autoload 'font-menu-family-constructor "font-menu" nil nil nil) @@ -1306,11 +1309,12 @@ recovering from an error in this function; it says do not attempt further (recursive) error recovery. TRYFILE is ??" nil nil) (autoload 'Info-batch-rebuild-dir "info" "\ -(Re)build info `dir' files in the directories remaining on the command line. -Use this from the command line, with `-batch'; -it won't work in an interactive Emacs. -Each file is processed even if an error occurred previously. -For example, invoke \"xemacs -batch -f Info-batch-rebuild-dir /usr/local/info\"" nil nil) +(Re)build `dir' files in the directories remaining on the command line. +Use this from the command line, with `-batch', it won't work in an +interactive XEmacs. + +Each file is processed even if an error occurred previously. For example, +invoke \"xemacs -batch -f Info-batch-rebuild-dir /usr/local/info\"." nil nil) (autoload 'Info-goto-node "info" "\ Go to info node named NAME. Give just NODENAME or (FILENAME)NODENAME. @@ -1380,7 +1384,7 @@ or if you change your font path, you can call this to re-initialize the menus." ;;;### (autoloads (mwheel-install) "mwheel" "lisp/mwheel.el") (autoload 'mwheel-install "mwheel" "\ -Enable mouse wheel support." nil nil) +Enable mouse wheel support." t nil) ;;;*** @@ -1446,7 +1450,7 @@ recent to least recent -- in other words, the version names don't have to be lexically ordered. It is debatable if it makes sense to have more than one version of a package available.") -(defcustom package-get-download-sites '(("xemacs.org" "ftp.xemacs.org" "pub/xemacs/packages") ("crc.ca (Canada)" "ftp.crc.ca" "pub/packages/editors/xemacs/packages") ("ualberta.ca (Canada)" "sunsite.ualberta.ca" "pub/Mirror/xemacs/packages") ("uiuc.edu (United States)" "uiarchive.uiuc.edu" "pub/packages/xemacs/packages") ("unc.edu (United States)" "metalab.unc.edu" "pub/packages/editors/xemacs/packages") ("utk.edu (United States)" "ftp.sunsite.utk.edu" "pub/xemacs/packages") ("unicamp.br (Brazil)" "ftp.unicamp.br" "pub/xemacs/packages") ("tuwien.ac.at (Austria)" "gd.tuwien.ac.at" "editors/xemacs/packages") ("auc.dk (Denmark)" "sunsite.auc.dk" "pub/emacs/xemacs/packages") ("doc.ic.ac.uk (England)" "sunsite.doc.ic.ac.uk" "packages/xemacs/packages") ("funet.fi (Finland)" "ftp.funet.fi" "pub/mirrors/ftp.xemacs.org/pub/tux/xemacs/packages") ("cenatls.cena.dgac.fr (France)" "ftp.cenatls.cena.dgac.fr" "Emacs/xemacs/packages") ("pasteur.fr (France)" "ftp.pasteur.fr" "pub/computing/xemacs/packages") ("tu-darmstadt.de (Germany)" "ftp.tu-darmstadt.de" "pub/editors/xemacs/packages") ("kfki.hu (Hungary)" "ftp.kfki.hu" "pub/packages/xemacs/packages") ("eunet.ie (Ireland)" "ftp.eunet.ie" "mirrors/ftp.xemacs.org/pub/xemacs/packages") ("uniroma2.it (Italy)" "ftp.uniroma2.it" "unix/misc/dist/XEMACS/packages") ("uio.no (Norway)" "sunsite.uio.no" "pub/xemacs/packages") ("icm.edu.pl (Poland)" "ftp.icm.edu.pl" "pub/unix/editors/xemacs/packages") ("srcc.msu.su (Russia)" "ftp.srcc.msu.su" "mirror/ftp.xemacs.org/packages") ("sunet.se (Sweden)" "ftp.sunet.se" "pub/gnu/xemacs/packages") ("cnlab-switch.ch (Switzerland)" "sunsite.cnlab-switch.ch" "mirror/xemacs/packages") ("aist.go.jp (Japan)" "ring.aist.go.jp" "pub/text/xemacs/packages") ("asahi-net.or.jp (Japan)" "ring.asahi-net.or.jp" "pub/text/xemacs/packages") ("dti.ad.jp (Japan)" "ftp.dti.ad.jp" "pub/unix/editor/xemacs/packages") ("jaist.ac.jp (Japan)" "ftp.jaist.ac.jp" "pub/GNU/xemacs/packages") ("nucba.ac.jp (Japan)" "mirror.nucba.ac.jp" "mirror/xemacs/packages") ("sut.ac.jp (Japan)" "sunsite.sut.ac.jp" "pub/archives/packages/xemacs/packages") ("tsukuba.ac.jp (Japan)" "ftp.netlab.is.tsukuba.ac.jp" "pub/GNU/xemacs/packages") ("kreonet.re.kr (Korea)" "ftp.kreonet.re.kr" "pub/tools/emacs/xemacs/packages") ("nctu.edu.tw (Taiwan)" "coda.nctu.edu.tw" "Editors/xemacs/packages") ("sun.ac.za (South Africa)" "ftp.sun.ac.za" "xemacs/packages") ("isu.net.sa (Saudi Arabia)" "ftp.isu.net.sa" "pub/mirrors/ftp.xemacs.org/packages") ("aarnet.edu.au (Australia)" "mirror.aarnet.edu.au" "pub/xemacs/packages")) "*List of remote sites available for downloading packages.\nList format is '(site-description site-name directory-on-site).\nSITE-DESCRIPTION is a textual description of the site. SITE-NAME\nis the internet address of the download site. DIRECTORY-ON-SITE\nis the directory on the site in which packages may be found.\nThis variable is used to initialize `package-get-remote', the\nvariable actually used to specify package download sites." :tag "Package download sites" :type '(repeat (list (string :tag "Name") host-name directory)) :group 'package-get) +(defcustom package-get-download-sites '(("Pre-Releases" "ftp.xemacs.org" "pub/xemacs/beta/experimental/packages") ("xemacs.org" "ftp.xemacs.org" "pub/xemacs/packages") ("crc.ca (Canada)" "ftp.crc.ca" "pub/packages/editors/xemacs/packages") ("ualberta.ca (Canada)" "sunsite.ualberta.ca" "pub/Mirror/xemacs/packages") ("uiuc.edu (United States)" "uiarchive.uiuc.edu" "pub/packages/xemacs/packages") ("unc.edu (United States)" "metalab.unc.edu" "pub/packages/editors/xemacs/packages") ("utk.edu (United States)" "ftp.sunsite.utk.edu" "pub/xemacs/packages") ("unicamp.br (Brazil)" "ftp.unicamp.br" "pub/xemacs/packages") ("tuwien.ac.at (Austria)" "gd.tuwien.ac.at" "editors/xemacs/packages") ("auc.dk (Denmark)" "sunsite.auc.dk" "pub/emacs/xemacs/packages") ("doc.ic.ac.uk (England)" "sunsite.doc.ic.ac.uk" "packages/xemacs/packages") ("funet.fi (Finland)" "ftp.funet.fi" "pub/mirrors/ftp.xemacs.org/pub/tux/xemacs/packages") ("cenatls.cena.dgac.fr (France)" "ftp.cenatls.cena.dgac.fr" "Emacs/xemacs/packages") ("pasteur.fr (France)" "ftp.pasteur.fr" "pub/computing/xemacs/packages") ("tu-darmstadt.de (Germany)" "ftp.tu-darmstadt.de" "pub/editors/xemacs/packages") ("kfki.hu (Hungary)" "ftp.kfki.hu" "pub/packages/xemacs/packages") ("eunet.ie (Ireland)" "ftp.eunet.ie" "mirrors/ftp.xemacs.org/pub/xemacs/packages") ("uniroma2.it (Italy)" "ftp.uniroma2.it" "unix/misc/dist/XEMACS/packages") ("uio.no (Norway)" "sunsite.uio.no" "pub/xemacs/packages") ("icm.edu.pl (Poland)" "ftp.icm.edu.pl" "pub/unix/editors/xemacs/packages") ("srcc.msu.su (Russia)" "ftp.srcc.msu.su" "mirror/ftp.xemacs.org/packages") ("sunet.se (Sweden)" "ftp.sunet.se" "pub/gnu/xemacs/packages") ("cnlab-switch.ch (Switzerland)" "sunsite.cnlab-switch.ch" "mirror/xemacs/packages") ("aist.go.jp (Japan)" "ring.aist.go.jp" "pub/text/xemacs/packages") ("asahi-net.or.jp (Japan)" "ring.asahi-net.or.jp" "pub/text/xemacs/packages") ("dti.ad.jp (Japan)" "ftp.dti.ad.jp" "pub/unix/editor/xemacs/packages") ("jaist.ac.jp (Japan)" "ftp.jaist.ac.jp" "pub/GNU/xemacs/packages") ("nucba.ac.jp (Japan)" "mirror.nucba.ac.jp" "mirror/xemacs/packages") ("sut.ac.jp (Japan)" "sunsite.sut.ac.jp" "pub/archives/packages/xemacs/packages") ("tsukuba.ac.jp (Japan)" "ftp.netlab.is.tsukuba.ac.jp" "pub/GNU/xemacs/packages") ("kreonet.re.kr (Korea)" "ftp.kreonet.re.kr" "pub/tools/emacs/xemacs/packages") ("nctu.edu.tw (Taiwan)" "coda.nctu.edu.tw" "Editors/xemacs/packages") ("sun.ac.za (South Africa)" "ftp.sun.ac.za" "xemacs/packages") ("isu.net.sa (Saudi Arabia)" "ftp.isu.net.sa" "pub/mirrors/ftp.xemacs.org/packages") ("aarnet.edu.au (Australia)" "mirror.aarnet.edu.au" "pub/xemacs/packages")) "*List of remote sites available for downloading packages.\nList format is '(site-description site-name directory-on-site).\nSITE-DESCRIPTION is a textual description of the site. SITE-NAME\nis the internet address of the download site. DIRECTORY-ON-SITE\nis the directory on the site in which packages may be found.\nThis variable is used to initialize `package-get-remote', the\nvariable actually used to specify package download sites." :tag "Package download sites" :type '(repeat (list (string :tag "Name") host-name directory)) :group 'package-get) (autoload 'package-get-download-menu "package-get" "\ Build the `Add Download Site' menu." nil nil) @@ -1763,21 +1767,21 @@ server and XEmacs has the necessary sound support compiled in." t nil) ;;;### (autoloads (ask-user-about-supersession-threat ask-user-about-lock) "userlock" "lisp/userlock.el") (autoload 'ask-user-about-lock "userlock" "\ -Ask user what to do when he wants to edit FILE but it is locked by USER. +Ask user wanting to edit FILENAME, locked by OTHER-USER, what to do. This function has a choice of three things to do: - do (signal 'file-locked (list FILE USER)) + do (signal 'file-locked (list FILENAME OTHER-USER)) to refrain from editing the file return t (grab the lock on the file) return nil (edit the file even though it is locked). -You can rewrite it to use any criterion you like to choose which one to do." nil nil) +You can rewrite it to use any criteria you like to choose which one to do." nil nil) (autoload 'ask-user-about-supersession-threat "userlock" "\ -Ask a user who is about to modify an obsolete buffer what to do. +Ask user who is about to modify an obsolete buffer what to do. This function has two choices: it can return, in which case the modification -of the buffer will proceed, or it can (signal 'file-supersession (file)), +of the buffer will proceed, or it can (signal 'file-supersession (FILENAME)), in which case the proposed buffer modification will not be made. -You can rewrite this to use any criterion you like to choose which one to do. +You can rewrite this to use any criteria you like to choose which one to do. The buffer in question is current when this function is called." nil nil) ;;;*** @@ -1789,13 +1793,13 @@ The buffer in question is current when this function is called." nil nil) (defvar view-mode-map (let ((map (copy-keymap view-minor-mode-map))) (set-keymap-name map 'view-mode-map) map)) (autoload 'view-file "view-less" "\ -Find FILE, enter view mode. With prefix arg OTHER-P, use other window." t nil) +Find FILENAME, enter view mode. With prefix arg OTHER-WINDOW-P, use other window." t nil) (autoload 'view-buffer "view-less" "\ -Switch to BUF, enter view mode. With prefix arg use other window." t nil) +Switch to BUFFER, enter view mode. With prefix arg use other window." t nil) (autoload 'view-file-other-window "view-less" "\ -Find FILE in other window, and enter view mode." t nil) +Find FILENAME in other window, and enter view mode." t nil) (autoload 'view-buffer-other-window "view-less" "\ Switch to BUFFER in another window, and enter view mode." t nil) diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index 49d09d0..5e62c34 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -46,7 +46,7 @@ ;; Based on FSF code dating back to 1985. ;;; Code: - + ;;;Trying to preserve the old window configuration works well in ;;;simple scenarios, when you enter the buffer menu, use it, and exit it. ;;;But it does strange things when you switch back to the buffer list buffer @@ -321,7 +321,7 @@ This command deletes and replaces all the previously existing windows in the selected frame." (interactive) (let ((buff (Buffer-menu-buffer t)) - (menu (current-buffer)) + (menu (current-buffer)) (others ()) tem) (goto-char (point-min)) @@ -484,8 +484,8 @@ The current window remains selected." ;; XEmacs (defvar list-buffers-header-line - (purecopy (concat " MR Buffer Size Mode File\n" - " -- ------ ---- ---- ----\n"))) + (concat " MR Buffer Size Mode File\n" + " -- ------ ---- ---- ----\n")) ;; XEmacs (defvar list-buffers-identification 'default-list-buffers-identification @@ -567,7 +567,7 @@ to generate such a string. This variable is always buffer-local.") (progn (setq current (point)) ?\.) ?\ )) (insert (if (buffer-modified-p buffer) - ?\* + ?\* ?\ )) (insert (if ro ?\% @@ -604,7 +604,7 @@ to generate such a string. This variable is always buffer-local.") "Display a list of names of existing buffers. The list is displayed in a buffer named `*Buffer List*'. Note that buffers with names starting with spaces are omitted. -Non-null optional arg FILES-ONLY means mention only file buffers. +Non-nil optional arg FILES-ONLY means mention only file buffers. The M column contains a * for buffers that are modified. The R column contains a % for buffers that are read-only." @@ -616,7 +616,7 @@ The R column contains a % for buffers that are read-only." "Create and return a buffer with a list of names of existing buffers. The buffer is named `*Buffer List*'. Note that buffers with names starting with spaces are omitted. -Non-null optional arg FILES-ONLY means mention only file buffers. +Non-nil optional arg FILES-ONLY means mention only file buffers. The M column contains a * for buffers that are modified. The R column contains a % for buffers that are read-only." diff --git a/lisp/byte-optimize.el b/lisp/byte-optimize.el index b18664b..6f9f8f4 100644 --- a/lisp/byte-optimize.el +++ b/lisp/byte-optimize.el @@ -23,7 +23,7 @@ ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. -;;; Synched up with: FSF 19.30. +;;; Synched up with: FSF 20.7. ;;; Commentary: @@ -177,13 +177,13 @@ ;;(disassemble #'(lambda (x) (eq (if (point) 'a 'b) 'c))) ;;(disassemble #'(lambda (x) (if (point) (eq 'a 'c) (eq 'b 'c)))) -;; (car (cons A B)) -> (progn B A) +;; (car (cons A B)) -> (prog1 A B) ;;(disassemble #'(lambda (x) (car (cons (foo) 42)))) ;; (cdr (cons A B)) -> (progn A B) ;;(disassemble #'(lambda (x) (cdr (cons 42 (foo))))) -;; (car (list A B ...)) -> (progn B ... A) +;; (car (list A B ...)) -> (prog1 A ... B) ;;(disassemble #'(lambda (x) (car (list (foo) 42 (bar))))) ;; (cdr (list A B ...)) -> (progn A (list B ...)) @@ -861,6 +861,44 @@ (if (= 1 (length (cdr form))) "" "s")) form)) +(defun byte-optimize-car (form) + (let ((arg (cadr form))) + (cond + ((and (byte-compile-trueconstp arg) + (not (and (consp arg) + (eq (car arg) 'quote) + (listp (cadr arg))))) + (byte-compile-warn + "taking car of a constant: %s" arg) + form) + ((and (eq (car-safe arg) 'cons) + (eq (length arg) 3)) + `(prog1 ,(nth 1 arg) ,(nth 2 arg))) + ((eq (car-safe arg) 'list) + `(prog1 ,@(cdr arg))) + (t + (byte-optimize-predicate form))))) + +(defun byte-optimize-cdr (form) + (let ((arg (cadr form))) + (cond + ((and (byte-compile-trueconstp arg) + (not (and (consp arg) + (eq (car arg) 'quote) + (listp (cadr arg))))) + (byte-compile-warn + "taking cdr of a constant: %s" arg) + form) + ((and (eq (car-safe arg) 'cons) + (eq (length arg) 3)) + `(progn ,(nth 1 arg) ,(nth 2 arg))) + ((eq (car-safe arg) 'list) + (if (> (length arg) 2) + `(progn ,(cadr arg) (list ,@(cddr arg))) + (cadr arg))) + (t + (byte-optimize-predicate form))))) + (put 'identity 'byte-optimizer 'byte-optimize-identity) (put '+ 'byte-optimizer 'byte-optimize-plus) @@ -899,8 +937,8 @@ (put 'logxor 'byte-optimizer 'byte-optimize-logmumble) (put 'lognot 'byte-optimizer 'byte-optimize-predicate) -(put 'car 'byte-optimizer 'byte-optimize-predicate) -(put 'cdr 'byte-optimizer 'byte-optimize-predicate) +(put 'car 'byte-optimizer 'byte-optimize-car) +(put 'cdr 'byte-optimizer 'byte-optimize-cdr) (put 'car-safe 'byte-optimizer 'byte-optimize-predicate) (put 'cdr-safe 'byte-optimizer 'byte-optimize-predicate) @@ -1111,6 +1149,18 @@ (while (>= (setq count (1- count)) 0) (setq form (list 'cdr form))) form))) + +(put 'concat 'byte-optimizer 'byte-optimize-concat) +(defun byte-optimize-concat (form) + (let ((args (cdr form)) + (constant t)) + (while (and args constant) + (or (byte-compile-constp (car args)) + (setq constant nil)) + (setq args (cdr args))) + (if constant + (eval form) + form))) ;;; enumerating those functions which need not be called if the returned ;;; value is not used. That is, something like @@ -1181,8 +1231,7 @@ hash-table-p identity ignore integerp integer-or-marker-p interactive-p invocation-directory invocation-name - ;; keymapp may autoload in XEmacs, so not on this list! - list listp + keymapp list listp make-marker mark mark-marker markerp memory-limit minibuffer-window ;; mouse-movement-p not in XEmacs natnump nlistp not null number-or-marker-p numberp @@ -1372,11 +1421,14 @@ (defconst byte-after-unbind-ops '(byte-constant byte-dup byte-symbolp byte-consp byte-stringp byte-listp byte-numberp byte-integerp - byte-eq byte-equal byte-not + byte-eq byte-not byte-cons byte-list1 byte-list2 ; byte-list3 byte-list4 byte-interactive-p) ;; How about other side-effect-free-ops? Is it safe to move an ;; error invocation (such as from nth) out of an unwind-protect? + ;; No, it is not, because the unwind-protect forms can alter + ;; the inside of the object to which nth would apply. + ;; For the same reason, byte-equal was deleted from this list. "Byte-codes that can be moved past an unbind.") (defconst byte-compile-side-effect-and-error-free-ops diff --git a/lisp/bytecomp.el b/lisp/bytecomp.el index 421a840..eb55143 100644 --- a/lisp/bytecomp.el +++ b/lisp/bytecomp.el @@ -10,7 +10,7 @@ ;; Richard Stallman ;; Keywords: internal lisp -(defconst byte-compile-version (purecopy "2.27 XEmacs; 2000-09-12.")) +(defconst byte-compile-version "2.27 XEmacs; 2000-09-12.") ;; This file is part of XEmacs. @@ -121,7 +121,7 @@ ;;; generate .elc files which can be loaded into ;;; generic emacs 19. ;;; emacs-lisp-file-regexp Regexp for the extension of source-files; -;;; see also the function byte-compile-dest-file. +;;; see also the function `byte-compile-dest-file'. ;;; byte-compile-overwrite-file If nil, delete old .elc files before saving. ;;; ;;; Most of the above parameters can also be set on a file-by-file basis; see @@ -145,7 +145,7 @@ ;;; This is, in fact, exactly what `defsubst' does. To make a function no ;;; longer be inline, you must use `proclaim-notinline'. Beware that if ;;; you define a function with `defsubst' and later redefine it with -;;; `defun', it will still be open-coded until you use proclaim-notinline. +;;; `defun', it will still be open-coded until you use `proclaim-notinline'. ;;; ;;; o You can also open-code one particular call to a function without ;;; open-coding all calls. Use the 'inline' form to do this, like so: @@ -164,20 +164,20 @@ ;;; ;;; o Forms like ((lambda ...) ...) are open-coded. ;;; -;;; o The form `eval-when-compile' is like progn, except that the body +;;; o The form `eval-when-compile' is like `progn', except that the body ;;; is evaluated at compile-time. When it appears at top-level, this ;;; is analogous to the Common Lisp idiom (eval-when (compile) ...). ;;; When it does not appear at top-level, it is similar to the ;;; Common Lisp #. reader macro (but not in interpreted code). ;;; -;;; o The form `eval-and-compile' is similar to eval-when-compile, but -;;; the whole form is evalled both at compile-time and at run-time. +;;; o The form `eval-and-compile' is similar to `eval-when-compile', +;;; but the whole form is evalled both at compile-time and at run-time. ;;; ;;; o The command M-x byte-compile-and-load-file does what you'd think. ;;; -;;; o The command compile-defun is analogous to eval-defun. +;;; o The command `compile-defun' is analogous to `eval-defun'. ;;; -;;; o If you run byte-compile-file on a filename which is visited in a +;;; o If you run `byte-compile-file' on a filename which is visited in a ;;; buffer, and that buffer is modified, you are asked whether you want ;;; to save the buffer before compiling. ;;; @@ -229,7 +229,7 @@ is compiled with optimization, this causes a speedup.") (defmacro byte-compile-version-cond (cond) cond))) ) -(defvar emacs-lisp-file-regexp (purecopy "\\.el$") +(defvar emacs-lisp-file-regexp "\\.el$" "*Regexp which matches Emacs Lisp source files. You may want to redefine `byte-compile-dest-file' if you change this.") @@ -444,15 +444,13 @@ on the specbind stack. The cdr of each cell is an integer bitmask.") (defvar byte-compiler-error-flag) (defconst byte-compile-initial-macro-environment - (purecopy - '((byte-compiler-options . (lambda (&rest forms) - (apply 'byte-compiler-options-handler forms))) - (eval-when-compile . (lambda (&rest body) - (list 'quote (eval (byte-compile-top-level - (cons 'progn body)))))) - (eval-and-compile . (lambda (&rest body) - (eval (cons 'progn body)) - (cons 'progn body))))) + '((byte-compiler-options . (lambda (&rest forms) + (apply 'byte-compiler-options-handler forms))) + (eval-when-compile . (lambda (&rest body) + (list 'quote (eval (cons 'progn body))))) + (eval-and-compile . (lambda (&rest body) + (eval (cons 'progn body)) + (cons 'progn body)))) "The default macro-environment passed to macroexpand by the compiler. Placing a macro here will cause a macro to have different semantics when expanded by the compiler as when expanded by the interpreter.") @@ -716,18 +714,18 @@ otherwise pop it") (defconst byte-constant-limit 64 "Exclusive maximum index usable in the `byte-constant' opcode.") -(defconst byte-goto-ops (purecopy - '(byte-goto byte-goto-if-nil byte-goto-if-not-nil - byte-goto-if-nil-else-pop - byte-goto-if-not-nil-else-pop)) +(defconst byte-goto-ops + '(byte-goto byte-goto-if-nil byte-goto-if-not-nil + byte-goto-if-nil-else-pop + byte-goto-if-not-nil-else-pop) "List of byte-codes whose offset is a pc.") (defconst byte-goto-always-pop-ops - (purecopy '(byte-goto-if-nil byte-goto-if-not-nil))) + '(byte-goto-if-nil byte-goto-if-not-nil)) (defconst byte-rel-goto-ops - (purecopy '(byte-rel-goto byte-rel-goto-if-nil byte-rel-goto-if-not-nil - byte-rel-goto-if-nil-else-pop byte-rel-goto-if-not-nil-else-pop)) + '(byte-rel-goto byte-rel-goto-if-nil byte-rel-goto-if-not-nil + byte-rel-goto-if-nil-else-pop byte-rel-goto-if-not-nil-else-pop) "byte-codes for relative jumps.") (byte-extrude-byte-code-vectors) @@ -997,7 +995,7 @@ otherwise pop it") '(emacs19) '(emacs20))))) ;; now we can copy it. -(setq byte-compiler-legal-options (purecopy byte-compiler-legal-options)) +(setq byte-compiler-legal-options byte-compiler-legal-options) (defun byte-compiler-options-handler (&rest args) (let (key val desc choices) @@ -1229,7 +1227,10 @@ otherwise pop it") (setq var nil)) (setq rest (cdr rest))) ;; if var is nil at this point, it's a defvar in this file. - (not var)))) + (not var)) + ;; Perhaps (eval-when-compile (defvar foo)) + (and (boundp 'current-load-list) + (memq var current-load-list)))) ;;; If we have compiled bindings of variables which have no referents, warn. @@ -1371,8 +1372,8 @@ Files in subdirectories of DIRECTORY are processed also." (defun byte-recompile-directory (directory &optional arg norecursion force) "Recompile every `.el' file in DIRECTORY that needs recompilation. This is if a `.elc' file exists but is older than the `.el' file. -Files in subdirectories of DIRECTORY are processed also unless argument -NORECURSION is non-nil. +Files in subdirectories of DIRECTORY are also processed unless +optional argument NORECURSION is non-nil. If the `.elc' file does not exist, normally the `.el' file is *not* compiled. But a prefix argument (optional second arg) means ask user, @@ -1381,7 +1382,7 @@ don't ask and compile the file anyway. A nonzero prefix argument also means ask about each subdirectory. -If the fourth argument FORCE is non-nil, +If the fourth optional argument FORCE is non-nil, recompile every `.el' file that already has a `.elc' file." (interactive "DByte recompile directory: \nP") (if arg @@ -2725,6 +2726,8 @@ If FORM is a lambda or a macro, byte-compile it as a function." (if (eq base-op 'byte-varset) byte-compile-assigned-bit byte-compile-referenced-bit))))) + (and (boundp 'current-load-list) + (memq var current-load-list)) (if (eq base-op 'byte-varset) (or (memq var byte-compile-free-assignments) (progn @@ -3815,8 +3818,9 @@ If FORM is a lambda or a macro, byte-compile it as a function." (byte-compile-body-do-effect (list ;; Put the defined variable in this library's load-history entry - ;; just as a real defvar would, but only in top-level forms. - (when (null byte-compile-current-form) + ;; just as a real defvar would, but only in top-level forms with values. + (when (and (> (length form) 2) + (null byte-compile-current-form)) `(push ',var current-load-list)) (when (> (length form) 3) (when (and string (not (stringp string))) @@ -4094,7 +4098,7 @@ invoked interactively." Use this from the command line, with `-batch'; it won't work in an interactive Emacs. Each file is processed even if an error occurred previously. -For example, invoke \"xemacs -batch -f batch-byte-compile $emacs/ ~/*.el\"" +For example, invoke \"xemacs -batch -f batch-byte-compile $emacs/ ~/*.el\"." ;; command-line-args-left is what is left of the command line (from ;; startup.el) (defvar command-line-args-left) ;Avoid 'free variable' warning diff --git a/lisp/cl-macs.el b/lisp/cl-macs.el index 3299793..6eddb94 100644 --- a/lisp/cl-macs.el +++ b/lisp/cl-macs.el @@ -2434,10 +2434,10 @@ The type name can then be used in `typecase', `check-type', etc." (t (error "Bad type spec: %s" type))))) ;;;###autoload -(defun typep (val type) ; See compiler macro below. +(defun typep (object type) ; See compiler macro below. "Check that OBJECT is of type TYPE. TYPE is a Common Lisp-style type specifier." - (eval (cl-make-type-test 'val type))) + (eval (cl-make-type-test 'object type))) ;;;###autoload (defmacro check-type (form type &optional string) diff --git a/lisp/code-files.el b/lisp/code-files.el index f3d138a..1738d70 100644 --- a/lisp/code-files.el +++ b/lisp/code-files.el @@ -17,7 +17,7 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the +;; along with XEmacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. @@ -205,16 +205,16 @@ object (the entry specified a coding system)." ;... (defun find-coding-system-magic-cookie () - "Look for the coding-system magic cookie in the current buffer.\n" -"The coding-system magic cookie is the exact string\n" -"\";;;###coding system: \" followed by a valid coding system symbol,\n" -"somewhere within the first 3000 characters of the file. If found,\n" -"the coding system symbol is returned; otherwise nil is returned.\n" -"Note that it is extremely unlikely that such a string would occur\n" -"coincidentally as the result of encoding some characters in a non-ASCII\n" -"charset, and that the spaces make it even less likely since the space\n" -"character is not a valid octet in any ISO 2022 encoding of most non-ASCII\n" -"charsets." + "Look for the coding-system magic cookie in the current buffer. +The coding-system magic cookie is the exact string +\";;;###coding system: \" followed by a valid coding system symbol, +somewhere within the first 3000 characters of the file. If found, +the coding system symbol is returned; otherwise nil is returned. +Note that it is extremely unlikely that such a string would occur +coincidentally as the result of encoding some characters in a non-ASCII +charset, and that the spaces make it even less likely since the space +character is not a valid octet in any ISO 2022 encoding of most non-ASCII +charsets." (save-excursion (goto-char (point-min)) (or (and (looking-at @@ -353,7 +353,7 @@ CODING-SYSTEM (the actual coding system used to decode the file), and a cons of absolute pathname and length of data inserted (the same thing as will be returned from `insert-file-contents').") -(defun insert-file-contents (filename &optional visit beg end replace) +(defun insert-file-contents (filename &optional visit start end replace) "Insert contents of file FILENAME after point. Returns list of absolute file name and length of data inserted. If second argument VISIT is non-nil, the buffer's visited filename @@ -361,9 +361,9 @@ and last save file modtime are set, and it is marked unmodified. If visiting and the file does not exist, visiting is completed before the error is signaled. -The optional third and fourth arguments BEG and END +The optional third and fourth arguments START and END specify what portion of the file to insert. -If VISIT is non-nil, BEG and END must be nil. +If VISIT is non-nil, START and END must be nil. If optional fifth argument REPLACE is non-nil, it means replace the current buffer contents (in the accessible portion) with the file contents. This is better than simply deleting and inserting @@ -416,7 +416,7 @@ and `insert-file-contents-post-hook'." coding-system) (setq coding-system 'undecided))) (setq return-val - (insert-file-contents-internal filename visit beg end + (insert-file-contents-internal filename visit start end replace coding-system ;; store here! 'used-codesys)) diff --git a/lisp/code-process.el b/lisp/code-process.el index 1b248dc..09279c8 100644 --- a/lisp/code-process.el +++ b/lisp/code-process.el @@ -195,7 +195,7 @@ See also the function `find-operation-coding-system'.") (defun open-network-stream (name buffer host service &optional protocol) "Open a TCP connection for a service to a host. -Return a subprocess-object to represent the connection. +Return a process object to represent the connection. Input and output work as for subprocesses; `delete-process' closes it. Args are NAME BUFFER HOST SERVICE. NAME is name for process. It is modified if necessary to make it unique. diff --git a/lisp/coding.el b/lisp/coding.el index 30e4036..3cc7fbe 100644 --- a/lisp/coding.el +++ b/lisp/coding.el @@ -38,9 +38,9 @@ ;; override the default value defined in loaddefs.el. (setq-default modeline-format - (cons (purecopy "") - (cons 'modeline-multibyte-status - (cdr modeline-format)))) + (cons "" + (cons 'modeline-multibyte-status + (cdr modeline-format)))) (defun modify-coding-system-alist (target-type regexp coding-system) "Modify one of look up tables for finding a coding system on I/O operation. diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el index 1d528c7..b6317b3 100644 --- a/lisp/cus-edit.el +++ b/lisp/cus-edit.el @@ -682,8 +682,8 @@ If given a prefix (or a COMMENT argument), also prompt for a comment." (put var 'variable-comment comment)))) ;;;###autoload -(defun customize-set-variable (var val &optional comment) - "Set the default for VARIABLE to VALUE. VALUE is a Lisp object. +(defun customize-set-variable (variable value &optional comment) + "Set the default for VARIABLE to VALUE. VALUE is any Lisp object. If VARIABLE has a `custom-set' property, that is used for setting VARIABLE, otherwise `set-default' is used. @@ -701,18 +701,18 @@ If given a prefix (or a COMMENT argument), also prompt for a comment." (interactive (custom-prompt-variable "Set variable: " "Set customized value for %s to: " current-prefix-arg)) - (funcall (or (get var 'custom-set) 'set-default) var val) - (put var 'customized-value (list (custom-quote val))) + (funcall (or (get variable 'custom-set) 'set-default) variable value) + (put variable 'customized-value (list (custom-quote value))) (cond ((string= comment "") - (put var 'variable-comment nil) - (put var 'customized-variable-comment nil)) + (put variable 'variable-comment nil) + (put variable 'customized-variable-comment nil)) (comment - (put var 'variable-comment comment) - (put var 'customized-variable-comment comment)))) + (put variable 'variable-comment comment) + (put variable 'customized-variable-comment comment)))) ;;;###autoload -(defun customize-save-variable (var val &optional comment) +(defun customize-save-variable (variable value &optional comment) "Set the default for VARIABLE to VALUE, and save it for future sessions. If VARIABLE has a `custom-set' property, that is used for setting VARIABLE, otherwise `set-default' is used. @@ -730,15 +730,15 @@ If given a prefix (or a COMMENT argument), also prompt for a comment." (interactive (custom-prompt-variable "Set and ave variable: " "Set and save value for %s as: " current-prefix-arg)) - (funcall (or (get var 'custom-set) 'set-default) var val) - (put var 'saved-value (list (custom-quote val))) - (custom-push-theme 'theme-value var 'user 'set (list (custom-quote val))) + (funcall (or (get variable 'custom-set) 'set-default) variable value) + (put variable 'saved-value (list (custom-quote value))) + (custom-push-theme 'theme-value variable 'user 'set (list (custom-quote value))) (cond ((string= comment "") - (put var 'variable-comment nil) - (put var 'saved-variable-comment nil)) + (put variable 'variable-comment nil) + (put variable 'saved-variable-comment nil)) (comment - (put var 'variable-comment comment) - (put var 'saved-variable-comment comment))) + (put variable 'variable-comment comment) + (put variable 'saved-variable-comment comment))) (custom-save-all)) ;;;###autoload @@ -1988,7 +1988,7 @@ Otherwise, look up symbol in `custom-guess-type-alist'." ;; Insert documentation. ;; #### NOTE: this is ugly!!!! I need to do update the :buttons property ;; before the call to `widget-default-format-handler'. Otherwise, I - ;; loose my current `buttons'. This function shouldn't be called like + ;; lose my current `buttons'. This function shouldn't be called like ;; this anyway. The doc string widget should be added like the others. ;; --dv (widget-put widget :buttons buttons) @@ -3270,7 +3270,7 @@ Leave point at the location of the call, or after the last expression." (unless (bolp) (princ "\n")) (princ "(custom-set-variables") - (mapatoms (lambda (symbol) + (mapatoms (lambda (symbol) (let ((spec (car-safe (get symbol 'theme-value))) (requests (get symbol 'custom-requests)) (now (not (or (get symbol 'standard-value) @@ -3345,7 +3345,7 @@ Leave point at the location of the call, or after the last expression." (defun custom-save-resets (property setter special) (let (started-writing ignored-special) (setq ignored-special ignored-special) ;; suppress byte-compiler warning - ;; (custom-save-delete setter) Done by caller + ;; (custom-save-delete setter) Done by caller (let ((standard-output (current-buffer)) (mapper `(lambda (object) (let ((spec (car-safe (get object (quote ,property))))) @@ -3370,7 +3370,7 @@ Leave point at the location of the call, or after the last expression." (when started-writing (princ ")\n")))) ) - + (defun custom-save-loaded-themes () (let ((themes (reverse (get 'user 'theme-loads-themes))) @@ -3381,7 +3381,7 @@ Leave point at the location of the call, or after the last expression." (mapc (lambda (theme) (princ "\n '") (prin1 theme)) themes) - (princ " )\n")))) + (princ " )\n")))) ;;;###autoload (defun customize-save-customized () diff --git a/lisp/cus-face.el b/lisp/cus-face.el index 656f710..403f806 100644 --- a/lisp/cus-face.el +++ b/lisp/cus-face.el @@ -55,6 +55,7 @@ ;;; Font Attributes. +;; Consider adding the stuff in the XML font model here. (defconst custom-face-attributes '((:foreground (color :tag "Foreground" :value "" @@ -98,18 +99,20 @@ Control whether the text should be strikethru.") :help-echo "\ Control whether the text should be inverted. Works only on TTY-s") set-face-reverse-p face-reverse-p)) - "Alist of face attributes. + "Alist of face attributes. -The elements are of the form (KEY TYPE SET GET) where KEY is a symbol -identifying the attribute, TYPE is a widget type for editing the -attibute, SET is a function for setting the attribute value, and GET is a function for getiing the attribute value. +The elements are lists of the form (KEY TYPE SET GET) where: + KEY is a symbol identifying the attribute. + TYPE is a widget type for editing the attribute. + SET is a function for setting the attribute value. + GET is a function for getting the attribute value. -The SET function should take three arguments, the face to modify, the +The SET function should take three arguments: the face to modify, the value of the attribute, and optionally the frame where the face should be changed. The GET function should take two arguments, the face to examine, and -optonally the frame where the face should be examined.") +optionally the frame where the face should be examined.") (defun face-custom-attributes-set (face frame tags &rest atts) "For FACE on FRAME set the attributes [KEYWORD VALUE].... @@ -192,13 +195,13 @@ If FRAME is nil, use the default face." (defun custom-face-background-pixmap (face &rest args) "Return the name of the background pixmap file used for FACE." - (let ((image (apply 'specifier-instance + (let ((image (apply 'specifier-instance (face-background-pixmap face) args))) - (and image + (and image (image-instance-file-name image)))) (defun custom-set-face-font-size (face size &optional locale tags) - "Set the font of FACE to SIZE" + "Set the font of FACE to SIZE." (let* ((font (apply 'face-font-name face locale)) ;; Gag (fontobj (font-create-object font))) @@ -230,7 +233,7 @@ If FRAME is nil, use the default face." ;;;###autoload (defun custom-set-face-update-spec (face display plist) "Customize the FACE for display types matching DISPLAY, merging - in the new items from PLIST" + in the new items from PLIST." (let ((spec (face-spec-update-all-matching (custom-face-get-spec face) display plist))) (put face 'customized-face spec) @@ -326,7 +329,7 @@ This means reset face to its value in to-theme." "Reset the value of the face to values previously defined. Associate this setting with the 'user' theme. -ARGS is defined as for `custom-theme-reset-faces'" +ARGS is defined as for `custom-theme-reset-faces'." (apply #'custom-theme-reset-faces 'user args)) diff --git a/lisp/custom.el b/lisp/custom.el index 20f02ab..5cd137d 100644 --- a/lisp/custom.el +++ b/lisp/custom.el @@ -396,7 +396,7 @@ LOAD should be either a library file name, or a feature name." Define a theme labeled by SYMBOL THEME. The optional argument DOC is a doc string describing the theme. It is optionally followed by the -following keyboard arguments +following keyword arguments :short-description DESC DESC is a short (one line) description of the theme. If not given DOC @@ -423,7 +423,7 @@ following keyboard arguments (memq theme custom-known-themes)) (defsubst custom-check-theme (theme) - "Check whether THEME is valid and signal an error if NOT" + "Check whether THEME is valid and signal an error if NOT." (unless (custom-theme-p theme) (error "Unknown theme `%s'" theme))) @@ -565,7 +565,7 @@ BODY is as with custom-theme-load-themes." (defsubst copy-upto-last (elt list) - "Copy all the elements of the list upto the last occurrence of elt" + "Copy all the elements of the list upto the last occurrence of elt." ;; Is it faster to do more work in C than to do less in elisp? (nreverse (cdr (member elt (reverse list))))) diff --git a/lisp/dialog.el b/lisp/dialog.el index cdfbe55..03a9931 100644 --- a/lisp/dialog.el +++ b/lisp/dialog.el @@ -308,7 +308,7 @@ For type `page-setup': This invokes the Windows standard Page Setup dialog. This dialog is usually invoked in response to the Page Setup command, and -used to chose such parameters as page orientation, print margins etc. +used to choose such parameters as page orientation, print margins etc. Note that this dialog contains the \"Printer\" button, which invokes the Printer Setup dialog (see `msprinter-print-setup-dialog') so that the user can update the printer options or even select a different printer diff --git a/lisp/dumped-lisp.el b/lisp/dumped-lisp.el index b7568b8..b32bdfe 100644 --- a/lisp/dumped-lisp.el +++ b/lisp/dumped-lisp.el @@ -116,8 +116,10 @@ ;;;;;;;;;;;;;;;;;; Coding-system support (when-feature file-coding "coding") (when-feature file-coding "code-files") + ;; Handle process with encoding/decoding coding-system. (when-feature file-coding "code-process") - + ;; Provide basic commands to set coding systems to user + (when-feature file-coding "code-cmds") ;;;;;;;;;;;;;;;;;; MULE support (when-feature mule "mule-conf") (when-feature utf-2000 "u00000-C0") @@ -449,7 +451,7 @@ (when-feature mule "arabic") (when-feature mule "chinese") - (when-feature mule "mule/cyrillic") ; overloaded in leim/quail +; (when-feature mule "mule/cyrillic") ; overloaded in leim/quail (when-feature mule "english") (when-feature mule "ethiopic") (when-feature mule "european") @@ -458,8 +460,8 @@ (when-feature mule "japanese") (when-feature mule "korean") (when-feature mule "misc-lang") - (when-feature mule "thai-xtis-chars") - (when-feature mule "mule/thai-xtis") ; overloaded in leim/quail +; (when-feature mule "thai-xtis-chars") +; (when-feature mule "mule/thai-xtis") ; overloaded in leim/quail (when-feature mule "viet-chars") (when-feature (and mule (not utf-2000)) "viet-ccl") (when-feature mule "vietnamese") diff --git a/lisp/etags.el b/lisp/etags.el index e71cbe9..56fc478 100644 --- a/lisp/etags.el +++ b/lisp/etags.el @@ -408,7 +408,7 @@ File name returned is relative to tag table file's directory." (defun buffer-tag-table-files () "Returns a list of all files referenced by all TAGS tables that this buffer uses." - (apply #'nconc + (apply #'append (mapcar #'tag-table-files (buffer-tag-table-list)))) diff --git a/lisp/faces.el b/lisp/faces.el index eff6c16..953025b 100644 --- a/lisp/faces.el +++ b/lisp/faces.el @@ -842,12 +842,12 @@ the function to be called on it." ;; happen if that locale has no instantiators. So signal ;; an error to indicate this. - + (setq temp-sp (copy-specifier sp)) (if (and (or (eq locale 'global) (eq locale 'all) (not locale)) (not (face-property face property 'global))) (copy-specifier (face-property 'default property) - temp-sp 'global)) + temp-sp 'global)) (if (and (valid-specifier-locale-p locale) (not (specifier-specs temp-sp locale))) (error "Property must have a specification in locale %S" locale)) @@ -1298,7 +1298,7 @@ If FRAME is nil, return the default frame properties." (defun face-spec-update-all-matching (spec display plist) "Update all entries in the face spec that could match display to -have the entries from the new plist and return the new spec" +have the entries from the new plist and return the new spec." (mapcar (lambda (e) (let ((entries (car e)) @@ -1326,8 +1326,8 @@ have the entries from the new plist and return the new spec" (setq new-options (cddr new-options))) (list entries options)))) (copy-sequence spec))) - - + + (defun face-spec-set-match-display (display &optional frame) "Return non-nil if DISPLAY matches FRAME. @@ -1781,25 +1781,25 @@ in that frame; otherwise change each frame." (if (featurep 'xpm) (setq xpm-color-symbols (list - (purecopy '("foreground" (face-foreground 'default))) - (purecopy '("background" (face-background 'default))) - (purecopy '("backgroundToolBarColor" - (or - (and - (featurep 'x) - (x-get-resource "backgroundToolBarColor" - "BackgroundToolBarColor" 'string - nil nil 'warn)) - - (face-background 'toolbar)))) - (purecopy '("foregroundToolBarColor" - (or - (and - (featurep 'x) - (x-get-resource "foregroundToolBarColor" - "ForegroundToolBarColor" 'string - nil nil 'warn)) - (face-foreground 'toolbar)))) + '("foreground" (face-foreground 'default)) + '("background" (face-background 'default)) + '("backgroundToolBarColor" + (or + (and + (featurep 'x) + (x-get-resource "backgroundToolBarColor" + "BackgroundToolBarColor" 'string + nil nil 'warn)) + + (face-background 'toolbar))) + '("foregroundToolBarColor" + (or + (and + (featurep 'x) + (x-get-resource "foregroundToolBarColor" + "ForegroundToolBarColor" 'string + nil nil 'warn)) + (face-foreground 'toolbar))) ))) (when (featurep 'tty) diff --git a/lisp/files-nomule.el b/lisp/files-nomule.el index cab09cc..0c983fc 100644 --- a/lisp/files-nomule.el +++ b/lisp/files-nomule.el @@ -19,7 +19,7 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the +;; along with XEmacs; see the file COPYING. If not, write to the ;; Free Software Foundation, 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. @@ -33,7 +33,7 @@ ;;; Code: -(defun insert-file-contents (filename &optional visit beg end replace) +(defun insert-file-contents (filename &optional visit start end replace) "Insert contents of file FILENAME after point. Returns list of absolute file name and length of data inserted. If second argument VISIT is non-nil, the buffer's visited filename @@ -41,15 +41,15 @@ and last save file modtime are set, and it is marked unmodified. If visiting and the file does not exist, visiting is completed before the error is signaled. -The optional third and fourth arguments BEG and END +The optional third and fourth arguments START and END specify what portion of the file to insert. -If VISIT is non-nil, BEG and END must be nil. +If VISIT is non-nil, START and END must be nil. If optional fifth argument REPLACE is non-nil, it means replace the current buffer contents (in the accessible portion) with the file contents. This is better than simply deleting and inserting the whole thing because (1) it preserves some marker positions and (2) it puts less data in the undo list." - (insert-file-contents-internal filename visit beg end replace nil nil)) + (insert-file-contents-internal filename visit start end replace nil nil)) (defun write-region (start end filename &optional append visit lockname coding-system) "Write current region into specified file. diff --git a/lisp/files.el b/lisp/files.el index 0121aef..2b713c8 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -291,11 +291,11 @@ changing the major mode does not clear it. However, calling (defvar after-set-visited-file-name-hooks nil "List of functions to be called after \\[set-visited-file-name] or during \\[write-file]. -You can use this hook to restore local values of write-file-hooks, -after-save-hook, and revert-buffer-function, which pertain +You can use this hook to restore local values of `write-file-hooks', +`after-save-hook', and `revert-buffer-function', which pertain to a specific file and therefore are normally killed by a rename. -Put hooks pertaining to the buffer contents on write-contents-hooks -and revert-buffer-insert-file-contents-function.") +Put hooks pertaining to the buffer contents on `write-contents-hooks' +and `revert-buffer-insert-file-contents-function'.") (defvar write-contents-hooks nil "List of functions to be called before writing out a buffer to a file. @@ -870,18 +870,18 @@ If there is no such live buffer, return nil." (setq list (cdr list)))) found)))) -(defun insert-file-contents-literally (filename &optional visit beg end replace) - "Like `insert-file-contents', q.v., but only reads in the file literally. +(defun insert-file-contents-literally (filename &optional visit start end replace) + "Like `insert-file-contents', q.v., but only reads in the file. A buffer may be modified in several ways after reading into the buffer due to advanced Emacs features, such as format decoding, character code -conversion,find-file-hooks, automatic uncompression, etc. +conversion, find-file-hooks, automatic uncompression, etc. This function ensures that none of these modifications will take place." (let ((wrap-func (find-file-name-handler filename 'insert-file-contents-literally))) - (if wrap-func + (if wrap-func (funcall wrap-func 'insert-file-contents-literally filename - visit beg end replace) + visit start end replace) (let ((file-name-handler-alist nil) (format-alist nil) (after-insert-file-functions nil) @@ -895,7 +895,7 @@ conversion,find-file-hooks, automatic uncompression, etc. (unwind-protect (progn (fset 'find-buffer-file-type (lambda (filename) t)) - (insert-file-contents filename visit beg end replace)) + (insert-file-contents filename visit start end replace)) (if find-buffer-file-type-function (fset 'find-buffer-file-type find-buffer-file-type-function) (fmakunbound 'find-buffer-file-type))))))) @@ -1174,7 +1174,7 @@ run `normal-mode' explicitly." ("\\.m\\(?:[mes]\\|an\\)\\'" . nroff-mode) ("\\.icn\\'" . icon-mode) ("\\.\\(?:[ckz]?sh\\|shar\\)\\'" . sh-mode) - ("\\.pro\\'" . idlwave-mode) + ("\\.[Pp][Rr][Oo]\\'" . idlwave-mode) ;; #### Unix-specific! ("/\\.\\(?:bash_\\|z\\)?\\(profile\\|login\\|logout\\)\\'" . sh-mode) ("/\\.\\(?:[ckz]sh\\|bash\\|tcsh\\|es\\|xinit\\|startx\\)rc\\'" . sh-mode) @@ -1207,7 +1207,6 @@ run `normal-mode' explicitly." ("\\.[sj]?html?\\'" . html-mode) ("\\.jsp\\'" . html-mode) ("\\.xml\\'" . xml-mode) - ("\\.htm?l?3\\'" . html3-mode) ("\\.\\(?:sgml?\\|dtd\\)\\'" . sgml-mode) ("\\.c?ps\\'" . postscript-mode) ;; .emacs following a directory delimiter in either Unix or @@ -1282,9 +1281,9 @@ If it matches, mode MODE is selected.") ; "tiff" ; "jpg" ; "jpeg")))))) - + (defvar inhibit-first-line-modes-regexps - (purecopy binary-file-regexps) + binary-file-regexps "List of regexps; if one matches a file name, don't look for `-*-'.") (defvar inhibit-first-line-modes-suffixes nil @@ -1482,7 +1481,7 @@ for current buffer." (or force (hack-local-variables-p nil)))) (let ((continue t) - prefix prefixlen suffix beg + prefix prefixlen suffix start (enable-local-eval enable-local-eval)) ;; The prefix is what comes before "local variables:" in its line. ;; The suffix is what comes after "local variables:" in its line. @@ -1509,11 +1508,11 @@ for current buffer." (error "Local variables entry is missing the prefix"))) ;; Find the variable name; strip whitespace. (skip-chars-forward " \t") - (setq beg (point)) + (setq start (point)) (skip-chars-forward "^:\n") (if (eolp) (error "Missing colon in local variables entry")) (skip-chars-backward " \t") - (let* ((str (buffer-substring beg (point))) + (let* ((str (buffer-substring start (point))) (var (read str)) val) ;; Setting variable named "end" means end of list. @@ -2246,7 +2245,7 @@ After saving the buffer, run `after-save-hook'." (goto-char (point-max)) (insert ?\n))) - ;; Run the write-file-hooks until one returns non-null. + ;; Run the write-file-hooks until one returns non-nil. ;; Bind after-save-hook to nil while running the ;; write-file-hooks so that if this function is called ;; recursively (from inside a write-file-hook) the @@ -2362,9 +2361,9 @@ After saving the buffer, run `after-save-hook'." "Provide a clean way for a write-file-hook to wrap AROUND the execution of the remaining hooks and writing to disk. Do not call this function except from a functions -on the write-file-hooks or write-contents-hooks list. +on the `write-file-hooks' or `write-contents-hooks' list. A hook that calls this function must return non-nil, -to signal completion to its caller. continue-save-buffer +to signal completion to its caller. `continue-save-buffer' always returns non-nil." (let ((hooks (cdr (or continue-save-buffer-hooks-tail (error @@ -3166,19 +3165,19 @@ If WILDCARD, it also runs the shell specified by `shell-file-name'." (file-name-directory file) (file-name-directory (expand-file-name file)))) (pattern (file-name-nondirectory file)) - (beg 0)) + (start 0)) ;; Quote some characters that have special meanings in shells; ;; but don't quote the wildcards--we want them to be special. ;; We also currently don't quote the quoting characters ;; in case people want to use them explicitly to quote ;; wildcard characters. ;;#### Unix-specific - (while (string-match "[ \t\n;<>&|()#$]" pattern beg) + (while (string-match "[ \t\n;<>&|()#$]" pattern start) (setq pattern (concat (substring pattern 0 (match-beginning 0)) "\\" (substring pattern (match-beginning 0))) - beg (1+ (match-end 0)))) + start (1+ (match-end 0)))) (call-process shell-file-name nil t nil "-c" (concat "\\" ;; Disregard shell aliases! insert-directory-program diff --git a/lisp/fill.el b/lisp/fill.el index a1eafa1..2b2179b 100644 --- a/lisp/fill.el +++ b/lisp/fill.el @@ -88,7 +88,7 @@ reinserts the fill prefix in each resulting line." ;; #### - this is still weak. Yeah, there's filladapt, but this should ;; still be better... --Stig -(defcustom adaptive-fill-regexp (purecopy "[ \t]*\\([#;>*]+ +\\)?") +(defcustom adaptive-fill-regexp "[ \t]*\\([#;>*]+ +\\)?" "*Regexp to match text at start of line that constitutes indentation. If Adaptive Fill mode is enabled, whatever text matches this pattern on the second line of a paragraph is used as the standard indentation @@ -103,7 +103,7 @@ This function is used when `adaptive-fill-regexp' does not match." :type 'function :group 'fill) -;; Added for kinsoku processing. Use this instead of +;; Added for kinsoku processing. Use this instead of ;; (skip-chars-backward "^ \t\n") ;; (skip-chars-backward "^ \n" linebeg) (defun fill-move-backward-to-break-point (regexp &optional lim) @@ -161,7 +161,7 @@ number equals or exceeds the local fill-column - right-margin difference." here-col col)) (max here-col fill-col))))) -(defun canonically-space-region (beg end) +(defun canonically-space-region (start end) "Remove extra spaces between words in region. Leave one space between words, two at end of sentences or after colons \(depending on values of `sentence-end-double-space' and `colon-double-space'). @@ -169,7 +169,7 @@ Remove indentation from each line." (interactive "r") ;;;### 97/3/14 jhod: Do I have to add anything here for kinsoku? (save-excursion - (goto-char beg) + (goto-char start) ;; XEmacs - (ENE/stig from fa-extras.el): Skip the start of a comment. (and comment-start-skip (looking-at comment-start-skip) @@ -178,7 +178,7 @@ Remove indentation from each line." ;; This is quick, but loses when a tab follows the end of a sentence. ;; Actually, it is difficult to tell that from "Mr.\tSmith". ;; Blame the typist. - (subst-char-in-region beg end ?\t ?\ ) + (subst-char-in-region start end ?\t ?\ ) (while (and (< (point) end) (re-search-forward " *" end t)) (delete-region @@ -195,7 +195,7 @@ Remove indentation from each line." (match-end 0))) ;; Make sure sentences ending at end of line get an extra space. ;; loses on split abbrevs ("Mr.\nSmith") - (goto-char beg) + (goto-char start) (while (and (< (point) end) (re-search-forward "[.?!][])}\"']*$" end t)) ;; We insert before markers in case a caller such as @@ -294,7 +294,7 @@ space does not end a sentence, so don't break a line there." (beginning-of-line) (setq from (point)) - + ;; Delete all but one soft newline at end of region. ;; And leave TO before that one. (goto-char to) @@ -604,13 +604,13 @@ argument to it), and if it returns non-nil, we simply return its value." (forward-paragraph) (or (bolp) (newline 1)) (let ((end (point)) - (beg (progn (backward-paragraph) (point)))) + (start (progn (backward-paragraph) (point)))) (goto-char before) (if use-hard-newlines ;; Can't use fill-region-as-paragraph, since this paragraph may ;; still contain hard newlines. See fill-region. - (fill-region beg end arg) - (fill-region-as-paragraph beg end arg))))))) + (fill-region start end arg) + (fill-region-as-paragraph start end arg))))))) (defun fill-region (from to &optional justify nosqueeze to-eop) "Fill each of the paragraphs in the region. @@ -629,23 +629,23 @@ space does not end a sentence, so don't break a line there." (barf-if-buffer-read-only nil (region-beginning) (region-end)) (list (region-beginning) (region-end) (if current-prefix-arg 'full)))) - (let (end beg) + (let (end start) (save-restriction (goto-char (max from to)) (if to-eop (progn (skip-chars-backward "\n") (forward-paragraph))) (setq end (point)) - (goto-char (setq beg (min from to))) + (goto-char (setq start (min from to))) (beginning-of-line) (narrow-to-region (point) end) (while (not (eobp)) (let ((initial (point)) end) ;; If using hard newlines, break at every one for filling - ;; purposes rather than using paragraph breaks. + ;; purposes rather than using paragraph breaks. (if use-hard-newlines - (progn + (progn (while (and (setq end (text-property-any (point) (point-max) 'hard t)) (not (eq ?\n (char-after end))) @@ -656,8 +656,8 @@ space does not end a sentence, so don't break a line there." (forward-paragraph 1) (setq end (point)) (forward-paragraph -1)) - (if (< (point) beg) - (goto-char beg)) + (if (< (point) start) + (goto-char start)) (if (>= (point) initial) (fill-region-as-paragraph (point) end justify nosqueeze) (goto-char end))))))) @@ -671,7 +671,7 @@ See `fill-paragraph' and `fill-region' for more information." (fill-region (point) (mark) arg) (fill-paragraph arg))) - + (defconst default-justification 'left "*Method of justifying text not otherwise specified. Possible values are `left', `right', `full', `center', or `none'. @@ -685,9 +685,9 @@ This variable automatically becomes buffer-local when set in any fashion.") This returns the value of the text-property `justification', or the variable `default-justification' if there is no text-property. However, it returns nil rather than `none' to mean \"don't justify\"." - (let ((j (or (get-text-property + (let ((j (or (get-text-property ;; Make sure we're looking at paragraph body. - (save-excursion (skip-chars-forward " \t") + (save-excursion (skip-chars-forward " \t") (if (and (eobp) (not (bobp))) (1- (point)) (point))) 'justification) @@ -724,7 +724,7 @@ extended to include entire paragraphs as in the interactive command." (save-restriction (if whole-par (let ((paragraph-start (if use-hard-newlines "." paragraph-start)) - (paragraph-ignore-fill-prefix (if use-hard-newlines t + (paragraph-ignore-fill-prefix (if use-hard-newlines t paragraph-ignore-fill-prefix))) (goto-char begin) (while (and (bolp) (not (eobp))) (forward-char 1)) @@ -785,7 +785,7 @@ If the mark is not active, this applies to the current paragraph." ;; 97/3/14 jhod: This functions are added for Kinsoku support (defun find-space-insertable-point () - "Search backward for a permissible point for inserting justification spaces" + "Search backward for a permissible point for inserting justification spaces." (if (boundp 'space-insertable) (if (re-search-backward space-insertable nil t) (progn (forward-char 1) @@ -795,7 +795,7 @@ If the mark is not active, this applies to the current paragraph." ;; A line has up to six parts: ;; -;; >>> hello. +;; >>> hello. ;; [Indent-1][FP][ Indent-2 ][text][trailing whitespace][newline] ;; ;; "Indent-1" is the left-margin indentation; normally it ends at column @@ -807,7 +807,7 @@ If the mark is not active, this applies to the current paragraph." ;; Trailing whitespace is not counted as part of the line length when ;; center- or right-justifying. ;; -;; All parts of the line are optional, although the final newline can +;; All parts of the line are optional, although the final newline can ;; only be missing on the last line of the buffer. (defun justify-current-line (&optional how eop nosqueeze) @@ -815,7 +815,7 @@ If the mark is not active, this applies to the current paragraph." Normally does full justification: adds spaces to the line to make it end at the column given by `current-fill-column'. Optional first argument HOW specifies alternate type of justification: -it can be `left', `right', `full', `center', or `none'. +it can be `left', `right', `full', `center', or `none'. If HOW is t, will justify however the `current-justification' function says to. If HOW is nil or missing, full justification is done by default. Second arg EOP non-nil means that this is the last line of the paragraph, so @@ -831,14 +831,14 @@ otherwise it is made canonical." (let ((fc (current-fill-column)) (pos (point-marker)) fp-end ; point at end of fill prefix - beg ; point at beginning of line's text + start ; point at beginning of line's text end ; point at end of line's text - indent ; column of `beg' + indent ; column of `start' endcol ; column of `end' ncols) ; new indent point or offset (end-of-line) ;; Check if this is the last line of the paragraph. - (if (and use-hard-newlines (null eop) + (if (and use-hard-newlines (null eop) (get-text-property (point) 'hard)) (setq eop t)) (skip-chars-backward " \t") @@ -852,40 +852,40 @@ otherwise it is made canonical." (beginning-of-line) (skip-chars-forward " \t") ;; Skip over fill-prefix. - (if (and fill-prefix + (if (and fill-prefix (not (string-equal fill-prefix "")) (equal fill-prefix - (buffer-substring + (buffer-substring (point) (min (point-max) (+ (length fill-prefix) (point)))))) (forward-char (length fill-prefix)) - (if (and adaptive-fill-mode + (if (and adaptive-fill-mode (looking-at adaptive-fill-regexp)) (goto-char (match-end 0)))) (setq fp-end (point)) (skip-chars-forward " \t") ;; This is beginning of the line's text. (setq indent (current-column)) - (setq beg (point)) + (setq start (point)) (goto-char end) (setq endcol (current-column)) ;; HOW can't be null or left--we would have exited already - (cond ((eq 'right how) + (cond ((eq 'right how) (setq ncols (- fc endcol)) (if (< ncols 0) ;; Need to remove some indentation - (delete-region + (delete-region (progn (goto-char fp-end) (if (< (current-column) (+ indent ncols)) (move-to-column (+ indent ncols) t)) (point)) (progn (move-to-column indent) (point))) ;; Need to add some - (goto-char beg) + (goto-char start) (indent-to (+ indent ncols)) ;; If point was at beginning of text, keep it there. - (if (= beg pos) + (if (= start pos) (move-marker pos (point))))) ((eq 'center how) @@ -903,18 +903,18 @@ otherwise it is made canonical." (point)) (progn (move-to-column indent) (point))) ;; Have too little - add some - (goto-char beg) + (goto-char start) (indent-to ncols) ;; If point was at beginning of text, keep it there. - (if (= beg pos) + (if (= start pos) (move-marker pos (point))))) ((eq 'full how) ;; Insert extra spaces between words to justify line (save-restriction - (narrow-to-region beg end) + (narrow-to-region start end) (or nosqueeze - (canonically-space-region beg end)) + (canonically-space-region start end)) (goto-char (point-max)) (setq ncols (- fc endcol)) ;; Ncols is number of additional spaces needed @@ -956,10 +956,10 @@ extra spaces between words. It does nothing in other justification modes." (save-excursion (move-to-left-margin nil t) ;; Position ourselves after any fill-prefix. - (if (and fill-prefix + (if (and fill-prefix (not (string-equal fill-prefix "")) (equal fill-prefix - (buffer-substring + (buffer-substring (point) (min (point-max) (+ (length fill-prefix) (point)))))) (forward-char (length fill-prefix))) @@ -969,7 +969,7 @@ extra spaces between words. It does nothing in other justification modes." (defun unjustify-region (&optional begin end) "Remove justification whitespace from region. For centered or right-justified regions, this function removes any indentation -past the left margin from each line. For full-justified lines, it removes +past the left margin from each line. For full-justified lines, it removes extra spaces between words. It does nothing in other justification modes. Arguments BEGIN and END are optional; default is the whole buffer." (save-excursion @@ -1016,7 +1016,7 @@ MAIL-FLAG for a mail message, i. e. don't fill header lines." (goto-char min) (beginning-of-line) (narrow-to-region (point) max) - (if mailp + (if mailp (while (and (not (eobp)) (or (looking-at "[ \t]*[^ \t\n]+:") (looking-at "[ \t]*$"))) @@ -1040,7 +1040,7 @@ MAIL-FLAG for a mail message, i. e. don't fill header lines." (if (and adaptive-fill-mode adaptive-fill-regexp (looking-at adaptive-fill-regexp)) (match-string 0) - (buffer-substring + (buffer-substring (point) (save-excursion (skip-chars-forward " \t") (point)))) @@ -1055,7 +1055,7 @@ MAIL-FLAG for a mail message, i. e. don't fill header lines." (if fill-individual-varying-indent ;; If this line is a separator line, with or ;; without prefix, end the paragraph. - (and + (and (not (looking-at paragraph-separate)) (save-excursion (not (and (looking-at fill-prefix-regexp) diff --git a/lisp/float-sup.el b/lisp/float-sup.el index 11d409d..f034ecc 100644 --- a/lisp/float-sup.el +++ b/lisp/float-sup.el @@ -38,18 +38,16 @@ (error "Floating point was disabled at compile time")) ;; define pi and e via math-lib calls. (much less prone to killer typos.) -;; XEmacs change (purecopy) -(defconst pi (purecopy (* 4 (atan 1))) "The value of Pi (3.1415926...)") -(defconst e (purecopy (exp 1)) "The value of e (2.7182818...)") +(defconst pi (* 4 (atan 1)) "The value of Pi (3.1415926...)") +(defconst e (exp 1) "The value of e (2.7182818...)") ;; Careful when editing this file ... typos here will be hard to spot. ;; (defconst pi 3.14159265358979323846264338327 ;; "The value of Pi (3.14159265358979323846264338327...)") -;; XEmacs change (purecopy) -(defconst degrees-to-radians (purecopy (/ pi 180.0)) +(defconst degrees-to-radians (/ pi 180.0) "Degrees to radian conversion constant") -(defconst radians-to-degrees (purecopy (/ 180.0 pi)) +(defconst radians-to-degrees (/ 180.0 pi) "Radian to degree conversion constant") ;; these expand to a single multiply by a float when byte compiled diff --git a/lisp/font-lock.el b/lisp/font-lock.el index ee880bb..5a9452c 100644 --- a/lisp/font-lock.el +++ b/lisp/font-lock.el @@ -390,7 +390,7 @@ megabyte for buffers in `rmail-mode', and size is irrelevant otherwise." For example, an element of the first form highlights (if not already highlighted): - \"\\\\\" Discrete occurrences of \"foo\" in the value + \"\\\\\\=\" Discrete occurrences of \"foo\" in the value of the variable `font-lock-keyword-face'. (\"fu\\\\(bar\\\\)\" . 1) Substring \"bar\" within all occurrences of @@ -409,7 +409,7 @@ For example, an element of the first form highlights (if not already highlighted `fubar-match' finds and matches in the value of `fubar-face'. - (\"\\\\\" (0 anchor-face) (\"\\\\\" nil nil (0 item-face))) + (\"\\\\\\=\" (0 anchor-face) (\"\\\\\\=\" nil nil (0 item-face))) -------------- --------------- ------------ --- --- ------------- | | | | | | MATCHER | ANCHOR-MATCHER | +------+ MATCH-HIGHLIGHT @@ -909,11 +909,13 @@ See the variable `font-lock-keywords' for customization." ;;;###autoload (defun turn-on-font-lock () "Unconditionally turn on Font Lock mode." + (interactive) (font-lock-mode 1)) ;;;###autoload (defun turn-off-font-lock () "Unconditionally turn off Font Lock mode." + (interactive) (font-lock-mode 0)) ;;; FSF has here: @@ -2643,22 +2645,22 @@ The name is assumed to begin with a capital letter.") 3 (if (match-beginning 2) 'bold 'italic) keep)) "Default expressions to highlight in TeX modes.") -(defconst ksh-font-lock-keywords (purecopy +(defconst ksh-font-lock-keywords (list '("\\(^\\|[^\$\\\]\\)#.*" . font-lock-comment-face) '("\\<\\(if\\|then\\|else\\|elif\\|fi\\|case\\|esac\\|for\\|do\\|done\\|foreach\\|in\\|end\\|select\\|while\\|repeat\\|time\\|function\\|until\\|exec\\|command\\|coproc\\|noglob\\|nohup\\|nocorrect\\|source\\|autoload\\|alias\\|unalias\\|export\\|set\\|echo\\|eval\\|cd\\|log\\|compctl\\)\\>" . font-lock-keyword-face) '("\\<\\[\\[.*\\]\\]\\>" . font-lock-type-face) '("\$\(.*\)" . font-lock-type-face) - )) + ) "Additional expressions to highlight in ksh-mode.") -(defconst sh-font-lock-keywords (purecopy +(defconst sh-font-lock-keywords (list '("\\(^\\|[^\$\\\]\\)#.*" . font-lock-comment-face) '("\\<\\(if\\|then\\|else\\|elif\\|fi\\|case\\|esac\\|for\\|do\\|done\\|in\\|while\\|exec\\|export\\|set\\|echo\\|eval\\|cd\\)\\>" . font-lock-keyword-face) '("\\[.*\\]" . font-lock-type-face) '("`.*`" . font-lock-type-face) - )) + ) "Additional expressions to highlight in sh-mode.") diff --git a/lisp/font-menu.el b/lisp/font-menu.el index 14c680d..d1cb509 100644 --- a/lisp/font-menu.el +++ b/lisp/font-menu.el @@ -19,7 +19,7 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the +;; along with XEmacs; see the file COPYING. If not, write to the ;; Free Software Foundation, 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. @@ -158,7 +158,7 @@ the last entry in the menu." :type '(choice (string :tag "Format string") (function))) -(defvar font-menu-preferred-resolution +(defvar font-menu-preferred-resolution (make-specifier-and-init 'generic '((global ((mswindows) . ":") ((x) . "*-*"))) t) "Preferred horizontal and vertical font menu resolution (e.g. \"75:75\").") @@ -187,7 +187,7 @@ the last entry in the menu." This is run the first time that a font-menu is needed for each device. If you don't like the lazy invocation of this function, you can add it to `create-device-hook' and that will make the font menus respond more quickly -when they are selected for the first time. If you add fonts to your system, +when they are selected for the first time. If you add fonts to your system, or if you change your font path, you can call this to re-initialize the menus." (message "Getting list of fonts from server... ") (if (or noninteractive @@ -356,7 +356,7 @@ or if you change your font path, you can call this to re-initialize the menus." (when weight (signal 'error '("Setting weight currently not supported"))) (setq new-default-face-font - (font-menu-load-font + (font-menu-load-font (or family from-family) (or weight from-weight) (or size from-size) @@ -398,14 +398,14 @@ or if you change your font path, you can call this to re-initialize the menus." (/ (or size from-size) (specifier-instance font-menu-size-scaling (selected-device)))) - "pt"))) + "pt"))) (message "Font %s" (face-font-name 'default))))) (defun font-menu-change-face (face from-family from-weight from-size to-family to-weight to-size) - (or (symbolp face) (signal 'wrong-type-argument (list 'symbolp face))) + (or (symbolp face) (setq face (wrong-type-argument 'symbolp face))) (let* ((dcache (device-fonts-cache)) (font-data (font-menu-font-data face dcache)) (face-family (aref font-data 1)) @@ -422,7 +422,7 @@ or if you change your font path, you can call this to re-initialize the menus." ;; If its value is inherited, we don't touch it. If any of this ;; is not true, we leave it alone. (when (and (face-font face 'global) - (cond + (cond (to-family (string-equal face-family from-family)) (to-weight (string-equal face-weight from-weight)) (to-size (= face-size from-size)))) @@ -432,7 +432,7 @@ or if you change your font path, you can call this to re-initialize the menus." (or to-size face-size) face-slant (specifier-instance - font-menu-preferred-resolution + font-menu-preferred-resolution (selected-device))) (and font-menu-this-frame-only-p (selected-frame)))))) diff --git a/lisp/font.el b/lisp/font.el index 28bb05d..db52f88 100644 --- a/lisp/font.el +++ b/lisp/font.el @@ -299,7 +299,7 @@ for use in the 'weight' field of an X font string.") w2)))) (defun font-spatial-to-canonical (spec &optional device) - "Convert SPEC (in inches, millimeters, points, or picas) into points" + "Convert SPEC (in inches, millimeters, points, or picas) into points." ;; 1 in = 6 pa = 25.4 mm = 72 pt (cond ((numberp spec) diff --git a/lisp/format.el b/lisp/format.el index ae37ac1..50c522a 100644 --- a/lisp/format.el +++ b/lisp/format.el @@ -312,7 +312,7 @@ formats defined in `format-alist', or a list of such symbols." buffer-file-format)))) (format-encode-region (point-min) (point-max) format)) -(defun format-encode-region (beg end &optional format) +(defun format-encode-region (start end &optional format) "Translate the region into some FORMAT. FORMAT defaults to `buffer-file-format', it is a symbol naming one of the formats defined in `format-alist', or a list of such symbols." @@ -334,10 +334,10 @@ one of the formats defined in `format-alist', or a list of such symbols." ) (if to-fn (if modify - (setq end (format-encode-run-method to-fn beg end + (setq end (format-encode-run-method to-fn start end (current-buffer))) (format-insert-annotations - (funcall to-fn beg end (current-buffer))))) + (funcall to-fn start end (current-buffer))))) (setq format (cdr format))))))) (defun format-write-file (filename format) @@ -374,10 +374,10 @@ If FORMAT is nil then do not do any format conversion." (if format (format-decode-buffer format))) -(defun format-insert-file (filename format &optional beg end) +(defun format-insert-file (filename format &optional start end) "Insert the contents of file FILE using data format FORMAT. If FORMAT is nil then do not do any format conversion. -The optional third and fourth arguments BEG and END specify +The optional third and fourth arguments START and END specify the part of the file to read. The return value is like the value of `insert-file-contents': @@ -390,7 +390,7 @@ a list (ABSOLUTE-FILE-NAME . SIZE)." (list file fmt))) (let (value size) (let ((format-alist nil)) - (setq value (insert-file-contents filename nil beg end)) + (setq value (insert-file-contents filename nil start end)) (setq size (nth 1 value))) (if format (setq size (format-decode format size) @@ -412,7 +412,7 @@ Formats are defined in `format-alist'. Optional arg is the PROMPT to use." ;;; decoding functions for use in format-alist. ;;; -(defun format-replace-strings (alist &optional reverse beg end) +(defun format-replace-strings (alist &optional reverse start end) "Do multiple replacements on the buffer. ALIST is a list of (from . to) pairs, which should be proper arguments to `search-forward' and `replace-match' respectively. @@ -422,12 +422,12 @@ strings. Optional args BEGIN and END specify a region of the buffer to operate on." (save-excursion (save-restriction - (or beg (setq beg (point-min))) + (or start (setq start (point-min))) (if end (narrow-to-region (point-min) end)) (while alist (let ((from (if reverse (cdr (car alist)) (car (car alist)))) (to (if reverse (car (cdr alist)) (cdr (car alist))))) - (goto-char beg) + (goto-char start) (while (search-forward from nil t) (goto-char (match-beginning 0)) (insert to) diff --git a/lisp/frame.el b/lisp/frame.el index 8224377..f13e517 100644 --- a/lisp/frame.el +++ b/lisp/frame.el @@ -776,7 +776,7 @@ all frames that were visible, and iconify all frames that were not." (setq iconification-data (cdr iconification-data)))) (defun suspend-or-iconify-emacs () - "Call iconify-emacs if using a window system, otherwise call suspend-emacs." + "Call iconify-emacs if using a window system, otherwise suspend Emacs." (interactive) (cond ((device-on-window-system-p) (iconify-emacs)) @@ -1055,8 +1055,8 @@ prepended to the `default-frame-plist' when creating a frame for the first time. This function may be used as the value of `pre-display-buffer-function', -to cause the display-buffer function and its callers to exhibit the above -behavior." +to cause the `display-buffer' function and its callers to exhibit the +above behavior." (let ((frame (get-frame-for-buffer-noselect buffer not-this-window-p on-frame))) (if (not (eq frame (selected-frame))) @@ -1104,7 +1104,7 @@ is first in the list. VISIBLE-ONLY will only list non-iconified frames." :group 'frames) (defun show-temp-buffer-in-current-frame (buffer) - "For use as the value of temp-buffer-show-function: + "For use as the value of `temp-buffer-show-function': always displays the buffer in the selected frame, regardless of the behavior that would otherwise be introduced by the `pre-display-buffer-function', which is normally set to `get-frame-for-buffer' (which see)." diff --git a/lisp/gutter-items.el b/lisp/gutter-items.el index b1c75df..d5676d3 100644 --- a/lisp/gutter-items.el +++ b/lisp/gutter-items.el @@ -47,11 +47,16 @@ This option should be set through the options menu." 'buffers-tab val) (setq gutter-buffers-tab-visible-p val))) +(defcustom gutter-buffers-tab-enabled t + "*Whether to enable support for buffers tab in the gutter. +This is different to `gutter-buffers-tab-visible-p' which still runs hooks +even when the gutter is invisible." + :group 'buffers-tab + :type 'boolean) + (defvar gutter-buffers-tab-orientation 'top "Where the buffers tab currently is. Do not set this.") -(defvar gutter-buffers-tab-extent nil) - (defcustom buffers-tab-max-size 6 "*Maximum number of entries which may appear on the \"Buffers\" tab. If this is 10, then only the ten most-recently-selected buffers will be @@ -72,7 +77,7 @@ a large number or nil will slow down tab responsiveness." (defcustom buffers-tab-omit-function 'buffers-menu-omit-invisible-buffers "*If non-nil, a function specifying the buffers to omit from the buffers tab. This is passed a buffer and should return non-nil if the buffer should be -omitted. The default value `buffers-tab-omit-invisible-buffers' omits +omitted. The default value `buffers-menu-omit-invisible-buffers' omits buffers that are normally considered \"invisible\" (those whose name begins with a space)." :type '(choice (const :tag "None" nil) @@ -90,6 +95,18 @@ by `buffers-tab-grouping-regexp'." function) :group 'buffers-tab) +(defcustom buffers-tab-filter-functions (list buffers-tab-selection-function) + "*If non-nil, a list of functions specifying the buffers to select +from the buffers tab. +Each function in the list is passed two buffers, the buffer to +potentially select and the context buffer, and should return non-nil +if the first buffer should be selected. The default value groups +buffers by major mode and by `buffers-tab-grouping-regexp'." + + :type '(choice (const :tag "None" nil) + sexp) + :group 'buffers-tab) + (defcustom buffers-tab-sort-function nil "*If non-nil, a function specifying the buffers to select from the buffers tab. This is passed the buffer list and returns the list in the @@ -159,13 +176,14 @@ If this is 0, then the full buffer name will be shown." (select-window (car (windows-of-buffer buffer))) (switch-to-buffer buffer)))) -(defun select-buffers-tab-buffers-by-mode (buf1 buf2) +(defun select-buffers-tab-buffers-by-mode (buffer-to-select buf1) "For use as a value of `buffers-tab-selection-function'. This selects buffers by major mode `buffers-tab-grouping-regexp'." (let ((mode1 (symbol-name (symbol-value-in-buffer 'major-mode buf1))) - (mode2 (symbol-name (symbol-value-in-buffer 'major-mode buf2))) + (mode2 (symbol-name (symbol-value-in-buffer 'major-mode + buffer-to-select))) (modenm1 (symbol-value-in-buffer 'mode-name buf1)) - (modenm2 (symbol-value-in-buffer 'mode-name buf2))) + (modenm2 (symbol-value-in-buffer 'mode-name buffer-to-select))) (cond ((or (eq mode1 mode2) (eq modenm1 modenm2) (and (string-match "^[^-]+-" mode1) @@ -212,32 +230,25 @@ This just returns the buffer's name, optionally truncated." (when selected (setq selected nil)))) buffers))) -;;; #### SJT I'd really like this function to have just two hooks: (1) the -;;; buffer filter list and (2) a sort function list. Both should be lists -;;; of functions. Each filter takes two arguments: a buffer and a model -;;; buffer. (The model buffer argument allows selecting according to the -;;; mode or directory of that buffer.) The filter returns t if the buffer -;;; should be listed and nil otherwise. Effectively the filter amounts to -;;; the conjuction of the filter list. (Optionally the filter could take a -;;; frame instead of a buffer or generalize to a locale as in a specifier?) -;;; The filtering is done this way to preserve the ordering imposed by -;;; `buffer-list'. In addition, the in-deletion argument will be used the -;;; same way as in the current design. -;;; The list is checked for length and pruned according to least-recently- -;;; selected. (Optionally there could be some kind of sort function here, -;;; too.) -;;; Finally the list is sorted to gutter display order, and the tab data -;;; structure is created and returned. -;;; #### Docstring isn't very well expressed. +;;; #### SJT would like this function to have a sort function list. I +;;; don't see how this could work given that sorting is not +;;; cumulative --andyp. (defun buffers-tab-items (&optional in-deletion frame force-selection) - "This is the tab filter for the top-level buffers \"Buffers\" tab. -It dynamically creates a list of buffers to use as the contents of the tab. -Only the most-recently-used few buffers will be listed on the tab, for -efficiency reasons. You can control how many buffers will be shown by -setting `buffers-tab-max-size'. You can control the text of the tab -items by redefining the function `format-buffers-menu-line'." + "Return a list of tab instantiators based on the current buffers list. +This function is used as the tab filter for the top-level buffers +\"Buffers\" tab. It dynamically creates a list of tab instantiators +to use as the contents of the tab. The contents and order of the list +is controlled by `buffers-tab-filter-functions' which by default +groups buffers according to major mode and removes invisible buffers. +You can control how many buffers will be shown by setting +`buffers-tab-max-size'. You can control the text of the tab items by +redefining the function `format-buffers-menu-line'." (save-match-data - (let* ((buffers (delete-if buffers-tab-omit-function (buffer-list frame))) + ;; NB it is too late if we run the omit function as part of the + ;; filter functions because we need to know which buffer is the + ;; context buffer before they get run. + (let* ((buffers (delete-if + buffers-tab-omit-function (buffer-list frame))) (first-buf (car buffers))) ;; maybe force the selected window (when (and force-selection @@ -249,11 +260,19 @@ items by redefining the function `format-buffers-menu-line'." (when in-deletion (setq buffers (delq (current-buffer) buffers)) (setq first-buf (car buffers))) - ;; select buffers in group (default is by mode) - (when buffers-tab-selection-function - (delete-if-not #'(lambda (buf) - (funcall buffers-tab-selection-function - first-buf buf)) buffers)) + ;; filter buffers + (when buffers-tab-filter-functions + (setq buffers + (delete-if + #'null + (mapcar #'(lambda (buf) + (let ((tmp-buf buf)) + (mapc #'(lambda (fun) + (unless (funcall fun buf first-buf) + (setq tmp-buf nil))) + buffers-tab-filter-functions) + tmp-buf)) + buffers)))) ;; maybe shorten list of buffers (and (integerp buffers-tab-max-size) (> buffers-tab-max-size 1) @@ -269,14 +288,11 @@ items by redefining the function `format-buffers-menu-line'." (defun add-tab-to-gutter () "Put a tab control in the gutter area to hold the most recent buffers." (setq gutter-buffers-tab-orientation (default-gutter-position)) - (let ((gutter-string (copy-sequence "\n"))) - (unless gutter-buffers-tab-extent - (setq gutter-buffers-tab-extent (make-extent 0 1 gutter-string))) - (set-extent-begin-glyph - gutter-buffers-tab-extent - (setq gutter-buffers-tab - (make-glyph))) - + (let* ((gutter-string (copy-sequence "\n")) + (gutter-buffers-tab-extent (make-extent 0 1 gutter-string))) + (set-extent-begin-glyph gutter-buffers-tab-extent + (setq gutter-buffers-tab + (make-glyph))) ;; Nuke all existing tabs (remove-gutter-element top-gutter 'buffers-tab) (remove-gutter-element bottom-gutter 'buffers-tab) @@ -298,17 +314,11 @@ items by redefining the function `format-buffers-menu-line'." ((eq gutter-buffers-tab-orientation 'left) (set-specifier left-gutter-border-width 0 'global x) (set-gutter-element left-gutter 'buffers-tab - gutter-string 'global x) - (set-specifier left-gutter-width - (glyph-width gutter-buffers-tab) - 'global x)) + gutter-string 'global x)) ((eq gutter-buffers-tab-orientation 'right) (set-specifier right-gutter-border-width 0 'global x) (set-gutter-element right-gutter 'buffers-tab - gutter-string 'global x) - (set-specifier right-gutter-width - (glyph-width gutter-buffers-tab) - 'global x)) + gutter-string 'global x)) ))) (console-type-list)))) @@ -333,21 +343,33 @@ items by redefining the function `format-buffers-menu-line'." (eq gutter-buffers-tab-orientation 'bottom)) '(gutter-pixel-width) '(gutter-pixel-height)) :items (buffers-tab-items nil frame force-selection)) - frame))))) + frame) + ;; set-glyph-image will not make the gutter dirty + (set-specifier-dirty-flag + (eval (intern (concat + (symbol-name gutter-buffers-tab-orientation) + "-gutter")))))))) ;; A myriad of different update hooks all doing slightly different things -(add-hook 'create-frame-hook - #'(lambda (frame) - (when gutter-buffers-tab (update-tab-in-gutter frame t)))) -(add-hook 'buffer-list-changed-hook 'update-tab-in-gutter) -(add-hook 'default-gutter-position-changed-hook - #'(lambda () - (when gutter-buffers-tab - (mapc #'update-tab-in-gutter (frame-list))))) -(add-hook 'gutter-element-visibility-changed-hook - #'(lambda (prop visible-p) - (when (and (eq prop 'buffers-tab) visible-p) - (mapc #'update-tab-in-gutter (frame-list))))) +(add-one-shot-hook + 'after-init-hook + #'(lambda () + ;; don't add the hooks if the user really doesn't want them + (when gutter-buffers-tab-enabled + (add-hook 'create-frame-hook + #'(lambda (frame) + (when gutter-buffers-tab (update-tab-in-gutter frame t)))) + (add-hook 'buffer-list-changed-hook 'update-tab-in-gutter) + (add-hook 'default-gutter-position-changed-hook + #'(lambda () + (when gutter-buffers-tab + (mapc #'update-tab-in-gutter (frame-list))))) + (add-hook 'gutter-element-visibility-changed-hook + #'(lambda (prop visible-p) + (when (and (eq prop 'buffers-tab) visible-p) + (mapc #'update-tab-in-gutter (frame-list))))) + (update-tab-in-gutter (selected-frame) t)))) + ;; ;; progress display ;; ripped off from message display diff --git a/lisp/gutter.el b/lisp/gutter.el index 44df9a0..19283da 100644 --- a/lisp/gutter.el +++ b/lisp/gutter.el @@ -60,15 +60,15 @@ element in the gutter changes. The value of this variable may be buffer-local. The gutter element symbol is passed as an argument to the hook, as is the visibility flag.") -(defun set-gutter-element (gutter-specifier prop val &optional locale tag-set) - "Set GUTTER-SPECIFIER gutter element PROP to VAL in optional LOCALE. +(defun set-gutter-element (gutter-specifier prop value &optional locale tag-set) + "Set GUTTER-SPECIFIER gutter element PROP to VALUE in optional LOCALE. This is a convenience function for setting gutter elements. -VAL in general must be a string. If VAL is a glyph then a string will be -created to put the glyph into." - (let ((spec val)) - (when (glyphp val) +VALUE in general must be a string. If VALUE is a glyph then a string +will be created to put the glyph into." + (let ((spec value)) + (when (glyphp value) (setq spec (copy-sequence "\n")) - (set-extent-begin-glyph (make-extent 0 1 spec) val)) + (set-extent-begin-glyph (make-extent 0 1 spec) value)) (map-extents #'(lambda (extent arg) (set-extent-property extent 'duplicable t)) spec) (modify-specifier-instances gutter-specifier #'plist-put (list prop spec) diff --git a/lisp/help.el b/lisp/help.el index ab95b37..b07aa17 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -51,7 +51,7 @@ (defvar help-map (let ((map (make-sparse-keymap))) (set-keymap-name map 'help-map) (set-keymap-prompt - map (purecopy (gettext "(Type ? for further options)"))) + map (gettext "(Type ? for further options)")) map) "Keymap for characters following the Help key.") @@ -304,7 +304,7 @@ otherwise it is killed." Like `key-binding', but handles menu events and toolbar presses correctly. KEY is any value returned by `next-command-event'. MENU-FLAG is a symbol that should be set to t if KEY is a menu event, - or nil otherwise" + or nil otherwise." (let (defn) (and menu-flag (set menu-flag nil)) ;; If the key typed was really a menu selection, grab the form out @@ -663,10 +663,10 @@ describes the minor mode." (defun describe-bindings (&optional prefix mouse-only-p) "Show a list of all defined keys, and their definitions. The list is put in a buffer, which is displayed. -If the optional argument PREFIX is supplied, only commands which -start with that sequence of keys are described. -If the second argument (prefix arg, interactively) is non-null -then only the mouse bindings are displayed." +If optional first argument PREFIX is supplied, only commands +which start with that sequence of keys are described. +If optional second argument MOUSE-ONLY-P (prefix arg, interactively) +is non-nil then only the mouse bindings are displayed." (interactive (list nil current-prefix-arg)) (with-displaying-help-buffer (lambda () @@ -883,7 +883,7 @@ The number of messages shown is controlled by `view-lossage-message-count'." help-map) (defmacro with-syntax-table (syntab &rest body) - "Evaluate BODY with the syntax-table SYNTAB" + "Evaluate BODY with the SYNTAB as the current syntax table." `(let ((stab (syntax-table))) (unwind-protect (progn @@ -1164,7 +1164,7 @@ part of the documentation of internal subroutines." (defvar help-symbol-function-and-variable-context-menu '("---" - ["View Function %_Documentation" (help-symbol-run-function + ["View Function %_Documentation" (help-symbol-run-function 'describe-function)] ["View Variable D%_ocumentation" (help-symbol-run-function 'describe-variable)] diff --git a/lisp/hyper-apropos.el b/lisp/hyper-apropos.el index 7725839..7194df8 100644 --- a/lisp/hyper-apropos.el +++ b/lisp/hyper-apropos.el @@ -1085,12 +1085,13 @@ Deletes lines which match PATTERN." nil (forward-char 3) (read (point-marker)))) - ((and - (eq major-mode 'hyper-apropos-help-mode) - (> (point) (point-min))) - (save-excursion - (goto-char (point-min)) - (hyper-apropos-this-symbol))) + ;; What's this? This ends up in the same symbol already described. +;; ((and +;; (eq major-mode 'hyper-apropos-help-mode) +;; (> (point) (point-min))) +;; (save-excursion +;; (goto-char (point-min)) +;; (hyper-apropos-this-symbol))) (t (let* ((st (progn (skip-syntax-backward "w_") diff --git a/lisp/indent.el b/lisp/indent.el index adf2485..5c642cf 100644 --- a/lisp/indent.el +++ b/lisp/indent.el @@ -64,9 +64,9 @@ Default number of columns for margin-changing functions to indent.") ;; XEmacs: (Need the `1+') (indent-to (* tab-width (1+ (/ (current-column) tab-width))))))) -(defun indent-rigidly (start end arg) - "Indent all lines starting in the region sideways by ARG columns. -Called from a program, takes three arguments, START, END and ARG." +(defun indent-rigidly (start end count) + "Indent all lines starting in the region sideways by COUNT columns. +Called from a program, takes three arguments, START, END and COUNT." (interactive "r\np") (save-excursion (goto-char end) @@ -80,7 +80,7 @@ Called from a program, takes three arguments, START, END and ARG." (skip-chars-forward " \t") (setq eol-flag (eolp))) (or eol-flag - (indent-to (max 0 (+ indent arg)) 0)) + (indent-to (max 0 (+ indent count)) 0)) (delete-region (point) (progn (skip-chars-forward " \t") (point)))) (forward-line 1)) (move-marker end nil) @@ -139,7 +139,8 @@ interactively or with optional argument FORCE, it will be fixed." (defun delete-to-left-margin (&optional from to) "Remove left margin indentation from a region. -This deletes to the column given by `current-left-margin'. +The amount of indentation to delete is determined by calling the +function `current-left-margin'. In no case will it delete non-whitespace. Args FROM and TO are optional; default is the whole buffer." (save-excursion @@ -264,16 +265,16 @@ If `auto-fill-mode' is active, re-fills region to fit in new margin." With optional argument, move forward N-1 lines first. From the beginning of the line, moves past the left-margin indentation, the fill-prefix, and any indentation used for centering or right-justifying the -line, but does not move past any whitespace that was explicitly inserted +line, but does not move past any whitespace that was explicitly inserted \(such as a tab used to indent the first line of a paragraph)." (interactive "p") (beginning-of-line n) (skip-chars-forward " \t") ;; Skip over fill-prefix. - (if (and fill-prefix + (if (and fill-prefix (not (string-equal fill-prefix ""))) (if (equal fill-prefix - (buffer-substring + (buffer-substring (point) (min (point-max) (+ (length fill-prefix) (point))))) (forward-char (length fill-prefix))) (if (and adaptive-fill-mode adaptive-fill-regexp diff --git a/lisp/info.el b/lisp/info.el index b2e266e..bc8f765 100644 --- a/lisp/info.el +++ b/lisp/info.el @@ -428,9 +428,9 @@ nil or `never', the default, auto-generated info directory (const :tag "conservative" conservative)) :group 'info) -(defvar Info-emacs-info-file-name "xemacs.info" - "The filename of the XEmacs info for -`Info-goto-emacs-command-node' (`\\\\[Info-goto-emacs-command-node]')") +(defconst Info-emacs-info-file-name "xemacs.info" + "The filename of the XEmacs info for `Info-goto-emacs-command-node' +(`\\\\[Info-goto-emacs-command-node]')") ;;;###autoload (defvar Info-directory-list nil @@ -447,12 +447,10 @@ from .emacs. For instance: (setq Info-directory-list (cons \"~/info\" Info-directory-list))") -(defcustom Info-localdir-heading-regexp - "^Locally installed XEmacs Packages:?" +;; This could as well be hard-coded since ${srcdir}/info/dir is in CVS --dv +(defconst Info-localdir-heading-regexp "^Local Packages:$" "The menu part of localdir files will be inserted below this topic -heading." - :type 'regexp - :group 'info) +heading.") (defface info-node '((t (:bold t :italic t))) "Face used for node links in info." @@ -462,25 +460,41 @@ heading." "Face used for cross-references in info." :group 'info-faces) -;; Is this right for NT? .zip, with -c for to stdout, right? -(defvar Info-suffix-list '( ("" . nil) - (".info" . nil) - (".info.bz2" . "bzip2 -dc %s") - (".info.gz" . "gzip -dc %s") - (".info-z" . "gzip -dc %s") - (".info.Z" . "uncompress -c %s") - (".bz2" . "bzip2 -dc %s") - (".gz" . "gzip -dc %s") - (".Z" . "uncompress -c %s") - (".zip" . "unzip -c %s") ) - "List of file name suffixes and associated decoding commands. +;; This list is based on Karl Berry-s advice about extensions `info' itself +;; might encounter. --dv +(defcustom Info-suffix-list '(("" . nil) + (".info" . nil) + (".gz" . "gzip -dc %s") + (".info.gz" . "gzip -dc %s") + (".z" . "gzip -dc %s") + (".info.z" . "gzip -dc %s") + (".bz2" . "bzip2 -dc %s") + (".info.bz2" . "bzip2 -dc %s") + (".Z" . "uncompress -c %s") + (".info.Z" . "uncompress -c %s") + (".zip" . "unzip -c %s") + (".info.zip" . "unzip -c %s") + (".y" . "cat %s | unyabba") + ("info.y" . "cat %s | unyabba") + ;; These ones are for MS-DOS filenames. + (".inf" . nil) + (".igz" . "gzip -dc %s") + (".inz" . "gzip -c %s")) + "*List of file name suffixes and associated decoding commands. Each entry should be (SUFFIX . STRING); if STRING contains %s, that is changed to name of the file to decode, otherwise the file is given to -the command as standard input. If STRING is nil, no decoding is done.") +the command as standard input. If STRING is nil, no decoding is done." + :type '(repeat (cons (string :tag "suffix") + (choice :tag "command" + (const :tag "none" :value nil) + (string :tag "")))) + :group 'info) -(defvar Info-footnote-tag "Note" +(defcustom Info-footnote-tag "Note" "*Symbol that identifies a footnote or cross-reference. -All \"*Note\" references will be changed to use this word instead.") +All \"*Note\" references will be changed to use this word instead." + :type 'string + :group 'info) (defvar Info-current-file nil "Info file that Info is now looking at, or nil. @@ -508,6 +522,7 @@ Marker points nowhere if file has no tag table.") (defvar Info-index-alternatives nil "List of possible matches for last Info-index command.") + (defvar Info-index-first-alternative nil) (defcustom Info-annotations-path @@ -545,8 +560,10 @@ File: dir Node: Top This is the top of the INFO tree ") -(defvar Info-no-description-string "[No description available]" - "Description string for info files that have none") +(defcustom Info-no-description-string "[No description available]" + "*Description string for info files that have none" + :type 'string + :group 'info) ;;;###autoload (defun info (&optional file) @@ -610,13 +627,16 @@ further (recursive) error recovery. TRYFILE is ??" (Info-find-file-node nil nodename no-going-back tryfile line)) ;; Convert filename to lower case if not found as specified. ;; Expand it, look harder... - ((let (temp temp-downcase found - (fname (substitute-in-file-name filename))) + ((let ((fname (substitute-in-file-name filename)) + temp found) (let ((dirs (cond - ((string-match "^\\./" fname) ; If specified name starts with `./' - (list default-directory)) ; then just try current directory. + ;; If specified name starts with `./', then just try + ;; current directory. No point in searching for an absolute + ;; file name + ((string-match "^\\./" fname) + (list default-directory)) ((file-name-absolute-p fname) - '(nil)) ; No point in searching for an absolute file name + '(nil)) (Info-additional-search-directory-list (append Info-directory-list Info-additional-search-directory-list)) @@ -624,12 +644,7 @@ further (recursive) error recovery. TRYFILE is ??" ;; Search the directory list for file FNAME. (while (and dirs (not found)) (setq temp (expand-file-name fname (car dirs))) - (setq temp-downcase - (expand-file-name (downcase fname) (car dirs))) - (if (equal temp-downcase temp) (setq temp-downcase nil)) - ;; Try several variants of specified name. - ;; Try downcasing, appending a suffix, or both. - (setq found (Info-suffixed-file temp temp-downcase)) + (setq found (Info-suffixed-file temp)) (setq dirs (cdr dirs))) (if found (progn (setq filename (expand-file-name found)) @@ -742,10 +757,10 @@ further (recursive) error recovery. TRYFILE is ??" (set-buffer (marker-buffer Info-tag-table-marker)) (goto-char m) (setq foun (re-search-forward regexp nil t)) - (if foun + (if foun (setq guesspos (read (current-buffer)))) (setq found-mode major-mode)) - (if foun + (if foun ;; If this is an indirect file, ;; determine which file really holds this node ;; and read it in. @@ -820,7 +835,7 @@ further (recursive) error recovery. TRYFILE is ??" (defun Info-insert-dir () "Construct the Info directory node by merging the files named -\"dir\" or \"localdir\" from the directories in `Info-directory-list' +\"dir\" or \"localdir\" from the directories in `Info-directory-list'. The \"dir\" files will take precedence in cases where both exist. It sets the *info* buffer's `default-directory' to the first directory we actually get any text from." @@ -846,25 +861,26 @@ actually get any text from." (let ((truename (file-truename (expand-file-name (car dirs))))) (or (member truename dirs-done) (member (directory-file-name truename) dirs-done) - ;; Try several variants of specified name. - ;; Try upcasing, appending `.info', or both. - (let* (buf - file - (attrs - (or - (progn (setq file (expand-file-name "dir" truename)) - (file-attributes file)) - (progn (setq file (expand-file-name "DIR" truename)) - (file-attributes file)) - (progn (setq file (expand-file-name "dir.info" truename)) - (file-attributes file)) - (progn (setq file (expand-file-name "DIR.INFO" truename)) - (file-attributes file)) - (progn (setq file (expand-file-name "localdir" truename)) - (file-attributes file)) - (progn (setq file (expand-file-name "dir" truename)) - nil) - ))) + ;; Karl Berry recently added the ability all possibilities for + ;; extension as for normal info files. This code however is + ;; still unsatisfactory: if one day, we find a compressed dir + ;; file (which looks possible), we should be able to handle it + ;; (which means decompress and read it, update it, save and + ;; recompress it). --dv + (let ((trials '("dir" "DIR" + "dir.info" "DIR.INFO" + "dir.inf" "DIR.INF" + "localdir" "LOCALDIR" + "localdir.info" "LOCALDIR.INFO" + "localdir.inf" "LOCALDIR.INF")) + buf file attrs) + (catch 'found + (while (setq file (pop trials)) + (setq file (expand-file-name file truename)) + (and (setq attrs (file-attributes file)) + (throw 'found t)))) + (unless file + (setq file (expand-file-name "dir" truename))) (setq dirs-done (cons truename (cons (directory-file-name truename) @@ -1020,10 +1036,55 @@ actually get any text from." (setq default-directory Info-dir-contents-directory) (setq buffer-file-name (caar Info-dir-file-attributes))) +(defmacro Info-directory-files (dir-file &optional all full nosort files-only) + "Return a list of Info files living in the same directory as DIR-FILE. +This list actually contains the files living in this directory, except for +the dir file itself and the secondary info files (foo-1 foo-2 etc). + +If the optional argument ALL is non nil, the secondary info files are also +included in the list. + +Please refer to the function `directory-files' for the meaning of the other +optional arguments." + `(let* ((dir (file-name-directory ,dir-file)) + (all-files (remove ,dir-file (directory-files dir ',full nil ',nosort + ',files-only)))) + (setq all-files + (if ,full + (remove (concat dir ".") + (remove (concat dir "..") all-files)) + (remove "." + (remove ".." all-files)))) + (if ,all + all-files + (let ((suff-match + (concat "-[0-9]+\\(" + ;; Extract all known compression suffixes from + ;; Info-suffix-list. These suffixes can typically be + ;; found in entries of the form `.info.something'. + (let ((suff-list Info-suffix-list) + suff regexp) + (while (setq suff (pop suff-list)) + (and (string-match "^\\.info" (car suff)) + (setq regexp (concat regexp + (regexp-quote + (substring + (car suff) 5)) + (and suff-list "\\|"))))) + regexp) + "\\)?$")) + info-files file) + (while (setq file (pop all-files)) + (or (string-match suff-match file) + (push file info-files))) + (reverse info-files) + )) + )) + (defun Info-maybe-update-dir (file) "Rebuild dir or localdir according to `Info-auto-generate-directory'." (unless (or (not (file-exists-p (file-name-directory file))) - (null (directory-files (file-name-directory file) nil "\\.info"))) + (null (Info-directory-files file 'all))) (if (not (find-buffer-visiting file)) (if (not (file-exists-p file)) (if (or (eq Info-auto-generate-directory 'always) @@ -1042,8 +1103,7 @@ actually get any text from." dir or localdir are outdated when an info file in the same directory has been modified more recently." (let ((dir-mod-time (nth 5 (file-attributes file))) - f-mod-time - newer) + f-mod-time newer) (setq Info-dir-newer-info-files nil) (mapcar #'(lambda (f) @@ -1051,22 +1111,18 @@ directory has been modified more recently." (setq f-mod-time (nth 5 (file-attributes f))) (setq newer (or (> (car f-mod-time) (car dir-mod-time)) (and (= (car f-mod-time) (car dir-mod-time)) - (> (car (cdr f-mod-time)) (car (cdr dir-mod-time)))))) - (if (and (file-readable-p f) - newer) + (> (car (cdr f-mod-time)) + (car (cdr dir-mod-time)))))) + (if (and (file-readable-p f) newer) (setq Info-dir-newer-info-files (cons f Info-dir-newer-info-files))))) - (directory-files (file-name-directory file) - 'fullname - ".*\\.info\\(\\.gz\\|\\.bz2\\|\\.Z\\|-z\\|\\.zip\\)?$" - 'nosort - t)) + (Info-directory-files file nil 'fullname 'nosort t)) Info-dir-newer-info-files)) (defun Info-extract-dir-entry-from (file) "Extract the dir entry from the info FILE. The dir entry is delimited by the markers `START-INFO-DIR-ENTRY' -and `END-INFO-DIR-ENTRY'" +and `END-INFO-DIR-ENTRY'." (save-excursion (set-buffer (get-buffer-create " *Info-tmp*")) (when (file-readable-p file) @@ -1080,15 +1136,16 @@ and `END-INFO-DIR-ENTRY'" (goto-char (match-beginning 0)) (car (Info-parse-dir-entries beg (point))))))))) -;; Parse dir entries contained between BEG and END into a list of the form +;; Parse dir entries contained between START and END into a list of the form ;; (filename topic node (description-line-1 description-line-2 ...)) -(defun Info-parse-dir-entries (beg end) +(defun Info-parse-dir-entries (start end) (let (entry entries) (save-excursion (save-restriction - (narrow-to-region beg end) - (goto-char beg) - (while (re-search-forward "^\\* \\([^:]+\\):\\([ \t]*(\\([^)]*\\))\\w*\\.\\|:\\)" nil t) + (narrow-to-region start end) + (goto-char start) + (while (re-search-forward + "^\\* \\([^:]+\\):\\([ \t]*(\\([^)]*\\))\\w*\\.\\|:\\)" nil t) (setq entry (list (match-string 2) (match-string 1) (downcase (or (match-string 3) @@ -1135,36 +1192,31 @@ and `END-INFO-DIR-ENTRY'" (defun Info-build-dir-anew (directory) "Build info directory information for DIRECTORY. The generated directory listing may be saved to a `dir' according -to the value of `Info-save-auto-generated-dir'" +to the value of `Info-save-auto-generated-dir'." (save-excursion (let* ((dirfile (expand-file-name "dir" directory)) (to-temp (or (null Info-save-auto-generated-dir) (eq Info-save-auto-generated-dir 'never) (and (not (file-writable-p dirfile)) - (message "File not writable %s. Using temporary." dirfile)))) - (info-files - (directory-files directory - 'fullname - ".*\\.info\\(.gz\\|.Z\\|-z\\|.zip\\)?$" - nil - t))) + (message "File not writable %s. Using temporary." + dirfile)))) + (info-files (Info-directory-files dirfile nil 'fullname nil t))) (if to-temp (message "Creating temporary dir in %s..." directory) (message "Creating %s..." dirfile)) (set-buffer (find-file-noselect dirfile t)) (setq buffer-read-only nil) (erase-buffer) - (insert Info-dir-prologue - "Info files in " directory ":\n\n") + (insert Info-dir-prologue "Info files in " directory ":\n\n") (Info-dump-dir-entries (mapcar #'(lambda (f) (or (Info-extract-dir-entry-from f) (list 'dummy - (progn - (string-match "\\(.*\\)\\.info\\(.gz\\|.Z\\|-z\\|.zip\\)?$" - (file-name-nondirectory f)) - (capitalize (match-string 1 (file-name-nondirectory f)))) + (progn (string-match "\\([^.]*\\)\\(\\..*\\)?$" + (file-name-nondirectory f)) + (capitalize + (match-string 1 (file-name-nondirectory f)))) ":" (list Info-no-description-string)))) info-files)) @@ -1182,7 +1234,7 @@ Description of info files are merged from the info files in the directory and the contents of FILE with the description in info files taking precedence over descriptions in FILE. The generated directory listing may be saved to a `dir' according to -the value of `Info-save-auto-generated-dir' " +the value of `Info-save-auto-generated-dir'." (save-excursion (save-restriction (let (dir-section-contents dir-full-contents @@ -1198,7 +1250,8 @@ the value of `Info-save-auto-generated-dir' " (message "File not writable %s. Using temporary." file)) (and (eq Info-save-auto-generated-dir 'conservative) (or (and (not (file-writable-p file)) - (message "File not writable %s. Using temporary." file)) + (message + "File not writable %s. Using temporary." file)) (not (y-or-n-p (message "%s is outdated. Overwrite ? " file)))))))) @@ -1216,13 +1269,14 @@ the value of `Info-save-auto-generated-dir' " (match-beginning 0)))) (throw 'done nil)) (setq dir-full-contents (Info-parse-dir-entries mark (point-max))) - (setq next-section (or (and (re-search-forward "^[^* \t].*:[ \t]*$" nil t) + (setq next-section (or (and (re-search-forward "^[^* \t].*:[ \t]*$" + nil t) (match-beginning 0)) (point-max))) (while next-section (narrow-to-region mark next-section) - (setq dir-section-contents (nreverse (Info-parse-dir-entries (point-min) - (point-max)))) + (setq dir-section-contents (nreverse (Info-parse-dir-entries + (point-min) (point-max)))) (mapcar #'(lambda (file) (setq dir-entry (assoc (downcase @@ -1232,8 +1286,8 @@ the value of `Info-save-auto-generated-dir' " file-dir-entry (Info-extract-dir-entry-from file)) (if dir-entry (if file-dir-entry - ;; A dir entry in the info file takes precedence over an - ;; existing entry in the dir file + ;; A dir entry in the info file takes precedence over + ;; an existing entry in the dir file (setcdr dir-entry (cdr file-dir-entry))) (unless (or not-first-section (assoc (downcase @@ -1241,12 +1295,13 @@ the value of `Info-save-auto-generated-dir' " (file-name-nondirectory file))) dir-full-contents)) (if file-dir-entry - (setq dir-section-contents (cons file-dir-entry - dir-section-contents)) + (setq dir-section-contents + (cons file-dir-entry dir-section-contents)) (setq dir-section-contents (cons (list 'dummy (capitalize (file-name-sans-extension - (file-name-nondirectory file))) + (file-name-nondirectory + file))) ":" (list Info-no-description-string)) dir-section-contents)))))) @@ -1259,7 +1314,8 @@ the value of `Info-save-auto-generated-dir' " (or (setq mark (and (re-search-forward "^\\* " nil t) (match-beginning 0))) (throw 'done nil)) - (setq next-section (or (and (re-search-forward "^[^* \t].*:[ \t]*$" nil t) + (setq next-section (or (and (re-search-forward + "^[^* \t].*:[ \t]*$" nil t) (match-beginning 0)) (point-max)))) (setq not-first-section t))) @@ -1272,11 +1328,12 @@ the value of `Info-save-auto-generated-dir' " ;;;###autoload (defun Info-batch-rebuild-dir () - "(Re)build info `dir' files in the directories remaining on the command line. -Use this from the command line, with `-batch'; -it won't work in an interactive Emacs. -Each file is processed even if an error occurred previously. -For example, invoke \"xemacs -batch -f Info-batch-rebuild-dir /usr/local/info\"" + "(Re)build `dir' files in the directories remaining on the command line. +Use this from the command line, with `-batch', it won't work in an +interactive XEmacs. + +Each file is processed even if an error occurred previously. For example, +invoke \"xemacs -batch -f Info-batch-rebuild-dir /usr/local/info\"." ;; command-line-args-left is what is left of the command line (from ;; startup.el) (defvar command-line-args-left) ; Avoid 'free variable' warning @@ -1289,7 +1346,8 @@ For example, invoke \"xemacs -batch -f Info-batch-rebuild-dir /usr/local/info\"" (message "Warning: Skipped %s. Not a directory." (car command-line-args-left)) (setq dir (expand-file-name "dir" (car command-line-args-left))) - (setq localdir (expand-file-name "localdir" (car command-line-args-left))) + (setq localdir (expand-file-name "localdir" + (car command-line-args-left))) (cond ((file-exists-p dir) (Info-rebuild-dir dir)) @@ -1331,10 +1389,10 @@ For example, invoke \"xemacs -batch -f Info-batch-rebuild-dir /usr/local/info\"" (catch 'foo (while (not (looking-at "\^_")) (if (not (eolp)) - (let ((beg (point)) + (let ((start (point)) thisfilepos thisfilename) (search-forward ": ") - (setq thisfilename (buffer-substring beg (- (point) 2))) + (setq thisfilename (buffer-substring start (- (point) 2))) (setq thisfilepos (read (current-buffer))) ;; read in version 19 stops at the end of number. ;; Advance to the next line. @@ -1353,7 +1411,8 @@ For example, invoke \"xemacs -batch -f Info-batch-rebuild-dir /usr/local/info\"" (Info-insert-file-contents (Info-suffixed-file (expand-file-name lastfilename (file-name-directory - Info-current-file))) + Info-current-file)) + 'exact) t) (set-buffer-modified-p nil) (setq Info-current-subfile lastfilename))) @@ -1361,36 +1420,90 @@ For example, invoke \"xemacs -batch -f Info-batch-rebuild-dir /usr/local/info\"" (search-forward "\n\^_") (+ (- nodepos lastfilepos) (point)))) -(defun Info-suffixed-file (name &optional name2) - "Look for NAME with each of the `Info-suffix-list' extensions in -turn. Optional NAME2 is the name of a fallback info file to check -for; usually a downcased version of NAME." - (let ((suff Info-suffix-list) - (found nil) - file file2) - (while (and suff (not found)) - (setq file (concat name (caar suff)) - file2 (and name2 (concat name2 (caar suff)))) - (cond - ((file-regular-p file) - (setq found file)) - ((and file2 (file-regular-p file2)) - (setq found file2)) - (t - (setq suff (cdr suff))))) - (or found - (and name (when (file-regular-p name) - name)) - (and name2 (when (file-regular-p name2) - name2))))) +(defun Info-all-case-regexp (str) + (let ((regexp "") + (len (length str)) + (i 0) + c) + (while (< i len) + (setq c (aref str i)) + (cond ((or (and (>= c ?A) (<= c ?Z)) + (and (>= c ?a) (<= c ?z))) + (setq regexp (concat regexp + "[" + (char-to-string (downcase c)) + "\\|" + (char-to-string (upcase c)) + "]"))) + (t + (setq regexp (concat regexp (char-to-string c))))) + (setq i (1+ i))) + regexp)) + +(defun Info-suffixed-file (name &optional exact) + "Look for an info file named NAME. This function tries to be smart in +finding the file corresponding to NAME: if it doesn't exist, several +variants are looked for, notably by appending suffixes from +`Info-suffix-list' and by trying to change the characters case in NAME. + +The optional argument EXACT prevents this function from trying different case +versions of NAME. Only the suffixes are tried." + (catch 'found + ;; First, try NAME alone: + (and (file-regular-p name) (throw 'found name)) + ;; Then, try different variants + (let ((suff-match (concat "\\(" + (let ((suff-list Info-suffix-list) + suff regexp) + (while (setq suff (pop suff-list)) + (setq regexp + (concat regexp + (regexp-quote (car suff)) + (and suff-list "\\|")))) + regexp) + "\\)?$")) + (dir (file-name-directory name)) + file files) + (setq name (file-name-nondirectory name)) + (setq files + (condition-case data ;; protect against invalid directory + ;; First, try NAME[.] + (append + (directory-files dir 'fullname + (concat "^" (regexp-quote name) suff-match) + nil t) + (if exact + nil + ;; Then, try to match the name independantly of the + ;; characters case. + (directory-files dir 'fullname + (Info-all-case-regexp + (concat "^" + (regexp-quote name) + suff-match)) + nil t))) + (t + (display-warning 'info + (format "directory `%s' error: %s" dir data)) + nil))) + (while (setq file (pop files)) + (and (file-regular-p file) + (throw 'found file))) + ))) (defun Info-insert-file-contents (file &optional visit) (setq file (expand-file-name file default-directory)) - (let ((suff Info-suffix-list)) - (while (and suff (or (<= (length file) (length (car (car suff)))) - (not (equal (substring file - (- (length (car (car suff))))) - (car (car suff)))))) + (let ((suff Info-suffix-list) + len) + (while (and suff + (setq len (length (car (car suff)))) + (or (<= (length file) len) + (not (or + (equal (substring file (- len)) + (car (car suff))) + (equal (substring file (- len)) + (upcase (car (car suff))))) + ))) (setq suff (cdr suff))) (if (stringp (cdr (car suff))) (let ((command (if (string-match "%s" (cdr (car suff))) @@ -1457,9 +1570,10 @@ for; usually a downcased version of NAME." (concat "(" (if Info-current-file - (let ((name (file-name-nondirectory Info-current-file))) - (if (string-match "\\.info$" name) - (substring name 0 -5) + (let ((name (file-name-nondirectory + Info-current-file))) + (if (string-match "^\\([^.]*\\)\\..*$" name) + (match-string 1 name) name)) "") ")" @@ -1538,11 +1652,13 @@ annotation for any node of any file. (See `a' and `x' commands.)" (cond ((eq code nil) (if no-completion string - (try-completion string Info-read-node-completion-table predicate))) + (try-completion string Info-read-node-completion-table + predicate))) ((eq code t) (if no-completion nil - (all-completions string Info-read-node-completion-table predicate))) + (all-completions string Info-read-node-completion-table + predicate))) ((eq code 'lambda) (if no-completion t @@ -1595,10 +1711,10 @@ annotation for any node of any file. (See `a' and `x' commands.)" (goto-char (point-min)) (while (search-forward "\n\^_" nil t) (forward-line 1) - (let ((beg (point))) + (let ((start (point))) (forward-line 1) (if (re-search-backward "Node: *\\([^,\n]*\\) *[,\n\t]" - beg t) + start t) (setq compl (cons (list (buffer-substring (match-beginning 1) (match-end 1))) @@ -1634,7 +1750,8 @@ annotation for any node of any file. (See `a' and `x' commands.)" (condition-case nil (progn (re-search-forward regexp) (setq found (point))) (search-failed nil))))) - (if (not found) ;can only happen in subfile case -- else would have erred + (if (not found) + ;; can only happen in subfile case -- else would have erred (unwind-protect (let ((list ())) (save-excursion @@ -1652,8 +1769,9 @@ annotation for any node of any file. (See `a' and `x' commands.)" (re-search-forward "\\(^.*\\): [0-9]+$") (goto-char (+ (match-end 1) 2)) (setq list (cons (cons (read (current-buffer)) - (buffer-substring (match-beginning 1) - (match-end 1))) + (buffer-substring + (match-beginning 1) + (match-end 1))) list)) (goto-char (1+ (match-end 0)))) (setq list (nreverse list) @@ -1879,13 +1997,13 @@ NAME may be an abbreviation of the reference name." (defun Info-extract-menu-node-name (&optional errmessage multi-line) (skip-chars-forward " \t\n") - (let ((beg (point)) + (let ((start (point)) str i) (skip-chars-forward "^:") (forward-char 1) (setq str (if (looking-at ":") - (buffer-substring beg (1- (point))) + (buffer-substring start (1- (point))) (skip-chars-forward " \t\n") ;; Kludge. ;; Allow dots in node name not followed by whitespace. @@ -2378,6 +2496,7 @@ This command is designed to be used whether you are already in Info or not." (defvar Info-annotate-map nil "Local keymap used within `a' command of Info.") + (if Info-annotate-map nil ;; (setq Info-annotate-map (nconc (make-sparse-keymap) text-mode-map)) @@ -2693,6 +2812,7 @@ At end of the node's text, moves to the next node." (defvar Info-mode-map nil "Keymap containing Info commands.") + (if Info-mode-map nil (setq Info-mode-map (make-sparse-keymap)) @@ -2855,6 +2975,7 @@ e Edit the contents of the current node." (defvar Info-edit-map nil "Local keymap used within `e' command of Info.") + (if Info-edit-map nil ;; XEmacs: remove FSF stuff @@ -2994,19 +3115,22 @@ The locations are of the format used in Info-history, i.e. (while (looking-at "[ \t]*[^:, \t\n]+:[ \t]+\\([^:,\t\n]+\\),?\n?") (goto-char (match-end 0)) - (Info-highlight-region (match-beginning 1) (match-end 1) 'info-xref)))) + (Info-highlight-region (match-beginning 1) (match-end 1) + 'info-xref)))) ;; Now get the xrefs in the body (goto-char (point-min)) (while (re-search-forward xref-regexp nil t) (if (= (char-after (1- (match-beginning 0))) ?\") ; hack nil - (Info-highlight-region (match-beginning 1) (match-end 1) 'info-xref))) + (Info-highlight-region (match-beginning 1) (match-end 1) + 'info-xref))) ;; then highlight the nodes in the menu. (goto-char (point-min)) (if (and (search-forward "\n* menu:" nil t)) (while (re-search-forward "^\\* \\([^:\t\n]*\\):?:[ \t\n]" nil t) - (Info-highlight-region (match-beginning 1) (match-end 1) 'info-node))) + (Info-highlight-region (match-beginning 1) (match-end 1) + 'info-node))) (set-buffer-modified-p nil)))) (defun Info-construct-menu (&optional event) diff --git a/lisp/isearch-mode.el b/lisp/isearch-mode.el index 492bacd..3cb2440 100644 --- a/lisp/isearch-mode.el +++ b/lisp/isearch-mode.el @@ -180,8 +180,8 @@ an overlay having an `invisible' property and that overlay has a property This variable makes a difference when `search-invisible' is set to `open'. It means that after search makes some invisible text visible to show the match, it makes the text invisible again when the match moves. -Ordinarily the text becomes invisible again at the end of the search." - :type 'boolean +Ordinarily the text becomes invisible again at the end of the search." + :type 'boolean :group 'isearch) (defvar isearch-mode-hook nil @@ -674,7 +674,7 @@ is treated as a regexp. See \\[isearch-forward] for more info." (defun isearch-update-ring (string &optional regexp) "Add STRING to the beginning of the search ring. REGEXP says which ring to use." - (if regexp + (if regexp (if (or (null regexp-search-ring) (not (string= string (car regexp-search-ring)))) (progn @@ -1722,18 +1722,18 @@ If there is no completion possible, say so and continue searching." (put extent 'invisible nil) (put extent 'intangible nil)) -(defun isearch-range-invisible (beg end) - "Return t if all the text from BEG to END is invisible. +(defun isearch-range-invisible (start end) + "Return t if all the text from START to END is invisible. Before that, if search-invisible is `open', unhide the extents with an `isearch-open-invisible' property." ;; isearch-search uses this to skip the extents that are invisible, ;; but don't have `isearch-open-invisible' set. It is unclear - ;; what's supposed to happen if only a part of [BEG, END) overlaps + ;; what's supposed to happen if only a part of [START, END) overlaps ;; the extent. (let (to-be-unhidden) (if (map-extents (lambda (extent ignored) - (if (and (<= (extent-start-position extent) beg) + (if (and (<= (extent-start-position extent) start) (>= (extent-end-position extent) end)) ;; All of the region is covered by the extent. (if (and (eq search-invisible 'open) @@ -1747,7 +1747,7 @@ Before that, if search-invisible is `open', unhide the extents with an t) ;; Else, keep looking. nil)) - nil beg end nil 'all-extents-closed 'invisible) + nil start end nil 'all-extents-closed 'invisible) ;; The whole match must be skipped. Signal it by returning t ;; to the caller. t @@ -1766,9 +1766,9 @@ Before that, if search-invisible is `open', unhide the extents with an (remprop extent 'isearch-intangible)) ;; FSF calls this function `isearch-clean-overlays'. -(defun isearch-restore-invisible-extents (beg end) +(defun isearch-restore-invisible-extents (start end) (cond - ((null beg) + ((null start) ;; Delete all -- this is called at the end of isearch. (mapc #'isearch-restore-extent isearch-unhidden-extents) (setq isearch-unhidden-extents nil)) @@ -1777,7 +1777,7 @@ Before that, if search-invisible is `open', unhide the extents with an ;; restored to their hidden state. (setq isearch-unhidden-extents (delete-if (lambda (extent) - (unless (extent-in-region-p extent beg end + (unless (extent-in-region-p extent start end 'all-extents-closed) (isearch-restore-extent extent) t)) diff --git a/lisp/iso8859-1.el b/lisp/iso8859-1.el index dbfe12f..01a15eb 100644 --- a/lisp/iso8859-1.el +++ b/lisp/iso8859-1.el @@ -161,9 +161,9 @@ (setq pairs (cdr pairs))) (cons 'setq (cons 'iso8859/1-case-table - (list (list 'purecopy - (list 'quote - (list downcase nil nil nil))))))))) + (list + (list 'quote + (list downcase nil nil nil)))))))) (?\300 ?\340) ; Agrave (?\301 ?\341) ; Aacute diff --git a/lisp/itimer.el b/lisp/itimer.el index f4bdbcf..5199917 100644 --- a/lisp/itimer.el +++ b/lisp/itimer.el @@ -120,7 +120,7 @@ many seconds.") ;; signal errors appropriately if the arguments are not valid. (defmacro check-itimer (var) - "If VAR is not bound to an itimer, signal wrong-type-argument. + "If VAR is not bound to an itimer, signal `wrong-type-argument'. This is a macro." (list 'setq var (list 'if (list 'itimerp var) var @@ -139,7 +139,7 @@ wrong-type-argument. This is a macro." (list 'list ''string-or-itimer-p var)))))) (defmacro check-nonnegative-number (var) - "If VAR is not bound to a number, signal wrong-type-argument. + "If VAR is not bound to a number, signal `wrong-type-argument'. If VAR is not bound to a positive number, signal args-out-of-range. This is a macro." (list 'setq var @@ -151,7 +151,7 @@ This is a macro." var)))) (defmacro check-string (var) - "If VAR is not bound to a string, signal wrong-type-argument. + "If VAR is not bound to a string, signal `wrong-type-argument'. This is a macro." (list 'setq var (list 'if (list 'stringp var) var @@ -160,16 +160,16 @@ This is a macro." ;; Functions to access and modify itimer attributes. -(defun itimerp (obj) - "Return non-nil if OBJ is an itimer." - (and (consp obj) (eq (length obj) 8))) +(defun itimerp (object) + "Return non-nil if OBJECT is an itimer." + (and (consp object) (eq (length object) 8))) -(defun itimer-live-p (obj) - "Return non-nil if OBJ is an itimer and is active. +(defun itimer-live-p (object) + "Return non-nil if OBJECT is an itimer and is active. ``Active'' means Emacs will run it when it expires. `activate-timer' must be called on an itimer to make it active. Itimers started with `start-itimer' are automatically active." - (and (itimerp obj) (memq obj itimer-list))) + (and (itimerp object) (memq object itimer-list))) (defun itimer-name (itimer) "Return the name of ITIMER." @@ -329,7 +329,7 @@ VALUE is the number of seconds until this itimer expires. must be an integer. Optional fourth arg RESTART non-nil means that this itimer should be restarted automatically after its function is called. Normally an itimer - is deleted at expiration after its function has returned. + is deleted at expiration after its function has returned. If non-nil RESTART should be a number indicating the value at which the itimer should be set at restart time. Optional fifth arg IS-IDLE specifies if this is an idle timer. diff --git a/lisp/keymap.el b/lisp/keymap.el index 9f3f69d..bfd8c87 100644 --- a/lisp/keymap.el +++ b/lisp/keymap.el @@ -70,8 +70,8 @@ but optional second arg NODIGITS non-nil treats them like other chars." In other words, OLDDEF is replaced with NEWDEF wherever it appears. Prefix keymaps are checked recursively. If optional fourth argument OLDMAP is specified, we redefine in KEYMAP as NEWDEF those chars which are defined -as OLDDEF in OLDMAP, unless that keybinding is already present in keymap. -If optional fifth argument PREFIX is defined, then only those occurrences of +as OLDDEF in OLDMAP, unless that keybinding is already present in KEYMAP. +If optional fifth argument PREFIX is non-nil, then only those occurrences of OLDDEF found in keymaps accessible through the keymap bound to PREFIX in KEYMAP are redefined. See also `accessible-keymaps'." (let ((maps (accessible-keymaps (or oldmap keymap) prefix)) @@ -103,8 +103,6 @@ KEYMAP are redefined. See also `accessible-keymaps'." ))) -;; From Bill Dubuque - ;; This used to wrap forms into an interactive lambda. It is unclear ;; to me why this is needed in this function. Anyway, ;; `key-or-menu-binding' doesn't do it, so this function no longer @@ -119,7 +117,6 @@ KEYMAP are redefined. See also `accessible-keymaps'." (setq defn (key-binding defn))) ;; a keyboard macro (insert (format "%s" defn))))) -;; From Bill Dubuque (defun read-command-or-command-sexp (prompt) "Read a command symbol or command sexp. A command sexp is wrapped in an interactive lambda if needed. @@ -136,7 +133,7 @@ Prompts with PROMPT." ,result) result))) -(defun local-key-binding (keys) +(defun local-key-binding (keys &optional accept-defaults) "Return the binding for command KEYS in current local keymap only. KEYS is a string, a vector of events, or a vector of key-description lists as described in the documentation for the `define-key' function. @@ -144,17 +141,16 @@ The binding is probably a symbol with a function definition; see the documentation for `lookup-key' for more information." (let ((map (current-local-map))) (if map - (lookup-key map keys) + (lookup-key map keys accept-defaults) nil))) -(defun global-key-binding (keys) +(defun global-key-binding (keys &optional accept-defaults) "Return the binding for command KEYS in current global keymap only. KEYS is a string or vector of events, a sequence of keystrokes. The binding is probably a symbol with a function definition; see the documentation for `lookup-key' for more information." - (lookup-key (current-global-map) keys)) + (lookup-key (current-global-map) keys accept-defaults)) -;; from Bill Dubuque (defun global-set-key (key command) "Give KEY a global binding as COMMAND. COMMAND is a symbol naming an interactively-callable function. @@ -172,7 +168,6 @@ that local binding will continue to shadow any global binding." (define-key (current-global-map) key command) nil) -;; from Bill Dubuque (defun local-set-key (key command) "Give KEY a local binding as COMMAND. COMMAND is a symbol naming an interactively-callable function. diff --git a/lisp/ldap.el b/lisp/ldap.el index 4f5e9a9..1c14c13 100644 --- a/lisp/ldap.el +++ b/lisp/ldap.el @@ -5,7 +5,7 @@ ;; Author: Oscar Figueiredo ;; Maintainer: Oscar Figueiredo ;; Created: Jan 1998 -;; Version: $Revision: 1.7.2.8 $ +;; Version: $Revision: 1.7.2.9 $ ;; Keywords: help comm ;; This file is part of XEmacs @@ -21,13 +21,13 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to +;; along with XEmacs; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;; This file provides mid-level and user-level functions to access directory -;; servers using the LDAP protocol (RFC 1777). +;; servers using the LDAP protocol (RFC 1777). ;;; Installation: ;; LDAP support must have been built into XEmacs. @@ -45,7 +45,7 @@ (defcustom ldap-default-host nil "*Default LDAP server hostname. -A TCP port number can be appended to that name using a colon as +A TCP port number can be appended to that name using a colon as a separator." :type '(choice (string :tag "Host name") (const :tag "Use library default" nil)) @@ -73,13 +73,13 @@ Acme organization in the United States." The format of each list element is: \(HOST PROP1 VAL1 PROP2 VAL2 ...) HOST is the hostname of an LDAP server (with an optional TCP port number -appended to it using a colon as a separator). +appended to it using a colon as a separator). PROPn and VALn are property/value pairs describing parameters for the server. Valid properties include: - `binddn' is the distinguished name of the user to bind as + `binddn' is the distinguished name of the user to bind as (in RFC 1779 syntax). `passwd' is the password to use for simple authentication. - `auth' is the authentication method to use. + `auth' is the authentication method to use. Possible values are: `simple', `krbv41' and `krbv42'. `base' is the base for the search as described in RFC 1779. `scope' is one of the three symbols `subtree', `base' or `onelevel'. @@ -95,7 +95,7 @@ Valid properties include: (checklist :inline t :greedy t (list - :tag "Search Base" + :tag "Search Base" :inline t (const :tag "Search Base" base) string) @@ -119,7 +119,7 @@ Valid properties include: (const :menu-tag "Kerberos 4.1" :tag "Kerberos 4.1" krbv41) (const :menu-tag "Kerberos 4.2" :tag "Kerberos 4.2" krbv42))) (list - :tag "Search Scope" + :tag "Search Scope" :inline t (const :tag "Search Scope" scope) (choice @@ -166,139 +166,139 @@ Valid properties include: (defcustom ldap-coding-system nil "*Coding system of LDAP string values. -LDAP v3 specifies the coding system of strings to be UTF-8. +LDAP v3 specifies the coding system of strings to be UTF-8. Mule support is needed for this." :type 'symbol :group 'ldap) (defvar ldap-attribute-syntax-encoders - [nil ; 1 ACI Item N - nil ; 2 Access Point Y - nil ; 3 Attribute Type Description Y - nil ; 4 Audio N - nil ; 5 Binary N - nil ; 6 Bit String Y - ldap-encode-boolean ; 7 Boolean Y - nil ; 8 Certificate N - nil ; 9 Certificate List N - nil ; 10 Certificate Pair N - ldap-encode-country-string ; 11 Country String Y - ldap-encode-string ; 12 DN Y - nil ; 13 Data Quality Syntax Y - nil ; 14 Delivery Method Y - ldap-encode-string ; 15 Directory String Y - nil ; 16 DIT Content Rule Description Y - nil ; 17 DIT Structure Rule Description Y - nil ; 18 DL Submit Permission Y - nil ; 19 DSA Quality Syntax Y - nil ; 20 DSE Type Y - nil ; 21 Enhanced Guide Y - nil ; 22 Facsimile Telephone Number Y - nil ; 23 Fax N - nil ; 24 Generalized Time Y - nil ; 25 Guide Y - nil ; 26 IA5 String Y - number-to-string ; 27 INTEGER Y - nil ; 28 JPEG N - nil ; 29 Master And Shadow Access Points Y - nil ; 30 Matching Rule Description Y - nil ; 31 Matching Rule Use Description Y - nil ; 32 Mail Preference Y - nil ; 33 MHS OR Address Y - nil ; 34 Name And Optional UID Y - nil ; 35 Name Form Description Y - nil ; 36 Numeric String Y - nil ; 37 Object Class Description Y - nil ; 38 OID Y - nil ; 39 Other Mailbox Y - nil ; 40 Octet String Y - ldap-encode-address ; 41 Postal Address Y - nil ; 42 Protocol Information Y - nil ; 43 Presentation Address Y - ldap-encode-string ; 44 Printable String Y - nil ; 45 Subtree Specification Y - nil ; 46 Supplier Information Y - nil ; 47 Supplier Or Consumer Y - nil ; 48 Supplier And Consumer Y - nil ; 49 Supported Algorithm N - nil ; 50 Telephone Number Y - nil ; 51 Teletex Terminal Identifier Y - nil ; 52 Telex Number Y - nil ; 53 UTC Time Y - nil ; 54 LDAP Syntax Description Y - nil ; 55 Modify Rights Y - nil ; 56 LDAP Schema Definition Y - nil ; 57 LDAP Schema Description Y - nil ; 58 Substring Assertion Y - ] + [nil ; 1 ACI Item N + nil ; 2 Access Point Y + nil ; 3 Attribute Type Description Y + nil ; 4 Audio N + nil ; 5 Binary N + nil ; 6 Bit String Y + ldap-encode-boolean ; 7 Boolean Y + nil ; 8 Certificate N + nil ; 9 Certificate List N + nil ; 10 Certificate Pair N + ldap-encode-country-string ; 11 Country String Y + ldap-encode-string ; 12 DN Y + nil ; 13 Data Quality Syntax Y + nil ; 14 Delivery Method Y + ldap-encode-string ; 15 Directory String Y + nil ; 16 DIT Content Rule Description Y + nil ; 17 DIT Structure Rule Description Y + nil ; 18 DL Submit Permission Y + nil ; 19 DSA Quality Syntax Y + nil ; 20 DSE Type Y + nil ; 21 Enhanced Guide Y + nil ; 22 Facsimile Telephone Number Y + nil ; 23 Fax N + nil ; 24 Generalized Time Y + nil ; 25 Guide Y + nil ; 26 IA5 String Y + number-to-string ; 27 INTEGER Y + nil ; 28 JPEG N + nil ; 29 Master And Shadow Access Points Y + nil ; 30 Matching Rule Description Y + nil ; 31 Matching Rule Use Description Y + nil ; 32 Mail Preference Y + nil ; 33 MHS OR Address Y + nil ; 34 Name And Optional UID Y + nil ; 35 Name Form Description Y + nil ; 36 Numeric String Y + nil ; 37 Object Class Description Y + nil ; 38 OID Y + nil ; 39 Other Mailbox Y + nil ; 40 Octet String Y + ldap-encode-address ; 41 Postal Address Y + nil ; 42 Protocol Information Y + nil ; 43 Presentation Address Y + ldap-encode-string ; 44 Printable String Y + nil ; 45 Subtree Specification Y + nil ; 46 Supplier Information Y + nil ; 47 Supplier Or Consumer Y + nil ; 48 Supplier And Consumer Y + nil ; 49 Supported Algorithm N + nil ; 50 Telephone Number Y + nil ; 51 Teletex Terminal Identifier Y + nil ; 52 Telex Number Y + nil ; 53 UTC Time Y + nil ; 54 LDAP Syntax Description Y + nil ; 55 Modify Rights Y + nil ; 56 LDAP Schema Definition Y + nil ; 57 LDAP Schema Description Y + nil ; 58 Substring Assertion Y + ] "A vector of functions used to encode LDAP attribute values. The sequence of functions corresponds to the sequence of LDAP attribute syntax -object identifiers of the form 1.3.6.1.4.1.1466.1115.121.1.* as defined in +object identifiers of the form 1.3.6.1.4.1.1466.1115.121.1.* as defined in RFC2252 section 4.3.2") (defvar ldap-attribute-syntax-decoders - [nil ; 1 ACI Item N - nil ; 2 Access Point Y - nil ; 3 Attribute Type Description Y - nil ; 4 Audio N - nil ; 5 Binary N - nil ; 6 Bit String Y - ldap-decode-boolean ; 7 Boolean Y - nil ; 8 Certificate N - nil ; 9 Certificate List N - nil ; 10 Certificate Pair N - ldap-decode-string ; 11 Country String Y - ldap-decode-string ; 12 DN Y - nil ; 13 Data Quality Syntax Y - nil ; 14 Delivery Method Y - ldap-decode-string ; 15 Directory String Y - nil ; 16 DIT Content Rule Description Y - nil ; 17 DIT Structure Rule Description Y - nil ; 18 DL Submit Permission Y - nil ; 19 DSA Quality Syntax Y - nil ; 20 DSE Type Y - nil ; 21 Enhanced Guide Y - nil ; 22 Facsimile Telephone Number Y - nil ; 23 Fax N - nil ; 24 Generalized Time Y - nil ; 25 Guide Y - nil ; 26 IA5 String Y - string-to-number ; 27 INTEGER Y - nil ; 28 JPEG N - nil ; 29 Master And Shadow Access Points Y - nil ; 30 Matching Rule Description Y - nil ; 31 Matching Rule Use Description Y - nil ; 32 Mail Preference Y - nil ; 33 MHS OR Address Y - nil ; 34 Name And Optional UID Y - nil ; 35 Name Form Description Y - nil ; 36 Numeric String Y - nil ; 37 Object Class Description Y - nil ; 38 OID Y - nil ; 39 Other Mailbox Y - nil ; 40 Octet String Y - ldap-decode-address ; 41 Postal Address Y - nil ; 42 Protocol Information Y - nil ; 43 Presentation Address Y - ldap-decode-string ; 44 Printable String Y - nil ; 45 Subtree Specification Y - nil ; 46 Supplier Information Y - nil ; 47 Supplier Or Consumer Y - nil ; 48 Supplier And Consumer Y - nil ; 49 Supported Algorithm N - nil ; 50 Telephone Number Y - nil ; 51 Teletex Terminal Identifier Y - nil ; 52 Telex Number Y - nil ; 53 UTC Time Y - nil ; 54 LDAP Syntax Description Y - nil ; 55 Modify Rights Y - nil ; 56 LDAP Schema Definition Y - nil ; 57 LDAP Schema Description Y - nil ; 58 Substring Assertion Y - ] + [nil ; 1 ACI Item N + nil ; 2 Access Point Y + nil ; 3 Attribute Type Description Y + nil ; 4 Audio N + nil ; 5 Binary N + nil ; 6 Bit String Y + ldap-decode-boolean ; 7 Boolean Y + nil ; 8 Certificate N + nil ; 9 Certificate List N + nil ; 10 Certificate Pair N + ldap-decode-string ; 11 Country String Y + ldap-decode-string ; 12 DN Y + nil ; 13 Data Quality Syntax Y + nil ; 14 Delivery Method Y + ldap-decode-string ; 15 Directory String Y + nil ; 16 DIT Content Rule Description Y + nil ; 17 DIT Structure Rule Description Y + nil ; 18 DL Submit Permission Y + nil ; 19 DSA Quality Syntax Y + nil ; 20 DSE Type Y + nil ; 21 Enhanced Guide Y + nil ; 22 Facsimile Telephone Number Y + nil ; 23 Fax N + nil ; 24 Generalized Time Y + nil ; 25 Guide Y + nil ; 26 IA5 String Y + string-to-number ; 27 INTEGER Y + nil ; 28 JPEG N + nil ; 29 Master And Shadow Access Points Y + nil ; 30 Matching Rule Description Y + nil ; 31 Matching Rule Use Description Y + nil ; 32 Mail Preference Y + nil ; 33 MHS OR Address Y + nil ; 34 Name And Optional UID Y + nil ; 35 Name Form Description Y + nil ; 36 Numeric String Y + nil ; 37 Object Class Description Y + nil ; 38 OID Y + nil ; 39 Other Mailbox Y + nil ; 40 Octet String Y + ldap-decode-address ; 41 Postal Address Y + nil ; 42 Protocol Information Y + nil ; 43 Presentation Address Y + ldap-decode-string ; 44 Printable String Y + nil ; 45 Subtree Specification Y + nil ; 46 Supplier Information Y + nil ; 47 Supplier Or Consumer Y + nil ; 48 Supplier And Consumer Y + nil ; 49 Supported Algorithm N + nil ; 50 Telephone Number Y + nil ; 51 Teletex Terminal Identifier Y + nil ; 52 Telex Number Y + nil ; 53 UTC Time Y + nil ; 54 LDAP Syntax Description Y + nil ; 55 Modify Rights Y + nil ; 56 LDAP Schema Definition Y + nil ; 57 LDAP Schema Description Y + nil ; 58 Substring Assertion Y + ] "A vector of functions used to decode LDAP attribute values. The sequence of functions corresponds to the sequence of LDAP attribute syntax -object identifiers of the form 1.3.6.1.4.1.1466.1115.121.1.* as defined in +object identifiers of the form 1.3.6.1.4.1.1466.1115.121.1.* as defined in RFC2252 section 4.3.2") @@ -395,7 +395,7 @@ This table is built from RFC2252 Section 5 and RFC2256 Section 5") nil) (t (error "Wrong LDAP boolean string: %s" str)))) - + (defun ldap-encode-country-string (str) ;; We should do something useful here... (if (not (= 2 (length str))) @@ -421,16 +421,16 @@ This table is built from RFC2252 Section 5 and RFC2256 Section 5") ;; LDAP protocol functions - + (defun ldap-get-host-parameter (host parameter) "Get the value of PARAMETER for HOST in `ldap-host-parameters-alist'." (plist-get (cdr (assoc host ldap-host-parameters-alist)) parameter)) - + (defun ldap-decode-attribute (attr) "Decode the attribute/value pair ATTR according to LDAP rules. -The attribute name is looked up in `ldap-attribute-syntaxes-alist' -and the corresponding decoder is then retrieved from +The attribute name is looked up in `ldap-attribute-syntaxes-alist' +and the corresponding decoder is then retrieved from `ldap-attribute-syntax-decoders' and applied on the value(s)." (let* ((name (car attr)) (values (cdr attr)) @@ -458,13 +458,13 @@ and the corresponding decoder is then retrieved from decoded))) (defun ldap-search (arg1 &rest args) - "Perform an LDAP search." + "Perform an LDAP search." (apply (if (ldapp arg1) 'ldap-search-basic 'ldap-search-entries) arg1 args)) -(make-obsolete 'ldap-search - "Use `ldap-search-entries' instead or +(make-obsolete 'ldap-search + "Use `ldap-search-entries' instead or `ldap-search-basic' for the low-level search API.") (defun ldap-search-entries (filter &optional host attributes attrsonly withdn) @@ -477,7 +477,7 @@ If ATTRSONLY is non nil, the attributes will be retrieved without the associated values. If WITHDN is non-nil each entry in the result will be prepennded with its distinguished name DN. -Additional search parameters can be specified through +Additional search parameters can be specified through `ldap-host-parameters-alist' which see. The function returns a list of matching entries. Each entry is itself an alist of attribute/value pairs optionally preceded by the DN of the @@ -494,7 +494,7 @@ entry according to the value of WITHDN." (setq ldap (ldap-open host host-plist)) (if ldap-verbose (message "Searching with LDAP on %s..." host)) - (setq result (ldap-search ldap filter + (setq result (ldap-search ldap filter (plist-get host-plist 'base) (plist-get host-plist 'scope) attributes attrsonly withdn @@ -506,13 +506,13 @@ entry according to the value of WITHDN." (defun ldap-add-entries (entries &optional host binddn passwd) "Add entries to an LDAP directory. -ENTRIES is a list of entry specifications of +ENTRIES is a list of entry specifications of the form (DN (ATTR . VALUE) (ATTR . VALUE) ...) where DN is the distinguished name of an entry to add, the following are cons cells containing attribute/value string pairs. -HOST is the LDAP host, defaulting to `ldap-default-host' -BINDDN is the DN to bind as to the server -PASSWD is the corresponding password" +HOST is the LDAP host, defaulting to `ldap-default-host'. +BINDDN is the DN to bind as to the server. +PASSWD is the corresponding password." (or host (setq host ldap-default-host) (error "No LDAP host specified")) @@ -542,17 +542,17 @@ PASSWD is the corresponding password" (defun ldap-modify-entries (entry-mods &optional host binddn passwd) "Modify entries of an LDAP directory. -ENTRY_MODS is a list of entry modifications of the form - (DN MOD-SPEC1 MOD-SPEC2 ...) where DN is the distinguished name of -the entry to modify, the following are modification specifications. -A modification specification is itself a list of the form -(MOD-OP ATTR VALUE1 VALUE2 ...) MOD-OP and ATTR are mandatory, +ENTRY_MODS is a list of entry modifications of the form + (DN MOD-SPEC1 MOD-SPEC2 ...) where DN is the distinguished name of +the entry to modify, the following are modification specifications. +A modification specification is itself a list of the form +(MOD-OP ATTR VALUE1 VALUE2 ...) MOD-OP and ATTR are mandatory, VALUEs are optional depending on MOD-OP. MOD-OP is the type of modification, one of the symbols `add', `delete' or `replace'. ATTR is the LDAP attribute type to modify. -HOST is the LDAP host, defaulting to `ldap-default-host' -BINDDN is the DN to bind as to the server -PASSWD is the corresponding password" +HOST is the LDAP host, defaulting to `ldap-default-host'. +BINDDN is the DN to bind as to the server. +PASSWD is the corresponding password." (or host (setq host ldap-default-host) (error "No LDAP host specified")) @@ -582,10 +582,10 @@ PASSWD is the corresponding password" (defun ldap-delete-entries (dn &optional host binddn passwd) "Delete an entry from an LDAP directory. -DN is the distinguished name of an entry to delete or +DN is the distinguished name of an entry to delete or a list of those. -HOST is the LDAP host, defaulting to `ldap-default-host' -BINDDN is the DN to bind as to the server +HOST is the LDAP host, defaulting to `ldap-default-host'. +BINDDN is the DN to bind as to the server. PASSWD is the corresponding password." (or host (setq host ldap-default-host) @@ -619,5 +619,5 @@ PASSWD is the corresponding password." (provide 'ldap) - + ;;; ldap.el ends here diff --git a/lisp/lib-complete.el b/lisp/lib-complete.el index 69d5554..bbdc5d8 100644 --- a/lisp/lib-complete.el +++ b/lisp/lib-complete.el @@ -128,8 +128,8 @@ Display MESSAGE and evaluate FORMS, returning value of the last one." ;;=== Completion caching ================================================== (defconst lib-complete:cache nil - "Used within read-library and read-library-internal to prevent -costly repeated calls to library-all-completions. + "Used within `read-library' and `read-library-internal' to prevent +costly repeated calls to `library-all-completions'. Format is a list of lists of the form ([ ] ...) diff --git a/lisp/lisp.el b/lisp/lisp.el index 5878e23..4226730 100644 --- a/lisp/lisp.el +++ b/lisp/lisp.el @@ -80,17 +80,15 @@ With argument, do it that many times. Negative arg -N means move forward across N balanced expressions." ;; XEmacs change (for zmacs regions) (interactive "_p") - (or arg (setq arg 1)) - (forward-sexp (- arg))) + (forward-sexp (- (or arg 1)))) -(defun mark-sexp (arg) +(defun mark-sexp (&optional arg) "Set mark ARG sexps from point. The place mark goes is the same place \\[forward-sexp] would move to with the same argument. Repeat this command to mark more sexps in the same direction." (interactive "p") - ;; XEmacs change - (mark-something 'mark-sexp 'forward-sexp arg)) + (mark-something 'mark-sexp 'forward-sexp (or arg 1))) (defun forward-list (&optional arg) "Move forward across one balanced group of parentheses. @@ -98,8 +96,7 @@ With argument, do it that many times. Negative arg -N means move backward across N groups of parentheses." ;; XEmacs change (interactive "_p") - (or arg (setq arg 1)) - (goto-char (or (scan-lists (point) arg 0) (buffer-end arg)))) + (goto-char (or (scan-lists (point) (or arg 1) 0) (buffer-end (or arg 1))))) (defun backward-list (&optional arg) "Move backward across one balanced group of parentheses. @@ -107,56 +104,55 @@ With argument, do it that many times. Negative arg -N means move forward across N groups of parentheses." ;; XEmacs change (for zmacs regions) (interactive "_p") - (or arg (setq arg 1)) - (forward-list (- arg))) + (forward-list (- (or arg 1)))) -(defun down-list (arg) +(defun down-list (&optional arg) "Move forward down one level of parentheses. With argument, do this that many times. -A negative argument means move backward but still go down a level. -In Lisp programs, an argument is required." +A negative argument means move backward but still go down a level." ;; XEmacs change (for zmacs regions) (interactive "_p") + (or arg (setq arg 1)) (let ((inc (if (> arg 0) 1 -1))) (while (/= arg 0) (goto-char (or (scan-lists (point) inc -1) (buffer-end arg))) (setq arg (- arg inc))))) -(defun backward-up-list (arg) +(defun backward-up-list (&optional arg) "Move backward out of one level of parentheses. With argument, do this that many times. -A negative argument means move forward but still to a less deep spot. -In Lisp programs, an argument is required." +A negative argument means move forward but still to a less deep spot." (interactive "_p") - (up-list (- arg))) + (up-list (- (or arg 1)))) -(defun up-list (arg) +(defun up-list (&optional arg) "Move forward out of one level of parentheses. With argument, do this that many times. A negative argument means move backward but still to a less deep spot. In Lisp programs, an argument is required." ;; XEmacs change (for zmacs regions) (interactive "_p") + (or arg (setq arg 1)) (let ((inc (if (> arg 0) 1 -1))) (while (/= arg 0) (goto-char (or (scan-lists (point) inc 1) (buffer-end arg))) (setq arg (- arg inc))))) -(defun kill-sexp (arg) +(defun kill-sexp (&optional arg) "Kill the sexp (balanced expression) following the cursor. With argument, kill that many sexps after the cursor. Negative arg -N means kill N sexps before the cursor." (interactive "p") (let ((opoint (point))) - (forward-sexp arg) + (forward-sexp (or arg 1)) (kill-region opoint (point)))) -(defun backward-kill-sexp (arg) +(defun backward-kill-sexp (&optional arg) "Kill the sexp (balanced expression) preceding the cursor. With argument, kill that many sexps before the cursor. Negative arg -N means kill N sexps after the cursor." (interactive "p") - (kill-sexp (- arg))) + (kill-sexp (- (or arg 1)))) (defun beginning-of-defun (&optional arg) "Move backward to the beginning of a defun. diff --git a/lisp/loaddefs.el b/lisp/loaddefs.el index 52458c3..6ec4914 100644 --- a/lisp/loaddefs.el +++ b/lisp/loaddefs.el @@ -85,7 +85,6 @@ ;; are ignored in completion, ;; making it more likely you will get a unique match. (setq completion-ignored-extensions - (mapcar 'purecopy ;; this is way way way bogus. ;; completely wtf? ;; the only things that should be here are those that are @@ -99,10 +98,10 @@ ; ".aux" ".a" ".ln" ; ".lof" ".blg" ".bbl" ".glo" ".idx" ".lot" ".fmt" ; ".diff" ".oi" ".class"))) - '(".o" ".obj" ".elc" "~" - ".bin" ".lbin" ;; #### these are doubtful, esp. the latter. - ".dvi";; possibly doubtful, too. - ".class"))) + '(".o" ".obj" ".elc" "~" + ".bin" ".lbin" ;; #### these are doubtful, esp. the latter. + ".dvi";; possibly doubtful, too. + ".class")) ;; This needs to be redone better. -slb diff --git a/lisp/menubar-items.el b/lisp/menubar-items.el index 11f695f..31e54a6 100644 --- a/lisp/menubar-items.el +++ b/lisp/menubar-items.el @@ -121,7 +121,7 @@ which will not be used as accelerators." (t ""))) (defconst default-menubar - (purecopy-menubar +; (purecopy-menubar ;purespace is dead ;; note backquote. `( ("%_File" @@ -1453,7 +1453,7 @@ which will not be used as accelerators." ["View %_Splash Screen" xemacs-splash-buffer] ["%_Unix Manual..." manual-entry]) ["Send %_Bug Report..." report-emacs-bug - :active (fboundp 'report-emacs-bug)])))) + :active (fboundp 'report-emacs-bug)]))) (defun maybe-add-init-button () diff --git a/lisp/menubar.el b/lisp/menubar.el index de084e1..a971530 100644 --- a/lisp/menubar.el +++ b/lisp/menubar.el @@ -20,7 +20,7 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the +;; along with XEmacs; see the file COPYING. If not, write to the ;; Free Software Foundation, 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. @@ -96,7 +96,7 @@ See `current-menubar' for a description of the syntax of a menubar." ((stringp menuitem) (and (string-match "^\\(-+\\|=+\\):\\(.*\\)" menuitem) (setq item (match-string 2 menuitem)) - (or (member item '(;; Motif-compatible + (or (member item '(;; Motif-compatible "singleLine" "doubleLine" "singleDashedLine" @@ -289,14 +289,13 @@ MENU-LEAF is a menubar leaf node. See the documentation of `current-menubar'. BEFORE, if provided, is the name of a menu item before which this item should be added, if this item is not on the menu already. If the item is already present, it will not be moved. -If IN-MENU is present use that instead of `current-menubar' as the menu to -change. -" +IN-MENU, if provided, means use that instead of `current-menubar' as the + menu to change." ;; Note easymenu.el uses the fact that menu-leaf can be a submenu. (add-menu-item-1 t menu-path menu-leaf before in-menu)) ;; I actually liked the old name better, but the interface has changed too -;; drastically to keep it. --Stig +;; drastically to keep it. --Stig (defun add-submenu (menu-path submenu &optional before in-menu) "Add a menu to the menubar or one of its submenus. If the named menu exists already, it is changed. @@ -308,33 +307,38 @@ SUBMENU is the new menu to add. See the documentation of `current-menubar' for the syntax. BEFORE, if provided, is the name of a menu before which this menu should be added, if this menu is not on its parent already. If the menu is already - present, it will not be moved." + present, it will not be moved. +IN-MENU, if provided, means use that instead of `current-menubar' as the + menu to change." (check-menu-syntax submenu nil) (add-menu-item-1 nil menu-path submenu before in-menu)) - -(defun purecopy-menubar (x) - ;; this calls purecopy on the strings, and the contents of the vectors, - ;; but not on the vectors themselves, or the conses - those must be - ;; writable. - (cond ((vectorp x) - (let ((i (length x))) - (while (> i 0) - (aset x (1- i) (purecopy (aref x (1- i)))) - (setq i (1- i)))) - x) - ((consp x) - (let ((rest x)) - (while rest - (setcar rest (purecopy-menubar (car rest))) - (setq rest (cdr rest)))) - x) - (t - (purecopy x)))) +;; purespace is no more, so this function is unnecessary +;(defun purecopy-menubar (x) +; ;; this calls purecopy on the strings, and the contents of the vectors, +; ;; but not on the vectors themselves, or the conses - those must be +; ;; writable. +; (cond ((vectorp x) +; (let ((i (length x))) +; (while (> i 0) +; (aset x (1- i) (purecopy (aref x (1- i)))) +; (setq i (1- i)))) +; x) +; ((consp x) +; (let ((rest x)) +; (while rest +; (setcar rest (purecopy-menubar (car rest))) +; (setq rest (cdr rest)))) +; x) +; (t +; (purecopy x)))) (defun delete-menu-item (path &optional from-menu) "Remove the named menu item from the menu hierarchy. -PATH is a list of strings which identify the position of the menu item in -the menu hierarchy. The documentation of `add-submenu' describes menu-paths." +PATH is a list of strings which identify the position of the menu item +in the menu hierarchy. The documentation of `add-submenu' describes +menu paths. +FROM-MENU, if provided, means use that instead of `current-menubar' +as the menu to change." (let* ((pair (condition-case nil (find-menu-item (or from-menu current-menubar) path) (error nil))) @@ -352,13 +356,13 @@ the menu hierarchy. The documentation of `add-submenu' describes menu-paths." (defun relabel-menu-item (path new-name) "Change the string of the specified menu item. -PATH is a list of strings which identify the position of the menu item in +PATH is a list of strings which identify the position of the menu item in the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\" -under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the +under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the menu item called \"Item\" under the \"Foo\" submenu of \"Menu\". NEW-NAME is the string that the menu item will be printed as from now on." (or (stringp new-name) - (setq new-name (signal 'wrong-type-argument (list 'stringp new-name)))) + (setq new-name (wrong-type-argument 'stringp new-name))) (let* ((menubar current-menubar) (pair (find-menu-item menubar path)) (item (car pair)) @@ -380,7 +384,7 @@ NEW-NAME is the string that the menu item will be printed as from now on." ;; into the menubar if we didn't want people to use 'em? ;; x-font-menu.el is the only known offender right now and that ought to be ;; rehashed a bit. -;; +;; (defun enable-menu-item-1 (path toggle-p on-p) (let (menu item) @@ -430,33 +434,33 @@ NEW-NAME is the string that the menu item will be printed as from now on." (defun enable-menu-item (path) "Make the named menu item be selectable. -PATH is a list of strings which identify the position of the menu item in +PATH is a list of strings which identify the position of the menu item in the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\" -under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the +under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"." (enable-menu-item-1 path nil t)) (defun disable-menu-item (path) "Make the named menu item be unselectable. -PATH is a list of strings which identify the position of the menu item in +PATH is a list of strings which identify the position of the menu item in the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\" -under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the +under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"." (enable-menu-item-1 path nil nil)) (defun select-toggle-menu-item (path) "Make the named toggle- or radio-style menu item be in the `selected' state. -PATH is a list of strings which identify the position of the menu item in +PATH is a list of strings which identify the position of the menu item in the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\" -under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the +under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"." (enable-menu-item-1 path t t)) (defun deselect-toggle-menu-item (path) "Make the named toggle- or radio-style menu item be in the `unselected' state. -PATH is a list of strings which identify the position of the menu item in +PATH is a list of strings which identify the position of the menu item in the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\" -under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the +under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"." (enable-menu-item-1 path t nil)) @@ -554,7 +558,7 @@ button was clicked." (dispatch-event (next-event))) )) - + (defun popup-buffer-menu (event) "Pop up a copy of the Buffers menu (from the menubar) where the mouse is clicked." (interactive "e") diff --git a/lisp/minibuf.el b/lisp/minibuf.el index 34d2ddb..019519f 100644 --- a/lisp/minibuf.el +++ b/lisp/minibuf.el @@ -196,7 +196,7 @@ minibuffer is reinvoked while it is the selected window." (define-key map "\M-\t" 'comint-dynamic-complete) (define-key map "\M-?" 'comint-dynamic-list-completions) map) - "Minibuffer keymap used by shell-command and related commands.") + "Minibuffer keymap used by `shell-command' and related commands.") (defcustom use-dialog-box t "*Variable controlling usage of the dialog box. @@ -376,8 +376,8 @@ Sixth arg ABBREV-TABLE, if non-nil, becomes the value of `local-abbrev-table' Seventh arg DEFAULT, if non-nil, will be returned when user enters an empty string. -See also the variable completion-highlight-first-word-only for control over - completion display." +See also the variable `completion-highlight-first-word-only' for + control over completion display." (if (and (not enable-recursive-minibuffers) (> (minibuffer-depth) 0) (eq (selected-window) (minibuffer-window))) @@ -1212,7 +1212,7 @@ the special minibuffer behavior." (defun minibuffer-smart-maybe-select-highlighted-completion (event &optional click-count) - "Like minibuffer-smart-select-highlighted-completion but does nothing if + "Like `minibuffer-smart-select-highlighted-completion' but does nothing if there is no completion (as opposed to executing the global binding). Useful as the value of `mouse-track-click-hook'." (interactive "e") diff --git a/lisp/modeline.el b/lisp/modeline.el index c6e6a09..3e10878 100644 --- a/lisp/modeline.el +++ b/lisp/modeline.el @@ -588,14 +588,14 @@ parentheses on the modeline." "button2 cycles to the next buffer") (defconst modeline-buffer-identification - (list (cons modeline-buffer-id-left-extent (purecopy "XEmacs%N:")) + (list (cons modeline-buffer-id-left-extent "XEmacs%N:") ; this used to be "XEmacs:" - (cons modeline-buffer-id-right-extent (purecopy " %17b"))) + (cons modeline-buffer-id-right-extent " %17b")) "Modeline control for identifying the buffer being displayed. Its default value is - (list (cons modeline-buffer-id-left-extent (purecopy \"XEmacs%N:\")) - (cons modeline-buffer-id-right-extent (purecopy \" %17b\"))) + (list (cons modeline-buffer-id-left-extent \"XEmacs%N:\") + (cons modeline-buffer-id-right-extent \" %17b\"))) Major modes that edit things other than ordinary files may change this (e.g. Info, Dired,...).") @@ -626,7 +626,7 @@ Normally nil in most modes, since there is no process to display.") (set-extent-property modeline-modified-extent 'help-echo "button2 toggles the buffer's read-only status") -(defconst modeline-modified (purecopy '("--%1*%1+-")) +(defconst modeline-modified '("--%1*%1+-") "Modeline control for displaying whether current buffer is modified.") (make-variable-buffer-local 'modeline-modified) @@ -645,21 +645,21 @@ Normally nil in most modes, since there is no process to display.") (setq-default modeline-format (list - (purecopy "") + "" (cons modeline-modified-extent 'modeline-modified) (cons modeline-buffer-id-extent 'modeline-buffer-identification) - (purecopy " ") + " " 'global-mode-string - (purecopy " %[(") + " %[(" (cons modeline-minor-mode-extent - (list (purecopy "") 'mode-name 'minor-mode-alist)) - (cons modeline-narrowed-extent (purecopy "%n")) + (list "" 'mode-name 'minor-mode-alist)) + (cons modeline-narrowed-extent "%n") 'modeline-process - (purecopy ")%]----") - (list 'line-number-mode (purecopy "L%l--")) - (list 'column-number-mode (purecopy "C%c--")) - (cons -3 (purecopy "%p")) - (purecopy "-%-"))) + ")%]----" + (list 'line-number-mode "L%l--") + (list 'column-number-mode "C%c--") + (cons -3 "%p") + "-%-")) ;;; Added for XEmacs 20.3. Provide wrapper for vc since it may not always be ;;; present, and its symbols are not visible this early in the dump if it diff --git a/lisp/mouse.el b/lisp/mouse.el index 3fdc75a..67bea91 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -119,7 +119,7 @@ between point and mark." (interactive "P") ;; we fallback to the clipboard if the current selection is not existent (let ((text (if check-cutbuffer-p - (or (get-selection-no-error) + (or (get-selection-no-error) (get-cutbuffer) (get-selection-no-error 'CLIPBOARD) (error "No selection, clipboard or cut buffer available")) @@ -222,7 +222,7 @@ Returns whether a drag was begun." ;; #### barely implemented. (when (click-inside-selection-p event) (cond ((featurep 'offix) - (offix-start-drag-region + (offix-start-drag-region event (extent-start-position zmacs-region-extent) (extent-end-position zmacs-region-extent)) @@ -238,7 +238,7 @@ Returns whether a drag was begun." "Evaluate the sexp under the mouse. Usually, this is the last sexp before the click, but if you click on a left paren, then it is the sexp beginning with the paren that is evaluated. Also, since strings evaluate to themselves, -they're fed to re-search-forward and the matched region is highlighted until +they're fed to `re-search-forward' and the matched region is highlighted until the mouse button is released. Perhaps the most useful thing about this function is that the evaluation of @@ -343,7 +343,7 @@ Display cursor at that position for a second." (switch-to-buffer val)))) (defun narrow-window-to-region (m n) - "Narrow window to region between point and last mark" + "Narrow window to region between point and last mark." (interactive "r") (save-excursion (save-restriction diff --git a/lisp/msw-font-menu.el b/lisp/msw-font-menu.el index 23a2b6d..5b97f33 100644 --- a/lisp/msw-font-menu.el +++ b/lisp/msw-font-menu.el @@ -43,12 +43,11 @@ "Registry and encoding to use with font menu fonts.") (defvar mswindows-font-menu-junk-families - (purecopy - (mapconcat - #'identity - '("Symbol" - ) - "\\|")) + (mapconcat + #'identity + '("Symbol" + ) + "\\|") "A regexp matching font families which are uninteresting (e.g. cursor fonts).") (defvar mswindows-font-regexp-ascii nil diff --git a/lisp/mule/chinese.el b/lisp/mule/chinese.el index a47b74c..44b4512 100644 --- a/lisp/mule/chinese.el +++ b/lisp/mule/chinese.el @@ -218,8 +218,8 @@ ;; (setq font-ccl-encoder-alist ;; (cons (cons "big5" ccl-encode-big5-font) font-ccl-encoder-alist)) -(set-charset-ccl-program 'chinese-big5-1 ccl-encode-big5-font) -(set-charset-ccl-program 'chinese-big5-2 ccl-encode-big5-font) +(set-charset-ccl-program 'chinese-big5-1 'ccl-encode-big5-font) +(set-charset-ccl-program 'chinese-big5-2 'ccl-encode-big5-font) (set-language-info-alist "Chinese-BIG5" '((charset chinese-big5-1 chinese-big5-2) diff --git a/lisp/mule/cyrillic.el b/lisp/mule/cyrillic.el index a766710..610dce0 100644 --- a/lisp/mule/cyrillic.el +++ b/lisp/mule/cyrillic.el @@ -25,12 +25,13 @@ ;;; Commentary: -;; The character set ISO8859-5 is supported. KOI-8 and ALTERNATIVNYJ -;; are converted to ISO8859-5 internally. +;; The character set ISO8859-5 is supported. +;; KOI-8, Windows-1251, and ALTERNATIVNYJ are converted to ISO8859-5 +;; internally. ;;; Code: -;; For syntax of Cyrillic +;; Cyrillic syntax (modify-syntax-entry 'cyrillic-iso8859-5 "w") (modify-syntax-entry ?,L-(B ".") (modify-syntax-entry ?,Lp(B ".") @@ -40,21 +41,11 @@ ;;; CYRILLIC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ISO-8859-5 staff - -;; (make-coding-system -;; 'cyrillic-iso-8bit 2 ?5 -;; "ISO 2022 based 8-bit encoding for Cyrillic script (MIME:ISO-8859-5)" -;; '(ascii cyrillic-iso8859-5 nil nil -;; nil nil nil nil nil nil nil) -;; '((safe-charsets ascii cyrillic-iso8859-5) -;; (mime-charset . iso-8859-5))) - -;; (define-coding-system-alias 'iso-8859-5 'cyrillic-iso-8bit) +;; ISO-8859-5 (make-coding-system 'iso-8859-5 'iso2022 - "MIME ISO-8859-5" + "ISO-8859-5 (ISO 2022 based 8-bit encoding for Cyrillic script)" '(charset-g0 ascii charset-g1 cyrillic-iso8859-5 charset-g2 t @@ -73,7 +64,7 @@ (documentation . "Support for Cyrillic ISO-8859-5.")) '("Cyrillic")) -;; KOI-8 staff +;; KOI-8 (eval-and-compile @@ -133,31 +124,17 @@ (write-read-repeat r0 , cyrillic-koi8-r-encode-table)))))) "CCL program to encode KOI8.") -;; (make-coding-system -;; 'cyrillic-koi8 4 -;; ;; We used to use ?K. It is true that ?K is more strictly correct, -;; ;; but it is also used for Korean. -;; ;; So people who use koi8 for languages other than Russian -;; ;; will have to forgive us. -;; ?R "KOI8 8-bit encoding for Cyrillic (MIME: KOI8-R)" -;; '(ccl-decode-koi8 . ccl-encode-koi8) -;; '((safe-charsets ascii cyrillic-iso8859-5) -;; (mime-charset . koi8-r) -;; (valid-codes (0 . 127) 163 179 (192 . 255)) -;; (charset-origin-alist (cyrillic-iso8859-5 "KOI8-R" -;; cyrillic-encode-koi8-r-char)))) - ;; (define-coding-system-alias 'koi8-r 'cyrillic-koi8) ;; (define-coding-system-alias 'koi8 'cyrillic-koi8) (make-coding-system 'koi8-r 'ccl - "Coding-system used for KOI8-R." - `(decode ,ccl-decode-koi8 - encode ,ccl-encode-koi8 + "KOI8-R 8-bit encoding for Cyrillic." + '(decode ccl-decode-koi8 + encode ccl-encode-koi8 mnemonic "KOI8")) -;; it is not correct, but XEmacs doesn't have `ccl' category... +;; `iso-8-1' is not correct, but XEmacs doesn't have a `ccl' category (coding-system-put 'koi8-r 'category 'iso-8-1) ;; (define-ccl-program ccl-encode-koi8-font @@ -184,7 +161,88 @@ (documentation . "Support for Cyrillic KOI8-R.")) '("Cyrillic")) -;;; ALTERNATIVNYJ staff +;;; WINDOWS-1251 + +(eval-and-compile + +(defvar cyrillic-windows-1251-decode-table + [ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 + 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 + 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 + 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 + 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 + 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 + 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 + ?,L"(B ?,L#(B 32 ?,Ls(B 32 32 32 32 32 32 ?,L)(B 32 ?,L*(B ?,L,(B ?,L+(B ?,L/(B ;" + ?,Lr(B 32 32 32 32 32 32 32 32 32 ?,Ly(B 32 ?,Lz(B ?,L|(B ?,L{(B ?,L(B + ?,L (B ?,L.(B ?,L~(B ?,L((B ?,A$(B 32 ?,A&(B ?,L}(B ?,L!(B ?,A)(B ?,L$(B ?,A+(B ?,A,(B ?,L-(B ?,A.(B ?,L'(B + ?,A0(B ?,A1(B ?,L&(B ?,Lv(B 32 ?,A5(B ?,A6(B ?,A7(B ?,Lq(B ?,Lp(B ?,Lt(B ?,A;(B ?,Lx(B ?,L%(B ?,Lu(B ?,Lw(B + ?,L0(B ?,L1(B ?,L2(B ?,L3(B ?,L4(B ?,L5(B ?,L6(B ?,L7(B ?,L8(B ?,L9(B ?,L:(B ?,L;(B ?,L<(B ?,L=(B ?,L>(B ?,L?(B + ?,L@(B ?,LA(B ?,LB(B ?,LC(B ?,LD(B ?,LE(B ?,LF(B ?,LG(B ?,LH(B ?,LI(B ?,LJ(B ?,LK(B ?,LL(B ?,LM(B ?,LN(B ?,LO(B + ?,LP(B ?,LQ(B ?,LR(B ?,LS(B ?,LT(B ?,LU(B ?,LV(B ?,LW(B ?,LX(B ?,LY(B ?,LZ(B ?,L[(B ?,L\(B ?,L](B ?,L^(B ?,L_(B + ?,L`(B ?,La(B ?,Lb(B ?,Lc(B ?,Ld(B ?,Le(B ?,Lf(B ?,Lg(B ?,Lh(B ?,Li(B ?,Lj(B ?,Lk(B ?,Ll(B ?,Lm(B ?,Ln(B ?,Lo(B ] + "Cyrillic Windows-1251 decoding table.") + +(defvar cyrillic-windows-1251-encode-table + (let ((table (make-vector 256 32)) + (i 0)) + (while (< i 256) + (let* ((ch (aref cyrillic-windows-1251-decode-table i)) + (split (split-char ch))) + (cond ((eq (car split) 'cyrillic-iso8859-5) + (aset table (logior (nth 1 split) 128) i) + ) + ((eq ch 32)) + ((eq (car split) 'ascii) + (aset table ch i) + ))) + (setq i (1+ i))) + table) + "Cyrillic Windows-1251 encoding table.") + +) + +(define-ccl-program ccl-decode-windows1251 + `(3 + ((read r0) + (loop + (write-read-repeat r0 ,cyrillic-windows-1251-decode-table)))) + "CCL program to decode Windows-1251.") + +(define-ccl-program ccl-encode-windows1251 + `(1 + ((read r0) + (loop + (if (r0 != ,(charset-id 'cyrillic-iso8859-5)) + (write-read-repeat r0) + ((read r0) + (write-read-repeat r0 , cyrillic-windows-1251-encode-table)))))) + "CCL program to encode Windows-1251.") + +(make-coding-system + 'windows-1251 'ccl + "Coding-system used for Windows-1251." + '(decode ccl-decode-windows1251 + encode ccl-encode-windows1251 + mnemonic "CyrW")) + +;; `iso-8-1' is not correct, but XEmacs doesn't have a `ccl' category +(coding-system-put 'windows-1251 'category 'iso-8-1) + +(set-language-info-alist + "Cyrillic-Win" '((charset cyrillic-iso8859-5) + (coding-system windows-1251) + (coding-priority windows-1251) + (input-method . "cyrillic-yawerty") + (features cyril-util) + (tutorial . "TUTORIAL.ru") + (sample-text . "Russian (,L@caaZXY(B) ,L7T`PRabRcYbU(B!") + (documentation . "Support for Cyrillic Windows-1251.")) + '("Cyrillic")) + +;;; ALTERNATIVNYJ (eval-and-compile @@ -242,26 +300,16 @@ (write-read-repeat r0 ,cyrillic-alternativnyj-encode-table)))))) "CCL program to encode Alternativnyj.") -;; (make-coding-system -;; 'cyrillic-alternativnyj 4 ?A -;; "ALTERNATIVNYJ 8-bit encoding for Cyrillic" -;; '(ccl-decode-alternativnyj . ccl-encode-alternativnyj) -;; '((safe-charsets ascii cyrillic-iso8859-5) -;; (valid-codes (0 . 175) (224 . 241) 255) -;; (charset-origin-alist (cyrillic-iso8859-5 "ALTERNATIVNYJ" -;; cyrillic-encode-koi8-r-char)))) - - ;; (define-coding-system-alias 'alternativnyj 'cyrillic-alternativnyj) (make-coding-system 'alternativnyj 'ccl "Coding-system used for Alternativnyj" - `(decode ,ccl-decode-alternativnyj - encode ,ccl-encode-alternativnyj + '(decode ccl-decode-alternativnyj + encode ccl-encode-alternativnyj mnemonic "Cy.Alt")) -;; it is not correct, but XEmacs doesn't have `ccl' category... +;; `iso-8-1' is not correct, but XEmacs doesn't have `ccl' category (coding-system-put 'alternativnyj 'category 'iso-8-1) ;; (define-ccl-program ccl-encode-alternativnyj-font diff --git a/lisp/mule/ethiopic.el b/lisp/mule/ethiopic.el index b5b15cf..4963470 100644 --- a/lisp/mule/ethiopic.el +++ b/lisp/mule/ethiopic.el @@ -56,7 +56,7 @@ ;; (setq font-ccl-encoder-alist ;; (cons (cons "ethiopic" ccl-encode-ethio-font) font-ccl-encoder-alist)) -(set-charset-ccl-program 'ethiopic ccl-encode-ethio-font) +(set-charset-ccl-program 'ethiopic 'ccl-encode-ethio-font) (set-language-info-alist "Ethiopic" '((setup-function . setup-ethiopic-environment-internal) diff --git a/lisp/mule/mule-category.el b/lisp/mule/mule-category.el index 913fc71..254b541 100644 --- a/lisp/mule/mule-category.el +++ b/lisp/mule/mule-category.el @@ -19,7 +19,7 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the +;; along with XEmacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. @@ -79,21 +79,21 @@ Categories are given by their designators." (check-argument-type 'defined-category-p designator) (gethash designator defined-category-hashtable)) -(defun modify-category-entry (char-range designator &optional table reset) +(defun modify-category-entry (char-range designator &optional category-table reset) "Add a category to the categories associated with CHAR-RANGE. CHAR-RANGE is a single character or a range of characters, as per `put-char-table'. The category is given by a designator character. -The changes are made in TABLE, which defaults to the current buffer's - category table. +The changes are made in CATEGORY-TABLE, which defaults to the current + buffer's category table. If optional fourth argument RESET is non-nil, previous categories associated with CHAR-RANGE are removed before adding the specified category." - (or table (setq table (category-table))) - (check-argument-type 'category-table-p table) + (or category-table (setq category-table (category-table))) + (check-argument-type 'category-table-p category-table) (check-argument-type 'defined-category-p designator) (if reset ;; clear all existing stuff. - (put-char-table char-range nil table)) + (put-char-table char-range nil category-table)) (map-char-table #'(lambda (key value) ;; make sure that this range has a bit-vector assigned to it @@ -103,16 +103,16 @@ If optional fourth argument RESET is non-nil, previous categories associated ;; set the appropriate bit in that vector. (aset value (- designator 32) 1) ;; put the vector back, thus assuring we have a unique setting for this range - (put-char-table key value table)) - table char-range)) + (put-char-table key value category-table)) + category-table char-range)) -(defun char-category-list (char &optional table) - "Return a list of the categories that CHAR is in. -TABLE defaults to the current buffer's category table. +(defun char-category-list (character &optional category-table) + "Return a list of the categories that CHARACTER is in. +CATEGORY-TABLE defaults to the current buffer's category table. The categories are given by their designators." - (or table (setq table (category-table))) - (check-argument-type 'category-table-p table) - (let ((vec (get-char-table char table))) + (or category-table (setq category-table (category-table))) + (check-argument-type 'category-table-p category-table) + (let ((vec (get-char-table character category-table))) (if (null vec) nil (let ((a 32) list) (while (< a 127) @@ -121,7 +121,7 @@ The categories are given by their designators." (setq a (1+ a))) (nreverse list))))) -;; implemented in c, file chartab.c (97/3/14 jhod@po.iijnet.or.jp) +;; implemented in C, file chartab.c (97/3/14 jhod@po.iijnet.or.jp) ;(defun char-in-category-p (char category &optional table) ; "Return non-nil if CHAR is in CATEGORY. ;TABLE defaults to the current buffer's category table. diff --git a/lisp/mule/mule-ccl.el b/lisp/mule/mule-ccl.el index 1f24a55..72880fe 100644 --- a/lisp/mule/mule-ccl.el +++ b/lisp/mule/mule-ccl.el @@ -22,7 +22,7 @@ ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. -;; Synched up with: FSF 20.2 +;; Synched up with: FSF 21.0.90 ;;; Commentary: @@ -39,66 +39,17 @@ ;; combination of three or more arithmetic operations can be ;; calculated faster than Emacs Lisp. ;; -;; Here's the syntax of CCL program in BNF notation. -;; -;; CCL_PROGRAM := -;; (BUFFER_MAGNIFICATION -;; CCL_MAIN_BLOCK -;; [ CCL_EOF_BLOCK ]) -;; -;; BUFFER_MAGNIFICATION := integer -;; CCL_MAIN_BLOCK := CCL_BLOCK -;; CCL_EOF_BLOCK := CCL_BLOCK -;; -;; CCL_BLOCK := -;; STATEMENT | (STATEMENT [STATEMENT ...]) -;; STATEMENT := -;; SET | IF | BRANCH | LOOP | REPEAT | BREAK | READ | WRITE | CALL -;; -;; SET := -;; (REG = EXPRESSION) -;; | (REG ASSIGNMENT_OPERATOR EXPRESSION) -;; | integer -;; -;; EXPRESSION := ARG | (EXPRESSION OPERATOR ARG) -;; -;; IF := (if EXPRESSION CCL_BLOCK CCL_BLOCK) -;; BRANCH := (branch EXPRESSION CCL_BLOCK [CCL_BLOCK ...]) -;; LOOP := (loop STATEMENT [STATEMENT ...]) -;; BREAK := (break) -;; REPEAT := -;; (repeat) -;; | (write-repeat [REG | integer | string]) -;; | (write-read-repeat REG [integer | ARRAY]) -;; READ := -;; (read REG ...) -;; | (read-if (REG OPERATOR ARG) CCL_BLOCK CCL_BLOCK) -;; | (read-branch REG CCL_BLOCK [CCL_BLOCK ...]) -;; | (read-multibyte-character REG {charset} REG {code-point}) -;; WRITE := -;; (write REG ...) -;; | (write EXPRESSION) -;; | (write integer) | (write string) | (write REG ARRAY) -;; | string -;; | (write-multibyte-character REG(charset) REG(codepoint)) -;; CALL := (call ccl-program-name) -;; END := (end) -;; -;; REG := r0 | r1 | r2 | r3 | r4 | r5 | r6 | r7 -;; ARG := REG | integer -;; OPERATOR := -;; + | - | * | / | % | & | '|' | ^ | << | >> | <8 | >8 | // -;; | < | > | == | <= | >= | != | de-sjis | en-sjis -;; ASSIGNMENT_OPERATOR := -;; += | -= | *= | /= | %= | &= | '|=' | ^= | <<= | >>= -;; ARRAY := '[' integer ... ']' +;; Syntax and semantics of CCL program is described in the +;; documentation of `define-ccl-program'. ;;; Code: (defconst ccl-command-table [if branch loop break repeat write-repeat write-read-repeat read read-if read-branch write call end - read-multibyte-character write-multibyte-character] + read-multibyte-character write-multibyte-character + translate-character + iterate-multiple-map map-multiple map-single] "Vector of CCL commands (symbols).") ;; Put a property to each symbol of CCL commands for the compiler. @@ -228,11 +179,26 @@ ;; Embed integer DATA in `ccl-program-vector' at `ccl-current-ic' and ;; increment it. If IC is specified, embed DATA at IC. (defun ccl-embed-data (data &optional ic) - (let ((val (if (characterp data) (char-int data) data))) - (if ic - (aset ccl-program-vector ic val) - (aset ccl-program-vector ccl-current-ic val) - (setq ccl-current-ic (1+ ccl-current-ic))))) + (if (characterp data) + (setq data (char-int data))) + (if ic + (aset ccl-program-vector ic data) + (let ((len (length ccl-program-vector))) + (if (>= ccl-current-ic len) + (let ((new (make-vector (* len 2) nil))) + (while (> len 0) + (setq len (1- len)) + (aset new len (aref ccl-program-vector len))) + (setq ccl-program-vector new)))) + (aset ccl-program-vector ccl-current-ic data) + (setq ccl-current-ic (1+ ccl-current-ic)))) + +;; Embed pair of SYMBOL and PROP where (get SYMBOL PROP) should give +;; proper index number for SYMBOL. PROP should be +;; `translation-table-id', `code-conversion-map-id', or +;; `ccl-program-idx'. +(defun ccl-embed-symbol (symbol prop) + (ccl-embed-data (cons symbol prop))) ;; Embed string STR of length LEN in `ccl-program-vector' at ;; `ccl-current-ic'. @@ -280,8 +246,7 @@ (logior (ash (get reg2 'ccl-register-number) 8) (ash data 11)) (ash data 8))))) - (aset ccl-program-vector ccl-current-ic code) - (setq ccl-current-ic (1+ ccl-current-ic)))) + (ccl-embed-data code))) ;; extended ccl command format ;; |- 14-bit -|- 3-bit --|- 3-bit --|- 3-bit --|- 5-bit -| @@ -297,18 +262,6 @@ (defun ccl-increment-ic (inc) (setq ccl-current-ic (+ ccl-current-ic inc))) -;;;###autoload -(defun ccl-program-p (obj) - "Return t if OBJECT is a valid CCL compiled code." - (and (vectorp obj) - (let ((i 0) (len (length obj)) (flag t)) - (if (> len 1) - (progn - (while (and flag (< i len)) - (setq flag (integerp (aref obj i))) - (setq i (1+ i))) - flag))))) - ;; If non-nil, index of the start of the current loop. (defvar ccl-loop-head nil) ;; If non-nil, list of absolute addresses of the breaking points of @@ -319,7 +272,7 @@ (defun ccl-compile (ccl-program) "Return a compiled code of CCL-PROGRAM as a vector of integer." (if (or (null (consp ccl-program)) - (null (integer-or-char-p (car ccl-program))) + (null (integerp (car ccl-program))) (null (listp (car (cdr ccl-program))))) (error "CCL: Invalid CCL program: %s" ccl-program)) (if (null (vectorp ccl-program-vector)) @@ -479,7 +432,8 @@ (setq left 'r7))) ;; Now EXPR has the form (LEFT OP RIGHT). - (if (eq rrr left) + (if (and (eq rrr left) + (< op (length ccl-assign-arith-table))) ;; Compile this SET statement as `(RRR OP= RIGHT)'. (if (integer-or-char-p right) (progn @@ -501,6 +455,7 @@ ;; Compile WRITE statement with string argument. (defun ccl-compile-write-string (str) + (setq str (encode-coding-string str 'binary)) (let ((len (length str))) (ccl-embed-code 'write-const-string 1 len) (ccl-embed-string len str)) @@ -712,6 +667,7 @@ (ccl-embed-code 'write-const-jump 0 ccl-loop-head) (ccl-embed-data arg)) ((stringp arg) + (setq arg (encode-coding-string arg 'binary)) (let ((len (length arg)) (i 0)) (ccl-embed-code 'write-string-jump 0 ccl-loop-head) @@ -825,11 +781,8 @@ (error "CCL: Invalid number of arguments: %s" cmd)) (if (not (symbolp (nth 1 cmd))) (error "CCL: Subroutine should be a symbol: %s" cmd)) - (let* ((name (nth 1 cmd)) - (idx (get name 'ccl-program-idx))) - (if (not idx) - (error "CCL: Unknown subroutine name: %s" name)) - (ccl-embed-code 'call 0 idx)) + (ccl-embed-code 'call 1 0) + (ccl-embed-symbol (nth 1 cmd) 'ccl-program-idx) nil) ;; Compile END statement. @@ -862,97 +815,99 @@ nil) ;; Compile translate-character -;; (defun ccl-compile-translate-character (cmd) -;; (if (/= (length cmd) 4) -;; (error "CCL: Invalid number of arguments: %s" cmd)) -;; (let ((Rrr (nth 1 cmd)) -;; (RRR (nth 2 cmd)) -;; (rrr (nth 3 cmd))) -;; (ccl-check-register rrr cmd) -;; (ccl-check-register RRR cmd) -;; (cond ((and (symbolp Rrr) (not (get Rrr 'ccl-register-number))) -;; (if (not (get Rrr 'translation-table)) -;; (error "CCL: Invalid translation table %s in %s" Rrr cmd)) -;; (ccl-embed-extended-command 'translate-character-const-tbl -;; rrr RRR 0) -;; (ccl-embed-data Rrr)) -;; (t -;; (ccl-check-register Rrr cmd) -;; (ccl-embed-extended-command 'translate-character rrr RRR Rrr)))) -;; nil) - -;; (defun ccl-compile-iterate-multiple-map (cmd) -;; (ccl-compile-multiple-map-function 'iterate-multiple-map cmd) -;; nil) - -;; (defun ccl-compile-map-multiple (cmd) -;; (if (/= (length cmd) 4) -;; (error "CCL: Invalid number of arguments: %s" cmd)) -;; (let ((func '(lambda (arg mp) -;; (let ((len 0) result add) -;; (while arg -;; (if (consp (car arg)) -;; (setq add (funcall func (car arg) t) -;; result (append result add) -;; add (+ (-(car add)) 1)) -;; (setq result -;; (append result -;; (list (car arg))) -;; add 1)) -;; (setq arg (cdr arg) -;; len (+ len add))) -;; (if mp -;; (cons (- len) result) -;; result)))) -;; arg) -;; (setq arg (append (list (nth 0 cmd) (nth 1 cmd) (nth 2 cmd)) -;; (funcall func (nth 3 cmd) nil))) -;; (ccl-compile-multiple-map-function 'map-multiple arg)) -;; nil) - -;; (defun ccl-compile-map-single (cmd) -;; (if (/= (length cmd) 4) -;; (error "CCL: Invalid number of arguments: %s" cmd)) -;; (let ((RRR (nth 1 cmd)) -;; (rrr (nth 2 cmd)) -;; (map (nth 3 cmd)) -;; id) -;; (ccl-check-register rrr cmd) -;; (ccl-check-register RRR cmd) -;; (ccl-embed-extended-command 'map-single rrr RRR 0) -;; (cond ((symbolp map) -;; (if (get map 'code-conversion-map) -;; (ccl-embed-data map) -;; (error "CCL: Invalid map: %s" map))) -;; (t -;; (error "CCL: Invalid type of arguments: %s" cmd)))) -;; nil) - -;; (defun ccl-compile-multiple-map-function (command cmd) -;; (if (< (length cmd) 4) -;; (error "CCL: Invalid number of arguments: %s" cmd)) -;; (let ((RRR (nth 1 cmd)) -;; (rrr (nth 2 cmd)) -;; (args (nthcdr 3 cmd)) -;; map) -;; (ccl-check-register rrr cmd) -;; (ccl-check-register RRR cmd) -;; (ccl-embed-extended-command command rrr RRR 0) -;; (ccl-embed-data (length args)) -;; (while args -;; (setq map (car args)) -;; (cond ((symbolp map) -;; (if (get map 'code-conversion-map) -;; (ccl-embed-data map) -;; (error "CCL: Invalid map: %s" map))) -;; ((numberp map) -;; (ccl-embed-data map)) -;; (t -;; (error "CCL: Invalid type of arguments: %s" cmd))) -;; (setq args (cdr args))))) +(defun ccl-compile-translate-character (cmd) + (if (/= (length cmd) 4) + (error "CCL: Invalid number of arguments: %s" cmd)) + (let ((Rrr (nth 1 cmd)) + (RRR (nth 2 cmd)) + (rrr (nth 3 cmd))) + (ccl-check-register rrr cmd) + (ccl-check-register RRR cmd) + (cond ((and (symbolp Rrr) (not (get Rrr 'ccl-register-number))) + (ccl-embed-extended-command 'translate-character-const-tbl + rrr RRR 0) + (ccl-embed-symbol Rrr 'translation-table-id)) + (t + (ccl-check-register Rrr cmd) + (ccl-embed-extended-command 'translate-character rrr RRR Rrr)))) + nil) + +(defun ccl-compile-iterate-multiple-map (cmd) + (ccl-compile-multiple-map-function 'iterate-multiple-map cmd) + nil) + +(defun ccl-compile-map-multiple (cmd) + (if (/= (length cmd) 4) + (error "CCL: Invalid number of arguments: %s" cmd)) + (let (func arg) + (setq func + (lambda (arg mp) + (let ((len 0) result add) + (while arg + (if (consp (car arg)) + (setq add (funcall func (car arg) t) + result (append result add) + add (+ (- (car add)) 1)) + (setq result + (append result + (list (car arg))) + add 1)) + (setq arg (cdr arg) + len (+ len add))) + (if mp + (cons (- len) result) + result)))) + (setq arg (append (list (nth 0 cmd) (nth 1 cmd) (nth 2 cmd)) + (funcall func (nth 3 cmd) nil))) + (ccl-compile-multiple-map-function 'map-multiple arg)) + nil) + +(defun ccl-compile-map-single (cmd) + (if (/= (length cmd) 4) + (error "CCL: Invalid number of arguments: %s" cmd)) + (let ((RRR (nth 1 cmd)) + (rrr (nth 2 cmd)) + (map (nth 3 cmd)) + id) + (ccl-check-register rrr cmd) + (ccl-check-register RRR cmd) + (ccl-embed-extended-command 'map-single rrr RRR 0) + (cond ((symbolp map) + (if (get map 'code-conversion-map) + (ccl-embed-symbol map 'code-conversion-map-id) + (error "CCL: Invalid map: %s" map))) + (t + (error "CCL: Invalid type of arguments: %s" cmd)))) + nil) + +(defun ccl-compile-multiple-map-function (command cmd) + (if (< (length cmd) 4) + (error "CCL: Invalid number of arguments: %s" cmd)) + (let ((RRR (nth 1 cmd)) + (rrr (nth 2 cmd)) + (args (nthcdr 3 cmd)) + map) + (ccl-check-register rrr cmd) + (ccl-check-register RRR cmd) + (ccl-embed-extended-command command rrr RRR 0) + (ccl-embed-data (length args)) + (while args + (setq map (car args)) + (cond ((symbolp map) + (if (get map 'code-conversion-map) + (ccl-embed-symbol map 'code-conversion-map-id) + (error "CCL: Invalid map: %s" map))) + ((numberp map) + (ccl-embed-data map)) + (t + (error "CCL: Invalid type of arguments: %s" cmd))) + (setq args (cdr args))))) -;;; CCL dump stuff +;;; CCL dump staffs + +;; To avoid byte-compiler warning. +(defvar ccl-code) ;;;###autoload (defun ccl-dump (ccl-code) @@ -980,7 +935,6 @@ ;; Return a CCL code in `ccl-code' at `ccl-current-ic'. (defun ccl-get-next-code () - (declare (special ccl-code)) (prog1 (aref ccl-code ccl-current-ic) (setq ccl-current-ic (1+ ccl-current-ic)))) @@ -1230,40 +1184,40 @@ (defun ccl-dump-write-multibyte-character (rrr RRR Rrr) (insert (format "write-multibyte-character r%d r%d\n" RRR rrr))) -;; (defun ccl-dump-translate-character (rrr RRR Rrr) -;; (insert (format "translation table(r%d) r%d r%d\n" Rrr RRR rrr))) - -;; (defun ccl-dump-translate-character-const-tbl (rrr RRR Rrr) -;; (let ((tbl (ccl-get-next-code))) -;; (insert (format "translation table(%S) r%d r%d\n" tbl RRR rrr)))) - -;; (defun ccl-dump-iterate-multiple-map (rrr RRR Rrr) -;; (let ((notbl (ccl-get-next-code)) -;; (i 0) id) -;; (insert (format "iterate-multiple-map r%d r%d\n" RRR rrr)) -;; (insert (format "\tnumber of maps is %d .\n\t [" notbl)) -;; (while (< i notbl) -;; (setq id (ccl-get-next-code)) -;; (insert (format "%S" id)) -;; (setq i (1+ i))) -;; (insert "]\n"))) - -;; (defun ccl-dump-map-multiple (rrr RRR Rrr) -;; (let ((notbl (ccl-get-next-code)) -;; (i 0) id) -;; (insert (format "map-multiple r%d r%d\n" RRR rrr)) -;; (insert (format "\tnumber of maps and separators is %d\n\t [" notbl)) -;; (while (< i notbl) -;; (setq id (ccl-get-next-code)) -;; (if (= id -1) -;; (insert "]\n\t [") -;; (insert (format "%S " id))) -;; (setq i (1+ i))) -;; (insert "]\n"))) - -;; (defun ccl-dump-map-single (rrr RRR Rrr) -;; (let ((id (ccl-get-next-code))) -;; (insert (format "map-single r%d r%d map(%S)\n" RRR rrr id)))) +(defun ccl-dump-translate-character (rrr RRR Rrr) + (insert (format "translation table(r%d) r%d r%d\n" Rrr RRR rrr))) + +(defun ccl-dump-translate-character-const-tbl (rrr RRR Rrr) + (let ((tbl (ccl-get-next-code))) + (insert (format "translation table(%S) r%d r%d\n" tbl RRR rrr)))) + +(defun ccl-dump-iterate-multiple-map (rrr RRR Rrr) + (let ((notbl (ccl-get-next-code)) + (i 0) id) + (insert (format "iterate-multiple-map r%d r%d\n" RRR rrr)) + (insert (format "\tnumber of maps is %d .\n\t [" notbl)) + (while (< i notbl) + (setq id (ccl-get-next-code)) + (insert (format "%S" id)) + (setq i (1+ i))) + (insert "]\n"))) + +(defun ccl-dump-map-multiple (rrr RRR Rrr) + (let ((notbl (ccl-get-next-code)) + (i 0) id) + (insert (format "map-multiple r%d r%d\n" RRR rrr)) + (insert (format "\tnumber of maps and separators is %d\n\t [" notbl)) + (while (< i notbl) + (setq id (ccl-get-next-code)) + (if (= id -1) + (insert "]\n\t [") + (insert (format "%S " id))) + (setq i (1+ i))) + (insert "]\n"))) + +(defun ccl-dump-map-single (rrr RRR Rrr) + (let ((id (ccl-get-next-code))) + (insert (format "map-single r%d r%d map(%S)\n" RRR rrr id)))) ;; CCL emulation staffs @@ -1276,16 +1230,222 @@ (defmacro declare-ccl-program (name &optional vector) "Declare NAME as a name of CCL program. -To compile a CCL program which calls another CCL program not yet -defined, it must be declared as a CCL program in advance. +This macro exists for backward compatibility. In the old version of +Emacs, to compile a CCL program which calls another CCL program not +yet defined, it must be declared as a CCL program in advance. But, +now CCL program names are resolved not at compile time but before +execution. + Optional arg VECTOR is a compiled CCL code of the CCL program." `(put ',name 'ccl-program-idx (register-ccl-program ',name ,vector))) ;;;###autoload (defmacro define-ccl-program (name ccl-program &optional doc) "Set NAME the compiled code of CCL-PROGRAM. -CCL-PROGRAM is `eval'ed before being handed to the CCL compiler `ccl-compile'. -The compiled code is a vector of integers." + +CCL-PROGRAM has this form: + (BUFFER_MAGNIFICATION + CCL_MAIN_CODE + [ CCL_EOF_CODE ]) + +BUFFER_MAGNIFICATION is an integer value specifying the approximate +output buffer magnification size compared with the bytes of input data +text. If the value is zero, the CCL program can't execute `read' and +`write' commands. + +CCL_MAIN_CODE and CCL_EOF_CODE are CCL program codes. CCL_MAIN_CODE +executed at first. If there's no more input data when `read' command +is executed in CCL_MAIN_CODE, CCL_EOF_CODE is executed. If +CCL_MAIN_CODE is terminated, CCL_EOF_CODE is not executed. + +Here's the syntax of CCL program code in BNF notation. The lines +starting by two semicolons (and optional leading spaces) describe the +semantics. + +CCL_MAIN_CODE := CCL_BLOCK + +CCL_EOF_CODE := CCL_BLOCK + +CCL_BLOCK := STATEMENT | (STATEMENT [STATEMENT ...]) + +STATEMENT := + SET | IF | BRANCH | LOOP | REPEAT | BREAK | READ | WRITE | CALL + | TRANSLATE | END + +SET := (REG = EXPRESSION) + | (REG ASSIGNMENT_OPERATOR EXPRESSION) + ;; The following form is the same as (r0 = integer). + | integer + +EXPRESSION := ARG | (EXPRESSION OPERATOR ARG) + +;; Evaluate EXPRESSION. If the result is nonzeor, execute +;; CCL_BLOCK_0. Otherwise, execute CCL_BLOCK_1. +IF := (if EXPRESSION CCL_BLOCK_0 CCL_BLOCK_1) + +;; Evaluate EXPRESSION. Provided that the result is N, execute +;; CCL_BLOCK_N. +BRANCH := (branch EXPRESSION CCL_BLOCK_0 [CCL_BLOCK_1 ...]) + +;; Execute STATEMENTs until (break) or (end) is executed. +LOOP := (loop STATEMENT [STATEMENT ...]) + +;; Terminate the most inner loop. +BREAK := (break) + +REPEAT := + ;; Jump to the head of the most inner loop. + (repeat) + ;; Same as: ((write [REG | integer | string]) + ;; (repeat)) + | (write-repeat [REG | integer | string]) + ;; Same as: ((write REG [ARRAY]) + ;; (read REG) + ;; (repeat)) + | (write-read-repeat REG [ARRAY]) + ;; Same as: ((write integer) + ;; (read REG) + ;; (repeat)) + | (write-read-repeat REG integer) + +READ := ;; Set REG_0 to a byte read from the input text, set REG_1 + ;; to the next byte read, and so on. + (read REG_0 [REG_1 ...]) + ;; Same as: ((read REG) + ;; (if (REG OPERATOR ARG) CCL_BLOCK_0 CCL_BLOCK_1)) + | (read-if (REG OPERATOR ARG) CCL_BLOCK_0 CCL_BLOCK_1) + ;; Same as: ((read REG) + ;; (branch REG CCL_BLOCK_0 [CCL_BLOCK_1 ...])) + | (read-branch REG CCL_BLOCK_0 [CCL_BLOCK_1 ...]) + ;; Read a character from the input text while parsing + ;; multibyte representation, set REG_0 to the charset ID of + ;; the character, set REG_1 to the code point of the + ;; character. If the dimension of charset is two, set REG_1 + ;; to ((CODE0 << 8) | CODE1), where CODE0 is the first code + ;; point and CODE1 is the second code point. + | (read-multibyte-character REG_0 REG_1) + +WRITE := + ;; Write REG_0, REG_1, ... to the output buffer. If REG_N is + ;; a multibyte character, write the corresponding multibyte + ;; representation. + (write REG_0 [REG_1 ...]) + ;; Same as: ((r7 = EXPRESSION) + ;; (write r7)) + | (write EXPRESSION) + ;; Write the value of `integer' to the output buffer. If it + ;; is a multibyte character, write the corresponding multibyte + ;; representation. + | (write integer) + ;; Write the byte sequence of `string' as is to the output + ;; buffer. It is encoded by binary coding system, thus, + ;; by this operation, you cannot write multibyte string + ;; as it is. + | (write string) + ;; Same as: (write string) + | string + ;; Provided that the value of REG is N, write Nth element of + ;; ARRAY to the output buffer. If it is a multibyte + ;; character, write the corresponding multibyte + ;; representation. + | (write REG ARRAY) + ;; Write a multibyte representation of a character whose + ;; charset ID is REG_0 and code point is REG_1. If the + ;; dimension of the charset is two, REG_1 should be ((CODE0 << + ;; 8) | CODE1), where CODE0 is the first code point and CODE1 + ;; is the second code point of the character. + | (write-multibyte-character REG_0 REG_1) + +;; Call CCL program whose name is ccl-program-name. +CALL := (call ccl-program-name) + +;; Terminate the CCL program. +END := (end) + +;; CCL registers that can contain any integer value. As r7 is also +;; used by CCL interpreter, its value is changed unexpectedly. +REG := r0 | r1 | r2 | r3 | r4 | r5 | r6 | r7 + +ARG := REG | integer + +OPERATOR := + ;; Normal arithmethic operators (same meaning as C code). + + | - | * | / | % + + ;; Bitwize operators (same meaning as C code) + | & | `|' | ^ + + ;; Shifting operators (same meaning as C code) + | << | >> + + ;; (REG = ARG_0 <8 ARG_1) means: + ;; (REG = ((ARG_0 << 8) | ARG_1)) + | <8 + + ;; (REG = ARG_0 >8 ARG_1) means: + ;; ((REG = (ARG_0 >> 8)) + ;; (r7 = (ARG_0 & 255))) + | >8 + + ;; (REG = ARG_0 // ARG_1) means: + ;; ((REG = (ARG_0 / ARG_1)) + ;; (r7 = (ARG_0 % ARG_1))) + | // + + ;; Normal comparing operators (same meaning as C code) + | < | > | == | <= | >= | != + + ;; If ARG_0 and ARG_1 are higher and lower byte of Shift-JIS + ;; code, and CHAR is the corresponding JISX0208 character, + ;; (REG = ARG_0 de-sjis ARG_1) means: + ;; ((REG = CODE0) + ;; (r7 = CODE1)) + ;; where CODE0 is the first code point of CHAR, CODE1 is the + ;; second code point of CHAR. + | de-sjis + + ;; If ARG_0 and ARG_1 are the first and second code point of + ;; JISX0208 character CHAR, and SJIS is the correponding + ;; Shift-JIS code, + ;; (REG = ARG_0 en-sjis ARG_1) means: + ;; ((REG = HIGH) + ;; (r7 = LOW)) + ;; where HIGH is the higher byte of SJIS, LOW is the lower + ;; byte of SJIS. + | en-sjis + +ASSIGNMENT_OPERATOR := + ;; Same meaning as C code + += | -= | *= | /= | %= | &= | `|=' | ^= | <<= | >>= + + ;; (REG <8= ARG) is the same as: + ;; ((REG <<= 8) + ;; (REG |= ARG)) + | <8= + + ;; (REG >8= ARG) is the same as: + ;; ((r7 = (REG & 255)) + ;; (REG >>= 8)) + + ;; (REG //= ARG) is the same as: + ;; ((r7 = (REG % ARG)) + ;; (REG /= ARG)) + | //= + +ARRAY := `[' integer ... `]' + + +TRANSLATE := + (translate-character REG(table) REG(charset) REG(codepoint)) + | (translate-character SYMBOL REG(charset) REG(codepoint)) +MAP := + (iterate-multiple-map REG REG MAP-IDs) + | (map-multiple REG REG (MAP-SET)) + | (map-single REG REG MAP-ID) +MAP-IDs := MAP-ID ... +MAP-SET := MAP-IDs | (MAP-IDs) MAP-SET +MAP-ID := integer +" `(let ((prog ,(ccl-compile (eval ccl-program)))) (defconst ,name prog ,doc) (put ',name 'ccl-program-idx (register-ccl-program ',name prog)) @@ -1294,25 +1454,23 @@ The compiled code is a vector of integers." ;;;###autoload (defmacro check-ccl-program (ccl-program &optional name) "Check validity of CCL-PROGRAM. -If CCL-PROGRAM is a symbol denoting a valid CCL program, return +If CCL-PROGRAM is a symbol denoting a CCL program, return CCL-PROGRAM, else return nil. If CCL-PROGRAM is a vector and optional arg NAME (symbol) is supplied, register CCL-PROGRAM by name NAME, and return NAME." - `(let ((result ,ccl-program)) - (cond ((symbolp ,ccl-program) - (or (numberp (get ,ccl-program 'ccl-program-idx)) - (setq result nil))) - ((vectorp ,ccl-program) - (setq result ,name) - (register-ccl-program result ,ccl-program)) - (t - (setq result nil))) - result)) + `(if (ccl-program-p ,ccl-program) + (if (vectorp ,ccl-program) + (progn + (register-ccl-program ,name ,ccl-program) + ,name) + ,ccl-program))) ;;;###autoload (defun ccl-execute-with-args (ccl-prog &rest args) "Execute CCL-PROGRAM with registers initialized by the remaining args. -The return value is a vector of resulting CCL registers." +The return value is a vector of resulting CCL registers. + +See the documentation of `define-ccl-program' for the detail of CCL program." (let ((reg (make-vector 8 0)) (i 0)) (while (and args (< i 8)) diff --git a/lisp/mule/mule-cmds.el b/lisp/mule/mule-cmds.el index c0fa5a7..f10f5e7 100644 --- a/lisp/mule/mule-cmds.el +++ b/lisp/mule/mule-cmds.el @@ -23,25 +23,20 @@ ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ;; 02111-1307, USA. +;; Note: Some of the code here is now in code-cmds.el + ;;; Code: ;;; MULE related key bindings and menus. -(defvar mule-keymap (make-sparse-keymap "Mule") - "Keymap for Mule (Multilingual environment) specific commands.") +(require 'code-cmds) -;; Keep "C-x C-m ..." for mule specific commands. -(define-key ctl-x-map "\C-m" mule-keymap) +;; Preserve the old name +(defvaralias 'mule-keymap 'coding-keymap) -(define-key mule-keymap "f" 'set-buffer-file-coding-system) -(define-key mule-keymap "F" 'set-default-buffer-file-coding-system) ; XEmacs -(define-key mule-keymap "t" 'set-terminal-coding-system) -(define-key mule-keymap "k" 'set-keyboard-coding-system) -(define-key mule-keymap "p" 'set-buffer-process-coding-system) (define-key mule-keymap "x" 'set-selection-coding-system) (define-key mule-keymap "X" 'set-next-selection-coding-system) (define-key mule-keymap "\C-\\" 'set-input-method) -(define-key mule-keymap "c" 'universal-coding-system-argument) ;;(define-key mule-keymap "c" 'list-coding-system-briefly) ; XEmacs (define-key mule-keymap "C" 'describe-coding-system) ; XEmacs (define-key mule-keymap "r" 'toggle-display-direction) ; XEmacs @@ -123,378 +118,6 @@ They means `lf', `crlf', and `cr' respectively." (let ((coding-system-for-read 'iso-2022-7bit)) (find-file-read-only (expand-file-name "HELLO" data-directory)))) -(defun universal-coding-system-argument () - "Execute an I/O command using the specified coding system." - (interactive) - (let* ((default (and buffer-file-coding-system - (not (eq (coding-system-type buffer-file-coding-system) - t)) - (coding-system-name buffer-file-coding-system))) - (coding-system - (read-coding-system - (if default - (format "Coding system for following command (default, %s): " - default) - "Coding system for following command: ") - default)) - (keyseq (read-key-sequence - (format "Command to execute with %s:" coding-system))) - (cmd (key-binding keyseq))) - (let ((coding-system-for-read coding-system) - (coding-system-for-write coding-system)) - (message "") - (call-interactively cmd)))) - -(defun set-default-coding-systems (coding-system) - "Set default value of various coding systems to CODING-SYSTEM. -This sets the following coding systems: - o coding system of a newly created buffer - o default coding system for terminal output - o default coding system for keyboard input - o default coding system for subprocess I/O - o default coding system for converting file names." - (check-coding-system coding-system) - ;;(setq-default buffer-file-coding-system coding-system) - (set-default-buffer-file-coding-system coding-system) - ;; (if default-enable-multibyte-characters - ;; (setq default-file-name-coding-system coding-system)) - ;; If coding-system is nil, honor that on MS-DOS as well, so - ;; that they could reset the terminal coding system. - ;; (unless (and (eq window-system 'pc) coding-system) - ;; (setq default-terminal-coding-system coding-system)) - (set-terminal-coding-system coding-system) - ;;(setq default-keyboard-coding-system coding-system) - (set-keyboard-coding-system coding-system) - ;;(setq default-process-coding-system (cons coding-system coding-system)) - ;; Refer to coding-system-for-read and coding-system-for-write - ;; so that C-x RET c works. - (add-hook 'comint-exec-hook - `(lambda () - (let ((proc (get-buffer-process (current-buffer)))) - (set-process-input-coding-system - proc (or coding-system-for-read ',coding-system)) - (set-process-output-coding-system - proc (or coding-system-for-write ',coding-system)))) - 'append) - (setq file-name-coding-system coding-system)) - -(defun prefer-coding-system (coding-system) - "Add CODING-SYSTEM at the front of the priority list for automatic detection. -This also sets the following coding systems: - o coding system of a newly created buffer - o default coding system for terminal output - o default coding system for keyboard input - o default coding system for converting file names. - -If CODING-SYSTEM specifies a certain type of EOL conversion, the coding -systems set by this function will use that type of EOL conversion. - -This command does not change the default value of terminal coding system -for MS-DOS terminal, because DOS terminals only support a single coding -system, and Emacs automatically sets the default to that coding system at -startup." - (interactive "zPrefer coding system: ") - (if (not (and coding-system (find-coding-system coding-system))) - (error "Invalid coding system `%s'" coding-system)) - (let ((coding-category (coding-system-category coding-system)) - (base (coding-system-base coding-system)) - (eol-type (coding-system-eol-type coding-system))) - (if (not coding-category) - ;; CODING-SYSTEM is no-conversion or undecided. - (error "Can't prefer the coding system `%s'" coding-system)) - (set-coding-category-system coding-category (or base coding-system)) - ;; (update-coding-systems-internal) - (or (eq coding-category (car (coding-category-list))) - ;; We must change the order. - (set-coding-priority-list (list coding-category))) - (if (and base (interactive-p)) - (message "Highest priority is set to %s (base of %s)" - base coding-system)) - ;; If they asked for specific EOL conversion, honor that. - (if (memq eol-type '(lf crlf mac)) - (setq coding-system - (coding-system-change-eol-conversion base eol-type)) - (setq coding-system base)) - (set-default-coding-systems coding-system))) - -;; (defun find-coding-systems-region-subset-p (list1 list2) -;; "Return non-nil if all elements in LIST1 are included in LIST2. -;; Comparison done with EQ." -;; (catch 'tag -;; (while list1 -;; (or (memq (car list1) list2) -;; (throw 'tag nil)) -;; (setq list1 (cdr list1))) -;; t)) - -;; (defun find-coding-systems-region (from to) -;; "Return a list of proper coding systems to encode a text between FROM and TO. -;; All coding systems in the list can safely encode any multibyte characters -;; in the text. -;; -;; If the text contains no multibyte characters, return a list of a single -;; element `undecided'." -;; (find-coding-systems-for-charsets (find-charset-region from to))) - -;; (defun find-coding-systems-string (string) -;; "Return a list of proper coding systems to encode STRING. -;; All coding systems in the list can safely encode any multibyte characters -;; in STRING. -;; -;; If STRING contains no multibyte characters, return a list of a single -;; element `undecided'." -;; (find-coding-systems-for-charsets (find-charset-string string))) - -;; (defun find-coding-systems-for-charsets (charsets) -;; "Return a list of proper coding systems to encode characters of CHARSETS. -;; CHARSETS is a list of character sets." -;; (if (or (null charsets) -;; (and (= (length charsets) 1) -;; (eq 'ascii (car charsets)))) -;; '(undecided) -;; (setq charsets (delq 'composition charsets)) -;; (let ((l (coding-system-list 'base-only)) -;; (charset-preferred-codings -;; (mapcar (function -;; (lambda (x) -;; (if (eq x 'unknown) -;; 'raw-text -;; (get-charset-property x 'preferred-coding-system)))) -;; charsets)) -;; (priorities (mapcar (function (lambda (x) (symbol-value x))) -;; coding-category-list)) -;; codings coding safe) -;; (if (memq 'unknown charsets) -;; ;; The region contains invalid multibyte characters. -;; (setq l '(raw-text))) -;; (while l -;; (setq coding (car l) l (cdr l)) -;; (if (and (setq safe (coding-system-get coding 'safe-charsets)) -;; (or (eq safe t) -;; (find-coding-systems-region-subset-p charsets safe))) -;; ;; We put the higher priority to coding systems included -;; ;; in CHARSET-PREFERRED-CODINGS, and within them, put the -;; ;; higher priority to coding systems which support smaller -;; ;; number of charsets. -;; (let ((priority -;; (+ (if (coding-system-get coding 'mime-charset) 4096 0) -;; (lsh (length (memq coding priorities)) 7) -;; (if (memq coding charset-preferred-codings) 64 0) -;; (if (> (coding-system-type coding) 0) 32 0) -;; (if (consp safe) (- 32 (length safe)) 0)))) -;; (setq codings (cons (cons priority coding) codings))))) -;; (mapcar 'cdr -;; (sort codings (function (lambda (x y) (> (car x) (car y)))))) -;; ))) - -;; (defun find-multibyte-characters (from to &optional maxcount excludes) -;; "Find multibyte characters in the region specified by FROM and TO. -;; If FROM is a string, find multibyte characters in the string. -;; The return value is an alist of the following format: -;; ((CHARSET COUNT CHAR ...) ...) -;; where -;; CHARSET is a character set, -;; COUNT is a number of characters, -;; CHARs are found characters of the character set. -;; Optional 3rd arg MAXCOUNT limits how many CHARs are put in the above list. -;; Optional 4th arg EXCLUDE is a list of character sets to be ignored. -;; -;; For invalid characters, CHARs are actually strings." -;; (let ((chars nil) -;; charset char) -;; (if (stringp from) -;; (let ((idx 0)) -;; (while (setq idx (string-match "[^\000-\177]" from idx)) -;; (setq char (aref from idx) -;; charset (char-charset char)) -;; (if (eq charset 'unknown) -;; (setq char (match-string 0))) -;; (if (or (eq charset 'unknown) -;; (not (or (eq excludes t) (memq charset excludes)))) -;; (let ((slot (assq charset chars))) -;; (if slot -;; (if (not (memq char (nthcdr 2 slot))) -;; (let ((count (nth 1 slot))) -;; (setcar (cdr slot) (1+ count)) -;; (if (or (not maxcount) (< count maxcount)) -;; (nconc slot (list char))))) -;; (setq chars (cons (list charset 1 char) chars))))) -;; (setq idx (1+ idx)))) -;; (save-excursion -;; (goto-char from) -;; (while (re-search-forward "[^\000-\177]" to t) -;; (setq char (preceding-char) -;; charset (char-charset char)) -;; (if (eq charset 'unknown) -;; (setq char (match-string 0))) -;; (if (or (eq charset 'unknown) -;; (not (or (eq excludes t) (memq charset excludes)))) -;; (let ((slot (assq charset chars))) -;; (if slot -;; (if (not (member char (nthcdr 2 slot))) -;; (let ((count (nth 1 slot))) -;; (setcar (cdr slot) (1+ count)) -;; (if (or (not maxcount) (< count maxcount)) -;; (nconc slot (list char))))) -;; (setq chars (cons (list charset 1 char) chars)))))))) -;; (nreverse chars))) - -;; (defvar last-coding-system-specified nil -;; "Most recent coding system explicitly specified by the user when asked. -;; This variable is set whenever Emacs asks the user which coding system -;; to use in order to write a file. If you set it to nil explicitly, -;; then call `write-region', then afterward this variable will be non-nil -;; only if the user was explicitly asked and specified a coding system.") - -;; (defun select-safe-coding-system (from to &optional default-coding-system) -;; "Ask a user to select a safe coding system from candidates. -;; The candidates of coding systems which can safely encode a text -;; between FROM and TO are shown in a popup window. -;; -;; Optional arg DEFAULT-CODING-SYSTEM specifies a coding system to be -;; checked at first. If omitted, buffer-file-coding-system of the -;; current buffer is used. -;; -;; If the text can be encoded safely by DEFAULT-CODING-SYSTEM, it is -;; returned without any user interaction. -;; -;; Kludgy feature: if FROM is a string, the string is the target text, -;; and TO is ignored." -;; (or default-coding-system -;; (setq default-coding-system buffer-file-coding-system)) -;; (let* ((charsets (if (stringp from) (find-charset-string from) -;; (find-charset-region from to))) -;; (safe-coding-systems (find-coding-systems-for-charsets charsets))) -;; (if (or (not enable-multibyte-characters) -;; (eq (car safe-coding-systems) 'undecided) -;; (eq default-coding-system 'no-conversion) -;; (and default-coding-system -;; (memq (coding-system-base default-coding-system) -;; safe-coding-systems))) -;; default-coding-system -;; -;; ;; At first, change each coding system to the corresponding -;; ;; mime-charset name if it is also a coding system. -;; (let ((l safe-coding-systems) -;; mime-charset) -;; (while l -;; (setq mime-charset (coding-system-get (car l) 'mime-charset)) -;; (if (and mime-charset (coding-system-p mime-charset)) -;; (setcar l mime-charset)) -;; (setq l (cdr l)))) -;; -;; (let ((non-safe-chars (find-multibyte-characters -;; from to 3 -;; (and default-coding-system -;; (coding-system-get default-coding-system -;; 'safe-charsets)))) -;; show-position overlays) -;; (save-excursion -;; ;; Highlight characters that default-coding-system can't encode. -;; (when (integerp from) -;; (goto-char from) -;; (let ((found nil)) -;; (while (and (not found) -;; (re-search-forward "[^\000-\177]" to t)) -;; (setq found (assq (char-charset (preceding-char)) -;; non-safe-chars)))) -;; (forward-line -1) -;; (setq show-position (point)) -;; (save-excursion -;; (while (and (< (length overlays) 256) -;; (re-search-forward "[^\000-\177]" to t)) -;; (let* ((char (preceding-char)) -;; (charset (char-charset char))) -;; (when (assq charset non-safe-chars) -;; (setq overlays (cons (make-overlay (1- (point)) (point)) -;; overlays)) -;; (overlay-put (car overlays) 'face 'highlight)))))) -;; -;; ;; At last, ask a user to select a proper coding system. -;; (unwind-protect -;; (save-window-excursion -;; (when show-position -;; ;; At first, be sure to show the current buffer. -;; (set-window-buffer (selected-window) (current-buffer)) -;; (set-window-start (selected-window) show-position)) -;; ;; Then, show a helpful message. -;; (with-output-to-temp-buffer "*Warning*" -;; (save-excursion -;; (set-buffer standard-output) -;; (insert "The target text contains the following non ASCII character(s):\n") -;; (let ((len (length non-safe-chars)) -;; (shown 0)) -;; (while (and non-safe-chars (< shown 3)) -;; (when (> (length (car non-safe-chars)) 2) -;; (setq shown (1+ shown)) -;; (insert (format "%25s: " (car (car non-safe-chars)))) -;; (let ((l (nthcdr 2 (car non-safe-chars)))) -;; (while l -;; (if (or (stringp (car l)) (char-valid-p (car l))) -;; (insert (car l))) -;; (setq l (cdr l)))) -;; (if (> (nth 1 (car non-safe-chars)) 3) -;; (insert "...")) -;; (insert "\n")) -;; (setq non-safe-chars (cdr non-safe-chars))) -;; (if (< shown len) -;; (insert (format "%27s\n" "...")))) -;; (insert (format "\ -;; These can't be encoded safely by the coding system %s. -;; -;; Please select one from the following safe coding systems:\n" -;; default-coding-system)) -;; (let ((pos (point)) -;; (fill-prefix " ")) -;; (mapcar (function (lambda (x) (princ " ") (princ x))) -;; safe-coding-systems) -;; (fill-region-as-paragraph pos (point))))) -;; -;; ;; Read a coding system. -;; (let* ((safe-names (mapcar (lambda (x) (list (symbol-name x))) -;; safe-coding-systems)) -;; (name (completing-read -;; (format "Select coding system (default %s): " -;; (car safe-coding-systems)) -;; safe-names nil t nil nil -;; (car (car safe-names))))) -;; (setq last-coding-system-specified (intern name)) -;; (if (integerp (coding-system-eol-type default-coding-system)) -;; (setq last-coding-system-specified -;; (coding-system-change-eol-conversion -;; last-coding-system-specified -;; (coding-system-eol-type default-coding-system)))) -;; last-coding-system-specified)) -;; (kill-buffer "*Warning*") -;; (while overlays -;; (delete-overlay (car overlays)) -;; (setq overlays (cdr overlays))))))))) - -;; (setq select-safe-coding-system-function 'select-safe-coding-system) - -;; (defun select-message-coding-system () -;; "Return a coding system to encode the outgoing message of the current buffer. -;; It at first tries the first coding system found in these variables -;; in this order: -;; (1) local value of `buffer-file-coding-system' -;; (2) value of `sendmail-coding-system' -;; (3) value of `default-buffer-file-coding-system' -;; (4) value of `default-sendmail-coding-system' -;; If the found coding system can't encode the current buffer, -;; or none of them are bound to a coding system, -;; it asks the user to select a proper coding system." -;; (let ((coding (or (and (local-variable-p 'buffer-file-coding-system) -;; buffer-file-coding-system) -;; sendmail-coding-system -;; default-buffer-file-coding-system -;; default-sendmail-coding-system))) -;; (if (eq coding 'no-conversion) -;; ;; We should never use no-conversion for outgoing mails. -;; (setq coding nil)) -;; (if (fboundp select-safe-coding-system-function) -;; (funcall select-safe-coding-system-function -;; (point-min) (point-max) coding) -;; coding))) ;;; Language support stuff. @@ -1057,7 +680,7 @@ to using the function `set-language-environment'." The default status is as follows: - The default value of buffer-file-coding-system is nil. + The default value of `buffer-file-coding-system' is nil. The default coding system for process I/O is nil. The default value for the command `set-terminal-coding-system' is nil. The default value for the command `set-keyboard-coding-system' is nil. diff --git a/lisp/mule/mule-coding.el b/lisp/mule/mule-coding.el index 3919545..84abe72 100644 --- a/lisp/mule/mule-coding.el +++ b/lisp/mule/mule-coding.el @@ -19,7 +19,7 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the +;; along with XEmacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. @@ -31,8 +31,7 @@ (defun coding-system-force-on-output (coding-system register) "Return the 'force-on-output property of CODING-SYSTEM for the specified REGISTER." - (unless (integerp register) - (signal 'wrong-type-argument (list 'integerp register))) + (check-type register integer) (coding-system-property coding-system (case register diff --git a/lisp/mule/mule-misc.el b/lisp/mule/mule-misc.el index 2a411dd..eeecb2f 100644 --- a/lisp/mule/mule-misc.el +++ b/lisp/mule/mule-misc.el @@ -19,7 +19,7 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the +;; along with XEmacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. @@ -220,25 +220,6 @@ because its `find-charset-string' ignores ASCII charset." ; )))) -;;; Commands - -(defun set-buffer-process-coding-system (decoding encoding) - "Set coding systems for the process associated with the current buffer. -DECODING is the coding system to be used to decode input from the process, -ENCODING is the coding system to be used to encode output to the process. - -For a list of possible values of CODING-SYSTEM, use \\[list-coding-systems]." - (interactive - "zCoding-system for process input: \nzCoding-system for process output: ") - (let ((proc (get-buffer-process (current-buffer)))) - (if (null proc) - (error "no process") - (check-coding-system decoding) - (check-coding-system encoding) - (set-process-coding-system proc decoding encoding))) - (force-mode-line-update)) - - ;;; Language environments ;; (defvar current-language-environment nil) @@ -314,13 +295,13 @@ when the language environment is made current." (coding-system-property coding-system prop) (error nil)))) -(defun coding-system-put (coding-system prop val) - "Change value in CODING-SYSTEM's property list PROP to VAL." +(defun coding-system-put (coding-system prop value) + "Change value in CODING-SYSTEM's property list PROP to VALUE." (put (coding-system-name coding-system) 'coding-system-property (plist-put (get (coding-system-name coding-system) 'coding-system-property) - prop val))) + prop value))) (defun coding-system-category (coding-system) "Return the coding category of CODING-SYSTEM." @@ -356,5 +337,5 @@ when the language environment is made current." ((= dim 2) 'iso-8-2) (t 'iso-8-designate)) )))))))) - + ;;; mule-misc.el ends here diff --git a/lisp/mule/thai-xtis.el b/lisp/mule/thai-xtis.el index 1092a05..1036597 100644 --- a/lisp/mule/thai-xtis.el +++ b/lisp/mule/thai-xtis.el @@ -342,8 +342,8 @@ 'tis-620 'ccl "external=tis620, internal=thai-xtis" `(mnemonic "TIS620" - decode ,ccl-decode-thai-xtis - encode ,ccl-encode-thai-xtis)) + decode ccl-decode-thai-xtis + encode ccl-encode-thai-xtis)) (coding-system-put 'tis-620 'category 'iso-8-1)) (make-coding-system 'tis-620 4 ?T "external=tis620, internal=thai-xtis" diff --git a/lisp/mule/viet-ccl.el b/lisp/mule/viet-ccl.el index 86b37e5..670e407 100644 --- a/lisp/mule/viet-ccl.el +++ b/lisp/mule/viet-ccl.el @@ -207,8 +207,8 @@ Both tables are indexed by the position code of Vietnamese characters.") 'viscii 'ccl "Coding-system used for VISCII 1.1." `(mnemonic "VISCII" - decode ,ccl-decode-viscii - encode ,ccl-encode-viscii)) + decode ccl-decode-viscii + encode ccl-encode-viscii)) ;; it is not correct, but XEmacs doesn't have `ccl' category... (coding-system-put 'viscii 'category 'iso-8-1) @@ -227,8 +227,8 @@ Both tables are indexed by the position code of Vietnamese characters.") 'vscii 'ccl "Coding-system used for VSCII 1.1." `(mnemonic "VSCII" - decode ,ccl-decode-vscii - encode ,ccl-encode-vscii)) + decode ccl-decode-vscii + encode ccl-encode-vscii)) ;; (make-coding-system ;; 'vietnamese-vscii 4 ?v @@ -241,12 +241,12 @@ Both tables are indexed by the position code of Vietnamese characters.") ;; For VISCII users (set-charset-ccl-program 'vietnamese-viscii-lower - ccl-encode-viscii-font) + 'ccl-encode-viscii-font) (set-charset-ccl-program 'vietnamese-viscii-upper - ccl-encode-viscii-font) + 'ccl-encode-viscii-font) ;; For VSCII users -(set-charset-ccl-program 'vietnamese-viscii-lower ccl-encode-vscii-font) -(set-charset-ccl-program 'vietnamese-viscii-upper ccl-encode-vscii-font) +(set-charset-ccl-program 'vietnamese-viscii-lower 'ccl-encode-vscii-font) +(set-charset-ccl-program 'vietnamese-viscii-upper 'ccl-encode-vscii-font) ;; (setq font-ccl-encoder-alist ;; (cons (cons "viscii" ccl-encode-viscii-font) font-ccl-encoder-alist)) diff --git a/lisp/multicast.el b/lisp/multicast.el index efd3f80..bcc6d08 100644 --- a/lisp/multicast.el +++ b/lisp/multicast.el @@ -45,7 +45,7 @@ (defun open-multicast-group (name buffer address) "Open a multicast connection on the specified address. -Returns a subprocess-object to represent the connection. +Returns a process object to represent the connection. Input and output work as for subprocesses; `delete-process' closes it. Args are NAME BUFFER ADDRESS. NAME is a name for the process. It is modified if necessary to make it unique. diff --git a/lisp/mwheel.el b/lisp/mwheel.el index 57725f2..03d4392 100644 --- a/lisp/mwheel.el +++ b/lisp/mwheel.el @@ -100,6 +100,7 @@ This can be slightly disconcerting, but some people may prefer it." ;;;###autoload (defun mwheel-install () "Enable mouse wheel support." + (interactive) (let ((keys '([(mouse-4)] [(shift mouse-4)] [(mouse-5)] [(shift mouse-5)]))) ;; This condition-case is here because Emacs 19 will throw an error ;; if you try to define a key that it does not know about. I for one diff --git a/lisp/obsolete.el b/lisp/obsolete.el index 635f368..8e8571f 100644 --- a/lisp/obsolete.el +++ b/lisp/obsolete.el @@ -57,7 +57,7 @@ This makes referencing or setting OLDVAR equivalent to referencing or setting NEWVAR and marks OLDVAR as obsolete. If OLDVAR was bound and NEWVAR was not, Set NEWVAR to OLDVAR. -Note: Use this before any other references (defvar/defcustom) to NEWVAR" +Note: Use this before any other references (defvar/defcustom) to NEWVAR." (let ((needs-setting (and (boundp oldvar) (not (boundp newvar)))) (value (and (boundp oldvar) (symbol-value oldvar)))) (defvaralias oldvar newvar) @@ -338,13 +338,13 @@ Multibyte characters are concerned." "Return a vector of characters in STRING." (mapvector #'identity string)) -(defun store-substring (string idx obj) - "Embed OBJ (string or character) at index IDX of STRING." - (let* ((str (cond ((stringp obj) obj) - ((characterp obj) (char-to-string obj)) +(defun store-substring (string idx object) + "Embed OBJECT (string or character) at index IDX of STRING." + (let* ((str (cond ((stringp object) object) + ((characterp object) (char-to-string object)) (t (error "Invalid argument (should be string or character): %s" - obj)))) + object)))) (string-len (length string)) (len (length str)) (i 0)) diff --git a/lisp/package-admin.el b/lisp/package-admin.el index 333d303..2f971ea 100644 --- a/lisp/package-admin.el +++ b/lisp/package-admin.el @@ -42,9 +42,9 @@ 'package-admin-install-function-mswindows 'package-admin-default-install-function) "The function to call to install a package. -Three args are passed: FILENAME PKG-DIR BUF +Three args are passed: FILENAME PKG-DIR BUFFER Install package FILENAME into directory PKG-DIR, with any messages output -to buffer BUF.") +to buffer BUFFER.") (defvar package-admin-error-messages '( "No space left on device" @@ -123,31 +123,31 @@ The optional `pkg-dir' can be used to override the default package hierarchy ;; rest of command line follows package-admin-xemacs file destination))) -(defun package-admin-install-function-mswindows (file pkg-dir buf) - "Install function for mswindows" +(defun package-admin-install-function-mswindows (file pkg-dir buffer) + "Install function for mswindows." (let ((default-directory (file-name-as-directory pkg-dir))) (unless (file-directory-p default-directory) (make-directory default-directory t)) - (call-process "minitar" nil buf t file))) + (call-process "minitar" nil buffer t file))) -(defun package-admin-default-install-function (file pkg-dir buf) +(defun package-admin-default-install-function (filename pkg-dir buffer) "Default function to install a package. Install package FILENAME into directory PKG-DIR, with any messages output -to buffer BUF." +to BUFFER." (let* ((pkg-dir (file-name-as-directory pkg-dir)) (default-directory pkg-dir) - (filename (expand-file-name file))) + (filename (expand-file-name filename))) (unless (file-directory-p pkg-dir) (make-directory pkg-dir t)) ;; Don't assume GNU tar. - (if (shell-command (concat "gunzip -c " filename " | tar xvf -") buf) + (if (shell-command (concat "gunzip -c " filename " | tar xvf -") buffer) 0 1) )) ; (call-process "add-big-package.sh" ; nil -; buf +; buffer ; t ; ;; rest of command line follows ; package-admin-xemacs file pkg-dir)) @@ -180,7 +180,7 @@ or return a location appropriate for the package otherwise." (if (eq package 'xemacs-base) (car (last late-packages)) (package-admin-get-install-dir 'xemacs-base nil nil))))))) - + (defun package-admin-get-manifest-file (pkg-topdir package) @@ -294,7 +294,7 @@ is the top-level directory under which the package was installed." ;; Create pkginfo, if necessary (if (not (file-directory-p pathname)) (make-directory pathname)) - (setq pathname (expand-file-name + (setq pathname (expand-file-name (concat "MANIFEST." package-name) pathname)) (save-excursion @@ -435,9 +435,9 @@ PACKAGE is a symbol, not a string." ;; Note, user might have removed the file! (condition-case () (delete-file file) - (error nil))) ;; We may want to turn the error into a Warning? + (error nil))) ;; We may want to turn the error into a Warning? (forward-line 1)) - + ;; Delete empty directories. (if dirs (let ( (orig-default-directory default-directory) @@ -473,7 +473,7 @@ PACKAGE is a symbol, not a string." (lambda (dir) (condition-case () (delete-directory dir))) - dirs)) + dirs)) (setq default-directory orig-default-directory) ))) ) @@ -499,7 +499,7 @@ PACKAGE is a symbol, not a string." (package-admin-rmtree package-lispdir) (message "Removing old lisp directory \"%s\" ... done" package-lispdir) - )) + )) ;; Delete the package from the database of installed packages. (package-delete-name package))) diff --git a/lisp/package-get.el b/lisp/package-get.el index b837861..88be9d3 100644 --- a/lisp/package-get.el +++ b/lisp/package-get.el @@ -184,6 +184,7 @@ order until the package is found. As a special case, `site-name' can be (defcustom package-get-download-sites '( ;; North America + ("Pre-Releases" "ftp.xemacs.org" "pub/xemacs/beta/experimental/packages") ("xemacs.org" "ftp.xemacs.org" "pub/xemacs/packages") ("crc.ca (Canada)" "ftp.crc.ca" "pub/packages/editors/xemacs/packages") ("ualberta.ca (Canada)" "sunsite.ualberta.ca" "pub/Mirror/xemacs/packages") @@ -457,11 +458,11 @@ used interactively, for example from a mail or news buffer." (package-get-update-base-entries content-beg content-end) (message "Updated package-get database")))) -(defun package-get-update-base-entries (beg end) +(defun package-get-update-base-entries (start end) "Update the package-get database with the entries found between -BEG and END in the current buffer." +START and END in the current buffer." (save-excursion - (goto-char beg) + (goto-char start) (if (not (re-search-forward "^(package-get-update-base-entry" nil t)) (error "Buffer does not contain package-get database entries")) (beginning-of-line) diff --git a/lisp/packages.el b/lisp/packages.el index 11162e4..780d9a0 100644 --- a/lisp/packages.el +++ b/lisp/packages.el @@ -355,7 +355,7 @@ This function is basically a wrapper over `locate-file'." (and version-directory (list version-directory)) (and site-directory (list site-directory))))) -(defvar packages-special-base-regexp "^\\(etc\\|info\\|lisp\\|lib-src\\|bin\\|pkginfo\\)$" +(defvar packages-special-base-regexp "^\\(etc\\|info\\|man\\|lisp\\|lib-src\\|bin\\|pkginfo\\)$" "Special subdirectories of packages.") (defvar packages-no-package-hierarchy-regexp @@ -418,7 +418,7 @@ DEFAULT is a default list of packages." (or default (let ((packages '())) (while package-locations - (packages-deconstruct + (packages-deconstruct (car package-locations) #'(lambda (name a-time thunk) (if (and (eq time a-time) @@ -529,12 +529,12 @@ Call HANDLE on each file off definitions of PACKAGE-LISP there." (defun packages-load-package-dumped-lisps (package-load-path) "Load dumped-lisp.el files along a load path. -Also load files off PACKAGE-LISP definitions there" +Also load files off PACKAGE-LISP definitions there." (packages-handle-package-dumped-lisps #'load package-load-path)) (defun packages-collect-package-dumped-lisps (package-load-path) "Load dumped-lisp.el files along a load path. -Return list of files off PACKAGE-LISP definitions there" +Return list of files off PACKAGE-LISP definitions there." (let ((*files* '())) (packages-handle-package-dumped-lisps #'(lambda (file) diff --git a/lisp/paragraphs.el b/lisp/paragraphs.el index cb6025c..0d209a9 100644 --- a/lisp/paragraphs.el +++ b/lisp/paragraphs.el @@ -99,8 +99,7 @@ to paragraphs. The fill functions insert and delete only soft newlines." (point) (1+ (point)))))))))))) (setq use-hard-newlines t))) -;; XEmacs - use purecopy -(defconst paragraph-start (purecopy "[ \t\n\f]") "\ +(defconst paragraph-start "[ \t\n\f]" "\ *Regexp for beginning of a line that starts OR separates paragraphs. This regexp should match lines that separate paragraphs and should also match lines that start a paragraph @@ -123,8 +122,7 @@ hard newline are considered to match.") ;; something very minimal, even including "." (which makes every hard newline ;; start a new paragraph). -;; XEmacs -- use purecopy -(defconst paragraph-separate (purecopy "[ \t\f]*$") "\ +(defconst paragraph-separate "[ \t\f]*$" "\ *Regexp for beginning of a line that separates paragraphs. If you change this, you may have to change paragraph-start also. @@ -133,8 +131,7 @@ the beginning of the line, so it should not use \"^\" as an anchor. This ensures that the paragraph functions will work equally within a region of text indented by a margin setting.") -;; XEmacs -- use purecopy -(defconst sentence-end (purecopy "[.?!][]\"')}]*\\($\\| $\\|\t\\| \\)[ \t\n]*") "\ +(defconst sentence-end "[.?!][]\"')}]*\\($\\| $\\|\t\\| \\)[ \t\n]*" "\ *Regexp describing the end of a sentence. All paragraph boundaries also end sentences, regardless. @@ -142,8 +139,7 @@ In order to be recognized as the end of a sentence, the ending period, question mark, or exclamation point must be followed by two spaces, unless it's inside some sort of quotes or parenthesis.") -;; XEmacs -- use purecopy -(defconst page-delimiter (purecopy "^\014") "\ +(defconst page-delimiter "^\014" "\ *Regexp describing line-beginnings that separate pages.") (defvar paragraph-ignore-fill-prefix nil "\ diff --git a/lisp/paths.el b/lisp/paths.el index 1636a56..d83d54c 100644 --- a/lisp/paths.el +++ b/lisp/paths.el @@ -91,7 +91,7 @@ (defvar mh-lib nil "Directory of MH library.") -(defvar rmail-file-name (purecopy "~/RMAIL") +(defvar rmail-file-name "~/RMAIL" "Name of user's primary mail file.") (defconst rmail-spool-directory nil @@ -104,7 +104,7 @@ Its name should end with a slash.") (defconst remote-shell-program nil "Program used to execute shell commands on a remote machine.") -(defconst term-file-prefix (purecopy "term/") +(defconst term-file-prefix "term/" "If non-nil, Emacs startup does (load (concat term-file-prefix (getenv \"TERM\"))) You may set this variable to nil in your `.emacs' file if you do not wish the terminal-initialization file to be loaded.") @@ -112,7 +112,7 @@ the terminal-initialization file to be loaded.") (defconst manual-program nil "Program to run to print man pages.") -(defconst abbrev-file-name (purecopy "~/.abbrev_defs") +(defconst abbrev-file-name "~/.abbrev_defs" "*Default name of file to read abbrevs from.") (defconst directory-abbrev-alist nil) diff --git a/lisp/printer.el b/lisp/printer.el index 8a12a5a..2a9cc7b 100644 --- a/lisp/printer.el +++ b/lisp/printer.el @@ -134,32 +134,33 @@ user-id User logon id user-name User full name" (error "not yet implemented")) -(defun generic-print-buffer (&optional buf) - "Print buffer BUF using a printing method appropriate to the O.S. being run. +(defun generic-print-buffer (&optional buffer) + "Print buffer BUFFER using a printing method appropriate to the O.S. being run. Under Unix, `lpr' is normally used to spool out a no-frills version of the buffer, or the `ps-print' package is used to pretty-print the buffer to a PostScript printer. Under MS Windows, the built-in printing support is used. -If BUF is nil or omitted, the current buffer is used." +If BUFFER is nil or omitted, the current buffer is used." (interactive) - (generic-print-region (point-min buf) (point-max buf) buf)) + (generic-print-region (point-min buffer) (point-max buffer) buffer)) -(defun generic-print-region (b e &optional buf) +(defun generic-print-region (start end &optional buffer) "Print region using a printing method appropriate to the O.S. being run. -The region between B and E of BUF (defaults to the current buffer) is printed. +The region between START and END of BUFFER (defaults to the current +buffer) is printed. Under Unix, `lpr' is normally used to spool out a no-frills version of the buffer, or the `ps-print' package is used to pretty-print the buffer to a PostScript printer. Under MS Windows, the built-in printing support is used." (cond ((valid-specifier-tag-p 'msprinter) (let (d f) - (setq buf (decode-buffer buf)) + (setq buffer (decode-buffer buffer)) (unwind-protect (progn (setq d (make-device 'msprinter printer-name)) (setq f (make-frame - (list* 'name (concat (substitute ?_ ?. - (buffer-name buf)) + (list* 'name (concat (substitute ?_ ?. + (buffer-name buffer)) " - XEmacs") '(menubar-visible-p nil has-modeline-p nil @@ -175,12 +176,12 @@ PostScript printer. Under MS Windows, the built-in printing support is used." (pixel-vertical-clip-threshold (/ vertdpi 2)) (last-end 0) done) - (set-window-buffer w (or buf (current-buffer))) - (set-window-start w b) + (set-window-buffer w (or buffer (current-buffer))) + (set-window-start w start) (while (not done) (redisplay-frame f) (print-job-eject-page f) - (let ((end (window-end w)) + (let ((this-end (window-end w)) (pixvis (window-last-line-visible-height w))) ;; in case we get stuck somewhere, bow out ;; rather than printing an infinite number of @@ -188,14 +189,14 @@ PostScript printer. Under MS Windows, the built-in printing support is used." ;; bigger than an entire page. but we really ;; need this check here. we should be more ;; clever in our check, to deal with this case. - (if (or (= end last-end) + (if (or (= this-end last-end) ;; #### fuckme! window-end returns a value ;; outside of the valid range of buffer ;; positions!!! - (>= end e)) + (>= this-end end)) (setq done t) - (setq last-end end) - (set-window-start w end) + (setq last-end this-end) + (set-window-start w this-end) (if pixvis (save-selected-window (select-window w) @@ -207,5 +208,5 @@ PostScript printer. Under MS Windows, the built-in printing support is used." ))) ((and (not (eq system-type 'windows-nt)) (fboundp 'lpr-buffer)) - (lpr-region buf)) + (lpr-region buffer)) (t (error "No print support available")))) diff --git a/lisp/process.el b/lisp/process.el index e078009..e287189 100644 --- a/lisp/process.el +++ b/lisp/process.el @@ -20,7 +20,7 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the +;; along with XEmacs; see the file COPYING. If not, write to the ;; Free Software Foundation, 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. @@ -258,7 +258,7 @@ In either case, the output is inserted after point (leaving mark after it)." (if (and output-buffer (not (or (bufferp output-buffer) (stringp output-buffer)))) (progn (barf-if-buffer-read-only) - (push-mark) + (push-mark nil (not (interactive-p))) ;; We do not use -f for csh; we will not support broken use of ;; .cshrcs. Even the BSD csh manual says to use ;; "if ($?prompt) exit" before things which are not useful @@ -405,7 +405,7 @@ Remaining arguments are strings to give program as arguments." (defun open-network-stream (name buffer host service &optional protocol) "Open a TCP connection for a service to a host. -Returns a subprocess-object to represent the connection. +Returns a process object to represent the connection. Input and output work as for subprocesses; `delete-process' closes it. Args are NAME BUFFER HOST SERVICE. NAME is name for process. It is modified if necessary to make it unique. diff --git a/lisp/replace.el b/lisp/replace.el index 990625b..6d7c7ee 100644 --- a/lisp/replace.el +++ b/lisp/replace.el @@ -56,7 +56,7 @@ That becomes the \"string to replace\".") (defvar replace-search-function (lambda (str limit) (search-forward str limit t)) - "Function used by perform-replace to search forward for a string. It will be + "Function used by perform-replace to search forward for a string. It will be called with two arguments: the string to search for and a limit bounding the search.") @@ -322,7 +322,7 @@ Alternatively, click \\[occur-mode-mouse-goto] on an item to go to it. (defun occur-mode-mouse-goto (event) "Go to the occurrence highlighted by mouse. -This function is only reasonable when bound to a mouse key in the occur buffer" +This function should be bound to a mouse key in the `*Occur*' buffer." (interactive "e") (let ((window-save (selected-window)) (frame-save (selected-frame))) @@ -498,7 +498,7 @@ It serves as a menu to find any of the occurrences in this buffer. (insert "--------\n")) (setq first nil) (insert-buffer-substring buffer start end) - (set-marker final-context-start + (set-marker final-context-start (- (point) (- end (match-end 0)))) (backward-char (- end start)) (setq tem (if (< nlines 0) (- nlines) nlines)) @@ -511,7 +511,7 @@ It serves as a menu to find any of the occurrences in this buffer. (if (null tag) (setq tag (format "%5d" this-linenum))) (insert tag ?:) - ;; FSFmacs -- + ;; FSFmacs -- ;; we handle this using mode-motion-highlight-line, above. ;; (put-text-property (save-excursion ;; (beginning-of-line) @@ -546,8 +546,7 @@ It serves as a menu to find any of the occurrences in this buffer. ;; It would be nice to use \\[...], but there is no reasonable way ;; to make that display both SPC and Y. (defconst query-replace-help - (purecopy - "Type Space or `y' to replace one match, Delete or `n' to skip to next, + "Type Space or `y' to replace one match, Delete or `n' to skip to next, RET or `q' to exit, Period to replace one match and exit, Comma to replace but not move point immediately, C-r to enter recursive edit (\\[exit-recursive-edit] to get out again), @@ -555,7 +554,7 @@ C-w to delete match and recursive edit, C-l to clear the frame, redisplay, and offer same replacement again, ! to replace all remaining matches with no more questions, ^ to move point back to previous match." -) + "Help message while in query-replace") (defvar query-replace-map nil @@ -596,7 +595,7 @@ The valid answers include `act', `skip', `act-and-show', (define-key map "\C-]" 'quit) ;FSFmacs (define-key map "\e" 'exit-prefix) (define-key map [escape] 'exit-prefix) - + (setq query-replace-map map))) ;; isearch-mode is dumped, so don't autoload. @@ -624,15 +623,16 @@ just as `query-replace' does. Instead, write a simple loop like this: (while (re-search-forward \"foo[ \t]+bar\" nil t) (replace-match \"foobar\" nil nil)) which will run faster and probably do exactly what you want. -When searching for a match, this function use `replace-search-function' and `replace-re-search-function'" +When searching for a match, this function uses +`replace-search-function' and `replace-re-search-function'." (or map (setq map query-replace-map)) (let* ((event (make-event)) (nocasify (not (and case-fold-search case-replace (string-equal from-string (downcase from-string))))) (literal (not regexp-flag)) - (search-function (if regexp-flag - replace-re-search-function + (search-function (if regexp-flag + replace-re-search-function replace-search-function)) (search-string from-string) (real-match-data nil) ; the match data for the current match @@ -692,7 +692,7 @@ When searching for a match, this function use `replace-search-function' and `rep (if (or (eobp) (and limit (>= (point) limit))) nil - ;; Don't replace the null string + ;; Don't replace the null string ;; right after end of previous replacement. (forward-char 1) (let ((case-fold-search qr-case-fold-search)) @@ -705,7 +705,7 @@ When searching for a match, this function use `replace-search-function' and `rep ;; Before we make the replacement, decide whether the search string ;; can match again just after this match. (if regexp-flag - (progn + (progn (setq match-again (looking-at search-string)) ;; XEmacs addition (store-match-data real-match-data))) diff --git a/lisp/select.el b/lisp/select.el index 479e548..3905641 100644 --- a/lisp/select.el +++ b/lisp/select.el @@ -20,7 +20,7 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the +;; along with XEmacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. @@ -28,7 +28,7 @@ ;;; Commentary: -;; This file is dumped with XEmacs +;; This file is dumped with XEmacs ;;; Code: @@ -40,7 +40,7 @@ COMPOUND_TEXT and STRING are the most commonly used data types. If a list is provided, the types are tried in sequence until there is a successful conversion.") -(defvar selection-sets-clipboard nil +(defvar selection-sets-clipboard nil "Controls the selection's relationship to the clipboard. When non-nil, any operation that sets the primary selection will also set the clipboard.") @@ -86,7 +86,7 @@ This will do nothing under anything other than X.") "Return the value of a window-system selection. The argument TYPE (default `PRIMARY') says which selection, and the argument DATA-TYPE (default `STRING', or `COMPOUND_TEXT' under Mule) -says how to convert the data. Returns NIL if there is no selection" +says how to convert the data. Returns NIL if there is no selection." (condition-case nil (get-selection type data-type) (t nil))) (defun get-selection (&optional type data-type) @@ -623,7 +623,7 @@ nil if this is impossible, or a suitable representation otherwise." (defun select-convert-from-integer (selection type value) (cond ((integerp value) ; Integer value) - + ((and (consp value) ; (integer . integer) (integerp (car value)) (integerp (cdr value))) @@ -633,7 +633,7 @@ nil if this is impossible, or a suitable representation otherwise." (< (cdr value) 0)) (cdr value) value))) - + ((and (listp value) ; (integer integer) (eq (length value) 2) (integerp (car value)) @@ -644,21 +644,21 @@ nil if this is impossible, or a suitable representation otherwise." (< (cdr value) 0)) (- (cadr value)) (cons (car value) (cadr value))))) - + ((listp value) ; list (if (cdr value) (mapcar '(lambda (x) (select-convert-from-integer selection type x)) value) (select-convert-from-integer selection type (car value)))) - + ((vectorp value) ; vector (if (eq (length value) 1) (select-convert-from-integer selection type (aref value 0)) (mapvector '(lambda (x) (select-convert-from-integer selection type x)) value))) - + (t nil) )) @@ -740,7 +740,7 @@ nil if this is impossible, or a suitable representation otherwise." (defun select-buffer-killed-text (selection type value buffer) (select-buffer-killed-default selection type value buffer)) - + ;; Types listed in here can be selections of XEmacs (setq selection-converter-out-alist '((TEXT . select-convert-to-text) diff --git a/lisp/simple.el b/lisp/simple.el index c8d5e1f..eb9ebee 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -108,14 +108,14 @@ This does not apply to \"yanked\" strings." If REGEXP-FLAG is non-nil, disregard letters preceded by `\\' (but not `\\\\') since they have special meaning in a regexp." (let ((case-fold-search nil)) - (not (string-match (if regexp-flag + (not (string-match (if regexp-flag "\\(^\\|\\\\\\\\\\|[^\\]\\)[A-Z]" "[A-Z]") string)) )) (defmacro with-search-caps-disable-folding (string regexp-flag &rest body) "\ -Eval BODY with `case-fold-search' let to nil if `search-caps-disable-folding' +Eval BODY with `case-fold-search' let to nil if `search-caps-disable-folding' is non-nil, and if STRING (either a string or a regular expression according to REGEXP-FLAG) contains uppercase letters." `(let ((case-fold-search @@ -124,27 +124,27 @@ to REGEXP-FLAG) contains uppercase letters." case-fold-search))) ,@body)) (put 'with-search-caps-disable-folding 'lisp-indent-function 2) -(put 'with-search-caps-disable-folding 'edebug-form-spec +(put 'with-search-caps-disable-folding 'edebug-form-spec '(sexp sexp &rest form)) -(defmacro with-interactive-search-caps-disable-folding (string regexp-flag +(defmacro with-interactive-search-caps-disable-folding (string regexp-flag &rest body) "Same as `with-search-caps-disable-folding', but only in the case of a function called interactively." `(let ((case-fold-search - (if (and (interactive-p) + (if (and (interactive-p) case-fold-search search-caps-disable-folding) (no-upper-case-p ,string ,regexp-flag) case-fold-search))) ,@body)) (put 'with-interactive-search-caps-disable-folding 'lisp-indent-function 2) -(put 'with-interactive-search-caps-disable-folding 'edebug-form-spec +(put 'with-interactive-search-caps-disable-folding 'edebug-form-spec '(sexp sexp &rest form)) -(defun newline (&optional arg) +(defun newline (&optional n) "Insert a newline, and move to left margin of the new line if it's blank. The newline is marked with the text-property `hard'. -With arg, insert that many newlines. +With optional arg N, insert that many newlines. In Auto Fill mode, if no numeric arg, break the preceding line if it's long." (interactive "*P") (barf-if-buffer-read-only nil (point)) @@ -178,16 +178,16 @@ In Auto Fill mode, if no numeric arg, break the preceding line if it's long." ;; Don't auto-fill if we have a numeric argument. ;; Also not if flag is true (it would fill wrong line); ;; there is no need to since we're at BOL. - (auto-fill-function (if (or arg flag) nil auto-fill-function))) + (auto-fill-function (if (or n flag) nil auto-fill-function))) (unwind-protect - (self-insert-command (prefix-numeric-value arg)) + (self-insert-command (prefix-numeric-value n)) ;; If we get an error in self-insert-command, put point at right place. (if flag (forward-char 1)))) ;; If we did *not* get an error, cancel that forward-char. (if flag (backward-char 1)) ;; Mark the newline(s) `hard'. (if use-hard-newlines - (let* ((from (- (point) (if arg (prefix-numeric-value arg) 1))) + (let* ((from (- (point) (if n (prefix-numeric-value n) 1))) (sticky (get-text-property from 'end-open))) ; XEmacs (put-text-property from (point) 'hard 't) ;; If end-open is not "t", add 'hard to end-open list @@ -219,7 +219,7 @@ In Auto Fill mode, if no numeric arg, break the preceding line if it's long." (put-text-property from (point) 'rear-nonsticky (cons 'hard sticky))))) -(defun open-line (arg) +(defun open-line (n) "Insert a newline and leave point before it. If there is a fill prefix and/or a left-margin, insert them on the new line if the line would have been blank. @@ -228,14 +228,14 @@ With arg N, insert N newlines." (let* ((do-fill-prefix (and fill-prefix (bolp))) (do-left-margin (and (bolp) (> (current-left-margin) 0))) (loc (point))) - (newline arg) + (newline n) (goto-char loc) - (while (> arg 0) + (while (> n 0) (cond ((bolp) (if do-left-margin (indent-to (current-left-margin))) (if do-fill-prefix (insert fill-prefix)))) (forward-line 1) - (setq arg (1- arg))) + (setq n (1- n))) (goto-char loc) (end-of-line))) @@ -827,33 +827,33 @@ With prefix argument, insert the result to the current buffer." (if eval-expression-insert-value (current-buffer) t))) ;; XEmacs -- extra parameter (variant, but equivalent logic) -(defun edit-and-eval-command (prompt command &optional history) - "Prompting with PROMPT, let user edit COMMAND and eval result. -COMMAND is a Lisp expression. Let user edit that expression in +(defun edit-and-eval-command (prompt form &optional history) + "Prompting with PROMPT, let user edit FORM and eval result. +FORM is a Lisp expression. Let user edit that expression in the minibuffer, then read and evaluate the result." - (let ((command (read-expression prompt - ;; first try to format the thing readably; - ;; and if that fails, print it normally. - (condition-case () - (let ((print-readably t)) - (prin1-to-string command)) - (error (prin1-to-string command))) - (or history '(command-history . 1))))) + (let ((form (read-expression prompt + ;; first try to format the thing readably; + ;; and if that fails, print it normally. + (condition-case () + (let ((print-readably t)) + (prin1-to-string form)) + (error (prin1-to-string form))) + (or history '(command-history . 1))))) (or history (setq history 'command-history)) (if (consp history) (setq history (car history))) (if (eq history t) nil - ;; If command was added to the history as a string, + ;; If form was added to the history as a string, ;; get rid of that. We want only evallable expressions there. (if (stringp (car (symbol-value history))) (set history (cdr (symbol-value history)))) - ;; If command to be redone does not match front of history, + ;; If form to be redone does not match front of history, ;; add it to the history. - (or (equal command (car (symbol-value history))) - (set history (cons command (symbol-value history))))) - (eval command))) + (or (equal form (car (symbol-value history))) + (set history (cons form (symbol-value history))))) + (eval form))) (defun repeat-complex-command (arg) "Edit and re-evaluate last complex command, or ARGth from last. @@ -880,21 +880,21 @@ to get different commands to edit and resubmit." ;; next-complete-history-element ;; previous-complete-history-element -(defun goto-line (arg) - "Goto line ARG, counting from line 1 at beginning of buffer." +(defun goto-line (line) + "Goto line LINE, counting from line 1 at beginning of buffer." (interactive "NGoto line: ") - (setq arg (prefix-numeric-value arg)) + (setq line (prefix-numeric-value line)) (save-restriction (widen) (goto-char 1) (if (eq selective-display t) - (re-search-forward "[\n\C-m]" nil 'end (1- arg)) - (forward-line (1- arg))))) + (re-search-forward "[\n\C-m]" nil 'end (1- line)) + (forward-line (1- line))))) ;Put this on C-x u, so we can force that rather than C-_ into startup msg (define-function 'advertised-undo 'undo) -(defun undo (&optional arg) +(defun undo (&optional count) "Undo some previous changes. Repeat this command to undo more changes. A numeric argument serves as a repeat count." @@ -910,7 +910,7 @@ A numeric argument serves as a repeat count." (eq (current-buffer) last-undo-buffer)) ; XEmacs (progn (undo-start) (undo-more 1))) - (undo-more (or arg 1)) + (undo-more (or count 1)) ;; Don't specify a position in the undo record for the undo command. ;; Instead, undoing this should move point to where the change is. (let ((tail buffer-undo-list) @@ -1090,16 +1090,16 @@ Repeating \\[universal-argument] without digits or minus sign ;; XEmacs -- keep zmacs-region active. -(defun forward-to-indentation (arg) - "Move forward ARG lines and position at first nonblank character." +(defun forward-to-indentation (count) + "Move forward COUNT lines and position at first nonblank character." (interactive "_p") - (forward-line arg) + (forward-line count) (skip-chars-forward " \t")) -(defun backward-to-indentation (arg) - "Move backward ARG lines and position at first nonblank character." +(defun backward-to-indentation (count) + "Move backward COUNT lines and position at first nonblank character." (interactive "_p") - (forward-line (- arg)) + (forward-line (- count)) (skip-chars-forward " \t")) (defcustom kill-whole-line nil @@ -1271,7 +1271,7 @@ ring directly.") (defun kill-new (string &optional replace) "Make STRING the latest kill in the kill ring. -Set the kill-ring-yank pointer to point to it. +Set `kill-ring-yank-pointer' to point to it. Run `kill-hooks'. Optional second argument REPLACE non-nil means that STRING will replace the front of the kill ring, rather than being added to the list." @@ -1331,7 +1331,7 @@ yanking point\; just return the Nth kill forward." ;(defvar kill-read-only-ok nil ; "*Non-nil means don't signal an error for killing read-only text.") -(defun kill-region (beg end &optional verbose) ; verbose is XEmacs addition +(defun kill-region (start end &optional verbose) ; verbose is XEmacs addition "Kill between point and mark. The text is deleted but saved in the kill ring. The command \\[yank] can retrieve it from there. @@ -1352,18 +1352,18 @@ to make one entry in the kill ring." ; (prog1 ; (list (point) (mark) current-prefix-arg) ; (if region-hack (zmacs-deactivate-region))))) - ;; beg and end can be markers but the rest of this function is + ;; start and end can be markers but the rest of this function is ;; written as if they are only integers - (if (markerp beg) (setq beg (marker-position beg))) + (if (markerp start) (setq start (marker-position start))) (if (markerp end) (setq end (marker-position end))) - (or (and beg end) (if zmacs-regions ;; rewritten for I18N3 snarfing + (or (and start end) (if zmacs-regions ;; rewritten for I18N3 snarfing (error "The region is not active now") (error "The mark is not set now"))) (if verbose (if buffer-read-only (lmessage 'command "Copying %d characters" - (- (max beg end) (min beg end))) + (- (max start end) (min start end))) (lmessage 'command "Killing %d characters" - (- (max beg end) (min beg end))))) + (- (max start end) (min start end))))) (cond ;; I don't like this large change in behavior -- jwz @@ -1373,11 +1373,11 @@ to make one entry in the kill ring." ;; just isn't aware of this. However, there's no harm in putting ;; the region's text in the kill ring, anyway. ((or (and buffer-read-only (not inhibit-read-only)) - (text-property-not-all (min beg end) (max beg end) 'read-only nil)) + (text-property-not-all (min start end) (max start end) 'read-only nil)) ;; This is redundant. ;; (if verbose (message "Copying %d characters" - ;; (- (max beg end) (min beg end)))) - (copy-region-as-kill beg end) + ;; (- (max start end) (min start end)))) + (copy-region-as-kill start end) ;; ;; This should always barf, and give us the correct error. ;; (if kill-read-only-ok ;; (message "Read only text copied to kill ring") @@ -1390,13 +1390,13 @@ to make one entry in the kill ring." ((not (or (eq buffer-undo-list t) (eq last-command 'kill-region) ;; Use = since positions may be numbers or markers. - (= beg end))) + (= start end))) ;; Don't let the undo list be truncated before we can even access it. ;; FSF calls this `undo-strong-limit' - (let ((undo-high-threshold (+ (- end beg) 100)) + (let ((undo-high-threshold (+ (- end start) 100)) ;(old-list buffer-undo-list) tail) - (delete-region beg end) + (delete-region start end) ;; Search back in buffer-undo-list for this string, ;; in case a change hook made property changes. (setq tail buffer-undo-list) @@ -1411,31 +1411,31 @@ to make one entry in the kill ring." (t ;; if undo is not kept, grab the string then delete it (which won't ;; add another string to the undo list). - (copy-region-as-kill beg end) - (delete-region beg end))) + (copy-region-as-kill start end) + (delete-region start end))) (setq this-command 'kill-region)) ;; copy-region-as-kill no longer sets this-command, because it's confusing ;; to get two copies of the text when the user accidentally types M-w and ;; then corrects it with the intended C-w. -(defun copy-region-as-kill (beg end) +(defun copy-region-as-kill (start end) "Save the region as if killed, but don't kill it. Run `kill-hooks'." (interactive "r") (if (eq last-command 'kill-region) - (kill-append (buffer-substring beg end) (< end beg)) - (kill-new (buffer-substring beg end))) + (kill-append (buffer-substring start end) (< end start)) + (kill-new (buffer-substring start end))) nil) -(defun kill-ring-save (beg end) +(defun kill-ring-save (start end) "Save the region as if killed, but don't kill it. This command is similar to `copy-region-as-kill', except that it gives visual feedback indicating the extent of the region being copied." (interactive "r") - (copy-region-as-kill beg end) + (copy-region-as-kill start end) ;; copy before delay, for xclipboard's benefit (if (interactive-p) - (let ((other-end (if (= (point) beg) end beg)) + (let ((other-end (if (= (point) start) end start)) (opoint (point)) ;; Inhibit quitting so we can make a quit here ;; look like a C-g typed as a command. @@ -1457,7 +1457,7 @@ visual feedback indicating the extent of the region being copied." ;; too noisy. -- jwz ; (let* ((killed-text (current-kill 0)) ; (message-len (min (length killed-text) 40))) -; (if (= (point) beg) +; (if (= (point) start) ; ;; Don't say "killed"; that is misleading. ; (message "Saved text until \"%s\"" ; (substring killed-text (- message-len))) @@ -1656,7 +1656,7 @@ 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 stack. -This is why most applications should use push-mark, not set-mark. +This is why most applications should use `push-mark', not `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. @@ -1664,7 +1664,7 @@ Most editing commands should not alter the mark. To remember a location for internal use in the Lisp program, store it in a Lisp variable. Example: - (let ((beg (point))) (forward-line 1) (delete-region beg (point)))." + (let ((start (point))) (forward-line 1) (delete-region start (point)))." (setq buffer (decode-buffer buffer)) (set-marker (mark-marker t buffer) pos buffer)) @@ -1960,7 +1960,7 @@ if `shifted-motion-keys-select-region' is nil." '(left right up down home end prior next kp-left kp-right kp-up kp-down kp-home kp-end kp-prior kp-next)))) - + (defun handle-pre-motion-command () (if (and @@ -2028,9 +2028,9 @@ boundaries do not cause an error to be signaled." (scroll-up-command 1)) (defun scroll-up-command (&optional n) - "Scroll text of current window upward ARG lines; or near full screen if no ARG. + "Scroll current window upward N lines; or near full screen if N is nil. A near full screen is `next-screen-context-lines' less than a full screen. -Negative ARG means scroll downward. +Negative N means scroll downward. When calling from a program, supply a number as argument or nil. On attempt to scroll past end of buffer, `end-of-buffer' is signaled. On attempt to scroll past beginning of buffer, `beginning-of-buffer' is @@ -2058,9 +2058,9 @@ boundaries do not cause an error to be signaled." (scroll-down-command 1)) (defun scroll-down-command (&optional n) - "Scroll text of current window downward ARG lines; or near full screen if no ARG. + "Scroll current window downward N lines; or near full screen if N is nil. A near full screen is `next-screen-context-lines' less than a full screen. -Negative ARG means scroll upward. +Negative N means scroll upward. When calling from a program, supply a number as argument or nil. On attempt to scroll past end of buffer, `end-of-buffer' is signaled. On attempt to scroll past beginning of buffer, `beginning-of-buffer' is @@ -2076,8 +2076,8 @@ boundaries do not cause an error to be signaled." (beginning-of-buffer nil) (end-of-buffer nil)))) -(defun next-line (arg) - "Move cursor vertically down ARG lines. +(defun next-line (count) + "Move cursor vertically down COUNT lines. If there is no character in the target line exactly under the current column, the cursor 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. @@ -2096,25 +2096,25 @@ If you are thinking of using this in a Lisp program, consider using `forward-line' instead. It is usually easier to use and more reliable (no dependence on goal column, etc.)." (interactive "_p") - (if (and next-line-add-newlines (= arg 1)) + (if (and next-line-add-newlines (= count 1)) (let ((opoint (point))) (end-of-line) (if (eobp) (newline 1) (goto-char opoint) - (line-move arg))) + (line-move count))) (if (interactive-p) ;; XEmacs: Not sure what to do about this. It's inconsistent. -sb (condition-case nil - (line-move arg) + (line-move count) ((beginning-of-buffer end-of-buffer) (when signal-error-on-buffer-boundary (ding nil 'buffer-bound)))) - (line-move arg))) + (line-move count))) nil) -(defun previous-line (arg) - "Move cursor vertically up ARG lines. +(defun previous-line (count) + "Move cursor vertically up COUNT lines. If there is no character in the target line exactly over the current column, the cursor 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. @@ -2129,11 +2129,11 @@ to use and more reliable (no dependence on goal column, etc.)." (interactive "_p") (if (interactive-p) (condition-case nil - (line-move (- arg)) + (line-move (- count)) ((beginning-of-buffer end-of-buffer) (when signal-error-on-buffer-boundary ; XEmacs (ding nil 'buffer-bound)))) - (line-move (- arg))) + (line-move (- count))) nil) (defcustom block-movement-size 6 @@ -2186,8 +2186,8 @@ Use with care, as it slows down movement significantly. Outline mode sets this. :group 'editing-basics) ;; This is the guts of next-line and previous-line. -;; Arg says how many lines to move. -(defun line-move (arg) +;; Count says how many lines to move. +(defun line-move (count) ;; Don't run any point-motion hooks, and disregard intangibility, ;; for intermediate positions. (let ((inhibit-point-motion-hooks t) @@ -2199,7 +2199,7 @@ Use with care, as it slows down movement significantly. Outline mode sets this. (eq last-command 'previous-line))) (setq temporary-goal-column (if (and track-eol (eolp) - ;; Don't count beg of empty line as end of line + ;; Don't count start of empty line as end of line ;; unless we just did explicit end-of-line. (or (not (bolp)) (eq last-command 'end-of-line))) 9999 @@ -2207,21 +2207,21 @@ Use with care, as it slows down movement significantly. Outline mode sets this. (if (and (not (integerp selective-display)) (not line-move-ignore-invisible)) ;; Use just newline characters. - (or (if (> arg 0) - (progn (if (> arg 1) (forward-line (1- arg))) - ;; This way of moving forward ARG lines + (or (if (> count 0) + (progn (if (> count 1) (forward-line (1- count))) + ;; This way of moving forward COUNT lines ;; verifies that we have a newline after the last one. ;; It doesn't get confused by intangible text. (end-of-line) (zerop (forward-line 1))) - (and (zerop (forward-line arg)) + (and (zerop (forward-line count)) (bolp))) - (signal (if (< arg 0) + (signal (if (< count 0) 'beginning-of-buffer 'end-of-buffer) nil)) - ;; Move by arg lines, but ignore invisible ones. - (while (> arg 0) + ;; Move by count lines, but ignore invisible ones. + (while (> count 0) (end-of-line) (and (zerop (vertical-motion 1)) (signal 'end-of-buffer nil)) @@ -2237,8 +2237,8 @@ Use with care, as it slows down movement significantly. Outline mode sets this. (if (get-text-property (point) 'invisible) (goto-char (next-single-property-change (point) 'invisible)) (goto-char (next-extent-change (point))))) ; XEmacs - (setq arg (1- arg))) - (while (< arg 0) + (setq count (1- count))) + (while (< count 0) (beginning-of-line) (and (zerop (vertical-motion -1)) (signal 'beginning-of-buffer nil)) @@ -2252,7 +2252,7 @@ Use with care, as it slows down movement significantly. Outline mode sets this. (if (get-text-property (1- (point)) 'invisible) (goto-char (previous-single-property-change (point) 'invisible)) (goto-char (previous-extent-change (point))))) ; XEmacs - (setq arg (1+ arg)))) + (setq count (1+ count)))) (move-to-column (or goal-column temporary-goal-column))) ;; Remember where we moved to, go back home, ;; then do the motion over again @@ -2269,7 +2269,7 @@ Use with care, as it slows down movement significantly. Outline mode sets this. ;; It's not on a key, as of 20.2. So no need for this. ;(put 'set-goal-column 'disabled t) -(defun set-goal-column (arg) +(defun set-goal-column (column) "Set the current horizontal position as a goal for \\[next-line] and \\[previous-line]. Those commands will move to this position in the line moved to rather than trying to keep the same horizontal position. @@ -2277,13 +2277,13 @@ With a non-nil argument, clears out the goal column so that \\[next-line] and \\[previous-line] resume vertical motion. The goal column is stored in the variable `goal-column'." (interactive "_P") ; XEmacs - (if arg + (if column (progn (setq goal-column nil) (display-message 'command "No goal column")) (setq goal-column (current-column)) (lmessage 'command - "Goal column %d (use %s with an arg to unset it)" + "Goal column %d (use %s with a prefix arg to unset it)" goal-column (substitute-command-keys "\\[set-goal-column]"))) nil) @@ -2395,7 +2395,7 @@ With argument 0, interchanges line point is in with line mark is in." (defun transpose-line-up (arg) "Move current line one line up, leaving point at beginning of that line. -This can be run repeatedly to move to current line up a number of lines." +This can be run repeatedly to move the current line up a number of lines." (interactive "*p") ;; Move forward over a line, ;; but create a newline if none exists yet. @@ -2408,7 +2408,7 @@ This can be run repeatedly to move to current line up a number of lines." (defun transpose-line-down (arg) "Move current line one line down, leaving point at beginning of that line. -This can be run repeatedly to move to current line down a number of lines." +This can be run repeatedly to move the current line down a number of lines." (interactive "*p") ;; Move forward over a line, ;; but create a newline if none exists yet. @@ -2642,7 +2642,7 @@ With argument, kill comments on that many lines starting with this one." (if arg (forward-line 1)) (setq count (1- count))))) -(defun comment-region (beg end &optional arg) +(defun comment-region (start end &optional arg) "Comment or uncomment each line in the region. With just C-u prefix arg, uncomment each line in region. Numeric prefix arg ARG means use ARG comment characters. @@ -2655,7 +2655,7 @@ not end the comment. Blank lines do not get comments." ;; every line. (interactive "r\nP") (or comment-start (error "No comment syntax is defined")) - (if (> beg end) (let (mid) (setq mid beg beg end end mid))) + (if (> start end) (let (mid) (setq mid start start end end mid))) (save-excursion (save-restriction (let ((cs comment-start) (ce comment-end) @@ -2668,9 +2668,9 @@ not end the comment. Blank lines do not get comments." (setq cs (concat cs comment-start) ce (concat ce comment-end)) (setq numarg (1- numarg)))) - ;; Loop over all lines from BEG to END. - (narrow-to-region beg end) - (goto-char beg) + ;; Loop over all lines from START to END. + (narrow-to-region start end) + (goto-char start) (while (not (eobp)) (if (or (eq numarg t) (< numarg 0)) (progn @@ -2902,7 +2902,7 @@ indicating whether soft newlines should be inserted.") (= (point) fill-point)) ;; 1999-09-17 hniksic: turn off Kinsoku until ;; it's debugged. - (indent-new-comment-line) + (funcall comment-line-break-function) ;; 97/3/14 jhod: Kinsoku processing ; ;(indent-new-comment-line) ; (let ((spacep (memq (char-before (point)) '(?\ ?\t)))) @@ -3052,6 +3052,7 @@ for `auto-fill-function' when turning Auto Fill mode on." (defun turn-on-auto-fill () "Unconditionally turn on Auto Fill mode." + (interactive) (auto-fill-mode 1)) (defun set-fill-column (arg) @@ -3206,14 +3207,14 @@ state before disabling selective display." (add-hook 'change-major-mode-hook 'nuke-selective-display) -(defconst overwrite-mode-textual (purecopy " Ovwrt") +(defconst overwrite-mode-textual " Ovwrt" "The string displayed in the mode line when in overwrite mode.") -(defconst overwrite-mode-binary (purecopy " Bin Ovwrt") +(defconst overwrite-mode-binary " Bin Ovwrt" "The string displayed in the mode line when in binary overwrite mode.") (defun overwrite-mode (arg) "Toggle overwrite mode. -With arg, turn overwrite mode on iff arg is positive. +With arg, enable overwrite mode if arg is positive, else disable. In overwrite mode, printing characters typed in replace existing text on a one-for-one basis, rather than pushing it to the right. At the end of a line, such characters extend the line. Before a tab, @@ -3229,7 +3230,7 @@ is supposed to make it easier to insert characters when necessary." (defun binary-overwrite-mode (arg) "Toggle binary overwrite mode. -With arg, turn binary overwrite mode on iff arg is positive. +With arg, enable binary overwrite mode if arg is positive, else disable. In binary overwrite mode, printing characters typed in replace existing text. Newlines are not treated specially, so typing at the end of a line joins the line to the next, with the typed character @@ -3256,7 +3257,7 @@ specialization of overwrite-mode, entered by setting the (defun line-number-mode (arg) "Toggle Line Number mode. -With arg, turn Line Number mode on iff arg is positive. +With arg, enable Line Number mode if arg is positive, else disable. When Line Number mode is enabled, the line number appears in the mode line." (interactive "P") @@ -3272,7 +3273,7 @@ in the mode line." (defun column-number-mode (arg) "Toggle Column Number mode. -With arg, turn Column Number mode on iff arg is positive. +With arg, enable Column Number mode if arg is positive, else disable. When Column Number mode is enabled, the column number appears in the mode line." (interactive "P") @@ -4399,5 +4400,5 @@ The C code calls this periodically, right before redisplay." "Send a string to the debugging output. The string is formatted using (apply #'format FORMAT ARGS)." (princ (apply #'format format args) 'external-debugging-output)) - + ;;; simple.el ends here diff --git a/lisp/sound.el b/lisp/sound.el index e63c0e9..2857165 100644 --- a/lisp/sound.el +++ b/lisp/sound.el @@ -163,12 +163,11 @@ nVolume (0 for default): ") ;; some conses in sound-alist might have been dumped with emacs. (if old (setq sound-alist (delq old (copy-sequence sound-alist))))) (setq sound-alist (cons - (purecopy - (nconc (list sound-name) - (if (and volume (not (eq 0 volume))) - (list ':volume volume)) - (list ':sound data))) - sound-alist))) + (nconc (list sound-name) + (if (and volume (not (eq 0 volume))) + (list ':volume volume)) + (list ':sound data)) + sound-alist))) sound-name) ;;;###autoload diff --git a/lisp/startup.el b/lisp/startup.el index 91c82c0..a63465f 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -136,7 +136,7 @@ Otherwise, XEmacs will offer migration to the init directory.") ;; #### called `site-run-file' in FSFmacs -(defvar site-start-file (purecopy "site-start") +(defvar site-start-file "site-start" "File containing site-wide run-time initializations. This file is loaded at run-time before `.emacs'. It contains inits that need to be in place for the entire site, but @@ -171,11 +171,6 @@ after your init file is read, in case it sets `mail-host-address'." :type 'string :group 'mail) -(defvar auto-save-list-file-prefix "~/.saves-" - "Prefix for generating auto-save-list-file-name. -Emacs's pid and the system name will be appended to -this prefix to create a unique file name.") - (defvar init-file-debug nil) (defvar init-file-had-error nil) @@ -190,23 +185,22 @@ after, and will not be true at any time before.") (defvar command-switch-alist - (purecopy - '(("-help" . command-line-do-help) - ("-version". command-line-do-version) - ("-V" . command-line-do-version) - ("-funcall". command-line-do-funcall) - ("-f" . command-line-do-funcall) - ("-e" . command-line-do-funcall-1) - ("-eval" . command-line-do-eval) - ("-load" . command-line-do-load) - ("-l" . command-line-do-load) - ("-insert" . command-line-do-insert) - ("-i" . command-line-do-insert) - ("-kill" . command-line-do-kill) - ;; Options like +35 are handled specially. - ;; Window-system, site, or package-specific code might add to this. - ;; X11 handles its options by letting Xt remove args from this list. - )) + '(("-help" . command-line-do-help) + ("-version". command-line-do-version) + ("-V" . command-line-do-version) + ("-funcall". command-line-do-funcall) + ("-f" . command-line-do-funcall) + ("-e" . command-line-do-funcall-1) + ("-eval" . command-line-do-eval) + ("-load" . command-line-do-load) + ("-l" . command-line-do-load) + ("-insert" . command-line-do-insert) + ("-i" . command-line-do-insert) + ("-kill" . command-line-do-kill) + ;; Options like +35 are handled specially. + ;; Window-system, site, or package-specific code might add to this. + ;; X11 handles its options by letting Xt remove args from this list. + ) "Alist of command-line switches. Elements look like (SWITCH-STRING . HANDLER-FUNCTION). HANDLER-FUNCTION receives switch name as sole arg; @@ -449,12 +443,13 @@ Type ^H^H^H (Control-h Control-h Control-h) to get more help options.\n") (setq default-directory (abbreviate-file-name default-directory)) ;; Specify the file for recording all the auto save files of ;; this session. This is used by recover-session. - (setq auto-save-list-file-name - (expand-file-name - (format "%s%d-%s" - auto-save-list-file-prefix - (emacs-pid) - (system-name)))) + (if auto-save-list-file-prefix + (setq auto-save-list-file-name + (expand-file-name + (format "%s%d-%s" + auto-save-list-file-prefix + (emacs-pid) + (system-name))))) (run-hooks 'emacs-startup-hook) (and term-setup-hook (run-hooks 'term-setup-hook)) diff --git a/lisp/subr.el b/lisp/subr.el index fd65346..bbde00d 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -359,7 +359,7 @@ function allows you to set the local value. NOTE: At some point, this will be moved into C and will be very fast." (with-current-buffer buffer (set sym val))) - + ;;;; String functions. ;; XEmacs @@ -446,13 +446,13 @@ See also `with-temp-buffer'." (set-buffer ,buffer) ,@body)) -(defmacro with-temp-file (file &rest forms) - "Create a new buffer, evaluate FORMS there, and write the buffer to FILE. +(defmacro with-temp-file (filename &rest forms) + "Create a new buffer, evaluate FORMS there, and write the buffer to FILENAME. The value of the last form in FORMS is returned, like `progn'. See also `with-temp-buffer'." (let ((temp-file (make-symbol "temp-file")) (temp-buffer (make-symbol "temp-buffer"))) - `(let ((,temp-file ,file) + `(let ((,temp-file ,filename) (,temp-buffer (get-buffer-create (generate-new-buffer-name " *temp file*")))) (unwind-protect @@ -571,20 +571,20 @@ The original alist is not modified. See also `destructive-alist-to-plist'." ;; getf, remf in cl*.el. -(defmacro putf (plist prop val) - "Add property PROP to plist PLIST with value VAL. -Analogous to (setq PLIST (plist-put PLIST PROP VAL))." - `(setq ,plist (plist-put ,plist ,prop ,val))) +(defmacro putf (plist property value) + "Add property PROPERTY to plist PLIST with value VALUE. +Analogous to (setq PLIST (plist-put PLIST PROPERTY VALUE))." + `(setq ,plist (plist-put ,plist ,property ,value))) -(defmacro laxputf (lax-plist prop val) - "Add property PROP to lax plist LAX-PLIST with value VAL. -Analogous to (setq LAX-PLIST (lax-plist-put LAX-PLIST PROP VAL))." - `(setq ,lax-plist (lax-plist-put ,lax-plist ,prop ,val))) +(defmacro laxputf (lax-plist property value) + "Add property PROPERTY to lax plist LAX-PLIST with value VALUE. +Analogous to (setq LAX-PLIST (lax-plist-put LAX-PLIST PROPERTY VALUE))." + `(setq ,lax-plist (lax-plist-put ,lax-plist ,property ,value))) -(defmacro laxremf (lax-plist prop) - "Remove property PROP from lax plist LAX-PLIST. -Analogous to (setq LAX-PLIST (lax-plist-remprop LAX-PLIST PROP))." - `(setq ,lax-plist (lax-plist-remprop ,lax-plist ,prop))) +(defmacro laxremf (lax-plist property) + "Remove property PROPERTY from lax plist LAX-PLIST. +Analogous to (setq LAX-PLIST (lax-plist-remprop LAX-PLIST PROPERTY))." + `(setq ,lax-plist (lax-plist-remprop ,lax-plist ,property))) ;;; Error functions @@ -746,9 +746,9 @@ yourself.]" ;;;; Miscellanea. ;; This is now in C. -;(defun buffer-substring-no-properties (beg end) -; "Return the text from BEG to END, without text properties, as a string." -; (let ((string (buffer-substring beg end))) +;(defun buffer-substring-no-properties (start end) +; "Return the text from START to END, without text properties, as a string." +; (let ((string (buffer-substring start end))) ; (set-text-properties 0 (length string) nil string) ; string)) diff --git a/lisp/syntax.el b/lisp/syntax.el index 8835eab..08557cd 100644 --- a/lisp/syntax.el +++ b/lisp/syntax.el @@ -16,7 +16,7 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the +;; along with XEmacs; see the file COPYING. If not, write to the ;; Free Software Foundation, 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. @@ -147,11 +147,11 @@ If STRING is invalid, signal an error." (setq code (cons code (aref string 1)))) code)) -(defun modify-syntax-entry (char-range spec &optional table) +(defun modify-syntax-entry (char-range spec &optional syntax-table) "Set syntax for the characters CHAR-RANGE according to string SPEC. CHAR-RANGE is a single character or a range of characters, as per `put-char-table'. -The syntax is changed only for table TABLE, which defaults to +The syntax is changed only for SYNTAX-TABLE, which defaults to the current buffer's syntax table. The first character of SPEC should be one of the following: Space whitespace syntax. w word constituent. @@ -181,26 +181,27 @@ Defined flags are the characters 1, 2, 3, 4, 5, 6, 7, 8, p, a, and b. between expressions. a means C is comment starter or comment ender for comment style a (default) b means C is comment starter or comment ender for comment style b." - (interactive + (interactive ;; I really don't know why this is interactive ;; help-form should at least be made useful while reading the second arg "cSet syntax for character: \nsSet syntax for %c to: ") - (cond ((syntax-table-p table)) - ((not table) - (setq table (syntax-table))) - (t - (setq table - (wrong-type-argument 'syntax-table-p table)))) - (let ((code (syntax-string-to-code spec))) - (simple-set-syntax-entry char-range code table)) + (simple-set-syntax-entry + char-range + (syntax-string-to-code spec) + (cond ((syntax-table-p syntax-table) + syntax-table) + ((null syntax-table) + (syntax-table)) + (t + (wrong-type-argument 'syntax-table-p syntax-table)))) nil) -(defun map-syntax-table (__function __table &optional __range) - "Map FUNCTION over entries in syntax table TABLE, collapsing inheritance. +(defun map-syntax-table (__function __syntax_table &optional __range) + "Map FUNCTION over entries in SYNTAX-TABLE, collapsing inheritance. This is similar to `map-char-table', but works only on syntax tables, and collapses any entries that call for inheritance by invisibly substituting the inherited values from the standard syntax table." - (check-argument-type 'syntax-table-p __table) + (check-argument-type 'syntax-table-p __syntax_table) (map-char-table #'(lambda (__key __value) (if (eq ?@ (char-syntax-from-code __value)) (map-char-table #'(lambda (__key __value) @@ -209,7 +210,7 @@ This is similar to `map-char-table', but works only on syntax tables, and (standard-syntax-table) __key) (funcall __function __key __value))) - __table __range)) + __syntax_table __range)) ;(defun test-xm () ; (let ((o (copy-syntax-table)) diff --git a/lisp/term/bg-mouse.el b/lisp/term/bg-mouse.el index ca3b447..e75f35e 100644 --- a/lisp/term/bg-mouse.el +++ b/lisp/term/bg-mouse.el @@ -71,7 +71,7 @@ To reinitialize the mouse if the terminal is reset, type ESC : RET" ((screen-mouse-x (min (1- (frame-width)) ;don't hit column 86! (/ (bg-get-tty-num semicolon) 9))) (screen-mouse-y (- (1- (frame-height)) ;assume default font size. - (/ (bg-get-tty-num semicolon) 16))) + (/ (bg-get-tty-num semicolon) 16))) (bg-mouse-buttons (% (bg-get-tty-num ?c) 8)) (bg-mouse-window (bg-window-from-x-y screen-mouse-x screen-mouse-y)) (bg-cursor-window (selected-window)) @@ -168,8 +168,8 @@ through the buffer as the BitGraph mouse's X position in the window." (scroll-up bg-mouse-y)) (defun bg-mouse-line-to-center () - "Scroll the line pointed to by the BitGraph mouse to the center -of the window" + "Scroll the line pointed to by the BitGraph mouse to the center +of the window." (interactive) (scroll-up (/ (+ 2 bg-mouse-y bg-mouse-y (- (window-height))) 2))) @@ -290,7 +290,7 @@ X and Y are 0-based character positions on the screen." "Bind bg-mouse CLICK-CODE to run FUNCTION." (define-key mouse-map (char-to-string click-code) function)) -(bind-bg-mouse-click bg-button-l 'bg-set-point) +(bind-bg-mouse-click bg-button-l 'bg-set-point) (bind-bg-mouse-click bg-button-m 'bg-yank) (bind-bg-mouse-click bg-button-r 'bg-set-mark) (bind-bg-mouse-click (+ bg-button-l bg-button-m) 'yank-pop-1) diff --git a/lisp/term/sun-mouse.el b/lisp/term/sun-mouse.el index 0537147..2879126 100644 --- a/lisp/term/sun-mouse.el +++ b/lisp/term/sun-mouse.el @@ -34,7 +34,7 @@ ;; Modelled after the GNUEMACS keymap interface. ;; ;; User Functions: -;; make-mousemap, copy-mousemap, +;; make-mousemap, copy-mousemap, ;; define-mouse, global-set-mouse, local-set-mouse, ;; use-global-mousemap, use-local-mousemap, ;; mouse-lookup, describe-mouse-bindings @@ -189,7 +189,7 @@ Just like the Common Lisp function of the same name." YESMINI says to include the minibuffer as a window. This is a macro, and does not evaluate its arguments." `(let ((OriginallySelectedWindow (selected-window))) - (unwind-protect + (unwind-protect (while (progn ,form (not (eq OriginallySelectedWindow @@ -216,7 +216,7 @@ Handles wrapped and horizontally scrolled lines correctly." (defun minibuffer-window-p (window) - "True iff this WINDOW is minibuffer." + "Return t if this WINDOW is a minibuffer." (= (frame-height) (nth 3 (window-edges window)) ; The bottom edge. )) @@ -224,9 +224,9 @@ Handles wrapped and horizontally scrolled lines correctly." (defun sun-mouse-handler (&optional hit) "Evaluates the function or list associated with a mouse hit. -Expecting to read a hit, which is a list: (button x y delta). -A form bound to button by define-mouse is found by mouse-lookup. -The variables: *mouse-window*, *mouse-x*, *mouse-y* are bound. +Expecting to read a hit, which is a list: (button x y delta). +A form bound to button by define-mouse is found by mouse-lookup. +The variables: *mouse-window*, *mouse-x*, *mouse-y* are bound. If the form is a symbol (symbolp), it is funcall'ed with *mouse-window*, *mouse-x*, and *mouse-y* as arguments; if the form is a list (listp), the form is eval'ed; if the form is neither of these, it is an error. @@ -242,8 +242,8 @@ Returns nil." (mouse-lookup mouse-code)))) (cond ((null form) (if (not (sm::hit-up-p hit)) ; undefined up hits are ok. - (error "Undefined mouse event: %s" - (prin1-to-string + (error "Undefined mouse event: %s" + (prin1-to-string (mouse-code-to-mouse-list mouse-code))))) ((symbolp form) (setq this-command form) @@ -268,9 +268,9 @@ Returns nil." (let ((hit2 (mouse-second-hit extra-click-wait))) (if hit2 ; we cons'd it, we can smash it. ; (setf (sm::hit-code hit1) (logior (sm::hit-code hit1) ...)) - (setcar hit1 (logior (sm::hit-code hit1) + (setcar hit1 (logior (sm::hit-code hit1) (sm::hit-code hit2) - (if (= (sm::hit-button hit1) + (if (= (sm::hit-button hit1) (sm::hit-button hit2)) sm::DoubleBits 0)))))) hit1)) @@ -280,7 +280,7 @@ Returns nil." but that uses minibuffer, and mucks up last-command." (let ((char-list nil) (char nil)) (while (not (equal 13 ; Carriage return. - (prog1 (setq char (read-char)) + (prog1 (setq char (read-char)) (setq char-list (cons char char-list)))))) (read (mapconcat 'char-to-string (nreverse char-list) "")) )) @@ -331,7 +331,7 @@ but that uses minibuffer, and mucks up last-command." Returns list (window x y) where x and y are relative to window." (or (catch 'found - (eval-in-windows + (eval-in-windows (let ((we (window-edges (selected-window)))) (let ((le (nth 0 we)) (te (nth 1 we)) @@ -347,7 +347,7 @@ Returns list (window x y) where x and y are relative to window." (if (and (>= x le) (< x re) (>= y te) (< y be)) - (throw 'found + (throw 'found (list (selected-window) (- x le) (- y te)))))) t)) ; include minibuffer in eval-in-windows ;;If x,y from a real mouse click, we shouldn't get here. @@ -375,14 +375,14 @@ Returns one of (text scrollbar modeline minibuffer)" (t 'text))))) (defun window-line-end (w x y) - "Return WINDOW column (ignore X) containing end of line Y" + "Return WINDOW column (ignore X) containing end of line Y." (eval-in-window w (save-excursion (move-to-loc (frame-width) y)))) ;;; ;;; The encoding of mouse events into a mousemap. ;;; These values must agree with coding in emacstool: ;;; -(defconst sm::keyword-alist +(defconst sm::keyword-alist '((left . 1) (middle . 2) (right . 4) (shift . 8) (control . 16) (meta . 32) (double . 64) (up . 128) (text . 256) (scrollbar . 512) (modeline . 1024) (minibuffer . 2048) @@ -538,7 +538,7 @@ where each mouse-list is bound to the function in REGION." (defun describe-mouse-briefly (mouse-list) "Print a short description of the function bound to MOUSE-LIST." - (interactive "xDescibe mouse list briefly: ") + (interactive "xDescribe mouse list briefly: ") (let ((function (mouse-lookup (mouse-list-to-mouse-code mouse-list)))) (if function (message "%s runs the command %s" mouse-list function) @@ -584,7 +584,7 @@ of MENU. MENU (or its symbol-value) should be a menu defined by defmenu. the FORM associated with the selected STRING is evaluated, and the resulting value is returned. Generally these FORMs are evaluated for their side-effects rather than their values. - If the selected form is a menu or a symbol whose value is a menu, + If the selected form is a menu or a symbol whose value is a menu, then it is displayed and evaluated as a pullright menu item. If the FORM of the first ITEM is nil, the STRING of the item is used as a label for the menu, i.e. it's inverted and not selectable." @@ -595,7 +595,7 @@ is used as a label for the menu, i.e. it's inverted and not selectable." (defun sun-get-frame-data (code) "Sends the tty-sub-window escape sequence CODE to terminal, and returns a cons of the two numbers in returned escape sequence. -That is it returns (cons ) from \"\\E[n;;t\". +That is it returns (cons ) from \"\\E[n;;t\". CODE values: 13 = Tool-Position, 14 = Size-in-Pixels, 18 = Size-in-Chars." (send-string-to-terminal (concat "\033[" (int-to-string code) "t")) (let (char str x y) @@ -615,9 +615,9 @@ CODE values: 13 = Tool-Position, 14 = Size-in-Pixels, 18 = Size-in-Chars." (chr (sun-get-frame-data 18))) ; returns size in chars (cons (/ (car pix) (car chr)) (/ (cdr pix) (cdr chr))))) -(defvar sm::menu-kludge-x nil +(defvar sm::menu-kludge-x nil "Cached frame-to-window X-Offset for sm::menu-kludge") -(defvar sm::menu-kludge-y nil +(defvar sm::menu-kludge-y nil "Cached frame-to-window Y-Offset for sm::menu-kludge") (defun sm::menu-kludge () @@ -641,10 +641,10 @@ Insert contents into the current buffer at point." (set-mark-command nil) (insert-string (sun-get-selection))) -(defun sun-select-region (beg end) +(defun sun-select-region (start end) "Set the sunwindows selection to the region in the current buffer." (interactive "r") - (sun-set-selection (buffer-substring beg end))) + (sun-set-selection (buffer-substring start end))) ;;; ;;; Support for emacstool @@ -653,7 +653,7 @@ Insert contents into the current buffer at point." (defun suspend-emacstool (&optional stuffstring) "Suspend emacstool. If running under as a detached process emacstool, -you don't want to suspend (there is no way to resume), +you don't want to suspend (there is no way to resume), just close the window, and wait for reopening." (interactive) (run-hooks 'suspend-hook) diff --git a/lisp/term/sun.el b/lisp/term/sun.el index 94d443c..5cb92ef 100644 --- a/lisp/term/sun.el +++ b/lisp/term/sun.el @@ -43,10 +43,10 @@ (next-line n) (scroll-up n)) -(defun kill-region-and-unmark (beg end) +(defun kill-region-and-unmark (start end) "Like kill-region, but pops the mark [which equals point, anyway.]" (interactive "r") - (kill-region beg end) + (kill-region start end) (setq this-command 'kill-region-and-unmark) (set-mark-command t)) @@ -68,11 +68,11 @@ (let* ((command (car command-history)) (command-name (symbol-name (car command))) (search-arg (car (cdr command))) - (search-command + (search-command (and command-name (string-match "search" command-name))) ) (if (and search-command (stringp search-arg)) (setq grep-arg search-arg) - (setq search-command this-command + (setq search-command this-command grep-arg (read-string "REsearch: " grep-arg) this-command search-command) grep-arg)))) @@ -91,7 +91,7 @@ ;;; handle sun's extra function keys ;;; this version for those who run with standard .ttyswrc and no emacstool ;;; -;;; sunview picks up expose and open on the way UP, +;;; sunview picks up expose and open on the way UP, ;;; so we ignore them on the way down ;;; @@ -169,11 +169,11 @@ ;;; ;;; {c} is [a-j] for LEFT, [a-i] for TOP, [a-o] for RIGHT. ;;; A higher level insists on encoding {h,j,l,n}{r} (the arrow keys) -;;; as ANSI escape sequences. Use the shell command +;;; as ANSI escape sequences. Use the shell command ;;; % setkeys noarrows ;;; if you want these to come through for emacstool. ;;; -;;; If you are not using EmacsTool, +;;; If you are not using EmacsTool, ;;; you can also use this by creating a .ttyswrc file to do the conversion. ;;; but it won't include the CONTROL, META, or SHIFT keys! ;;; @@ -213,10 +213,10 @@ (define-key suntool-map "i\M-l" 'research-backward) ; M-Find (define-key suntool-map "i\M-," 're-search-backward) ; C-M-Find -(define-key suntool-map "jL" 'yank) ; DELETE +(define-key suntool-map "jL" 'yank) ; DELETE (define-key suntool-map "jl" 'kill-region-and-unmark) ; Delete (define-key suntool-map "j\M-l" 'exchange-point-and-mark); M-Delete -(define-key suntool-map "j," +(define-key suntool-map "j," #'(lambda () (interactive) (pop-mark 1))) ; C-Delete (define-key suntool-map "fT" 'shrink-window-horizontally) ; T6 @@ -249,7 +249,7 @@ ;;; ;;; C-x C-@ is the mouse command prefix. -(autoload 'sun-mouse-handler "sun-mouse" +(autoload 'sun-mouse-handler "sun-mouse" "Sun Emacstool handler for mouse blips (not loaded)." t) (defun emacstool-init () diff --git a/lisp/update-elc-2.el b/lisp/update-elc-2.el index aa46fcf..eb2bd21 100644 --- a/lisp/update-elc-2.el +++ b/lisp/update-elc-2.el @@ -52,18 +52,18 @@ (defvar update-elc-ignored-files ;; note: entries here are regexps '("^," ;; #### huh? - "^paths.el$" - "^loadup.el$" - "^loadup-el.el$" - "^update-elc.el$" - "^update-elc-2.el$" - "^dumped-lisp.el$" - "^make-docfile.el$" - "^site-start.el$" - "^site-load.el$" - "^site-init.el$" - "^version.el$" - "^very-early-lisp.el$")) + "^paths\\.el$" + "^loadup\\.el$" + "^loadup-el\\.el$" + "^update-elc\\.el$" + "^update-elc-2\\.el$" + "^dumped-lisp\\.el$" + "^make-docfile\\.el$" + "^site-start\\.el$" + "^site-load\\.el$" + "^site-init\\.el$" + "^version\\.el$" + "^very-early-lisp\\.el$")) ;; SEEN accumulates the list of already-handled dirs. (defun do-update-elc-2 (dir compile-stage-p seen) @@ -75,7 +75,7 @@ ;; Do this directory. (if compile-stage-p ;; Stage 2: Recompile necessary .els - (let ((files (directory-files dir t ".el$")) + (let ((files (directory-files dir t "\\.el$")) file file-c) (while (setq file (car files)) (setq files (cdr files)) @@ -95,7 +95,7 @@ ;; Stage 1. ;; Remove out-of-date elcs - (let ((files (directory-files dir t ".el$")) + (let ((files (directory-files dir t "\\.el$")) file file-c) (while (setq file (car files)) (setq files (cdr files)) @@ -105,7 +105,7 @@ (message "Removing out-of-date %s" file-c) (delete-file file-c)))) ;; Remove elcs without corresponding el - (let ((files (directory-files dir t ".elc$")) + (let ((files (directory-files dir t "\\.elc$")) file file-c) (while (setq file-c (car files)) (setq files (cdr files)) @@ -145,4 +145,4 @@ (message "Recompiling updated .els in directory tree `%s'...done" dir)) (setq command-line-args-left nil)) -;;; cleantree.el ends here +;;; update-elc-2.el ends here diff --git a/lisp/userlock.el b/lisp/userlock.el index ff7f344..7f4657c 100644 --- a/lisp/userlock.el +++ b/lisp/userlock.el @@ -35,11 +35,11 @@ (define-error 'file-locked "File is locked" 'file-error) ; XEmacs -(defun ask-user-about-lock-minibuf (fn opponent) +(defun ask-user-about-lock-minibuf (filename other-user) (save-window-excursion (let (answer) (while (null answer) - (message "%s is locking %s: action (s, q, p, ?)? " opponent fn) + (message "%s is locking %s: action (s, q, p, ?)? " other-user filename) (let ((tem (let ((inhibit-quit t) (cursor-in-echo-area t)) (prog1 (downcase (read-char)) @@ -59,7 +59,7 @@ (ask-user-about-lock-help) (setq answer nil)) ((eq (cdr answer) 'yield) - (signal 'file-locked (list "File is locked" fn opponent))))))) + (signal 'file-locked (list "File is locked" filename other-user))))))) (cdr answer)))) (defun ask-user-about-lock-help () @@ -77,12 +77,12 @@ You can uit; don't modify this file.") (define-error 'file-supersession "File changed on disk" 'file-error) ; XEmacs -(defun ask-user-about-supersession-threat-minibuf (fn) +(defun ask-user-about-supersession-threat-minibuf (filename) (save-window-excursion (let (answer) (while (null answer) (message "%s changed on disk; really edit the buffer? (y, n, r or C-h) " - (file-name-nondirectory fn)) + (file-name-nondirectory filename)) (let ((tem (downcase (let ((cursor-in-echo-area t)) (read-char))))) (setq answer @@ -104,10 +104,10 @@ You can uit; don't modify this file.") (revert-buffer nil (not (buffer-modified-p))) ; ask confirmation iff buffer modified (signal 'file-supersession - (list "File reverted" fn))) + (list "File reverted" filename))) ((eq answer 'yield) (signal 'file-supersession - (list "File changed on disk" fn)))))) + (list "File changed on disk" filename)))))) (message "File on disk now will become a backup file if you save these changes.") (setq buffer-backed-up nil)))) @@ -131,14 +131,14 @@ to get the latest version of the file, then make the change again.") ;;; dialog-box versions [XEmacs] -(defun ask-user-about-lock-dbox (fn opponent) +(defun ask-user-about-lock-dbox (filename other-user) (let ((echo-keystrokes 0)) (make-dialog-box 'question :question (format "%s is locking %s\n It has been detected that you want to modify a file that someone else has already started modifying in XEmacs." - opponent fn) + other-user filename) :buttons '(["Steal Lock\n\nThe other user will\nbecome the intruder" steal t] ["Proceed\n\nEdit file at your own\n\(and the other user's) risk" @@ -156,7 +156,7 @@ to get the latest version of the file, then make the change again.") (throw 'aual-done t)) ((and (misc-user-event-p event) (eq (event-object event) 'yield)) - (signal 'file-locked (list "File is locked" fn opponent))) + (signal 'file-locked (list "File is locked" filename other-user))) ((and (misc-user-event-p event) (eq (event-object event) 'menu-no-selection-hook)) (signal 'quit nil)) @@ -170,7 +170,7 @@ to get the latest version of the file, then make the change again.") (beep) (message "please answer the dialog box")))))))) -(defun ask-user-about-supersession-threat-dbox (fn) +(defun ask-user-about-supersession-threat-dbox (filename) (let ((echo-keystrokes 0)) (make-dialog-box 'question @@ -178,7 +178,7 @@ to get the latest version of the file, then make the change again.") (format "File %s has changed on disk since its buffer was last read in or saved. -Do you really want to edit the buffer? " fn) +Do you really want to edit the buffer? " filename) :buttons '(["Yes\n\nEdit the buffer anyway,\nignoring the disk file" proceed t] @@ -192,14 +192,14 @@ Do you really want to edit the buffer? " fn) (cond ((and (misc-user-event-p event) (eq (event-object event) 'proceed)) (throw 'auast-done nil)) ((and (misc-user-event-p event) (eq (event-object event) 'yield)) - (signal 'file-supersession (list fn))) + (signal 'file-supersession (list filename))) ((and (misc-user-event-p event) (eq (event-object event) 'revert)) - (or (equal fn (buffer-file-name)) + (or (equal filename (buffer-file-name)) (error "ask-user-about-supersession-threat called bogusly")) (revert-buffer nil t) (signal 'file-supersession - (list fn "(reverted)"))) + (list filename "(reverted)"))) ((and (misc-user-event-p event) (eq (event-object event) 'menu-no-selection-hook)) (signal 'quit nil)) @@ -217,31 +217,31 @@ Do you really want to edit the buffer? " fn) ;;; top-level ;;;###autoload -(defun ask-user-about-lock (fn opponent) - "Ask user what to do when he wants to edit FILE but it is locked by USER. +(defun ask-user-about-lock (filename other-user) + "Ask user wanting to edit FILENAME, locked by OTHER-USER, what to do. This function has a choice of three things to do: - do (signal 'file-locked (list FILE USER)) + do (signal 'file-locked (list FILENAME OTHER-USER)) to refrain from editing the file return t (grab the lock on the file) return nil (edit the file even though it is locked). -You can rewrite it to use any criterion you like to choose which one to do." +You can rewrite it to use any criteria you like to choose which one to do." (discard-input) (if (should-use-dialog-box-p) - (ask-user-about-lock-dbox fn opponent) - (ask-user-about-lock-minibuf fn opponent))) + (ask-user-about-lock-dbox filename other-user) + (ask-user-about-lock-minibuf filename other-user))) ;;;###autoload -(defun ask-user-about-supersession-threat (fn) - "Ask a user who is about to modify an obsolete buffer what to do. +(defun ask-user-about-supersession-threat (filename) + "Ask user who is about to modify an obsolete buffer what to do. This function has two choices: it can return, in which case the modification -of the buffer will proceed, or it can (signal 'file-supersession (file)), +of the buffer will proceed, or it can (signal 'file-supersession (FILENAME)), in which case the proposed buffer modification will not be made. -You can rewrite this to use any criterion you like to choose which one to do. +You can rewrite this to use any criteria you like to choose which one to do. The buffer in question is current when this function is called." (discard-input) (if (should-use-dialog-box-p) - (ask-user-about-supersession-threat-dbox fn) - (ask-user-about-supersession-threat-minibuf fn))) + (ask-user-about-supersession-threat-dbox filename) + (ask-user-about-supersession-threat-minibuf filename))) ;;; userlock.el ends here diff --git a/lisp/version.el b/lisp/version.el index 7e2d275..bdc75c0 100644 --- a/lisp/version.el +++ b/lisp/version.el @@ -36,18 +36,17 @@ Warning, this variable did not exist in XEmacs versions prior to 20.3") (defconst emacs-version - (purecopy - (format "%d.%d %s%s%s%s" - emacs-major-version - emacs-minor-version - (if emacs-patch-level - (format "(patch %d)" emacs-patch-level) - "") - (or xemacs-betaname "") - (if xemacs-codename - (concat " \"" xemacs-codename "\"") - "") - " XEmacs Lucid")) + (format "%d.%d %s%s%s%s" + emacs-major-version + emacs-minor-version + (if emacs-patch-level + (format "(patch %d)" emacs-patch-level) + "") + (or xemacs-betaname "") + (if xemacs-codename + (concat " \"" xemacs-codename "\"") + "") + " XEmacs Lucid") "Version numbers of this version of XEmacs.") (if (featurep 'infodock) @@ -134,9 +133,9 @@ argument are optional. Only the Non-nil arguments are used in the test." ;; `what(1)' can extract from the executable or a core file. We don't ;; actually need this to be pointed to from lisp; pure objects can't ;; be GCed. -(purecopy (concat "\n@" "(#)" (emacs-version) - "\n@" "(#)" "Configuration: " - system-configuration "\n")) +(concat "\n@" "(#)" (emacs-version) + "\n@" "(#)" "Configuration: " + system-configuration "\n") ;;Local variables: ;;version-control: never diff --git a/lisp/view-less.el b/lisp/view-less.el index 28c14be..bc41a17 100644 --- a/lisp/view-less.el +++ b/lisp/view-less.el @@ -7,17 +7,17 @@ ;; Keywords: wp, unix ;; This file is part of XEmacs. -;; +;; ;; XEmacs 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. -;; +;; ;; XEmacs 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 XEmacs; if not, write to the Free Software ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -32,7 +32,7 @@ ;; Originally written for v18 by David Gudeman (gudeman@arizona.edu) ;; Mods by Bengt Martensson, to closely resemble less (July 1987) ;; -;; If you would like all write-protected files to be visited in view-mode, +;; If you would like all write-protected files to be visited in view-mode, ;; then add the following to your .emacs file: ;; ;; (add-hook 'find-file-hooks 'auto-view-mode) @@ -108,33 +108,34 @@ map)) ;;;###autoload -(defun view-file (file &optional other-p) - "Find FILE, enter view mode. With prefix arg OTHER-P, use other window." +(defun view-file (filename &optional other-window-p) + "Find FILENAME, enter view mode. With prefix arg OTHER-WINDOW-P, use other window." (interactive "fView File: \nP") - (let ((old-p (get-file-buffer file)) + (let ((old-p (get-file-buffer filename)) (obuf (current-buffer))) - (if other-p - (find-file-other-window file) - (find-file file)) - (view-mode (if other-p nil obuf) + (if other-window-p + (find-file-other-window filename) + (find-file filename)) + (view-mode (if other-window-p nil obuf) (if old-p nil 'kill-buffer)) nil)) ;;;###autoload -(defun view-buffer (buf &optional other-p) - "Switch to BUF, enter view mode. With prefix arg use other window." +(defun view-buffer (buffer &optional other-window-p) + "Switch to BUFFER, enter view mode. With prefix arg use other window." (interactive "bView Buffer: \nP") (let ((obuf (current-buffer))) - (if other-p - (switch-to-buffer-other-window buf) - (switch-to-buffer buf)) - (view-mode (if other-p nil obuf) (if other-p nil 'bury-buffer)))) + (if other-window-p + (switch-to-buffer-other-window buffer) + (switch-to-buffer buffer)) + (view-mode (if other-window-p nil obuf) + (if other-window-p nil 'bury-buffer)))) ;;;###autoload -(defun view-file-other-window (file) - "Find FILE in other window, and enter view mode." +(defun view-file-other-window (filename) + "Find FILENAME in other window, and enter view mode." (interactive "fView File: ") - (view-file file t)) + (view-file filename t)) ;;;###autoload (defun view-buffer-other-window (buffer) @@ -252,7 +253,7 @@ This is meant to be added to `find-file-hooks'." "Exit view mode and execute the global binding of the key that invoked this command. Normally, this will toggle the state of `buffer-read-only', perhaps invoking some version-control mechanism." - (interactive) + (interactive) (setq view-exit-position nil) ;; Kludge so this works as advertised. Stig, why can't you write ;; bug-free code??? @@ -376,7 +377,7 @@ Positive prefix arg sets, negative disables." With prefix ARG, search forward that many occurrences." (interactive "sView search: \np") (unwind-protect - (re-search-forward + (re-search-forward (if (string-equal "" s) view-search-string s) nil nil p) (setq view-search-arg p) (or (string-equal "" s) diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el index b84901d..3f22c46 100644 --- a/lisp/wid-edit.el +++ b/lisp/wid-edit.el @@ -512,14 +512,16 @@ Suitable for use with `map-extents'." (defun widget-specify-active (widget) "Make WIDGET active for user modifications." - (let ((inactive (widget-get widget :inactive))) + (let ((inactive (widget-get widget :inactive)) + (from (widget-get widget :from)) + (to (widget-get widget :to))) (when (and inactive (not (extent-detached-p inactive))) ;; Reactivate the buttons and fields covered by the extent. (map-extents 'widget-activation-widget-mapper - inactive nil nil :activate nil 'button-or-field) + nil from to :activate nil 'button-or-field) ;; Reactivate the glyphs. (map-extents 'widget-activation-glyph-mapper - inactive nil nil :activate nil 'end-glyph) + nil from to :activate nil 'end-glyph) (delete-extent inactive) (widget-put widget :inactive nil)))) @@ -566,7 +568,7 @@ Otherwise, just return the value." value))) (defun widget-member (widget property) - "Non-nil iff there is a definition in WIDGET for PROPERTY." + "Return t if there is a definition in WIDGET for PROPERTY." (cond ((widget-plist-member (cdr widget) property) t) ((car widget) diff --git a/lisp/window-xemacs.el b/lisp/window-xemacs.el index 3418047..6fb0abd 100644 --- a/lisp/window-xemacs.el +++ b/lisp/window-xemacs.el @@ -51,11 +51,11 @@ If WINDOW is nil, the selected window is used." (when (null n) (redraw-frame (window-frame window) t))) -(defun backward-other-window (arg &optional all-frames device) - "Select the ARG'th different window on this frame, going backwards. -This is just like calling `other-window' with the arg negated." +(defun backward-other-window (count &optional which-frames which-devices) + "Select the COUNT'th different window on this frame, going backwards. +This is just like calling `other-window' with COUNT negated." (interactive "p") - (other-window (- arg) all-frames device)) + (other-window (- count) which-frames which-devices)) (defalias 'windows-of-buffer 'get-buffer-window-list) diff --git a/lisp/window.el b/lisp/window.el index 4687c8a..cfd37e7 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -33,32 +33,38 @@ ;;;; Window tree functions. -(defun one-window-p (&optional nomini all-frames device) +(defun one-window-p (&optional nomini which-frames which-devices) "Return non-nil if the selected window is the only window (in its frame). Optional arg NOMINI non-nil means don't count the minibuffer even if it is active. -The optional arg ALL-FRAMES t means count windows on all frames. -If it is `visible', count windows on all visible frames. -ALL-FRAMES nil or omitted means count only the selected frame, +By default, only the windows in the selected frame are considered. +The optional argument WHICH-FRAMES changes this behavior: +WHICH-FRAMES nil or omitted means count only the selected frame, plus the minibuffer it uses (which may be on another frame). -ALL-FRAMES = 0 means count windows on all visible and iconified frames. -If ALL-FRAMES is any other value, count only the selected frame. - -If optional third argument DEVICE is nil or omitted, count frames -on all devices. -If a device, count frames only on that device. -If a device type, count frames only on devices of that type. -Otherwise, count frames only on the selected device." +WHICH-FRAMES = `visible' means include windows on all visible frames. +WHICH-FRAMES = 0 means include windows on all visible and iconified frames. +WHICH-FRAMES = t means include windows on all frames including invisible frames. +If WHICH-FRAMES is any other value, count only the selected frame. + +The optional third argument WHICH-DEVICES further clarifies on which +devices to search for frames as specified by WHICH-FRAMES. This value +is only meaningful if WHICH-FRAMES is non-nil. +If nil or omitted, search all devices on the selected console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all devices on window-system consoles. +Any other non-nil value means search all devices." (let ((base-window (selected-window))) (if (and nomini (eq base-window (minibuffer-window))) (setq base-window (next-window base-window))) (eq base-window - (next-window base-window (if nomini 'arg) all-frames device)))) + (next-window base-window (if nomini 'arg) which-frames which-devices)))) -(defun walk-windows (proc &optional minibuf all-frames device) - "Cycle through all visible windows, calling PROC for each one. -PROC is called with a window as argument. +(defun walk-windows (function &optional minibuf which-frames which-devices) + "Cycle through all visible windows, calling FUNCTION for each one. +FUNCTION is called with a window as argument. Optional second arg MINIBUF t means count the minibuffer window even if not active. MINIBUF nil or omitted means count the minibuffer iff @@ -70,20 +76,25 @@ counts, all windows on all frames that share that minibuffer count too. Therefore, when a separate minibuffer frame is active, `walk-windows' includes the windows in the frame from which you entered the minibuffer, as well as the minibuffer window. But if the -minibuffer does not count, only windows from WINDOW's frame count. - -ALL-FRAMES is the optional third argument. -ALL-FRAMES nil or omitted means cycle within the frames as specified above. -ALL-FRAMES = `visible' means include windows on all visible frames. -ALL-FRAMES = 0 means include windows on all visible and iconified frames. -ALL-FRAMES = t means include windows on all frames including invisible frames. +minibuffer does not count, only the selected window counts. + +By default, only the windows in the selected frame are included. +The optional argument WHICH-FRAMES changes this behavior: +WHICH-FRAMES nil or omitted means cycle within the frames as specified above. +WHICH-FRAMES = `visible' means include windows on all visible frames. +WHICH-FRAMES = 0 means include windows on all visible and iconified frames. +WHICH-FRAMES = t means include windows on all frames including invisible frames. Anything else means restrict to WINDOW's frame. -If optional fourth argument DEVICE is nil or omitted, include frames -on all devices. -If a device, include frames only on that device. -If a device type, include frames only on devices of that type. -Otherwise, include frames only on the selected device." +The optional fourth argument WHICH-DEVICES further clarifies on which +devices to search for frames as specified by WHICH-FRAMES. This value +is only meaningful if WHICH-FRAMES is non-nil. +If nil or omitted, search all devices on the selected console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all devices on window-system consoles. +Any other non-nil value means search all devices." ;; If we start from the minibuffer window, don't fail to come back to it. (if (window-minibuffer-p (selected-window)) (setq minibuf t)) @@ -94,9 +105,9 @@ Otherwise, include frames only on the selected device." (walk-windows-current walk-windows-start)) (while (progn (setq walk-windows-current - (next-window walk-windows-current minibuf all-frames - device)) - (funcall proc walk-windows-current) + (next-window walk-windows-current minibuf which-frames + which-devices)) + (funcall function walk-windows-current) (not (eq walk-windows-current walk-windows-start)))))) ;; The old XEmacs definition of the above clause. It's more correct in ;; that it will never hit a window that's already been hit even if you @@ -107,12 +118,12 @@ Otherwise, include frames only on the selected device." ; (walk-windows-current (selected-window))) ; (while (progn ; (setq walk-windows-current -; (next-window walk-windows-current minibuf all-frames -; device)) +; (next-window walk-windows-current minibuf which-frames +; which-devices)) ; (not (memq walk-windows-current walk-windows-history))) ; (setq walk-windows-history (cons walk-windows-current ; walk-windows-history)) -; (funcall proc walk-windows-current)))) +; (funcall function walk-windows-current)))) (defun minibuffer-window-active-p (window) "Return t if WINDOW (a minibuffer window) is now active." @@ -213,7 +224,7 @@ If the variable split-window-keep-point is non-nil, both new windows will get the same value of point as the current window. This is often more convenient for editing. -Otherwise, we chose window starts so as to minimize the amount of +Otherwise, we choose window starts so as to minimize the amount of redisplay; this is convenient on slow terminals. The new selected window is the one that the current value of point appears in. The value of point can change if the text around point is hidden by the @@ -329,30 +340,31 @@ or if the window is the only window of its frame." (kill-buffer buffer)) (error "Aborted"))) -;;; New with XEmacs 20.3 -;;; Suggested by Noah Friedman, and tuned by Hrvoje Niksic. -(defun window-list (&optional minibuf all-frames device) +(defun window-list (&optional minibuf which-frames which-devices) "Return a list of existing windows. If the optional argument MINIBUF is non-nil, then include minibuffer windows in the result. By default, only the windows in the selected frame are returned. -The optional argument ALL-FRAMES changes this behavior: -ALL-FRAMES = `visible' means include windows on all visible frames. -ALL-FRAMES = 0 means include windows on all visible and iconified frames. -ALL-FRAMES = t means include windows on all frames including invisible frames. +The optional argument WHICH-FRAMES changes this behavior: +WHICH-FRAMES = `visible' means include windows on all visible frames. +WHICH-FRAMES = 0 means include windows on all visible and iconified frames. +WHICH-FRAMES = t means include windows on all frames including invisible frames. Anything else means restrict to the selected frame. -The optional fourth argument DEVICE further clarifies which frames to -search as specified by ALL-FRAMES. This value is only meaningful if -ALL-FRAMES is non-nil. -If nil or omitted, search only the selected device. -If a device, search frames only on that device. -If a device type, search frames only on devices of that type. -Any other non-nil value means search frames on all devices." + +The optional fourth argument WHICH-DEVICES further clarifies on which +devices to search for frames as specified by WHICH-FRAMES. This value +is only meaningful if WHICH-FRAMES is non-nil. +If nil or omitted, search all devices on the selected console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all devices on window-system consoles. +Any other non-nil value means search all devices." (let ((wins nil)) (walk-windows (lambda (win) (push win wins)) - minibuf all-frames device) + minibuf which-frames which-devices) wins)) ;;; window.el ends here diff --git a/lisp/x-faces.el b/lisp/x-faces.el index 5dddded..aabfe87 100644 --- a/lisp/x-faces.el +++ b/lisp/x-faces.el @@ -101,41 +101,38 @@ (encoding "[^-]+") ; false! ) (setq x-font-regexp - (purecopy - (concat "\\`\\*?[-?*]" - foundry - family - weight\? - slant\? - swidth - adstyle - - pixelsize - pointsize - resx - resy - spacing - avgwidth - - registry - encoding "\\'" - ))) + (concat "\\`\\*?[-?*]" + foundry - family - weight\? - slant\? - swidth - adstyle - + pixelsize - pointsize - resx - resy - spacing - avgwidth - + registry - encoding "\\'" + )) (setq x-font-regexp-head - (purecopy - (concat "\\`[-?*]" foundry - family - weight\? - slant\? - "\\([-*?]\\|\\'\\)"))) + (concat "\\`[-?*]" foundry - family - weight\? - slant\? + "\\([-*?]\\|\\'\\)")) (setq x-font-regexp-head-2 - (purecopy - (concat "\\`[-?*]" foundry - family - weight\? - slant\? - - swidth - adstyle - pixelsize - pointsize - "\\([-*?]\\|\\'\\)"))) - (setq x-font-regexp-slant (purecopy (concat - slant -))) - (setq x-font-regexp-weight (purecopy (concat - weight -))) + (concat "\\`[-?*]" foundry - family - weight\? - slant\? + - swidth - adstyle - pixelsize - pointsize + "\\([-*?]\\|\\'\\)")) + (setq x-font-regexp-slant (concat - slant -)) + (setq x-font-regexp-weight (concat - weight -)) ;; if we can't match any of the more specific regexps (unfortunate) then ;; look for digits; assume 2+ digits is 10ths of points, and 1-2 digits ;; is pixels. Bogus as hell. - (setq x-font-regexp-pixel (purecopy "[-?*]\\([0-9][0-9]?\\)[-?*]")) - (setq x-font-regexp-point (purecopy "[-?*]\\([0-9][0-9]+\\)[-?*]")) + (setq x-font-regexp-pixel "[-?*]\\([0-9][0-9]?\\)[-?*]") + (setq x-font-regexp-point "[-?*]\\([0-9][0-9]+\\)[-?*]") ;; the following two are used by x-font-menu.el. (setq x-font-regexp-foundry-and-family - (purecopy (concat "\\`[-?*]" foundry - "\\(" family "\\)" -))) + (concat "\\`[-?*]" foundry - "\\(" family "\\)" -)) (setq x-font-regexp-registry-and-encoding - (purecopy (concat - "\\(" registry "\\)" - "\\(" encoding "\\)\\'"))) + (concat - "\\(" registry "\\)" - "\\(" encoding "\\)\\'")) (setq x-font-regexp-spacing - (purecopy (concat - "\\(" spacing "\\)" - avgwidth - - registry - encoding "\\'"))) + (concat - "\\(" spacing "\\)" - avgwidth + - registry - encoding "\\'")) ) ;; A "loser font" is something like "8x13" -> "8x13bold". ;; These are supported only through extreme generosity. -(defconst x-loser-font-regexp (purecopy "\\`[0-9]+x[0-9]+\\'")) +(defconst x-loser-font-regexp "\\`[0-9]+x[0-9]+\\'") (defun x-frob-font-weight (font which) (if (font-instance-p font) (setq font (font-instance-name font))) diff --git a/lisp/x-font-menu.el b/lisp/x-font-menu.el index 03b4092..b4adead 100644 --- a/lisp/x-font-menu.el +++ b/lisp/x-font-menu.el @@ -38,17 +38,16 @@ "Registry and encoding to use with font menu fonts.") (defvar x-fonts-menu-junk-families - (purecopy - (mapconcat - #'identity - '("cursor" "glyph" "symbol" ; Obvious losers. - "\\`Ax...\\'" ; FrameMaker fonts - there are just way too + (mapconcat + #'identity + '("cursor" "glyph" "symbol" ; Obvious losers. + "\\`Ax...\\'" ; FrameMaker fonts - there are just way too ; many of these, and there is a different ; font family for each font face! Losers. ; "Axcor" -> "Applix Courier Roman", ; "Axcob" -> "Applix Courier Bold", etc. - ) - "\\|")) + ) + "\\|") "A regexp matching font families which are uninteresting (e.g. cursor fonts).") (defun hack-font-truename (fn) diff --git a/lisp/x-mouse.el b/lisp/x-mouse.el index 2d57100..3db5e6c 100644 --- a/lisp/x-mouse.el +++ b/lisp/x-mouse.el @@ -40,7 +40,7 @@ (defun x-mouse-kill (event) "Kill the text between the point and mouse and copy it to the clipboard and -to the cut buffer" +to the cut buffer." (interactive "@e") (let ((old-point (point))) (mouse-set-point event) diff --git a/lisp/x-select.el b/lisp/x-select.el index 3b3a598..1dcf05a 100644 --- a/lisp/x-select.el +++ b/lisp/x-select.el @@ -51,7 +51,7 @@ (define-obsolete-function-alias 'x-cut-copy-clear-internal 'cut-copy-clear-internal) (define-obsolete-function-alias 'x-get-selection 'get-selection) (define-obsolete-function-alias 'x-get-clipboard 'get-clipboard) -(define-obsolete-function-alias 'x-yank-clipboard-selection +(define-obsolete-function-alias 'x-yank-clipboard-selection 'yank-clipboard-selection) (define-obsolete-function-alias 'x-disown-selection-internal 'disown-selection-internal) @@ -72,14 +72,14 @@ be the text between those markers)." (own-selection selection 'SECONDARY)) (defun x-notice-selection-requests (selection type successful) - "for possible use as the value of x-sent-selection-hooks." + "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." + "for possible use as the value of `x-sent-selection-hooks'." (or successful (message "Selection request failed to convert %s to %s" selection type))) @@ -95,32 +95,25 @@ be the text between those markers)." "Return 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. -This function does nothing if support for cut buffers was not compiled -into Emacs." - (and (fboundp 'x-get-cutbuffer-internal) - (x-get-cutbuffer-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)))) +This function does nothing if cut buffer support was not compiled in." + (when (fboundp 'x-get-cutbuffer-internal) + (x-get-cutbuffer-internal + (aref [CUT_BUFFER0 CUT_BUFFER1 CUT_BUFFER2 CUT_BUFFER3 + CUT_BUFFER4 CUT_BUFFER5 CUT_BUFFER6 CUT_BUFFER7] + (or which-one 0))))) ;;; FSF name x-set-cut-buffer (defun x-store-cutbuffer (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 +If optional arg PUSH is non-nil, also rotate the cut buffers: this +means the previous value of the primary cut buffer moves to the second cut buffer, and the second to the third, and so on (there are 8 buffers.) Cut buffers are considered obsolete; you should use selections instead. -This function does nothing if support for cut buffers was not compiled -into Emacs." - (and (fboundp 'x-store-cutbuffer-internal) - (progn - ;; Check the data type of STRING. - (substring string 0 0) - (if push - (x-rotate-cutbuffers-internal 1)) - (x-store-cutbuffer-internal 'CUT_BUFFER0 string)))) +This function does nothing if cut buffer support was not compiled in." + (when (fboundp 'x-store-cutbuffer-internal) + (when push + (x-rotate-cutbuffers-internal 1)) + (x-store-cutbuffer-internal 'CUT_BUFFER0 string))) ;FSFmacs (provide 'select) diff --git a/lwlib/ChangeLog b/lwlib/ChangeLog index c530488..776a3b8 100644 --- a/lwlib/ChangeLog +++ b/lwlib/ChangeLog @@ -1,7 +1,21 @@ +2000-11-14 Martin Buchholz + + * XEmacs 21.2.37 is released. + +2000-11-02 Stephen J. Turnbull + + * lwlib.h: Typo fixes and tiny clarifications. + 2000-10-04 Martin Buchholz * XEmacs 21.2.36 is released. +2000-09-21 Andy Piper + + * lwlib.h: declare copy_widget_value_tree. + + * lwlib.c (copy_widget_value_tree): make non-static. + 2000-09-19 Martin Buchholz * *: Spelling mega-patch diff --git a/lwlib/lwlib.h b/lwlib/lwlib.h index 76d3241..9ee62e8 100644 --- a/lwlib/lwlib.h +++ b/lwlib/lwlib.h @@ -104,7 +104,7 @@ typedef struct _widget_args ArgList args; int nargs; /* Copying args is impossible so we make the caller give us heap allocated - args and free them when on-one wants them any more. */ + args and free them when no one wants them any more. */ int ref_count; } widget_args; @@ -115,7 +115,7 @@ typedef struct _widget_value /* name of widget */ char* name; - /* value (meaning BOGUSLY depend on widget type) */ + /* value (meaning BOGUSLY depends on widget type) */ char* value; /* keyboard equivalent. no implications for XtTranslations */ char* key; @@ -134,11 +134,11 @@ typedef struct _widget_value Boolean edited; /* true if has changed (maintained by lw library) */ change_type change; - /* Contents of the sub-widgets, also selected slot for checkbox */ + /* Contents of sub-widgets, also selected slot for checkbox */ struct _widget_value* contents; /* data passed to callback */ XtPointer call_data; - /* next one in the list */ + /* next in the list of siblings */ struct _widget_value* next; /* slot for the toolkit dependent part. Always initialize to NULL. */ void* toolkit_data; diff --git a/man/ChangeLog b/man/ChangeLog index 959ddd5..0ba2252 100644 --- a/man/ChangeLog +++ b/man/ChangeLog @@ -1,3 +1,328 @@ +2000-11-14 Martin Buchholz + + * XEmacs 21.2.37 is released. + +2000-10-27 Martin Buchholz + + * xemacs/windows.texi (Other Window): + + * new-users-guide/files.texi (Saving Files): + * new-users-guide/search.texi (Search and Replace): + + * lispref/abbrevs.texi (Abbrev Tables): + * lispref/abbrevs.texi (Defining Abbrevs): + * lispref/abbrevs.texi (Abbrev Files): + * lispref/annotations.texi (Annotation Primitives): + * lispref/backups.texi (Auto-Saving): + * lispref/backups.texi (Reverting): + * lispref/buffers.texi (Current Buffer): + * lispref/buffers.texi (Buffer Names): + * lispref/buffers.texi (Buffer Modification): + * lispref/buffers.texi (Read Only Buffers): + * lispref/buffers.texi (The Buffer List): + * lispref/buffers.texi (Killing Buffers): + * lispref/buffers.texi (Indirect Buffers): + * lispref/building.texi (Building XEmacs): + * lispref/building.texi (Garbage Collection): + * lispref/commands.texi (Interactive Call): + * lispref/commands.texi (Events): + * lispref/commands.texi (Event Predicates): + * lispref/commands.texi (Working With Events): + * lispref/commands.texi (Converting Events): + * lispref/commands.texi (Key Sequence Input): + * lispref/commands.texi (Reading One Event): + * lispref/commands.texi (Waiting): + * lispref/commands.texi (Prefix Command Arguments): + * lispref/commands.texi (Recursive Editing): + * lispref/compile.texi (Compilation Functions): + * lispref/compile.texi (Compiled-Function Objects): + * lispref/consoles-devices.texi (Basic Device Functions): + * lispref/consoles-devices.texi (Console Types and Device Classes): + * lispref/consoles-devices.texi (Connecting to a Console or Device): + * lispref/control.texi (Signaling Errors): + * lispref/customize.texi (Type Keywords): + * lispref/databases.texi (Connecting to a Database): + * lispref/databases.texi (Working With a Database): + * lispref/databases.texi (Other Database Functions): + * lispref/debugging.texi (Function Debugging): + * lispref/display.texi (Refresh Screen): + * lispref/display.texi (The Echo Area): + * lispref/display.texi (Blinking): + * lispref/edebug-inc.texi (Tracing): + * lispref/edebug-inc.texi (Instrumenting Macro Calls): + * lispref/edebug-inc.texi (Edebug Options): + * lispref/eval.texi (Function Indirection): + * lispref/extents.texi (Creating and Modifying Extents): + * lispref/extents.texi (Finding Extents): + * lispref/extents.texi (Mapping Over Extents): + * lispref/extents.texi (Extent Properties): + * lispref/faces.texi (Basic Face Functions): + * lispref/faces.texi (Face Properties): + * lispref/faces.texi (Face Convenience Functions): + * lispref/faces.texi (Other Face Display Functions): + * lispref/faces.texi (Font Instance Characteristics): + * lispref/faces.texi (Color Specifiers): + * lispref/files.texi (Visiting Functions): + * lispref/files.texi (Reading from Files): + * lispref/files.texi (Changing File Attributes): + * lispref/files.texi (File Names): + * lispref/files.texi (File Name Components): + * lispref/files.texi (Directory Names): + * lispref/files.texi (Relative File Names): + * lispref/files.texi (File Name Expansion): + * lispref/files.texi (File Name Completion): + * lispref/files.texi (User Name Completion): + * lispref/files.texi (Magic File Names): + * lispref/files.texi (Creating a Partial File): + * lispref/files.texi (Format Conversion): + * lispref/frames.texi (Creating Frames): + * lispref/frames.texi (Property Access): + * lispref/frames.texi (Size and Position): + * lispref/frames.texi (Deleting Frames): + * lispref/frames.texi (Finding All Frames): + * lispref/frames.texi (Frames and Windows): + * lispref/frames.texi (Visibility of Frames): + * lispref/frames.texi (Frame Configurations): + * lispref/functions.texi (Calling Functions): + * lispref/functions.texi (Function Cells): + * lispref/glyphs.texi (Creating Glyphs): + * lispref/glyphs.texi (Image Specifiers): + * lispref/glyphs.texi (Image Instance Types): + * lispref/glyphs.texi (Image Instance Functions): + * lispref/gutter.texi (Creating Gutter): + * lispref/gutter.texi (Specifying a Gutter): + * lispref/gutter.texi (Other Gutter Variables): + * lispref/help.texi (Accessing Documentation): + * lispref/help.texi (Help Functions): + * lispref/help.texi (Obsoleteness): + * lispref/internationalization.texi (Domain Specification): + * lispref/intro.texi (Caveats): + * lispref/keymaps.texi (Active Keymaps): + * lispref/keymaps.texi (Functions for Key Lookup): + * lispref/keymaps.texi (Changing Key Bindings): + * lispref/keymaps.texi (Scanning Keymaps): + * lispref/ldap.texi (The High-Level LDAP API): + * lispref/ldap.texi (Low-level Operations on a LDAP Server): + * lispref/ldap.texi (Encoder/Decoder Functions): + * lispref/lists.texi (Setcar): + * lispref/lists.texi (Setcdr): + * lispref/lists.texi (Working With Normal Plists): + * lispref/lists.texi (Working With Lax Plists): + * lispref/loading.texi (Autoload): + * lispref/loading.texi (Named Features): + * lispref/markers.texi (Creating Markers): + * lispref/markers.texi (Changing Markers): + * lispref/markers.texi (The Mark): + * lispref/menus.texi (Modifying Menus): + * lispref/menus.texi (Pop-Up Menus): + * lispref/menus.texi (Menu Accelerator Functions): + * lispref/minibuf.texi (Text from Minibuffer): + * lispref/minibuf.texi (Object from Minibuffer): + * lispref/minibuf.texi (Basic Completion): + * lispref/minibuf.texi (High-Level Completion): + * lispref/minibuf.texi (Reading a Password): + * lispref/minibuf.texi (Minibuffer Misc): + * lispref/mouse.texi (Mouse Tracking): + * lispref/syntax.texi (Syntax Table Functions): + * lispref/numbers.texi (Arithmetic Operations): + * lispref/numbers.texi (Rounding Operations): + * lispref/numbers.texi (Math Functions): + * lispref/objects.texi (String Type): + * lispref/objects.texi (Equality Predicates): + * lispref/os.texi (Killing XEmacs): + * lispref/os.texi (Suspending XEmacs): + * lispref/os.texi (System Environment): + * lispref/os.texi (Time Conversion): + * lispref/os.texi (Timers): + * lispref/os.texi (Input Modes): + * lispref/os.texi (Translating Input): + * lispref/os.texi (Terminal Output): + * lispref/os.texi (Flow Control): + * lispref/positions.texi (Character Motion): + * lispref/positions.texi (Word Motion): + * lispref/positions.texi (Text Lines): + * lispref/positions.texi (Screen Lines): + * lispref/positions.texi (List Motion): + * lispref/positions.texi (Narrowing): + * lispref/postgresql.texi (Asynchronous Interface Functions): + * lispref/processes.texi (Subprocess Creation): + * lispref/processes.texi (Synchronous Processes): + * lispref/processes.texi (Asynchronous Processes): + * lispref/processes.texi (Process Information): + * lispref/processes.texi (Input to Processes): + * lispref/processes.texi (Signals to Processes): + * lispref/processes.texi (Process Buffers): + * lispref/processes.texi (Filter Functions): + * lispref/processes.texi (Network): + * lispref/range-tables.texi (Working With Range Tables): + * lispref/searching.texi (String Search): + * lispref/searching.texi (Regexp Search): + * lispref/searching.texi (POSIX Regexps): + * lispref/searching.texi (Replacing Match): + * lispref/searching.texi (Entire Match Data): + * lispref/sequences.texi (Bit Vector Functions): + * lispref/specifiers.texi (Adding Specifications): + * lispref/specifiers.texi (Creating Specifiers): + * lispref/specifiers.texi (Specifier Validation Functions): + * lispref/specifiers.texi (Other Specification Functions): + * lispref/streams.texi (Output Variables): + * lispref/symbols.texi (Other Plists): + * lispref/text.texi (Insertion): + * lispref/text.texi (Commands for Insertion): + * lispref/text.texi (Deletion): + * lispref/text.texi (User-Level Deletion): + * lispref/text.texi (Kill Functions): + * lispref/text.texi (Low-Level Kill Ring): + * lispref/text.texi (Undo): + * lispref/text.texi (Maintaining Undo): + * lispref/text.texi (Margins): + * lispref/text.texi (Sorting): + * lispref/text.texi (Columns): + * lispref/text.texi (Primitive Indent): + * lispref/text.texi (Mode-Specific Indent): + * lispref/text.texi (Region Indent): + * lispref/text.texi (Case Changes): + * lispref/text.texi (Examining Properties): + * lispref/text.texi (Property Search): + * lispref/text.texi (Registers): + * lispref/text.texi (Transformations): + * lispref/mule.texi (Charset Property Functions): + * lispref/mule.texi (MULE Characters): + * lispref/mule.texi (Composite Characters): + * lispref/mule.texi (Coding System Properties): + * lispref/mule.texi (Big5 and Shift-JIS Functions): + * lispref/mule.texi (CCL Statements): + * lispref/mule.texi (Calling CCL): + * lispref/mule.texi (Category Tables): + * lispref/toolbar.texi (Specifying the Toolbar): + * lispref/toolbar.texi (Other Toolbar Variables): + * lispref/tooltalk.texi (Elisp Interface for Sending Messages): + * lispref/tooltalk.texi (Elisp Interface for Receiving Messages): + * lispref/variables.texi (Creating Buffer-Local): + * lispref/variables.texi (Variable Aliases): + * lispref/windows.texi (Splitting Windows): + * lispref/windows.texi (Deleting Windows): + * lispref/windows.texi (Selecting Windows): + * lispref/windows.texi (Cyclic Window Ordering): + * lispref/windows.texi (Buffers and Windows): + * lispref/windows.texi (Displaying Buffers): + * lispref/windows.texi (Choosing Window): + * lispref/windows.texi (Window Point): + * lispref/windows.texi (Window Start): + * lispref/windows.texi (Vertical Scrolling): + * lispref/windows.texi (Horizontal Scrolling): + * lispref/windows.texi (Resizing Windows): + * lispref/windows.texi (Window Configurations): + * lispref/x-windows.texi (X Selections): + * lispref/x-windows.texi (Resources): + * lispref/strings.texi (Creating Strings): + * lispref/strings.texi (Character Codes): + * lispref/strings.texi (Text Comparison): + * lispref/strings.texi (String Conversion): + * lispref/strings.texi (Formatting Strings): + * lispref/strings.texi (Character Case): + * lispref/strings.texi (Case Tables): + * lispref/strings.texi (Char Table Types): + * lispref/strings.texi (Working With Char Tables): + Giant docstring parameter/Texinfo fixes. + + Don't use abbreviations for English words, especially when those + words have other meanings. For example, use START, not BEG. + Use OBJECT, not OBJ. + Use VALUE, not VAL. + Use BUFFER, not BUF. + Use PROCESS, not PROC. (Sometimes PROC was used to mean FUNCTION!) + Use CHARACTER, not CH or CHR. + Use NUMBER, not NUM. + Use COLUMN, not COL. + Use POSITION, not POS. + Use SYMBOL, not SYM. + Use STRING, not STR. + Use LIMIT, not LIM. + Use OTHER-WINDOW-P, not OTHER-P. + Use PRIORITY, not PRI. + + Use `non-nil', not `true'. + + Don't call a parameter an ALIST if it can also be a FUNCTION or OBARRAY. + + Use CASE-TABLE, CATEGORY-TABLE, CHAR-TABLE, etc. instead of TABLE. + + Try to find better parameter names than ARG. + + Use consistent parameter names. For example, s/NO-ERROR/NOERROR/g; + + Use type information in parameter names. For example, use + (make-bit-vector length bit), not (make-bit-vector length init). + + Completion functions should have parameters with names like + PARTIAL-FILENAME instead of the misleading FILENAME. + + Type predicates should consistently take an OBJECT parameter, + since any object is valid as input. + + Use WHICH-FRAMES and WHICH-DEVICES parameters consistently for + functions like next-window and next-frame that walk over window or + frame lists. + + Deleted duplicated documentation for: + one-window-p, format-insert-file + + Deleted 21 lines of VMS-specific texinfo documentation. + + Fixed up a few places where `_' was used in docstring parameter + names instead of `-'. + + Fixed up places that used nil or t without @code. + + Fixed up places that erroneously used @code instead of @var. + + Fixed many typos. + + Fixed many places where the parameters mentioned in the docstring + didn't match the actual parameters. + + Fixed 7 places that used `@var{nil}' instead of `@code{nil}'. + + Fixed 40 places where docstrings were missing trailing `.' + + Fixed the texi documentation of 41 functions where the + interactiveness of the function in the documentation did not match + the implementation. + + Fixed 117 functions where the names of parameters in the texi was + different from the names in the implementation. + + Fixed the texi documentation of 137 functions where the parameter + list of the function in the texi was semantically different from + the implementation. + +2000-10-28 Adrian Aichner + + * xemacs-faq.texi (Q1.2.1): Use @html instead of @ifhtml to + incorporate raw HTML output in the HTML version. + +2000-11-02 Stephen J. Turnbull + + * xemacs/menus.texi: + * widget.texi: + Typo fixes and tiny clarifications. + +2000-10-19 Stephen J. Turnbull + + * xemacs-faq.texi: Added Q2.0.13, Q2.0.14 - packages why and how. + Added Q2.1.25 - function not found due to package not installed. + + * xemacs/xemacs.texi: + * xemacs/abbrevs.texi: + * xemacs/basic.texi: + * xemacs/building.texi: + * xemacs/packages.texi: + * xemacs/startup.texi: + Moved "Packages" node to "Important General Concepts" section. + + * xemacs/packages.texi: Added package list from etc/PACKAGES. + 2000-10-04 Martin Buchholz * XEmacs 21.2.36 is released. diff --git a/man/internals/internals.texi b/man/internals/internals.texi index 5b8d38e..d7e67c5 100644 --- a/man/internals/internals.texi +++ b/man/internals/internals.texi @@ -1813,7 +1813,7 @@ Lisp lists are popular data structures in the C code as well as in Elisp. There are two sets of macros that iterate over lists. @code{EXTERNAL_LIST_LOOP_@var{n}} should be used when the list has been supplied by the user, and cannot be trusted to be acyclic and -nil-terminated. A @code{malformed-list} or @code{circular-list} error +@code{nil}-terminated. A @code{malformed-list} or @code{circular-list} error will be generated if the list being iterated over is not entirely kosher. @code{LIST_LOOP_@var{n}}, on the other hand, is faster and less safe, and can be used only on trusted lists. @@ -4810,7 +4810,7 @@ for example @code{or}, @code{and}, @code{if}, @code{cond}, @code{while}, @code{setq}, etc., miscellaneous @code{gui_item_...} functions, everything related to @code{eval} (@code{Feval_buffer}, @code{call0}, ...) and inside @code{Fsignal}. The latter is used to handle signals, as -for example the ones raised by every @code{QUITE}-macro triggered after +for example the ones raised by every @code{QUIT}-macro triggered after pressing Ctrl-g. @node garbage_collect_1, mark_object, Invocation, Garbage Collection - Step by Step @@ -5390,7 +5390,7 @@ A @dfn{mark} method. This is called during the marking stage and passed a function pointer (usually the @code{mark_object()} function), which is used to mark an object. All Lisp objects that are contained within the object need to be marked by applying this function to them. The mark -method should also return a Lisp object, which should be either nil or +method should also return a Lisp object, which should be either @code{nil} or an object to mark. (This can be used in lieu of calling @code{mark_object()} on the object, to reduce the recursion depth, and consequently should be the most heavily nested sub-object, such as a @@ -8113,7 +8113,7 @@ All windows have three fields governing their contents: these are @dfn{hchild} (a list of horizontally-arrayed children), @dfn{vchild} (a list of vertically-arrayed children), and @dfn{buffer} (the buffer contained in a leaf window). Exactly one of -these will be non-nil. Remember that @dfn{horizontally-arrayed} +these will be non-@code{nil}. Remember that @dfn{horizontally-arrayed} means ``side-by-side'' and @dfn{vertically-arrayed} means @dfn{one above the other}. @@ -8121,7 +8121,7 @@ means ``side-by-side'' and @dfn{vertically-arrayed} means Leaf windows also have markers in their @code{start} (the first buffer position displayed in the window) and @code{pointm} (the window's stashed value of @code{point}---see above) fields, -while combination windows have nil in these fields. +while combination windows have @code{nil} in these fields. @item The list of children for a window is threaded through the @@ -8531,7 +8531,7 @@ generalized to handle integers and linked list equally well). @section Zero-Length Extents Extents can be zero-length, and will end up that way if their endpoints -are explicitly set that way or if their detachable property is nil +are explicitly set that way or if their detachable property is @code{nil} and all the text in the extent is deleted. (The exception is open-open zero-length extents, which are barred from existing because there is no sensible way to define their properties. Deletion of the text in diff --git a/man/lispref/abbrevs.texi b/man/lispref/abbrevs.texi index c59e84c..1736cbe 100644 --- a/man/lispref/abbrevs.texi +++ b/man/lispref/abbrevs.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/abbrevs.info @node Abbrevs, Extents, Syntax Tables, Top @@ -42,7 +42,7 @@ Mode, emacs, The XEmacs Reference Manual}. @end menu @node Abbrev Mode -@section Setting Up Abbrev Mode +@section Setting Up Abbrev Mode Abbrev mode is a minor mode controlled by the value of the variable @code{abbrev-mode}. @@ -76,8 +76,8 @@ 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, +@defun define-abbrev-table table-name definitions +This function defines @var{table-name} (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} @@ -121,7 +121,7 @@ abbrev, or @code{nil} if the user declines to confirm redefining an existing abbrev. @end defun -@defun define-abbrev table name expansion hook +@defun define-abbrev table name &optional expansion hook count 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 XEmacs; its name is @@ -165,7 +165,7 @@ described here. This is the default file name for reading and saving abbrevs. @end defopt -@defun quietly-read-abbrev-file filename +@defun quietly-read-abbrev-file &optional 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. @@ -181,7 +181,7 @@ the file to save the abbrevs in. @end defopt @defvar abbrevs-changed -This variable is set non-@code{nil} by defining or altering any +This variable is set non-@code{nil} by defining or altering any abbrevs. This serves as a flag for various XEmacs commands to offer to save your abbrevs. @end defvar diff --git a/man/lispref/annotations.texi b/man/lispref/annotations.texi index 700375f..755851b 100644 --- a/man/lispref/annotations.texi +++ b/man/lispref/annotations.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c Copyright (C) 1995 Ben Wing. @c See the file lispref.texi for copying conditions. @setfilename ../../info/annotations.info @@ -123,10 +123,10 @@ space to display in. @section Annotation Primitives @defun make-annotation glyph &optional position layout buffer with-event d-glyph rightp -This function creates a marginal annotation at position @var{pos} in +This function creates a marginal annotation at position @var{position} in @var{buffer}. The annotation is displayed using @var{glyph}, which should be a glyph object or a string, and is positioned using layout -policy @var{layout}. If @var{pos} is @code{nil}, point is used. If +policy @var{layout}. If @var{position} is @code{nil}, point is used. If @var{layout} is @code{nil}, @code{whitespace} is used. If @var{buffer} is @code{nil}, the current buffer is used. @@ -180,7 +180,7 @@ which should be a glyph object. @defun annotation-face annotation This function returns the face associated with @var{annotation}. @end defun - + @defun set-annotation-face annotation face This function sets the face associated with @var{annotation} to @var{face}. diff --git a/man/lispref/backups.texi b/man/lispref/backups.texi index 62fc2e8..e1c0a18 100644 --- a/man/lispref/backups.texi +++ b/man/lispref/backups.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/backups.info @node Backups and Auto-Saving, Buffers, Files, Top @@ -78,9 +78,9 @@ which may save disk space. (You would put this code in your @smallexample @group -(add-hook 'rmail-mode-hook +(add-hook 'rmail-mode-hook (function (lambda () - (make-local-variable + (make-local-variable 'make-backup-files) (setq make-backup-files nil)))) @end group @@ -121,7 +121,7 @@ its value. Major modes should not set this variable---they should set @subsection Backup by Renaming or by Copying? @cindex backup files, how to make them - There are two ways that XEmacs can make a backup file: + There are two ways that XEmacs can make a backup file: @itemize @bullet @item @@ -347,7 +347,7 @@ This function returns the name of the most recent backup file for Some file comparison commands use this function so that they can automatically compare a file with its most recent backup. -@end defun +@end defun @node Auto-Saving @section Auto-Saving @@ -421,7 +421,7 @@ be sure to redefine the function @code{make-auto-save-file-name} correspondingly. @end defun -@defun make-auto-save-file-name +@defun make-auto-save-file-name &optional filename 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 @@ -581,7 +581,7 @@ 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 XEmacs Reference Manual}. -@deffn Command revert-buffer &optional check-auto-save noconfirm +@deffn Command revert-buffer &optional check-auto-save noconfirm preserve-modes 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. @@ -597,6 +597,10 @@ 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. +Optional third argument @var{preserve-modes} non-@code{nil} means don't +alter the files modes. Normally we reinitialize them using +@code{normal-mode}. + 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 diff --git a/man/lispref/buffers.texi b/man/lispref/buffers.texi index cc95f52..301364d 100644 --- a/man/lispref/buffers.texi +++ b/man/lispref/buffers.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/buffers.info @node Buffers, Windows, Backups and Auto-Saving, Top @@ -13,7 +13,7 @@ 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. +not be displayed in any window. @menu * Buffer Basics:: What is a buffer? @@ -134,7 +134,7 @@ 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, + 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 @@ -194,9 +194,9 @@ 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. +@var{buffer-or-name} must be a buffer or the name of an existing +buffer--else an error is signaled. This function returns the buffer +identified by @var{buffer-or-name}. @end defun @node Buffer Names @@ -265,11 +265,11 @@ 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: +This function returns the buffer named @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 actually a buffer, +it is returned as given. (That is not very useful, so the argument is +usually a name.) For example: @example @group @@ -289,8 +289,6 @@ a name.) For example: See also the function @code{get-buffer-create} in @ref{Creating Buffers}. @end defun -@c Emacs 19 feature -@c IGNORE is only in XEmacs @defun generate-new-buffer-name starting-name &optional ignore 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 @@ -443,9 +441,10 @@ 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 +@defun set-buffer-modified-p flag &optional buffer +This function marks @var{buffer} as modified if @var{flag} is non-@code{nil}, or as unmodified if the flag is @code{nil}. +@var{buffer} defaults to the current buffer. Another effect of calling this function is to cause unconditional redisplay of the modeline for the current buffer. In fact, the @@ -477,7 +476,7 @@ counter that increments every time the buffer is modified. If @node Modification Time @section Comparison of Modification Time @cindex comparison of modification time -@cindex modification time, comparison of +@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 @@ -545,7 +544,7 @@ some other program has probably altered the file. 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. +case the proposed buffer modification is not allowed. This function is called automatically by XEmacs on the proper occasions. It exists so you can customize XEmacs by redefining it. @@ -560,7 +559,7 @@ See also the file locking mechanism in @ref{File Locks}. @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 +although you may change your view of the contents by scrolling and narrowing. Read-only buffers are used in two kinds of situations: @@ -601,18 +600,35 @@ properties have no effect. If @code{inhibit-read-only} is a list, then 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}. +@deffn Command toggle-read-only &optional arg +This command changes whether the current buffer is read-only. +Interactively, if a prefix arg @var{arg} is supplied, set the current +buffer read only if and only if @var{arg} is positive. + +This command is intended for interactive use only; 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. +@defun barf-if-buffer-read-only &optional buffer start end +This function signals a @code{buffer-read-only} error if @var{buffer} is +read-only. @var{buffer} defaults to the current buffer. +@xref{Interactive Call}, for another way to signal an error if the +current buffer is read-only. + +If optional argument @var{start} is non-@code{nil}, all extents in the +buffer which overlap that part of the buffer are checked to ensure none +has a @code{read-only} property. (Extents that lie completely within the +range, however, are not checked.) @var{end} defaults to the value of +@var{start}. + +If @var{start} and @var{end} are equal, the range checked is +[@var{start}, @var{end}] (i.e. closed on both ends); otherwise, the +range checked is (@var{start}, @var{end}) \(open on both ends), except +that extents that lie completely within [@var{start}, @var{end}] are not +checked. See @code{extent-in-region-p} for a fuller discussion. @end defun @node The Buffer List @@ -656,7 +672,7 @@ global, non-frame ordering is returned instead. ;; @r{Note that the name of the minibuffer} ;; @r{begins with a space!} (mapcar (function buffer-name) (buffer-list)) - @result{} ("buffers.texi" " *Minibuf-1*" + @result{} ("buffers.texi" " *Minibuf-1*" "buffer.c" "*Help*" "TAGS") @end group @end example @@ -698,7 +714,6 @@ If no suitable buffer exists, the buffer @samp{*scratch*} is returned Note that in FSF Emacs 19, there is no @var{frame} argument, and @var{visible-ok} is the second argument instead of the third. -FSF Emacs 19. @end defun @deffn Command list-buffers &optional files-only @@ -709,7 +724,7 @@ intended for interactive use, and is described fully in @cite{The XEmacs Reference Manual}. It returns @code{nil}. @end deffn -@deffn Command bury-buffer &optional buffer-or-name +@deffn Command bury-buffer &optional buffer-or-name before 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 @@ -821,16 +836,17 @@ buffers, the indirect buffers are automatically killed as well. whether a buffer has been killed, you can either use this feature or the function @code{buffer-live-p}. -@defun buffer-live-p buffer -This function returns @code{nil} if @var{buffer} is deleted, and -@code{t} otherwise. +@defun buffer-live-p object +This function returns @code{t} if @var{object} is an editor buffer that +has not been deleted, @code{nil} otherwise. @end defun @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}. +@code{nil}. The argument @var{buffer-or-name} may be a buffer or the +name of one. Any processes that have this buffer as the @code{process-buffer} are sent the @code{SIGHUP} signal, which normally causes them to terminate. @@ -917,7 +933,7 @@ the base buffer kills all its indirect children. 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. @@ -946,7 +962,7 @@ not supplied, it defaults to the current buffer. @defun buffer-indirect-children &optional buffer This function returns a list of all indirect buffers whose base buffer is @var{buffer}. If @var{buffer} is indirect, the return value will -always be nil; see @code{make-indirect-buffer}. If @var{buffer} is not +always be @code{nil}; see @code{make-indirect-buffer}. If @var{buffer} is not supplied, it defaults to the current buffer. @example diff --git a/man/lispref/building.texi b/man/lispref/building.texi index 9f962af..4e9c1cd 100644 --- a/man/lispref/building.texi +++ b/man/lispref/building.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/building.info @node Building XEmacs and Object Allocation, Standard Errors, Tips, Top @@ -127,10 +127,14 @@ most emphatically @emph{not} call this yourself; it will reinitialize your XEmacs process and you'll be sorry. @end defun -@deffn Command emacs-version +@deffn Command emacs-version &optional arg This function returns a string describing the version of XEmacs that is running. It is useful to include this string in bug reports. +When called interactively with a prefix argument, insert string at point. +Don't use this function in programs to choose actions according +to the system configuration; look at @code{system-configuration} instead. + @example @group (emacs-version) @@ -150,7 +154,7 @@ local site. @example @group emacs-build-time "Mon Apr 7 20:28:52 1997" - @result{} + @result{} @end group @end example @end defvar @@ -310,7 +314,7 @@ information: (@var{used-syms} . @var{free-syms}) @end group (@var{used-markers} . @var{free-markers}) - @var{used-string-chars} + @var{used-string-chars} @var{used-vector-slots} (@var{plist})) @@ -436,6 +440,7 @@ not apply if XEmacs was configured with @samp{--debug}. Therefore, be careful when setting @code{gc-cons-threshold} in that case!) @end defopt +@ignore @c Emacs 19 feature @defun memory-limit This function returns the address of the last byte XEmacs has allocated, @@ -445,6 +450,7 @@ Lisp integer. You can use this to get a general idea of how your actions affect the memory usage. @end defun +@end ignore @defvar pre-gc-hook This is a normal hook to be run just before each garbage collection. diff --git a/man/lispref/commands.texi b/man/lispref/commands.texi index d68d1b4..9821a57 100644 --- a/man/lispref/commands.texi +++ b/man/lispref/commands.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/commands.info @node Command Loop, Keymaps, Minibuffers, Top @@ -11,7 +11,7 @@ When you run XEmacs, it enters the @dfn{editor command loop} almost immediately. This loop reads events, 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. +are done, and the subroutines that allow Lisp programs to do them. @menu * Command Overview:: How the command loop reads commands. @@ -429,7 +429,7 @@ value becomes the argument for the command. Prompt. @node Interactive Examples @subsection Examples of Using @code{interactive} @cindex examples of using @code{interactive} -@cindex @code{interactive}, examples of using +@cindex @code{interactive}, examples of using Here are some examples of @code{interactive}: @@ -487,9 +487,9 @@ 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}. +@defun commandp function +Returns @code{t} if @var{function} is suitable for calling interactively; +that is, if @var{function} 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 @@ -508,7 +508,7 @@ See @code{documentation} in @ref{Accessing Documentation}, for a realistic example of using @code{commandp}. @end defun -@defun call-interactively command &optional record-flag +@defun call-interactively command &optional record-flag keys 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 @@ -518,7 +518,7 @@ considered commands, because they are not functions. @c XEmacs feature? If @var{record-flag} is the symbol @code{lambda}, the interactive -calling arguments for @code{command} are read and returned as a list, +calling arguments for @var{command} are read and returned as a list, but the function is not called on them. @cindex record command history @@ -528,7 +528,7 @@ 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 +@defun command-execute command &optional record-flag keys @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., @@ -632,7 +632,7 @@ foobar @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. +records for itself and for commands that are run. @defvar last-command This variable records the name of the previous command executed by the @@ -792,7 +792,7 @@ For information about how exactly the XEmacs command loop works, @xref{Reading Input}. @defun eventp object -This function returns non-@code{nil} if @var{event} is an input event. +This function returns non-@code{nil} if @var{object} is an input event. @end defun @menu @@ -847,7 +847,7 @@ also specify the modifier keys that were held down at the time. a portion of a frame needing to be redrawn) has occurred. The contents of this event are not accessible at the E-Lisp level, but @code{dispatch-event} knows what to do with an event of this type. - + @item eval event This is a special kind of event specifying that a particular function needs to be called when this event is dispatched. An event of this type @@ -1009,7 +1009,7 @@ particular type. This is true if @var{object} is a key-press event. @end defun -@defun button-event-p object object +@defun button-event-p object This is true if @var{object} is a mouse button-press or button-release event. @end defun @@ -1327,7 +1327,7 @@ The event button. This an integer, either 1, 2 or 3. It is allowed only for button-press and button-release events. @item @code{modifiers} -The event modifiers. This is a list of modifier symbols. It is allowed +The event modifiers. This is a list of modifier symbols. It is allowed for key-press, button-press, button-release and motion events. @item @code{x} @@ -1430,10 +1430,11 @@ feature of @var{plist}. The following example creates a copy of @end defun @defun copy-event event1 &optional event2 -This function makes a copy of the given event object. If a second -argument is given, the first event is copied into the second and the -second is returned. If the second argument is not supplied (or is -@code{nil}) then a new event will be made. +This function makes a copy of the event object @var{event1}. If a +second event argument @var{event2} is given, @var{event1} is copied into +@var{event2} and @var{event2} is returned. If @var{event2} is not +supplied (or is @code{nil}) then a new event will be made, as with +@code{make-event}. @end defun @defun deallocate-event event @@ -1442,7 +1443,7 @@ This function allows the given event structure to be reused. You it. You will lose. It is not necessary to call this function, as event objects are garbage-collected like all other objects; however, it may be more efficient to explicitly deallocate events when you are sure that -that is safe. +it is safe to do so. @end defun @node Converting Events @@ -1452,25 +1453,32 @@ XEmacs provides some auxiliary functions for converting between events and other ways of representing keys. These are useful when working with @sc{ascii} strings and with keymaps. -@defun character-to-event ch &optional event device -This function converts a numeric @sc{ascii} value to an event structure, -replete with modifier bits. @var{ch} is the character to convert, and +@defun character-to-event key-description &optional event console use-console-meta-flag +This function converts a keystroke description to an event structure. +@var{key-description} is the specification of a key stroke, and @var{event} is the event object to fill in. This function contains knowledge about what the codes ``mean''---for example, the number 9 is converted to the character @key{Tab}, not the distinct character @key{Control-I}. -Note that @var{ch} does not have to be a numeric value, but can be a -symbol such as @code{clear} or a list such as @code{(control -backspace)}. +Note that @var{key-description} can be an integer, a character, a symbol +such as @code{clear} or a list such as @code{(control backspace)}. + +If optional arg @var{event} is non-@code{nil}, it is modified; +otherwise, a new event object is created. In both cases, the event is +returned. -If @code{event} is not @code{nil}, it is modified; otherwise, a -new event object is created. In both cases, the event is returned. +Optional third arg @var{console} is the console to store in the event, +and defaults to the selected console. -Optional third arg @var{device} is the device to store in the event; -this also affects whether the high bit is interpreted as a meta key. A -value of @code{nil} means use the selected device but always treat the -high bit as meta. +If @var{key-description} is an integer or character, the high bit may be +interpreted as the meta key. (This is done for backward compatibility in +lots of places.) If @var{use-console-meta-flag} is @code{nil}, this +will always be the case. If @var{use-console-meta-flag} is +non-@code{nil}, the @code{meta} flag for @var{console} affects whether +the high bit is interpreted as a meta key. (See @code{set-input-mode}.) +If you don't want this silly meta interpretation done, you should pass +in a list containing the character. Beware that @code{character-to-event} and @code{event-to-character} are not strictly inverse functions, since events contain much more @@ -1540,15 +1548,15 @@ Lisp programs can read input a key sequence at a time by calling @code{read-key-sequence}; for example, @code{describe-key} uses it to read the key to describe. -@defun read-key-sequence prompt +@defun read-key-sequence prompt &optional continue-echo dont-downcase-last @cindex key sequence This function reads a sequence of keystrokes or mouse clicks and returns -it as a vector of events. 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. +it as a vector of event objects read. 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. -The vector and the event objects it contains are freshly created, and -will not be side-effected by subsequent calls to this function. +The vector and the event objects it contains are freshly created (and +so will not be side-effected by subsequent calls to this function). The function @code{read-key-sequence} suppresses quitting: @kbd{C-g} typed while reading with this function works like any other character, @@ -1557,6 +1565,17 @@ 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. +Second optional arg @var{continue-echo} non-@code{nil} means this key +echoes as a continuation of the previous key. + +Third optional arg @var{dont-downcase-last} non-@code{nil} means do not +convert the last event to lower case. (Normally any upper case event is +converted to lower case if the original event is undefined and the lower +case equivalent is defined.) This argument is provided mostly for +@var{fsf} compatibility; the equivalent effect can be achieved more +generally by binding @code{retry-undefined-key-binding-unshifted} to +@code{nil} around the call to @code{read-key-sequence}. + @c XEmacs feature If the user selects a menu item while we are prompting for a key sequence, the returned value will be a vector of a single menu-selection @@ -1618,7 +1637,7 @@ In most cases, the function @code{next-command-event} is more appropriate. @end defun -@defun next-command-event &optional event +@defun next-command-event &optional event prompt This function returns the next available ``user'' event from the window system or terminal driver. Pass this object to @code{dispatch-event} to handle it. If an event object is supplied, it is filled in and @@ -1745,7 +1764,7 @@ functions to read command input. 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 +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. @@ -1823,7 +1842,7 @@ 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 +finishes sleeping, @code{discard-input} discards any characters typed during the sleep. @example @@ -1850,7 +1869,7 @@ take two arguments to specify the time (one integer and one float value), instead of a single argument that can be either an integer or a float. -@defun sit-for seconds &optional nodisp +@defun sit-for seconds &optional nodisplay This function performs redisplay (provided there is no pending input from the user), then waits @var{seconds} seconds, or until input is available. The result is @code{t} if @code{sit-for} waited the full @@ -1859,15 +1878,6 @@ and Discarding}). 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. -@ignore FSF Emacs stuff -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}. -@end ignore @cindex forcing redisplay Redisplay is normally preempted if input arrives, and does not happen at @@ -1876,7 +1886,7 @@ updating in such a case by using @code{force-redisplay}. @xref{Refresh Screen}.) 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 +If @var{nodisplay} 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). @@ -1946,7 +1956,7 @@ 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 XEmacs's -internal state. Because quitting is delayed until a safe place, quitting +internal state. Because quitting is delayed until a safe place, quitting cannot make XEmacs crash. Certain functions such as @code{read-key-sequence} or @@ -1955,7 +1965,7 @@ 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}. +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, @@ -2010,7 +2020,7 @@ in @ref{Errors}.) 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 @@ -2081,13 +2091,13 @@ M-3 M-x display-prefix @print{} 3 ; @r{(Same as @code{C-u 3}.)} C-3 M-x display-prefix @print{} 3 ; @r{(Same as @code{C-u 3}.)} -C-u - M-x display-prefix @print{} - +C-u - M-x display-prefix @print{} - M-- M-x display-prefix @print{} - ; @r{(Same as @code{C-u -}.)} C-- M-x display-prefix @print{} - ; @r{(Same as @code{C-u -}.)} -C-u - 7 M-x display-prefix @print{} -7 +C-u - 7 M-x display-prefix @print{} -7 M-- 7 M-x display-prefix @print{} -7 ; @r{(Same as @code{C-u -7}.)} @@ -2108,9 +2118,9 @@ argument, either numeric or raw, in the @code{interactive} declaration. value of the prefix argument directly in the variable @code{current-prefix-arg}, but this is less clean. -@defun prefix-numeric-value arg +@defun prefix-numeric-value raw 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. +value, @var{raw}. 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 @@ -2219,7 +2229,7 @@ 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 +@deffn Command recursive-edit @cindex suspend evaluation This function invokes the editor command loop. It is called automatically by the initialization of XEmacs, to let the user begin @@ -2241,17 +2251,17 @@ then type @kbd{C-M-c} to exit and continue executing @code{simple-rec}. (simple-rec) @result{} nil @end example -@end defun +@end deffn @deffn Command exit-recursive-edit This function exits from the innermost recursive edit (including minibuffer input). Its definition is effectively @code{(throw 'exit -nil)}. +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} +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 @@ -2394,7 +2404,7 @@ 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. +encounters an error or a failing search. @end defun @defvar executing-macro diff --git a/man/lispref/compile.texi b/man/lispref/compile.texi index 6feb3e0..7db86b7 100644 --- a/man/lispref/compile.texi +++ b/man/lispref/compile.texi @@ -213,17 +213,23 @@ for the file name. @end deffn @c flag is not optional in FSF Emacs -@deffn Command byte-recompile-directory directory &optional flag +@deffn Command byte-recompile-directory directory &optional flag norecursion force @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. +Files in subdirectories of @var{directory} are also processed unless +optional argument @var{norecursion} is non-@code{nil}. + 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. +If the fourth optional argument @var{force} is non-@code{nil}, +recompile every @samp{.el} file that already has a @samp{.elc} file. + The return value of this command is unpredictable. @end deffn @@ -254,7 +260,7 @@ normally @code{nil}, but is bound to @code{t} by @code{batch-byte-recompile-directory}. @end defvar -@defun byte-code instructions constants stack-size +@defun byte-code instructions constants stack-depth @cindex byte-code interpreter This function actually interprets byte-code. Don't call this function yourself. Only the byte compiler knows how to @@ -451,7 +457,7 @@ The string containing the byte-code instructions. The vector of Lisp objects referenced by the byte code. These include symbols used as function names and variable names. -@item stack-size +@item stack-depth The maximum stack size this function needs. @item doc-string @@ -485,7 +491,7 @@ representation. It is the definition of the command The primitive way to create a compiled-function object is with @code{make-byte-code}: -@defun make-byte-code arglist instructions constants stack-size &optional doc-string interactive +@defun make-byte-code arglist instructions constants stack-depth &optional doc-string interactive This function constructs and returns a compiled-function object with the specified attributes. @@ -522,7 +528,7 @@ This function returns the vector of Lisp objects referenced by compiled-function object @var{function}. @end defun -@defun compiled-function-stack-size function +@defun compiled-function-stack-depth function This function returns the maximum stack size needed by compiled-function object @var{function}. @end defun diff --git a/man/lispref/consoles-devices.texi b/man/lispref/consoles-devices.texi index 67f5f07..3a0e4bc 100644 --- a/man/lispref/consoles-devices.texi +++ b/man/lispref/consoles-devices.texi @@ -90,12 +90,14 @@ frame. This function is useful because devices and frames are similar in many respects and many functions can operate on either one. @end defun -@defun device-frame-list device +@defun device-frame-list &optional device This function returns a list of all frames on @var{device}. +@var{device} defaults to the currently selected device. @end defun -@defun frame-device frame +@defun frame-device &optional frame This function returns the device that @var{frame} is on. +@var{frame} defaults to the currently selected frame. @end defun @node Console Types and Device Classes @@ -136,16 +138,17 @@ but no color). A device that can only display two colors (e.g. black and white). @end table -@defun device-type device +@defun device-type &optional device This function returns the type of @var{device}. This is a symbol whose -name is one of the device types mentioned above. +name is one of the device types mentioned above. @var{device} defaults +to the selected device. @end defun @defun device-or-frame-type device-or-frame This function returns the type of @var{device-or-frame}. @end defun -@defun device-class device +@defun device-class &optional device This function returns the class (color behavior) of @var{device}. This is a symbol whose name is one of the device classes mentioned above. @end defun @@ -168,14 +171,14 @@ represents XEmacs's stdout. @node Connecting to a Console or Device @section Connecting to a Console or Device -@defun make-device &optional type device-data +@defun make-device type connection &optional props This function creates a new device. @end defun The following two functions create devices of specific types and are written in terms of @code{make-device}. -@defun make-tty-device &optional tty terminal-type +@defun make-tty-device &optional tty terminal-type This function creates a new tty device on @var{tty}. This also creates the tty's first frame. @var{tty} should be a string giving the name of a tty device file (e.g. @samp{/dev/ttyp3} under SunOS et al.), as @@ -193,7 +196,7 @@ argument @var{argv-list} is a list of strings describing command line options. @end defun -@defun delete-device device +@defun delete-device device &optional force This function deletes @var{device}, permanently eliminating it from use. This disconnects XEmacs's connection to the device. @end defun diff --git a/man/lispref/control.texi b/man/lispref/control.texi index 4588d48..59000f7 100644 --- a/man/lispref/control.texi +++ b/man/lispref/control.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/control.info @node Control Structures, Variables, Evaluation, Top @@ -152,7 +152,7 @@ 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}.) +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}. @@ -163,8 +163,8 @@ never evaluated---it is ignored. Thus, in the example below, @example @group -(if nil - (print 'true) +(if nil + (print 'true) 'very-false) @result{} very-false @end group @@ -226,7 +226,7 @@ clauses was successful. To do this, we use @code{t} as the never @code{nil}, so this clause never fails, provided the @code{cond} gets to it at all. -For example, +For example, @example @group @@ -360,7 +360,7 @@ 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} + (if @var{arg2} @var{arg2} @var{arg3})) @end group @end example @@ -581,7 +581,7 @@ return points at once. First, two return points with the same tag, @end group @group -(catch 'hack +(catch 'hack (print (catch2 'hack)) 'no) @print{} yes @@ -664,48 +664,161 @@ which you call for other purposes, such as if you try to take the buffer; you can also signal errors explicitly with the functions @code{error}, @code{signal}, and others. - Quitting, which happens when the user types @kbd{C-g}, is not + 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}. +XEmacs has a rich hierarchy of error symbols predefined via @code{deferror}. + +@example +error + syntax-error + invalid-read-syntax + list-formation-error + malformed-list + malformed-property-list + circular-list + circular-property-list + + invalid-argument + wrong-type-argument + args-out-of-range + wrong-number-of-arguments + invalid-function + no-catch + + invalid-state + void-function + cyclic-function-indirection + void-variable + cyclic-variable-indirection + + invalid-operation + invalid-change + setting-constant + editing-error + beginning-of-buffer + end-of-buffer + buffer-read-only + io-error + end-of-file + arith-error + range-error + domain-error + singularity-error + overflow-error + underflow-error +@end example + +The five most common errors you will probably use or base your new +errors off of are @code{syntax-error}, @code{invalid-argument}, +@code{invalid-state}, @code{invalid-operation}, and +@code{invalid-change}. Note the semantic differences: + +@itemize @bullet +@item +@code{syntax-error} is for errors in complex structures: parsed strings, +lists, and the like. + +@item +@code{invalid-argument} is for errors in a simple value. Typically, the +entire value, not just one part of it, is wrong. + +@item +@code{invalid-state} means that some settings have been changed in such +a way that their current state is unallowable. More and more, code is +being written more carefully, and catches the error when the settings +are being changed, rather than afterwards. This leads us to the next +error: + +@item +@code{invalid-change} means that an attempt is being made to change some +settings into an invalid state. @code{invalid-change} is a type of +@code{invalid-operation}. + +@item +@code{invalid-operation} refers to all cases where code is trying to do +something that's disallowed. This includes file errors, buffer errors +(e.g. running off the end of a buffer), @code{invalid-change} as just +mentioned, and arithmetic errors. +@end itemize + +@defun error datum &rest args +This function signals a non-continuable error. + +@var{datum} should normally be an error symbol, i.e. a symbol defined +using @code{define-error}. @var{args} will be made into a list, and +@var{datum} and @var{args} passed as the two arguments to @code{signal}, +the most basic error handling function. This error is not continuable: you cannot continue execution after the -error using the debugger @kbd{r} or @kbd{c} commands. If you wish the -user to be able to continue execution, use @code{cerror} or -@code{signal} instead. +error using the debugger @kbd{r} command. See also @code{cerror}. + +The correct semantics of @var{args} varies from error to error, but for +most errors that need to be generated in Lisp code, the first argument +should be a string describing the *context* of the error (i.e. the exact +operation being performed and what went wrong), and the remaining +arguments or \"frobs\" (most often, there is one) specify the offending +object(s) and/or provide additional details such as the exact error when +a file error occurred, e.g.: + +@itemize @bullet +@item +the buffer in which an editing error occurred. +@item +an invalid value that was encountered. (In such cases, the string +should describe the purpose or \"semantics\" of the value [e.g. if the +value is an argument to a function, the name of the argument; if the value +is the value corresponding to a keyword, the name of the keyword; if the +value is supposed to be a list length, say this and say what the purpose +of the list is; etc.] as well as specifying why the value is invalid, if +that's not self-evident.) +@item +the file in which an error occurred. (In such cases, there should be a +second frob, probably a string, specifying the exact error that occurred. +This does not occur in the string that precedes the first frob, because +that frob describes the exact operation that was happening. +@end itemize + +For historical compatibility, DATUM can also be a string. In this case, +@var{datum} and @var{args} are passed together as the arguments to +@code{format}, and then an error is signalled using the error symbol +@code{error} and formatted string. Although this usage of @code{error} +is very common, it is deprecated because it totally defeats the purpose +of having structured errors. There is now a rich set of defined errors +to use. + +See also @code{cerror}, @code{signal}, and @code{signal-error}." These examples show typical uses of @code{error}: @example @group -(error "You have committed an error. +(error 'syntax-error + "Dialog descriptor must supply at least one button" + descriptor) +@end group + +@group +(error "You have committed an error. Try something else.") - @error{} You have committed an error. + @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. + @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}. This is repeated in an endless loop, to ensure that -@code{error} never returns. - 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 cerror format-string &rest args +@defun cerror datum &rest args This function behaves like @code{error}, except that the error it signals is continuable. That means that debugger commands @kbd{c} and @kbd{r} can resume execution. @@ -966,9 +1079,9 @@ message and returns a very large number. @smallexample @group (defun safe-divide (dividend divisor) - (condition-case err + (condition-case err ;; @r{Protected form.} - (/ dividend divisor) + (/ dividend divisor) ;; @r{The handler.} (arith-error ; @r{Condition.} (princ (format "Arithmetic error: %s" err)) @@ -1011,7 +1124,7 @@ including those signaled with @code{error}: ;; @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)) + (error (princ (format "The error was: %s" err)) 2)) @print{} The error was: (error "Rats! The variable baz was 34, not 35") @result{} 2 @@ -1119,7 +1232,7 @@ 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. diff --git a/man/lispref/customize.texi b/man/lispref/customize.texi index 4c2c260..fddbf33 100644 --- a/man/lispref/customize.texi +++ b/man/lispref/customize.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1997, 1998 Free Software Foundation, Inc. +@c Copyright (C) 1997, 1998 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../info/customize @node Customization, , , Top @@ -13,8 +13,8 @@ definitions---as well as face definitions. @menu * Common Keywords:: -* Group Definitions:: -* Variable Definitions:: +* Group Definitions:: +* Variable Definitions:: * Customization Types:: @end menu @@ -627,7 +627,7 @@ Substitute the tag here. You specify the tag with the @code{:tag} keyword. @item %% -Display a literal @samp{%}. +Display a literal @samp{%}. @end table @item :action @var{action} @@ -710,7 +710,7 @@ in a @code{menu-choice} widget. By default, the tag used will be either the representation of the @code{:value} property if not. @item :validate -A function which takes a widget as an argument, and return nil if the +A function which takes a widget as an argument, and returns @code{nil} if the widgets current value is valid for the widget. Otherwise, it should return the widget containing the invalid data, and set that widgets @code{:error} property to a string explaining the error. @@ -727,7 +727,7 @@ implemented. @item Widgets with tabbing order @code{-1} are ignored. -@item +@item (Unimplemented) When on a widget with tabbing order @var{n}, go to the next widget in the buffer with tabbing order @var{n+1} or @code{nil}, whichever comes first. diff --git a/man/lispref/databases.texi b/man/lispref/databases.texi index b3106e3..6b05aa8 100644 --- a/man/lispref/databases.texi +++ b/man/lispref/databases.texi @@ -35,58 +35,58 @@ For a @var{type} of @code{'dbm}, there are no subtypes, so For a @var{type} of @code{'berkeley-db}, the following subtypes are available: @code{'hash}, @code{'btree}, and @code{'recno}. See the -manpages for the Berkeley DB functions for more information about these +manpages for the Berkeley DB functions for more information about these types. @end defun -@defun close-database obj -This function closes database @var{obj}. +@defun close-database database +This function closes database @var{database}. @end defun -@defun database-live-p obj -This function returns @code{t} iff @var{obj} is an active database, else +@defun database-live-p object +This function returns @code{t} if @var{object} is an active database, else @code{nil}. @end defun @node Working With a Database @section Working With a Database -@defun get-database key dbase &optional default +@defun get-database key database &optional default This function finds the value for @var{key} in @var{database}. If there is no corresponding value, @var{default} is returned (@code{nil} if @var{default} is omitted). @end defun -@defun map-database function dbase +@defun map-database function database This function maps @var{function} over entries in @var{database}, calling it with two args, each key and value in the database. @end defun -@defun put-database key val dbase &optional replace -This function stores @var{key} and @var{val} in @var{database}. If -optional fourth arg @var{replace} is non-@code{nil}, replace any +@defun put-database key value database &optional replace +This function stores @var{key} and @var{value} in @var{database}. +If optional fourth arg @var{replace} is non-@code{nil}, replace any existing entry in the database. @end defun -@defun remove-database key dbase +@defun remove-database key database This function removes @var{key} from @var{database}. @end defun @node Other Database Functions @section Other Database Functions -@defun database-file-name obj -This function returns the filename associated with the database @var{obj}. +@defun database-file-name database +This function returns the filename associated with @var{database}. @end defun -@defun database-last-error &optional obj -This function returns the last error associated with database @var{obj}. +@defun database-last-error &optional database +This function returns the last error associated with @var{database}. @end defun -@defun database-subtype obj -This function returns the subtype of database @var{obj}, if any. +@defun database-subtype database +This function returns the subtype of @var{database}, if any. @end defun -@defun database-type obj -This function returns the type of database @var{obj}. +@defun database-type database +This function returns the type of @var{database}. @end defun diff --git a/man/lispref/debugging.texi b/man/lispref/debugging.texi index 698d0ed..99c351e 100644 --- a/man/lispref/debugging.texi +++ b/man/lispref/debugging.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/debugging.info @node Debugging, Read and Print, Byte Compilation, Top @@ -232,7 +232,7 @@ Entering: @end example @end deffn -@deffn Command cancel-debug-on-entry function-name +@deffn Command cancel-debug-on-entry &optional 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 diff --git a/man/lispref/dialog.texi b/man/lispref/dialog.texi index 7aba6fb..a282f5e 100644 --- a/man/lispref/dialog.texi +++ b/man/lispref/dialog.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/dialog.info @node Dialog Boxes, Toolbar, Menus, Top diff --git a/man/lispref/display.texi b/man/lispref/display.texi index 1a85ffc..043f4e4 100644 --- a/man/lispref/display.texi +++ b/man/lispref/display.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1998 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1998 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/display.info @node Display, Hash Tables, Annotations, Top @@ -30,9 +30,14 @@ that XEmacs presents to the user. The function @code{redraw-frame} redisplays the entire contents of a given frame. @xref{Frames}. -@c Emacs 19 feature -@defun redraw-frame frame +@defun redraw-frame &optional frame no-preempt This function clears and redisplays frame @var{frame}. + +@var{frame} defaults to the selected frame if omitted. + +Normally, redisplay is preempted as normal if input arrives. However, +if optional second arg @var{no-preempt} is non-@code{nil}, redisplay +will not stop for input and is guaranteed to proceed to completion. @end defun Even more powerful is @code{redraw-display}: @@ -72,9 +77,9 @@ redrawn from scratch. Normally this occurs the next time that @code{next-event} or @code{sit-for} is called; however, a display update will not occur if there is input pending. @xref{Command Loop}. -@defun force-cursor-redisplay -This function causes an immediate update of the cursor on the selected -frame. (This function does not exist in FSF Emacs.) +@defun force-cursor-redisplay &optional frame +This function causes an immediate update of the cursor on @var{frame}, +which defaults to the selected frame. @end defun @node Truncation @@ -216,16 +221,16 @@ function; @item @code{progress}---progress indicators like @samp{Converting... 45%} (not logged by default); -@item @code{prompt}---prompt-like messages like @samp{Isearch: foo} (not +@item @code{prompt}---prompt-like messages like @samp{Isearch: foo} (not logged by default); -@item @code{command}---helper command messages like @samp{Mark set} (not +@item @code{command}---helper command messages like @samp{Mark set} (not logged by default); @item @code{no-log}---messages that should never be logged @end itemize -Several messages may be stacked in the echo area at once. Lisp programs +Several messages may be stacked in the echo area at once. Lisp programs may access these messages, or remove them as appropriate, via the message stack. @@ -273,7 +278,7 @@ displayed there. If a message remains at the head of the message-stack and @var{no-restore} is @code{nil}, it will be displayed. The string which remains in the echo area will be returned, or @code{nil} if the -message-stack is now empty. If @var{label} is nil, the entire +message-stack is now empty. If @var{label} is @code{nil}, the entire message-stack is cleared. @example @@ -554,7 +559,7 @@ effect is seen only within XEmacs. @defvar selective-display This buffer-local variable enables selective display. This means that -lines, or portions of lines, may be made invisible. +lines, or portions of lines, may be made invisible. @itemize @bullet @item @@ -823,7 +828,7 @@ 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 +@deffn Command 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 @@ -836,9 +841,6 @@ 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 @@ -849,7 +851,7 @@ Here is an example of calling this function explicitly. (blink-matching-open))) @end group @end smallexample -@end defun +@end deffn @node Usual Display @section Usual Display Conventions diff --git a/man/lispref/dragndrop.texi b/man/lispref/dragndrop.texi index ceab662..5d48ba6 100644 --- a/man/lispref/dragndrop.texi +++ b/man/lispref/dragndrop.texi @@ -1,7 +1,7 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. @c Copyright (C) 1998 Oliver Graf -@c Original reference is (c) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Original reference is (c) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/dragndrop.texi @node Drag and Drop, Modes, Scrollbars, Top @@ -57,10 +57,10 @@ OffiX is supported if 'offix is member of the variable dragdrop-protocols, or the feature 'offix is defined. Unfortunately it uses it's own data types. Examples are: File, Files, -Exe, Link, URL, MIME. The API tries to choose the right type for the data that +Exe, Link, URL, MIME. The API tries to choose the right type for the data that is dragged from XEmacs (well, not yet...). -XEmacs supports both MIME and URL drags and drops using this API. No application +XEmacs supports both MIME and URL drags and drops using this API. No application interaction is possible while dragging is in progress. For information about the OffiX project have a look at http://leb.net/~offix/ @@ -107,7 +107,7 @@ misc-user-event. This misc-user-event has its function argument set to @code{dragdrop-drop-dispatch} and the object contains the data of the drop (converted to URL/MIME specific data). This function will search the variable -@code{experimental-dragdrop-drop-functions} for a function that can handle the +@code{experimental-dragdrop-drop-functions} for a function that can handle the dropped data. To modify the drop behavior, the user can modify the variable @@ -118,7 +118,7 @@ extent-property with the same name. Extents are checked prior to the variable. The customization group @code{drag-n-drop} shows all variables of user -interest. +interest. @node Drag Interface @section Drag Interface diff --git a/man/lispref/edebug-inc.texi b/man/lispref/edebug-inc.texi index bce6dbc..682ffc0 100644 --- a/man/lispref/edebug-inc.texi +++ b/man/lispref/edebug-inc.texi @@ -22,10 +22,10 @@ each breakpoint. @item Display expression results and evaluate expressions as if outside of -Edebug. Interface with the custom printing package +Edebug. Interface with the custom printing package for printing circular structures. -@item +@item Automatically reevaluate a list of expressions and display their results each time Edebug updates the display. @@ -108,7 +108,7 @@ open-parenthesis before @code{if}. @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. +that is a list, and also after each variable reference. Here we show with periods the stop points found in the function @code{fac}: @@ -134,7 +134,7 @@ the display you will see: @end example When Edebug stops execution after an expression, it displays the -expression's value in the echo area. +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 @@ -190,7 +190,7 @@ package you are using but only when you also use Edebug. For example, @file{my-package.el}. @example -(add-hook 'edebug-setup-hook +(add-hook 'edebug-setup-hook (function (lambda () (require 'my-specs)))) @end example @@ -288,7 +288,7 @@ program more slowly or stop sooner. 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 @code{step} mode. Note that you may reenter the same Edebug -level several times if, for example, an instrumented function is called +level several times if, for example, an instrumented function is called several times from one command. While executing or tracing, you can interrupt the execution by typing @@ -342,7 +342,7 @@ point, type @kbd{w} first, to move point there. @item o Continue ``out of'' an expression (@code{edebug-step-out}). It places a -temporary breakpoint at the end of the sexp containing point. +temporary breakpoint at the end of the sexp containing point. If the containing sexp is a function definition itself, it continues until just before the last sexp in the definition. If that is where you @@ -410,7 +410,7 @@ execution. 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 +@kbd{C-]}. You can display a backtrace of all the pending evaluations with @kbd{d}. @@ -479,7 +479,7 @@ 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. +* Global Break Condition:: Breaking on an event. * Embedded Breakpoints:: Embedding breakpoints in code. @end menu @@ -495,7 +495,7 @@ break condition} is a condition that is repeatedly evaluated at every stop point. If it evaluates to a non-@code{nil} value, then execution is stopped or paused depending on the execution mode, just like a breakpoint. Any errors that might occur as a result of evaluating the -condition are ignored, as if the result were @code{nil}. +condition are ignored, as if the result were @code{nil}. @findex edebug-set-global-break-condition @vindex edebug-global-break-condition @@ -831,7 +831,7 @@ produce a traditional trace listing of execution in a separate buffer, @findex edebug-print-trace-before @findex edebug-print-trace-after -If the variable @code{edebug-trace} is non-nil, each function entry and +If the variable @code{edebug-trace} is non-@code{nil}, each function entry and exit adds lines to the trace buffer. On function entry, Edebug prints @samp{::::@{} followed by the function name and argument values. On function exit, Edebug prints @samp{::::@}} followed by the function name @@ -903,13 +903,13 @@ the breakpoint is reached, the frequency data is looks like this: @example (defun fac (n) (if (= n 0) (edebug)) -;#6 1 0 =5 +;#6 1 0 =5 (if (< 0 n) -;#5 = +;#5 = (* n (fac (1- n))) -;# 5 0 +;# 5 0 1)) -;# 0 +;# 0 @end example The comment lines show that @code{fac} has been called 6 times. The @@ -945,12 +945,12 @@ Whenever Edebug is entered just to think about whether to take some action, it needs to save and restore certain data. @itemize @bullet -@item +@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 +@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}. @@ -978,19 +978,19 @@ following data, but some of these are deliberately not restored if an error or quit signal occurs. @itemize @bullet -@item +@item @cindex current buffer point and mark (Edebug) Which buffer is current, and where point and mark are in the current buffer are saved and restored. -@item +@item @cindex window configuration (Edebug) @findex save-excursion (Edebug) @vindex edebug-save-windows The Edebug Display Update, is saved and restored if @code{edebug-save-windows} is non-@code{nil}. It 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. +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. @@ -1007,7 +1007,7 @@ 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 +@item @code{cursor-in-echo-area} is locally bound to @code{nil} so that the cursor shows up in the window. @@ -1055,7 +1055,7 @@ evaluation list window. by the @code{recursive-edit}, but Edebug temporarily restores them during evaluations. -@item +@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}. @@ -1074,7 +1074,7 @@ resulting expansion is evaluated, or any time later.) You must explain the format of macro call arguments by using @code{def-edebug-spec} to define an @dfn{Edebug specification} for each macro. -@deffn Macro def-edebug-spec macro specification +@defmac 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 @@ -1086,7 +1086,7 @@ name. Unless you are using Emacs 19 or XEmacs, this macro is only defined in Edebug, so you may want to use the following which is equivalent: @code{(put '@var{macro} 'edebug-form-spec '@var{specification})} -@end deffn +@end defmac Here is a simple example that defines the specification for the @code{for} macro described in the XEmacs Lisp Reference Manual, followed @@ -1194,7 +1194,7 @@ An unquoted anonymous lambda expression. @item &optional @cindex &optional (Edebug) All following elements in the specification list are optional; as soon -as one does not match, Edebug stops matching at this level. +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 @@ -1229,7 +1229,7 @@ Each of the following elements is matched as alternatives as if by using of them match, nothing is matched, but the @code{¬} specification succeeds. -@item &define +@item &define @cindex &define (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 @@ -1243,7 +1243,7 @@ described here. See the @code{defun} example below. @table @code @item name -The argument, a symbol, is the name of the defining form. +The argument, a symbol, is the name of the defining form. But a defining form need not be named at all, in which case a unique name will be created for it. @@ -1442,7 +1442,7 @@ specification for the macro as follows: the specifications for those arguments must use @code{def-form} instead of @code{form}. (This is to reestablish the Edebugging context for those external forms.) -For example, the @code{for} macro +For example, the @code{for} macro @c (@pxref{Problems with Macros}) @c in XEmacs Lisp Reference Manual (@pxref{Problems with Macros,,,, XEmacs Lisp Reference Manual}) @c Edebug Doc is shown here but with @code{edebug-`} @@ -1517,8 +1517,8 @@ function body. @example (def-edebug-spec defmacro defun) ; @r{Indirect ref to @code{defun} spec} -(def-edebug-spec defun - (&define name lambda-list +(def-edebug-spec defun + (&define name lambda-list [&optional stringp] ; @r{Match the doc string, if present.} [&optional ("interactive" interactive)] def-body)) @@ -1594,7 +1594,7 @@ what happens to data about windows, you may want to set this variable to @code{nil}. If the value is a list, only the listed windows are saved and -restored. +restored. @kbd{M-x edebug-toggle-save-windows} may be used to change this variable. This command is bound to @kbd{W} in source code buffers. @@ -1621,7 +1621,7 @@ 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}. +The default value is @code{step}. See @ref{Edebug Execution Modes}. @end defopt @@ -1630,15 +1630,15 @@ See @ref{Edebug Execution Modes}. @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. +function entry or exit per line, indented by the recursion level. -The default value is @code{nil}. +The default value is @code{nil}. Also see @code{edebug-tracing}. See @ref{Tracing}. @end defopt -@defopt edebug-test-coverage +@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 @@ -1651,7 +1651,7 @@ and coverage information for a definition. See @ref{Coverage Testing}. @end defopt -@defopt edebug-continue-kbd-macro +@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. @@ -1664,12 +1664,12 @@ results in Edebug. The default value is @code{50}. See @ref{Printing in Edebug}. @end defopt -@defopt edebug-print-level +@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 +@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 @@ -1694,6 +1694,6 @@ See @ref{Debugging Backquote}. @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. +If the result is non-@code{nil}, then break. Errors are ignored. See @ref{Global Break Condition}. @end defopt diff --git a/man/lispref/edebug.texi b/man/lispref/edebug.texi index 37f5ad4..527211a 100644 --- a/man/lispref/edebug.texi +++ b/man/lispref/edebug.texi @@ -149,7 +149,7 @@ sometimes. There is a bug in window updating when there is both a trace buffer and an evaluation list - the source buffer doesn't get displayed. -@item +@item Killing and reinserting an instrumented definition or parts of it leaves marks in the buffer which may confuse Edebug later. @@ -170,7 +170,7 @@ macros across the Edebug activation boundary. There are no other known bugs, so if you find any, please let me know. There is nothing worse than a buggy debugger! -@item +@item I need to rethink locally binding @code{debug-on-error}, @code{debug-on-quit}, and keyboard macro state variables. Should we allow the global values to be changed by the user? @@ -208,7 +208,7 @@ Use copy of @code{current-local-map} instead of @code{emacs-lisp-mode-map} Better integration with standard debug. @item -Use @code{inhibit-quit} while edebugging? +Use @code{inhibit-quit} while edebugging? @item Crawl mode would @code{sit-for} 0 or 1 in the outside window configuration diff --git a/man/lispref/errors.texi b/man/lispref/errors.texi index d246f1b..abde5b9 100644 --- a/man/lispref/errors.texi +++ b/man/lispref/errors.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/errors.info @node Standard Errors, Standard Buffer-Local Variables, Building XEmacs and Object Allocation, Top @@ -75,7 +75,7 @@ error message is constructed from the data items alone when the error condition @code{file-error} is present.@* @xref{Files}. -@item file-locked +@item file-locked This is a @code{file-error}.@* @xref{File Locks}. @@ -128,7 +128,7 @@ This is a @code{file-error}.@* @xref{Searching and Matching}. @item setting-constant -@code{"Attempt to set a constant symbol"}@* +@code{"Attempt to set a constant symbol"}@* @xref{Constant Variables, , Variables that Never Change}. @c XEmacs feature diff --git a/man/lispref/eval.texi b/man/lispref/eval.texi index 4714c04..71ce6d2 100644 --- a/man/lispref/eval.texi +++ b/man/lispref/eval.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/eval.info @node Evaluation, Control Structures, Symbols, Top @@ -30,7 +30,7 @@ function @code{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 +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. @@ -433,7 +433,7 @@ function, not a symbol. @smallexample @group ((lambda (arg) (erste arg)) - '(1 2 3)) + '(1 2 3)) @result{} 1 @end group @end smallexample @@ -445,12 +445,11 @@ 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. +@defun indirect-function object +This function returns the meaning of @var{object} as a function. If +@var{object} is a symbol, then it finds @var{object}'s function +definition and starts over with that value. If @var{object} is not a +symbol, then it returns @var{object} itself. Here is how you could define @code{indirect-function} in Lisp: diff --git a/man/lispref/extents.texi b/man/lispref/extents.texi index a654d69..d9c852c 100644 --- a/man/lispref/extents.texi +++ b/man/lispref/extents.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c Copyright (C) 1996 Ben Wing. @c See the file lispref.texi for copying conditions. @setfilename ../../info/extents.info @@ -108,16 +108,16 @@ commands. @xref{Duplicable Extents}. @node Creating and Modifying Extents @section Creating and Modifying Extents -@defun make-extent from to &optional object +@defun make-extent from to &optional buffer-or-string This function makes an extent for the range [@var{from}, @var{to}) in -@var{object} (a buffer or string). @var{object} defaults to the current -buffer. Insertions at point @var{to} will be outside of the extent; -insertions at @var{from} will be inside the extent, causing the extent -to grow (@pxref{Extent Endpoints}). This is the same way that markers -behave. The extent is initially detached if both @var{from} and -@var{to} are @code{nil}, and in this case @var{object} defaults to -@code{nil}, meaning the extent is in no buffer or string -(@pxref{Detached Extents}). +@var{buffer-or-string} (a buffer or string). @var{buffer-or-string} +defaults to the current buffer. Insertions at point @var{to} will be +outside of the extent; insertions at @var{from} will be inside the +extent, causing the extent to grow (@pxref{Extent Endpoints}). This is +the same way that markers behave. The extent is initially detached if +both @var{from} and @var{to} are @code{nil}, and in this case +@var{buffer-or-string} defaults to @code{nil}, meaning the extent is in +no buffer or string (@pxref{Detached Extents}). @end defun @defun delete-extent extent @@ -135,9 +135,9 @@ however, a detached extent will not necessarily return a value of @code{nil}. @end defun -@defun extent-live-p extent -This function returns @code{nil} if @var{extent} is deleted, and -@code{t} otherwise. +@defun extent-live-p object +This function returns @code{t} if @var{object} is an extent that has not +been deleted, and @code{nil} otherwise. @end defun @node Extent Endpoints @@ -231,7 +231,7 @@ are also provided (@pxref{Mapping Over Extents}). When reading through this section, keep in mind the way that extents are ordered (@pxref{Extent Endpoints}). -@defun extent-list &optional buffer-or-string from to flags +@defun extent-list &optional buffer-or-string from to flags property value This function returns a list of the extents in @var{buffer-or-string}. @var{buffer-or-string} defaults to the current buffer if omitted. @var{from} and @var{to} can be used to limit the range over which @@ -245,10 +245,19 @@ to the beginning and end of @var{buffer-or-string}, respectively. @var{flags} controls how end cases are treated. For a discussion of this, and exactly what ``overlap'' means, see @code{map-extents}. + +The optional arguments @var{property} and @var{value} can be used to +further restrict which extents are returned. They have the same meaning +as for @code{map-extents}. + +If you want to map a function over the extents in a buffer or string, +consider using @code{map-extents} or @code{mapcar-extents} instead. + +See also the function @code{extents-at}. @end defun Functions that create extents must be prepared for the possibility -that there are other extents in the same area, created by other +that there are other extents in the same area, created by other functions. To deal with this, functions typically mark their own extents by setting a particular property on them. The following function makes it easier to locate those extents. @@ -326,8 +335,8 @@ the end of the region is open), but this can be changed with the @var{function} is called with the arguments (extent, @var{maparg}). The arguments @var{object}, @var{from}, @var{to}, @var{maparg}, and @var{flags} are all optional and default to the current buffer, the -beginning of @var{object}, the end of @var{object}, @var{nil}, and -@var{nil}, respectively. @code{map-extents} returns the first +beginning of @var{object}, the end of @var{object}, @code{nil}, and +@code{nil}, respectively. @code{map-extents} returns the first non-@code{nil} result produced by @var{function}, and no more calls to @var{function} are made after it returns non-@code{nil}. @@ -436,7 +445,7 @@ Thus, this function may be used to walk a tree of extents in a buffer: @end defun @defun extent-in-region-p extent &optional from to flags -This function returns @var{t} if @code{map-extents} would visit +This function returns @code{t} if @code{map-extents} would visit @var{extent} if called with the given arguments. @end defun @@ -463,9 +472,9 @@ from that parent (or from the root ancestor if the parent in turn has a parent), and setting a property of the extent actually sets that property on the parent. @xref{Extent Parents}. -@defun extent-property extent property -This function returns the value of @var{property} in @var{extent}. If -@var{property} is undefined, @code{nil} is returned. +@defun extent-property extent property &optional default +This function returns @var{extent}'s value for @var{property}, or +@var{default} if no such property exists. @end defun @defun extent-properties extent @@ -669,9 +678,9 @@ there is none, @code{nil} is returned. The following convenience functions are provided for setting particular properties of an extent. -@defun set-extent-priority extent pri +@defun set-extent-priority extent priority This function sets the @code{priority} property of @var{extent} to -@var{pri}. +@var{priority}. @end defun @defun set-extent-face extent face @@ -713,7 +722,7 @@ respectively. (@var{layout} defaults to @code{text} if not specified.) @end defun @defun set-extent-initial-redisplay-function extent function -This function sets the @code{initial-redisplay-function} property of the +This function sets the @code{initial-redisplay-function} property of the extent to @var{function}. @end defun diff --git a/man/lispref/faces.texi b/man/lispref/faces.texi index ee36e15..4837ae7 100644 --- a/man/lispref/faces.texi +++ b/man/lispref/faces.texi @@ -127,16 +127,18 @@ other non-@code{nil} value both permanent and temporary are included. @end defun @defun facep object -This function returns whether the given object is a face. +This function returns @code{t} if @var{object} is a face, else @code{nil}. @end defun -@defun copy-face old-face new-name &optional locale how-to-add +@defun copy-face old-face new-name &optional locale tag-set exact-p how-to-add This function defines a new face named @var{new-name} which is a copy of the existing face named @var{old-face}. If there is already a face named @var{new-name}, then it alters the face to have the same -properties as @var{old-face}. @var{locale} and @var{how-to-add} -let you copy just parts of the old face rather than the whole face, -and are as in @code{copy-specifier} (@pxref{Specifiers}). +properties as @var{old-face}. + +@var{locale}, @var{tag-set}, @var{exact-p} and @var{how-to-add} let you +copy just parts of the old face rather than the whole face, and are as +in @code{copy-specifier} (@pxref{Specifiers}). @end defun @node Face Properties @@ -187,7 +189,7 @@ specifier, unlike all the other built-in properties, and cannot contain locale-specific values. @end table -@defun set-face-property face property value &optional locale tag how-to-add +@defun set-face-property face property value &optional locale tag-set how-to-add This function changes a property of a @var{face}. For built-in properties, the actual value of the property is a specifier @@ -248,7 +250,7 @@ specifier, it will automatically be converted into a @code{generic} specifier. @end defun -@defun remove-face-property face property &optional local tag-set exact-p +@defun remove-face-property face property &optional locale tag-set exact-p This function removes a property of a @var{face}. For built-in properties, this is analogous to @code{remove-specifier}. @@ -263,7 +265,7 @@ specifier, it will be converted into a @code{generic} specifier automatically. @end defun -@defun face-property face property &optional locale +@defun face-property face property &optional locale tag-set exact-p This function returns @var{face}'s value of the given @var{property}. If @var{locale} is omitted, the @var{face}'s actual value for @@ -354,15 +356,15 @@ in @code{specifier-instance}. @xref{Specifiers}. @node Face Convenience Functions @subsection Face Convenience Functions -@defun set-face-foreground face color &optional locale tag how-to-add -@defunx set-face-background face color &optional locale tag how-to-add +@deffn Command set-face-foreground face color &optional locale tag-set how-to-add +@deffnx Command set-face-background face color &optional locale tag-set how-to-add These functions set the foreground (respectively, background) color of face @var{face} to @var{color}. The argument @var{color} should be a string (the name of a color) or a color object as returned by @code{make-color} (@pxref{Colors}). -@end defun +@end deffn -@defun set-face-background-pixmap face pixmap &optional locale tag how-to-add +@deffn Command set-face-background-pixmap face pixmap &optional locale tag-set how-to-add This function sets the background pixmap of face @var{face} to @var{pixmap}. The argument @var{pixmap} should be a string (the name of a bitmap or pixmap file; the directories listed in the variable @@ -371,33 +373,34 @@ returned by @code{make-glyph} (@pxref{Glyphs}). The argument may also be a list of the form @code{(@var{width} @var{height} @var{data})} where @var{width} and @var{height} are the size in pixels, and @var{data} is a string, containing the raw bits of the bitmap. -@end defun +@end deffn -@defun set-face-font face font &optional locale tag how-to-add +@deffn Command set-face-font face font &optional locale tag-set how-to-add This function sets the font of face @var{face}. The argument @var{font} should be a string or a font object as returned by @code{make-font} (@pxref{Fonts}). -@end defun +@end deffn -@defun set-face-underline-p face underline-p &optional locale tag how-to-add +@deffn Command set-face-underline-p face underline-p &optional locale tag-set how-to-add This function sets the underline property of face @var{face}. -@end defun +@end deffn -@defun face-foreground face &optional locale -@defunx face-background face &optional locale +@defun face-foreground face &optional locale tag-set exact-p +@defunx face-background face &optional locale tag-set exact-p These functions return the foreground (respectively, background) color specifier of face @var{face}. @xref{Colors}. @end defun -@defun face-background-pixmap face &optional locale +@defun face-background-pixmap face &optional locale tag-set exact-p This function return the background-pixmap glyph object of face @var{face}. @end defun -@defun face-font face &optional locale +@defun face-font face &optional locale tag-set exact-p This function returns the font specifier of face @var{face}. (Note: This is not the same as the function @code{face-font} in FSF Emacs.) + @xref{Fonts}. @end defun @@ -433,11 +436,11 @@ This function returns the font specifier of face @var{face}. @node Other Face Display Functions @subsection Other Face Display Functions -@defun invert-face face &optional locale +@deffn Command invert-face face &optional locale 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. -@end defun +@end deffn @defun face-equal face1 face2 &optional domain This returns @code{t} if the faces @var{face1} and @var{face2} will @@ -584,7 +587,7 @@ that is defined. @cindex italic @cindex oblique -@defun font-instance-properties font +@defun font-instance-properties font-instance This function returns the properties (an alist or @code{nil}) of @var{font-instance}. @end defun @@ -711,7 +714,7 @@ A vector of two or three elements: a face to inherit from, optionally a symbol naming the property of that face to inherit from (if omitted, defaults to the same property that this face-boolean specifier is used for; if this specifier is not part of a face, the instantiator would not -be valid), and optionally a value which, if non-nil, means to invert the +be valid), and optionally a value which, if non-@code{nil}, means to invert the sense of the inherited property. @end itemize @@ -736,7 +739,7 @@ The color-instance object returned describes the way the background color of the @code{default} face is displayed in the next window after the selected one. -@defun color-instance-p object +@defun color-instance-p object This function returns non-@code{nil} if @var{object} is a color-instance. @end defun @@ -744,7 +747,7 @@ This function returns non-@code{nil} if @var{object} is a color-instance. @subsection Color Instance Properties @defun color-instance-name color-instance -This function returns the name used to allocate @var{color-instance}. +This function returns the name used to allocate @var{color-instance}. @end defun @defun color-instance-rgb-components color-instance diff --git a/man/lispref/files.texi b/man/lispref/files.texi index 7608b4a..e3e4171 100644 --- a/man/lispref/files.texi +++ b/man/lispref/files.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/files.info @node Files, Backups and Auto-Saving, Documentation, Top @@ -86,7 +86,7 @@ temporary buffer. Visiting the file is not necessary and takes longer. @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 +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 @@ -121,7 +121,7 @@ file named @var{filename}, it displays the message @samp{New file} in the echo area, and leaves the buffer empty. @c XEmacs feature -If @var{no-warn} is non-@code{nil}, various warnings that XEmacs normally +If @var{nowarn} is non-@code{nil}, various warnings that XEmacs normally gives (e.g. if another buffer is already visiting @var{filename} but @var{filename} has been removed from disk since that buffer was created) are suppressed. @@ -161,7 +161,7 @@ When this command is called interactively, it prompts for @var{filename}. @end deffn -@deffn Command view-file filename +@deffn Command view-file filename &optional other-window-p 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 @@ -170,6 +170,9 @@ let you modify it. Entering View mode runs the normal hook When @code{view-file} is called interactively, it prompts for @var{filename}. + +With non-@code{nil} prefix arg @var{other-window-p}, visit @var{filename} +in another window. @end deffn @defvar find-file-hooks @@ -403,7 +406,7 @@ major modes set it to @code{t} in particular buffers. 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 +@defun insert-file-contents filename &optional visit start 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 @@ -421,7 +424,7 @@ 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 +If @var{start} 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, @@ -548,10 +551,10 @@ 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: +@defun ask-user-about-lock filename other-user +This function is called when the user tries to modify @var{filename}, +but it is locked by another user named @var{other-user}. The value it +returns determines what happens next: @itemize @bullet @item @@ -570,11 +573,11 @@ 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} +@error{} File is locked: @var{filename} @var{other-user} @end example @noindent -where @code{file} is the name of the file and @var{other-user} is the +where @var{filename} is the name of the file and @var{other-user} is the name of the user who has locked the file. @end itemize @@ -749,7 +752,7 @@ 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}. +@code{file-symlink-p} returns @code{nil}. @example @group @@ -968,16 +971,16 @@ 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) + @result{} (nil + 1 + 2235 + 75 + (8489 20284) + (8489 20284) (8489 20285) - 14906 - "-rw-rw-rw-" - nil + 14906 + "-rw-rw-rw-" + nil 129500 -32252) @end group @@ -1037,9 +1040,10 @@ is on file system number -32252. 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}: + In the functions that have arguments @var{newname} and +@var{ok-if-already-exists}, if a file by the name of @var{newname} +already exists, the actions taken depend on the value of +@var{ok-if-already-exists}: @itemize @bullet @item @@ -1047,19 +1051,20 @@ 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. +Request confirmation if @var{ok-if-already-exists} is a number. This is +what happens when the function is invoked interactively. @item Replace the old file without confirmation if @var{ok-if-already-exists} is any other value. @end itemize -@deffn Command add-name-to-file oldname newname &optional ok-if-already-exists +@deffn Command add-name-to-file filename 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 +This function gives the file named @var{filename} the additional name @var{newname}. This means that @var{newname} becomes a new ``hard -link'' to @var{oldname}. +link'' to @var{filename}. Both these arguments must be strings. In the first part of the following example, we list two files, @file{foo} and @file{foo3}. @@ -1116,8 +1121,8 @@ contents of @file{foo3} are lost. @end group @end example - This function is meaningless on VMS, where multiple names for one file -are not allowed. +This function is meaningless on non-Unix systems, where multiple names +for one file are not allowed. See also @code{file-nlinks} in @ref{File Attributes}. @end deffn @@ -1135,9 +1140,9 @@ In an interactive call, this function prompts for @var{filename} and @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. +@deffn Command copy-file filename newname &optional ok-if-already-exists time +This command copies the file @var{filename} to @var{newname}. An +error is signaled if @var{filename} 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 @@ -1161,7 +1166,7 @@ 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 +@deffn Command make-symbolic-link filename newname &optional ok-if-already-exists @pindex ln @kindex file-already-exists This command makes a symbolic link to @var{filename}, named @@ -1173,11 +1178,6 @@ In an interactive call, this function prompts for @var{filename} and @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. @@ -1226,11 +1226,10 @@ how to manipulate file names. 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. +On MS-DOS, these functions understand MS-DOS file-name syntax as well as +Unix syntax. This is so that all the standard Lisp libraries can specify +file names in Unix syntax and work properly on all systems without +change. Similarly for other operating systems. @menu * File Name Components:: The directory part of a file name, and the rest. @@ -1257,22 +1256,16 @@ parts: the @dfn{directory name} part, and the @dfn{nondirectory} part 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. +slash; the nondirectory part is the rest. 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 -XEmacs omits the version number. Version numbers are found mostly in -directory lists. +files have version numbers in their names. @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{>}. +Unix, the function returns a string ending in a slash. @example @group @@ -1283,10 +1276,6 @@ returns a string ending in one of the three characters @samp{:}, (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 @@ -1302,11 +1291,6 @@ returns a string ending in one of the three characters @samp{:}, (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 @@ -1331,11 +1315,6 @@ version numbers, only true file version numbers. (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 @@ -1363,7 +1342,7 @@ 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. +lacks that slash. The difference between a directory name and its name as a file is subtle but crucial. When an XEmacs variable or function argument is @@ -1377,9 +1356,7 @@ 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]}. +Unix, this means appending a slash to the string. @example @group @@ -1392,9 +1369,7 @@ converts a string of the form @file{[X]Y.DIR.1} to the form @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}. +Unix, this means removing a final slash from the string. @example @group @@ -1415,7 +1390,7 @@ abbreviation instead. If you wish to convert a directory name to its abbreviation, use this function: -@defun abbreviate-file-name dirname &optional hack-homedir +@defun abbreviate-file-name filename &optional hack-homedir This function applies abbreviations from @code{directory-abbrev-alist} to its argument, and substitutes @samp{~} for the user's home directory. @@ -1468,13 +1443,11 @@ 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. +tilde (@samp{~}), and a relative one does not. @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. +file name, @code{nil} otherwise. @example @group @@ -1622,9 +1595,6 @@ example: @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 @@ -1666,7 +1636,7 @@ there is no danger of generating a name being used by another process. @end example In addition, this function makes an attempt to choose a name that does -not specify an existing file. To make this work, @var{prefix} should be +not specify an existing file. To make this work, @var{prefix} should be an absolute file name. To avoid confusion, each Lisp application should preferably use a unique @@ -1682,7 +1652,7 @@ To avoid confusion, each Lisp application should preferably use a unique 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 +This function returns a list of all possible completions for files 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 @@ -1692,6 +1662,11 @@ 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. +File names which end with any member of @code{completion-ignored-extensions} +are not considered as possible completions for @var{partial-filename} unless +there is no other possible completion. @code{completion-ignored-extensions} +is not applied to the names of directories. + 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 @@ -1700,25 +1675,30 @@ In the following example, suppose that the current default directory, @example @group (file-name-all-completions "f" "") - @result{} ("foo" "file~" "file.c.~2~" + @result{} ("foo" "file~" "file.c.~2~" "file.c.~1~" "file.c") @end group @group -(file-name-all-completions "fo" "") +(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 +@defun file-name-completion partial-filename directory +This function completes the file name @var{partial-filename} in directory @var{directory}. It returns the longest prefix common to all file names -in directory @var{directory} that start with @var{filename}. +in directory @var{directory} that start with @var{partial-filename}. -If only one match exists and @var{filename} matches it exactly, the +If only one match exists and @var{partial-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}. +@var{directory} contains no name starting with @var{partial-filename}. + +File names which end with any member of @code{completion-ignored-extensions} +are not considered as possible completions for @var{partial-filename} unless +there is no other possible completion. @code{completion-ignored-extensions} +is not applied to the names of directories. In the following example, suppose that the current default directory has five files whose names begin with @samp{f}: @file{foo}, @@ -1773,26 +1753,27 @@ completion-ignored-extensions name. For other completion functions, see @ref{Completion}. @defun user-name-all-completions partial-username -This function returns a list of all possible completions for a user -whose name starts with @var{partial-username}. The order of the -completions is unpredictable and conveys no useful information. +This function returns a list of all possible completions for a user name +starting with @var{partial-username}. The order of the completions is +unpredictable and conveys no useful information. -The argument @var{partial-username} must be a partial user name +The argument @var{partial-username} must be a partial user name containing no tilde character and no slash. @end defun -@defun user-name-completion username -This function completes the user name @var{username}. It returns the -longest prefix common to all user names that start with @var{username}. +@defun user-name-completion partial-username +This function completes a user name from @var{partial-username}. It +returns the longest prefix common to all user names that start with +@var{partial-username}. -If only one match exists and @var{username} matches it exactly, the -function returns @code{t}. The function returns @code{nil} if no user -name starting with @var{username} exists. +If only one match exists and @var{partial-username} matches it exactly, +the function returns @code{t}. The function returns @code{nil} if no +user name starting with @var{partial-username} exists. @end defun -@defun user-name-completion-1 username -This function completes the user name @var{username}, like -@code{user-name-completion}, differing only in the return value. +@defun user-name-completion-1 partial-username +This function completes the partial user name @var{partial-username}, +like @code{user-name-completion}, differing only in the return value. This function returns the cons of the completion returned by @code{user-name-completion}, and a boolean indicating whether that completion was unique. @@ -1843,7 +1824,7 @@ returned. @group (directory-files "~lewis") @result{} ("#foo#" "#foo.el#" "." ".." - "dired-mods.el" "files.texi" + "dired-mods.el" "files.texi" "files.texi.~1~") @end group @end example @@ -2002,7 +1983,7 @@ for an operation it does not recognize. Here's one way to do this: @dots{} ;; @r{Handle any operation we don't know about.} (t (let ((inhibit-file-name-handlers - (cons 'my-file-handler + (cons 'my-file-handler (and (eq inhibit-file-name-operation operation) inhibit-file-name-handlers))) (inhibit-file-name-operation operation)) @@ -2028,8 +2009,8 @@ for a certain 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 +@defun find-file-name-handler filename &optional operation +This function returns the handler function for file name @var{filename}, 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 @@ -2095,7 +2076,7 @@ work correctly. @node Creating a Partial File @subsection Creating a Partial File -@defun make-file-part &optional start end name buffer +@deffn Command make-file-part &optional start end name buffer Make a file part on buffer @var{buffer} out of the region. Call it @var{name}. This command creates a new buffer containing the contents of the region and marks the buffer as referring to the specified buffer, @@ -2106,9 +2087,9 @@ buffer is deleted, all file parts are deleted with it. When called from a function, expects four arguments, @var{start}, @var{end}, @var{name}, and @var{buffer}, all of which are optional and default to the beginning of @var{buffer}, the end of @var{buffer}, a -name generated from @var{buffer} name, and the current buffer, +name generated from @var{buffer}'s name, and the current buffer, respectively. -@end defun +@end deffn @node Detached Partial Files @subsection Detached Partial Files @@ -2237,14 +2218,14 @@ 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 +@deffn Command 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 +@end deffn -@defun format-find-file file format +@deffn Command 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. @@ -2252,11 +2233,11 @@ 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 +@end deffn -@defun format-insert-file file format &optional beg end +@deffn Command format-insert-file file format &optional start end This command inserts the contents of file @var{file}, converting it -according to format @var{format}. If @var{beg} and @var{end} are +according to format @var{format}. If @var{start} 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}). @@ -2267,32 +2248,7 @@ list of the absolute file name and the length of the data inserted 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 +@end deffn @defvar auto-save-file-format This variable specifies the format to use for auto-saving. Its value is diff --git a/man/lispref/frames.texi b/man/lispref/frames.texi index 1ae6f9b..892ca6c 100644 --- a/man/lispref/frames.texi +++ b/man/lispref/frames.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c Copyright (C) 1995, 1996 Ben Wing. @c See the file lispref.texi for copying conditions. @setfilename ../../info/frames.info @@ -63,7 +63,7 @@ This predicate returns @code{t} if @var{object} is a frame, and To create a new frame, call the function @code{make-frame}. -@defun make-frame &optional props device +@deffn Command make-frame &optional props device This function creates a new frame on @var{device}, if @var{device} permits creation of frames. (An X server does; an ordinary terminal does not (yet).) @var{device} defaults to the selected device if omitted. @@ -83,7 +83,7 @@ The set of possible properties depends in principle on what kind of window system XEmacs uses to display its frames. @xref{X Frame Properties}, for documentation of individual properties you can specify when creating an X window frame. -@end defun +@end deffn @node Frame Properties @section Frame Properties @@ -116,7 +116,7 @@ and their values. @defun frame-property frame property &optional default This function returns @var{frame}'s value for the property -@var{property}. +@var{property}, or @var{default} if there is no such property. @end defun @defun set-frame-properties frame plist @@ -125,9 +125,9 @@ elements of property list @var{plist}. If you don't mention a property in @var{plist}, its value doesn't change. @end defun -@defun set-frame-property frame prop val -This function sets the property @var{prop} of frame @var{frame} to the -value @var{val}. +@defun set-frame-property frame property value +This function sets the property @var{property} of frame @var{frame} to the +value @var{value}. @end defun @node Initial Properties @@ -362,7 +362,7 @@ pixels. If you don't supply @var{frame}, they use the selected frame. @defun set-frame-size frame cols rows &optional pretend This function sets the size of @var{frame}, measured in characters; @var{cols} and @var{rows} specify the new width and height. (If -@var{pretend} is non-nil, it means that redisplay should act as if +@var{pretend} is non-@code{nil}, it means that redisplay should act as if the frame's size is @var{cols} by @var{rows}, but the actual size of the frame should not be changed. You should not normally use this option.) @@ -498,9 +498,16 @@ 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. -@deffn Command delete-frame &optional frame +@deffn Command delete-frame &optional frame force This function deletes the frame @var{frame}. By default, @var{frame} is the selected frame. + +A frame may not be deleted if its minibuffer is used by other frames. +Normally, you cannot delete the last non-minibuffer-only frame (you must +use @code{save-buffers-kill-emacs} or @code{kill-emacs}). However, if +optional second argument @var{force} is non-@code{nil}, you can delete +the last frame. (This will automatically call +@code{save-buffers-kill-emacs}.) @end deffn @defun frame-live-p frame @@ -538,34 +545,84 @@ If @var{device} is specified only frames on that device will be returned. ``visible'', even though only the selected one is actually displayed.) @end defun -@defun next-frame &optional frame minibuf +@defun next-frame &optional frame which-frames which-devices 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. +frame after @var{frame} in the cycle. If @var{frame} defaults to the +selected frame. -The second argument, @var{minibuf}, says which frames to consider: +The second argument, @var{which-frames}, 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 the symbol @code{visible} -Include all visible frames. -@item @code{0} -Include all visible and iconified frames. -@item anything else +Consider only frames that are visible. + +@item @code{iconic} +Consider only frames that are iconic. + +@item @code{invisible} +Consider only frames that are invisible (this is different from iconic). + +@item @code{visible-iconic} +Consider frames that are visible or iconic. + +@item @code{invisible-iconic} +Consider frames that are invisible or iconic. + +@item @code{nomini} +Consider all frames except minibuffer-only ones. + +@item @code{visible-nomini} +Like @code{visible} but omits minibuffer-only frames. + +@item @code{iconic-nomini} +Like @code{iconic} but omits minibuffer-only frames. + +@item @code{invisible-nomini} +Like @code{invisible} but omits minibuffer-only frames. + +@item @code{visible-iconic-nomini} +Like @code{visible-iconic} but omits minibuffer-only frames. + +@item @code{invisible-iconic-nomini} +Like @code{invisible-iconic} but omits minibuffer-only frames. + +@item @code{nil} +Identical to @code{nomini}. + +@item @var{window} +Consider only the window @var{window}'s frame and any frame now using +@var{window} as the minibuffer. + +@item any other value Consider all frames. @end table + +The optional argument @var{which-devices} further clarifies on which +devices to search for frames as specified by @var{which-frames}. + +@table @asis +@item @code{nil} +Consider all devices on the selected console. + +@item @var{device} +Consider only the one device @var{device}. + +@item @var{console} +Consider all devices on @var{console}. + +@item @var{device-type} +Consider all devices with device type @var{device-type}. + +@item @code{window-system} +Consider all devices on window system consoles. + +@item anything else +Consider all devices without restriction. +@end table @end defun -@defun previous-frame &optional frame minibuf +@defun previous-frame &optional frame which-frames which-devices Like @code{next-frame}, but cycles through all frames in the opposite direction. @end defun @@ -595,10 +652,39 @@ 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}. +@defun frame-highest-window &optional frame position +This function returns the topmost, leftmost window of frame @var{frame} +at position @var{position}. + +If omitted, @var{frame} defaults to the currently selected frame. + +@var{position} is used to distinguish between multiple windows that abut +the top of the frame: 0 means the leftmost window abutting the top of +the frame, 1 the next-leftmost, etc. @var{position} can also be less +than zero: -1 means the rightmost window abutting the top of the frame, +-2 the next-rightmost, etc. If omitted, @var{position} defaults to 0, +i.e. the leftmost highest window. If there is no window at the given +@var{position}, @code{nil} is returned. +@end defun + +The following three functions work similarly. + +@defun frame-lowest-window &optional frame position +This function returns the lowest window on @var{frame} which is at +@var{position}. +@end defun + +@defun frame-leftmost-window &optional frame position +This function returns the leftmost window on @var{frame} which is at +@var{position}. +@end defun + +@defun frame-rightmost-window &optional frame position +This function returns the rightmost window on @var{frame} which is at +@var{position}. @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 @@ -699,18 +785,18 @@ The operation of @code{focus-frame} is not affected by the value of @code{focus-follows-mouse}. @end defun -@defmac save-selected-frame forms@dots{} -This macro records the selected frame, executes @var{forms} in sequence, -then restores the earlier selected frame. The value returned is the -value of the last form. -@end defmac +@defspec save-selected-frame forms@dots{} +This special form records the selected frame, executes @var{forms} in +sequence, then restores the earlier selected frame. The value returned +is the value of the last form. +@end defspec -@defmac with-selected-frame frame forms@dots{} -This macro records the selected frame, then selects @var{frame} and -executes @var{forms} in sequence. After the last form is finished, the -earlier selected frame is restored. The value returned is the value of -the last form. -@end defmac +@defspec with-selected-frame frame forms@dots{} +This special form records the selected frame, then selects @var{frame} +and executes @var{forms} in sequence. After the last form is finished, +the earlier selected frame is restored. The value returned is the value +of the last form. +@end defspec @ignore (FSF Emacs, continued from defun select-frame) XEmacs cooperates with the X server and the window managers by arranging @@ -765,7 +851,7 @@ change it. @cindex iconified frame @cindex frame visibility -An X window frame may be @dfn{visible}, @dfn{invisible}, or +An frame on a window system 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 @@ -774,31 +860,31 @@ even as an icon. Visibility is meaningless for TTY frames, since only the selected one is actually displayed in any case. -@deffn Command make-frame-visible &optional frame +@defun 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 +@end defun -@deffn Command make-frame-invisible &optional frame +@defun make-frame-invisible &optional frame force This function makes frame @var{frame} invisible. -@end deffn +@end defun @deffn Command iconify-frame &optional frame This function iconifies frame @var{frame}. @end deffn -@deffn Command deiconify-frame &optional frame -This function de-iconifies frame @var{frame}. Under X, this is -equivalent to @code{make-frame-visible}. -@end deffn +@defun Command deiconify-frame &optional frame +This function de-iconifies frame @var{frame}. Under a window system, +this is equivalent to @code{make-frame-visible}. +@end defun -@defun frame-visible-p frame +@defun frame-visible-p &optional frame This returns whether @var{frame} is currently ``visible'' (actually in use for display). A frame that is not visible is not updated, and, if it works through a window system, may not show at all. @end defun -@defun frame-iconified-p frame +@defun frame-iconified-p &optional frame This returns whether @var{frame} is iconified. Not all window managers use icons; some merely unmap the window, so this function is not the inverse of @code{frame-visible-p}. It is possible for a frame to not @@ -807,7 +893,7 @@ iconified, it will not be visible. (Under FSF Emacs, the functionality of this function is obtained through @code{frame-visible-p}.) @end defun -@defun frame-totally-visible-p frame +@defun frame-totally-visible-p &optional frame This returns whether @var{frame} is not obscured by any other X windows. On TTY frames, this is the same as @code{frame-visible-p}. @end defun @@ -904,9 +990,18 @@ 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 +@defun set-frame-configuration configuration &optional nodelete +This function restores the state of frames described by +@var{configuration}, which should be the return value from a previous +call to @code{current-frame-configuration}. + +Each frame listed in @var{configuration} has its position, size, window +configuration, and other properties set as specified in @var{configuration}. + +Ordinarily, this function deletes all existing frames not listed in +@var{configuration}. But if optional second argument @var{nodelete} is +non-@code{nil}, the unwanted frames are iconified instead. @end defun @node Frame Hooks diff --git a/man/lispref/functions.texi b/man/lispref/functions.texi index c2e6bb4..638cf96 100644 --- a/man/lispref/functions.texi +++ b/man/lispref/functions.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/functions.info @node Functions, Macros, Variables, Top @@ -17,7 +17,7 @@ define them. * 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. +* 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. @@ -671,9 +671,9 @@ function: This function returns @var{arg} and has no side effects. @end defun -@defun ignore &rest args +@deffn Command ignore &rest args This function ignores any arguments and returns @code{nil}. -@end defun +@end deffn @node Mapping Functions @section Mapping Functions @@ -718,10 +718,10 @@ The length of the result is the same as the length of @var{sequence}. "Apply FUNCTION to successive cars of all ARGS. Return the list of results." ;; @r{If no list is exhausted,} - (if (not (memq 'nil args)) + (if (not (memq 'nil args)) ;; @r{apply function to @sc{car}s.} - (cons (apply f (mapcar 'car args)) - (apply 'mapcar* f + (cons (apply f (mapcar 'car args)) + (apply 'mapcar* f ;; @r{Recurse for rest of elements.} (mapcar 'cdr args))))) @end group @@ -743,7 +743,7 @@ other suitable punctuation. The argument @var{function} must be a function that can take one argument and return a string. The argument @var{sequence} can be any kind of sequence; that is, a list, a vector, a bit vector, or a string. - + @smallexample @group (mapconcat 'symbol-name @@ -931,7 +931,7 @@ and can be stored into a function cell just as any other object can be 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 +This function returns @code{t} if @var{symbol} has an object in its function cell, @code{nil} otherwise. It does not check that the object is a legitimate function. @end defun @@ -976,9 +976,9 @@ 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. +to give a symbol @var{symbol1} a function definition which is another symbol +@var{symbol2}; then @var{symbol1} serves as an alias for whatever definition +@var{symbol2} presently has. @item In constructs for defining or altering functions. If @code{defun} diff --git a/man/lispref/glyphs.texi b/man/lispref/glyphs.texi index bf0c043..bc8663d 100644 --- a/man/lispref/glyphs.texi +++ b/man/lispref/glyphs.texi @@ -82,7 +82,7 @@ a toolbar, or as a mouse pointer or an icon, for example. Creating a glyph using @code{make-glyph} does not specify @emph{where} the glyph will be used, but it does specify @emph{what} the glyph will -look like. In particular, SPEC-LIST is used to specify this, and it's +look like. In particular, @var{spec-list} is used to specify this, and it's used to initialize the glyph's @code{image} property, which is an image specifier. (Note that @dfn{image} as used in the context of a glyph's @code{image} property or in the terms @dfn{image specifier}, @dfn{image @@ -90,7 +90,7 @@ instantiator}, or @dfn{image instance} does not refer to what people normally think of as an image (which in XEmacs is called a @dfn{pixmap}), but to any graphical element---a pixmap, a widget, or even a block of text, when used in the places that call for a glyph.) -The format of the SPEC-LIST is typically an image instantiator (a string +The format of the @var{spec-list} is typically an image instantiator (a string or a vector; @ref{Image Specifiers}), but can also be a list of such instantiators (each one in turn is tried until an image is successfully produced), a cons of a locale (frame, buffer, etc.) and an @@ -235,7 +235,7 @@ filled in with the corresponding colors from the face. @end itemize It is extremely rare that you will ever have to specify a value for -TYPE, which should be one of @code{buffer} (used for glyphs in an +@var{type}, which should be one of @code{buffer} (used for glyphs in an extent, the modeline, the toolbar, or elsewhere in a buffer), @code{pointer} (used for the mouse-pointer), or @code{icon} (used for a frame's icon), and defaults to @code{buffer}. The only cases where it @@ -880,10 +880,15 @@ the file must exist when the instantiator is added to the image, but does not need to exist at any other time (e.g. it may safely be a temporary file). -@defun valid-image-instantiator-format-p format +@defun valid-image-instantiator-format-p format &optional locale This function returns non-@code{nil} if @var{format} is a valid image -instantiator format. Note that the return value for many formats listed -above depends on whether XEmacs was compiled with support for that format. +instantiator format. + +If @var{locale} is non-@code{nil} then the format is checked in that locale. +If @var{locale} is @code{nil} the current console is used. + +Note that the return value for many formats listed above depends on +whether XEmacs was compiled with support for that format. @end defun @defun image-instantiator-format-list @@ -906,7 +911,7 @@ The default value of this variable defines the logical color names @end defvar @defvar x-bitmap-file-path -A list of the directories in which X bitmap files may be found. If nil, +A list of the directories in which X bitmap files may be found. If @code{nil}, this is initialized from the @samp{"*bitmapFilePath"} resource. This is used by the @code{make-image-instance} function (however, note that if the environment variable @samp{XBMLANGPATH} is set, it is consulted @@ -1047,13 +1052,13 @@ instance of type @code{nothing}. @end defun @defun widget-image-instance-p object -Return t if @var{object} is an image instance of type @code{widget}. +Return @code{t} if @var{object} is an image instance of type @code{widget}. @end defun @node Image Instance Functions @subsubsection Image Instance Functions -@defun make-image-instance data &optional domain dest-types no-error +@defun make-image-instance data &optional domain dest-types noerror This function creates a new image-instance object. @var{data} is an image instantiator, which describes the image @@ -1110,10 +1115,10 @@ fix this.) n If omitted, @var{domain} defaults to the selected window. -@var{no-error} controls what happens when the image cannot be generated. -If @var{nil}, an error message is generated. If @var{t}, no messages -are generated and this function returns @var{nil}. If anything else, a -warning message is generated and this function returns @var{nil}. +@var{noerror} controls what happens when the image cannot be generated. +If @code{nil}, an error message is generated. If @code{t}, no messages +are generated and this function returns @code{nil}. If anything else, a +warning message is generated and this function returns @code{nil}. @end defun @defun colorize-image-instance image-instance foreground background diff --git a/man/lispref/gutter.texi b/man/lispref/gutter.texi index db5882d..f3f9b9c 100644 --- a/man/lispref/gutter.texi +++ b/man/lispref/gutter.texi @@ -115,10 +115,10 @@ gutter. The values of the variables @code{default-gutter-visible-p}, @code{right-gutter-visible-p}, and @code{bottom-gutter-visible-p} are always gutter-visible specifiers. -Valid gutter-visible instantiators are t, nil or a list of symbols. If -a gutter-visible instantiator is set to a list of symbols, and the -corresponding gutter specification is a property-list strings, then -elements of the gutter specification will only be visible if the +Valid gutter-visible instantiators are @code{t}, @code{nil} or a list of +symbols. If a gutter-visible instantiator is set to a list of symbols, +and the corresponding gutter specification is a property-list strings, +then elements of the gutter specification will only be visible if the corresponding symbol occurs in the gutter-visible instantiator. @end defun @@ -252,7 +252,7 @@ the user to choose where the gutter should go. @defvr Specifier default-gutter The position of this gutter is specified in the function -@code{default-gutter-position}. If the corresponding +@code{default-gutter-position}. If the corresponding position-specific gutter (e.g. @code{top-gutter} if @code{default-gutter-position} is @code{top}) does not specify a gutter in a particular domain, then the value of @code{default-gutter} @@ -312,7 +312,7 @@ Specifier for the gutter at the right edge of the frame. @end defvr @defun gutter-specifier-p object -This function returns non-nil if @var{object} is a gutter specifier. +This function returns non-@code{nil} if @var{object} is a gutter specifier. Gutter specifiers are the actual objects contained in the gutter variables described above, and their valid instantiators are gutter descriptors (@pxref{Gutter Descriptor Format}). @@ -408,7 +408,7 @@ visibility that is used in frame geometry calculations. left gutter width for that frame to 68 pixels, then the frame will be sized to fit 80 characters plus a 68-pixel left gutter. If you then set the left gutter width to 0 for a particular buffer (or if that -buffer does not specify a left gutter or has a nil value specified for +buffer does not specify a left gutter or has a @code{nil} value specified for @code{left-gutter-visible-p}), you will find that, when that buffer is displayed in the selected window, the window will have a width of 86 or 87 characters -- the frame is sized for a 68-pixel left gutter but the diff --git a/man/lispref/help.texi b/man/lispref/help.texi index 7117fb1..9ab8294 100644 --- a/man/lispref/help.texi +++ b/man/lispref/help.texi @@ -226,7 +226,7 @@ Set the current horizontal position as a goal for C-n and C-p. @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 +With a non-@code{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 @@ -359,14 +359,14 @@ C-g abort-recursive-edit @group (substitute-command-keys "Substrings of the form \\=\\@{MAPVAR@} are replaced by summaries -\(made by describe-bindings) of the value of MAPVAR, taken as a keymap. +\(made by `describe-bindings') of the value of MAPVAR, taken as a keymap. Substrings of the form \\=\\ specify to use the value of MAPVAR as the keymap for future \\=\\[COMMAND] substrings. \\=\\= quotes the following character and is discarded; thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ into the output.") @result{} "Substrings of the form \@{MAPVAR@} are replaced by summaries -(made by describe-bindings) of the value of MAPVAR, taken as a keymap. +(made by `describe-bindings') of the value of MAPVAR, taken as a keymap. Substrings of the form \ specify to use the value of MAPVAR as the keymap for future \[COMMAND] substrings. \= quotes the following character and is discarded; @@ -606,12 +606,12 @@ 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 +@deffn Command 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 +@end deffn The following two functions are found in the library @file{helper}. They are for modes that want to provide help without relinquishing @@ -676,7 +676,7 @@ users of that function should be told to use the newer one instead. XEmacs Lisp lets you mark a function or variable as @dfn{obsolete}, and indicate what should be used instead. -@defun make-obsolete function new +@deffn Command make-obsolete function new This function indicates that @var{function} is an obsolete function, and the function @var{new} should be used instead. The byte compiler will issue a warning to this effect when it encounters a usage of the @@ -685,11 +685,11 @@ documentation. @var{new} can also be a string (if there is not a single function with the same functionality any more), and should be a descriptive statement, such as "use @var{foo} or @var{bar} instead" or "this function is unnecessary". -@end defun +@end deffn -@defun make-obsolete-variable variable new +@deffn Command make-obsolete-variable variable new This is like @code{make-obsolete} but is for variables instead of functions. -@end defun +@end deffn @defun define-obsolete-function-alias oldfun newfun This function combines @code{make-obsolete} and @code{define-function}, diff --git a/man/lispref/hooks.texi b/man/lispref/hooks.texi index e8a3381..9773d56 100644 --- a/man/lispref/hooks.texi +++ b/man/lispref/hooks.texi @@ -1,13 +1,13 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/hooks.info @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. +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 @@ -98,8 +98,8 @@ special way (they are passed arguments, or else their values are used). @item ediff-long-help-message-function @item ediff-make-wide-display-function @item ediff-merge-split-window-function -@item ediff-meta-action-function -@item ediff-meta-redraw-function +@item ediff-meta-action-function +@item ediff-meta-redraw-function @item ediff-mode-hook @item ediff-prepare-buffer-hook @item ediff-quit-hook diff --git a/man/lispref/index.texi b/man/lispref/index.texi index 31ed313..937b347 100644 --- a/man/lispref/index.texi +++ b/man/lispref/index.texi @@ -24,7 +24,7 @@ @ignore All variables, functions, keys, programs, files, and concepts are -in this one index. +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, diff --git a/man/lispref/internationalization.texi b/man/lispref/internationalization.texi index b39bee5..4882f74 100644 --- a/man/lispref/internationalization.texi +++ b/man/lispref/internationalization.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/internationalization.info @node Internationalization, MULE, PostgreSQL Support, top @@ -160,12 +160,8 @@ Example: @end example @end defspec -Autoloaded functions which are specified in @file{loaddefs.el} do not need -to have a domain specification, because their documentation strings are -extracted into the main message base. However, for autoloaded functions -which are specified in a separate package, use following syntax: - -@defun autoload symbol filename &optional docstring interactive macro domain +@defun autoload function filename &optional docstring interactive type +This function defines @var{function} to autoload from @var{filename} Example: @example (autoload 'explore "jungle" "Explore the jungle." nil nil "emacs-gorilla") diff --git a/man/lispref/intro.texi b/man/lispref/intro.texi index 93f6309..162051f 100644 --- a/man/lispref/intro.texi +++ b/man/lispref/intro.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/intro.info @@ -368,7 +368,7 @@ when it starts in an interactive mode: 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' +to redistribute it under certain conditions; type `show c' for details. @end smallexample @@ -386,7 +386,7 @@ necessary. Here is a sample; alter the names: @group Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' -(which makes passes at compilers) written +(which makes passes at compilers) written by James Hacker. @var{signature of Ty Coon}, 1 April 1989 @@ -441,7 +441,7 @@ 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. +intentionally. 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 @@ -712,7 +712,7 @@ The description follows on succeeding lines, sometimes with examples. function, @code{foo}. * A Sample Variable Description:: A description of an imaginary variable, - @code{electric-future-map}. + @code{electric-future-map}. @end menu @node A Sample Function Description diff --git a/man/lispref/keymaps.texi b/man/lispref/keymaps.texi index f727df8..a509fdf 100644 --- a/man/lispref/keymaps.texi +++ b/man/lispref/keymaps.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c Copyright (C) 1996 Ben Wing. @c See the file lispref.texi for copying conditions. @setfilename ../../info/keymaps.info @@ -131,7 +131,7 @@ This function constructs and returns a new keymap object. All entries in it are @code{nil}, meaning ``command undefined''. The only difference between this function and @code{make-keymap} is that this function returns a ``smaller'' keymap (one that is expected to contain -fewer entries). As keymaps dynamically resize, the distinction is not +fewer entries). As keymaps dynamically resize, this distinction is not great. Optional argument @var{name} specifies a name to assign to the keymap, @@ -282,7 +282,7 @@ That is, the @kbd{A} keystroke is represented by all of these forms: A ?A 65 (A) (?A) (65) [A] [?A] [65] [(A)] [(?A)] [(65)] @end example - + the @kbd{control-a} keystroke is represented by these forms: @example @@ -602,11 +602,13 @@ other. @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) has a number -of entries, including one prefix key, @kbd{C-x}. +@defun current-local-map &optional buffer +This function returns @var{buffer}'s local keymap, or @code{nil} +if it has none. @var{buffer} defaults to the current buffer. + +In the following example, the keymap for the @samp{*scratch*} buffer +(using Lisp Interaction mode) has a number of entries, including one +prefix key, @kbd{C-x}. @example @group @@ -931,8 +933,8 @@ bindings, as in @code{lookup-key} (above). @end example @end defun -@defun local-key-binding key &optional accept-defaults -This function returns the binding for @var{key} in the current +@defun local-key-binding keys &optional accept-defaults +This function returns the binding for @var{keys} in the current local keymap, or @code{nil} if it is undefined there. @c Emacs 19 feature @@ -940,8 +942,8 @@ 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 +@defun global-key-binding keys &optional accept-defaults +This function returns the binding for command @var{keys} in the current global keymap, or @code{nil} if it is undefined there. @c Emacs 19 feature @@ -1002,7 +1004,7 @@ meta-prefix-char ; @r{The default value.} @end group @group (setq meta-prefix-char 24) - @result{} 24 + @result{} 24 @end group @group (key-binding "\C-xb") @@ -1149,26 +1151,28 @@ 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 +@defun substitute-key-definition olddef newdef keymap &optional oldmap prefix @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}. +@var{olddef} is replaced with @var{newdef} wherever it appears. Prefix +keymaps are checked recursively. + +The function returns @code{nil}. For example, this redefines @kbd{C-x C-f}, if you do it in an XEmacs with standard bindings: @smallexample @group -(substitute-key-definition +(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 +keys to rebind. The rebindings still happen in @var{keymap}, not in @var{oldmap}. Thus, you can change one map under the control of the bindings in another. For example, @@ -1182,6 +1186,11 @@ bindings in another. For example, puts the special deletion command in @code{my-map} for whichever keys are globally bound to the standard deletion command. +If argument @var{prefix} is non-@code{nil}, then only those occurrences +of @var{olddef} found in keymaps accessible through the keymap bound to +@var{prefix} in @var{keymap} are redefined. See also +@code{accessible-keymaps}. + @ignore @c Emacs 18 only Prefix keymaps that appear within @var{keymap} are not checked @@ -1194,9 +1203,9 @@ Here is an example showing a keymap before and after substitution: @smallexample @group -(setq map '(keymap - (?1 . olddef-1) - (?2 . olddef-2) +(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 @@ -1225,8 +1234,8 @@ 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 +@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 @@ -1404,7 +1413,7 @@ sequences beginning with @kbd{C-x}.) @smallexample @group -(current-local-map) +(current-local-map) @result{} # (accessible-keymaps (current-local-map)) @result{}(([] . #) @@ -1452,7 +1461,7 @@ indicating their relationship to their enclosing keymap. @end defun @defun map-keymap function keymap &optional sort-first -This function applies @var{function} to each element of @code{KEYMAP}. +This function applies @var{function} to each element of @var{keymap}. @var{function} will be called with two arguments: a key-description list, and the binding. The order in which the elements of the keymap are passed to the function is unspecified. If the function inserts new @@ -1482,14 +1491,14 @@ bound to @var{definition} in a set of keymaps. The argument @var{definition} can be any object; it is compared with all keymap entries using @code{eq}. -KEYMAPS can be either a keymap (meaning search in that keymap and the +@var{keymaps} can be either a keymap (meaning search in that keymap and the current global keymap) or a list of keymaps (meaning search in exactly -those keymaps and no others). If KEYMAPS is nil, search in the currently -applicable maps for EVENT-OR-KEYS. +those keymaps and no others). If @var{keymaps} is nil, search in the currently +applicable maps for @var{event-or-keys}. -If @var{keymap} is a keymap, then the maps searched are @var{keymap} and -the global keymap. If @var{keymap} is a list of keymaps, then the maps -searched are exactly those keymaps, and no others. If @var{keymap} is +If @var{keymaps} is a keymap, then the maps searched are @var{keymaps} and +the global keymap. If @var{keymaps} is a list of keymaps, then the maps +searched are exactly those keymaps, and no others. If @var{keymaps} is @code{nil}, then the maps used are the current active keymaps for @var{event-or-keys} (this is equivalent to specifying @code{(current-keymaps @var{event-or-keys})} as the argument to @@ -1538,13 +1547,14 @@ for mouse clicks. @code{describe-bindings-internal} is used to implement the help command @code{describe-bindings}. -@deffn Command describe-bindings prefix mouse-only-p +@deffn Command describe-bindings &optional prefix mouse-only-p 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}. +If optional argument @var{prefix} is non-@code{nil}, it should be a +prefix key; then the listing includes only keys that start with +@var{prefix}. When several characters with consecutive @sc{ascii} codes have the same definition, they are shown together, as @@ -1556,8 +1566,9 @@ For example, in the default global map, the characters @samp{@key{SPC} the normal printing characters, (e.g., letters, digits, punctuation, etc.@:); all these characters are bound to @code{self-insert-command}. -If the second argument (prefix arg, interactively) is non-@code{nil} -then only the mouse bindings are displayed. +If the second optional argument @var{mouse-only-p} (prefix arg, +interactively) is non-@code{nil} then only the mouse bindings are +displayed. @end deffn @node Other Keymap Functions diff --git a/man/lispref/ldap.texi b/man/lispref/ldap.texi index 6e9c686..827fca0 100644 --- a/man/lispref/ldap.texi +++ b/man/lispref/ldap.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1998 Free Software Foundation, Inc. +@c Copyright (C) 1998 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/ldap.info @node LDAP Support, PostgreSQL Support, ToolTalk Support, top @@ -58,7 +58,7 @@ and ensuring compliance with LDAP internationalization rules and formats @menu * LDAP Variables:: Lisp variables related to LDAP -* The High-Level LDAP API:: High-level LDAP lisp functions +* The High-Level LDAP API:: High-level LDAP lisp functions * The Low-Level LDAP API:: Low-level LDAP lisp primitives * LDAP Internationalization:: I18n variables and functions @end menu @@ -70,7 +70,7 @@ and ensuring compliance with LDAP internationalization rules and formats @defvar ldap-default-host The default LDAP server hostname. -A TCP port number can be appended to that name using a colon as +A TCP port number can be appended to that name using a colon as a separator. @end defvar @@ -87,7 +87,7 @@ Acme organization in the United States. @end defvar @defvar ldap-host-parameters-alist -An alist of per host options for LDAP transactions. +An alist of per host options for LDAP transactions. The list elements look like @code{(HOST PROP1 VAL1 PROP2 VAL2 ...)} @var{host} is the name of an LDAP server. A TCP port number can be appended to that name using a colon as a separator. @@ -105,12 +105,12 @@ The authentication method to use, possible values depend on the LDAP library XEmacs was compiled with, they may include @code{simple}, @code{krbv41} and @code{krbv42}. @item base -The base for the search. This may look like @samp{cÿ, o¬me}, see +The base for the search. This may look like @samp{cÿ, o¬me}, see RFC 1779 for syntax details. @item scope -One of the symbols @code{base}, @code{onelevel} or @code{subtree} +One of the symbols @code{base}, @code{onelevel} or @code{subtree} indicating the scope of the search limited to a base -object, to a single level or to the whole subtree. +object, to a single level or to the whole subtree. @item deref The dereference policy is one of the symbols @code{never}, @code{always}, @code{search} or @code{find} and defines how aliases are @@ -146,63 +146,64 @@ LDAP operations. All of them open a connection to a host, perform an operation (add/search/modify/delete) on one or several entries and cleanly close the connection thus insulating the user from all the details of the low-level interface such as LDAP Lisp objects @pxref{The -Low-Level LDAP API}. +Low-Level LDAP API}. Note that @code{ldap-search} which used to be the name of the high-level -search function in XEmacs 21.1 is now obsolete. For consistency in the +search function in XEmacs 21.1 is now obsolete. For consistency in the naming as well as backward compatibility, that function now acts as a wrapper that calls either @code{ldap-search-basic} (low-level search function) or @code{ldap-search-entries} (high-level search function) according to the actual parameters. A direct call to one of these two functions is preferred since it is faster and unambiguous. -@defun ldap-search-entries filter &optional host attributes attrsonly withdn +@deffn Command ldap-search-entries filter &optional host attributes attrsonly withdn Perform an LDAP search. @var{filter} is the search filter @pxref{Syntax of Search Filters} @var{host} is the LDAP host on which to perform the search. -@var{attributes} is the specific attributes to retrieve, @code{nil} means +@var{attributes} is the specific attributes to retrieve, @code{nil} means retrieve all. -@var{attrsonly} if non-@code{nil} retrieves the attributes only without +@var{attrsonly} if non-@code{nil} retrieves the attributes only without their associated values. If @var{withdn} is non-@code{nil} each entry in the result will be prepended with its distinguished name DN. -Additional search parameters can be specified through +Additional search parameters can be specified through @code{ldap-host-parameters-alist}. The function returns a list of matching entries. Each entry is itself an alist of attribute/value pairs optionally preceded by the DN of the entry according to the value of @var{withdn}. -@end defun +@end deffn @defun ldap-add-entries entries &optional host binddn passwd Add entries to an LDAP directory. @var{entries} is a list of entry -specifications of the form @code{(DN (ATTR . VALUE) (ATTR . VALUE) ...)} +specifications of the form @code{(DN (ATTR . VALUE) (ATTR . VALUE) ...)} where @var{dn} the distinguished name of an entry to add, the following -are cons cells containing attribute/value string pairs. @var{host} is -the LDAP host, defaulting to `ldap-default-host' @var{binddn} is the DN -to bind as to the server @var{passwd} is the corresponding password. +are cons cells containing attribute/value string pairs. +@var{host} is the LDAP host, defaulting to @code{ldap-default-host}. +@var{binddn} is the DN to bind as to the server. +@var{passwd} is the corresponding password. @end defun @defun ldap-modify-entries entry-mods &optional host binddn passwd Modify entries of an LDAP directory. -@var{entry_mods} is a list of entry modifications of the form -@code{(DN MOD-SPEC1 MOD-SPEC2 ...)} where @var{dn} is the distinguished name of -the entry to modify, the following are modification specifications. -A modification specification is itself a list of the form -@code{(MOD-OP ATTR VALUE1 VALUE2 ...)} @var{mod-op} and @var{attr} are mandatory, +@var{entry_mods} is a list of entry modifications of the form +@code{(DN MOD-SPEC1 MOD-SPEC2 ...)} where @var{dn} is the distinguished name of +the entry to modify, the following are modification specifications. +A modification specification is itself a list of the form +@code{(MOD-OP ATTR VALUE1 VALUE2 ...)} @var{mod-op} and @var{attr} are mandatory, @var{values} are optional depending on @var{mod-op}. @var{mod-op} is the type of modification, one of the symbols @code{add}, @code{delete} or @code{replace}. @var{attr} is the LDAP attribute type to modify. -@var{host} is the LDAP host, defaulting to @code{ldap-default-host} -@var{binddn} is the DN to bind as to the server -@var{passwd} is the corresponding password" +@var{host} is the LDAP host, defaulting to @code{ldap-default-host}. +@var{binddn} is the DN to bind as to the server. +@var{passwd} is the corresponding password. @end defun @defun ldap-delete-entries dn &optional host binddn passwd Delete an entry from an LDAP directory. -@var{dn} is the distinguished name of an entry to delete or +@var{dn} is the distinguished name of an entry to delete or a list of those. -@var{host} is the LDAP host, defaulting to @code{ldap-default-host} -@var{binddn} is the DN to bind as to the server +@var{host} is the LDAP host, defaulting to @code{ldap-default-host}. +@var{binddn} is the DN to bind as to the server. @var{passwd} is the corresponding password. @end defun @@ -222,9 +223,9 @@ Note that the former functions @code{ldap-*-internal} functions have been renamed in XEmacs 21.2 @menu -* The LDAP Lisp Object:: -* Opening and Closing a LDAP Connection:: -* Low-level Operations on a LDAP Server:: +* The LDAP Lisp Object:: +* Opening and Closing a LDAP Connection:: +* Low-level Operations on a LDAP Server:: @end menu @node The LDAP Lisp Object, Opening and Closing a LDAP Connection, The Low-Level LDAP API, The Low-Level LDAP API @@ -239,11 +240,11 @@ This function returns non-@code{nil} if @var{object} is a @code{ldap} object. @end defun @defun ldap-host ldap -Return the server host of the connection represented by @var{ldap} +Return the server host of the connection represented by @var{ldap}. @end defun @defun ldap-live-p ldap -Return non-@code{nil} if @var{ldap} is an active LDAP connection +Return non-@code{nil} if @var{ldap} is an active LDAP connection. @end defun @@ -274,13 +275,13 @@ The dereference policy is one of the symbols @code{never}, dereferenced. @table @code @item never -Aliases are never dereferenced +Aliases are never dereferenced. @item always -Aliases are always dereferenced +Aliases are always dereferenced. @item search -Aliases are dereferenced when searching +Aliases are dereferenced when searching. @item find -Aliases are dereferenced when locating the base object for the search +Aliases are dereferenced when locating the base object for the search. @end table The default is @code{never}. @item timelimit @@ -291,7 +292,7 @@ The maximum number of matches to return for searches performed on this connectio @end defun @defun ldap-close ldap -Close the connection represented by @var{ldap} +Close the connection represented by @var{ldap}. @end defun @@ -305,7 +306,7 @@ thus requiring a preliminary call to @code{ldap-open}. Multiple searches can be made on the same connection, then the session must be closed with @code{ldap-close}. -@defun ldap-search-basic ldap filter base scope attrs attrsonly +@defun ldap-search-basic ldap filter &optional base scope attrs attrsonly withdn verbose Perform a search on an open connection @var{ldap} created with @code{ldap-open}. @var{filter} is a filter string for the search @pxref{Syntax of Search Filters} @var{base} is the distinguished name at which to start the search. @@ -313,16 +314,16 @@ Perform a search on an open connection @var{ldap} created with @code{ldap-open}. @code{subtree} indicating the scope of the search limited to a base object, to a single level or to the whole subtree. The default is @code{subtree}. -@code{attrs} is a list of strings indicating which attributes to retrieve +@var{attrs} is a list of strings indicating which attributes to retrieve for each matching entry. If @code{nil} all available attributes are returned. -If @code{attrsonly} is non-@code{nil} then only the attributes are retrieved, not -their associated values -If @code{withdn} is non-@code{nil} then each entry in the result is prepended with -its distinguished name DN -If @code{verbose} is non-@code{nil} then progress messages are echoed +If @var{attrsonly} is non-@code{nil} then only the attributes are +retrieved, not their associated values. +If @var{withdn} is non-@code{nil} then each entry in the result is +prepended with its distinguished name DN. +If @var{verbose} is non-@code{nil} then progress messages are echoed The function returns a list of matching entries. Each entry is itself an alist of attribute/value pairs optionally preceded by the DN of the -entry according to the value of @code{withdn}. +entry according to the value of @var{withdn}. @end defun @defun ldap-add ldap dn entry @@ -341,13 +342,13 @@ Modify an entry in an LDAP directory. A modification is a list of the form @code{(MOD-OP ATTR VALUE1 VALUE2 ...)} @var{mod-op} and @var{attr} are mandatory, @var{values} are optional depending on @var{mod-op}. @var{mod-op} is the type of modification, one of the symbols @code{add}, @code{delete} -or @code{replace}. @var{attr} is the LDAP attribute type to modify +or @code{replace}. @var{attr} is the LDAP attribute type to modify. @end defun @defun ldap-delete ldap dn Delete an entry to an LDAP directory. @var{ldap} is an LDAP connection object created with @code{ldap-open}. -@var{dn} is the distinguished name of the entry to delete +@var{dn} is the distinguished name of the entry to delete. @end defun @@ -370,8 +371,8 @@ and the corresponding decoder is then retrieved from @end defun @menu -* LDAP Internationalization Variables:: -* Encoder/Decoder Functions:: +* LDAP Internationalization Variables:: +* Encoder/Decoder Functions:: @end menu @node LDAP Internationalization Variables, Encoder/Decoder Functions, LDAP Internationalization, LDAP Internationalization @@ -384,20 +385,20 @@ If non-@code{nil}, no encoding/decoding will be performed LDAP attribute values @defvar ldap-coding-system Coding system of LDAP string values. -LDAP v3 specifies the coding system of strings to be UTF-8. +LDAP v3 specifies the coding system of strings to be UTF-8. You need an XEmacs with Mule support for this. @end defvar @defvar ldap-default-attribute-decoder Decoder function to use for attributes whose syntax is unknown. Such a function receives an encoded attribute value as a string and should -return the decoded value as a string +return the decoded value as a string. @end defvar @defvar ldap-attribute-syntax-encoders A vector of functions used to encode LDAP attribute values. The sequence of functions corresponds to the sequence of LDAP attribute syntax -object identifiers of the form 1.3.6.1.4.1.1466.1115.121.1.* as defined in +object identifiers of the form 1.3.6.1.4.1.1466.1115.121.1.* as defined in RFC2252 section 4.3.2. As of this writing, only a few encoder functions are available. @end defvar @@ -405,14 +406,14 @@ are available. @defvar ldap-attribute-syntax-decoders A vector of functions used to decode LDAP attribute values. The sequence of functions corresponds to the sequence of LDAP attribute syntax -object identifiers of the form 1.3.6.1.4.1.1466.1115.121.1.* as defined in +object identifiers of the form 1.3.6.1.4.1.1466.1115.121.1.* as defined in RFC2252 section 4.3.2. As of this writing, only a few decoder functions are available. @end defvar @defvar ldap-attribute-syntaxes-alist A map of LDAP attribute names to their type object id minor number. -This table is built from RFC2252 Section 5 and RFC2256 Section 5 +This table is built from RFC2252 Section 5 and RFC2256 Section 5. @end defvar @node Encoder/Decoder Functions, , LDAP Internationalization Variables, LDAP Internationalization @@ -421,32 +422,32 @@ This table is built from RFC2252 Section 5 and RFC2256 Section 5 @defun ldap-encode-boolean bool A function that encodes an elisp boolean @var{bool} into a LDAP -boolean string representation +boolean string representation. @end defun @defun ldap-decode-boolean str A function that decodes a LDAP boolean string representation -@var{str} into an elisp boolean +@var{str} into an elisp boolean. @end defun @defun ldap-decode-string str -Decode a string @var{str} according to `ldap-coding-system' +Decode a string @var{str} according to @var{ldap-coding-system}. @end defun @defun ldap-encode-string str -Encode a string @var{str} according to `ldap-coding-system' +Encode a string @var{str} according to @var{ldap-coding-system}. @end defun @defun ldap-decode-address str -Decode an address @var{str} according to `ldap-coding-system' and +Decode an address @var{str} according to @var{ldap-coding-system} and replacing $ signs with newlines as specified by LDAP encoding rules for -addresses +addresses. @end defun @defun ldap-encode-address str -Encode an address @var{str} according to `ldap-coding-system' and +Encode an address @var{str} according to @var{ldap-coding-system} and replacing newlines with $ signs as specified by LDAP encoding rules for -addresses +addresses. @end defun @@ -468,9 +469,9 @@ In that syntax simple filters have the form: @code{} is the corresponding value. This is generally an exact string but may also contain @code{*} characters as wildcards -@code{filtertype} is one @code{=} @code{~=}, @code{<=}, @code{>=} which +@code{filtertype} is one @code{=} @code{~=}, @code{<=}, @code{>=} which respectively describe equality, approximate equality, inferiority and -superiority. +superiority. Thus @code{(cn=John Smith)} matches all records having a canonical name equal to John Smith. @@ -485,5 +486,5 @@ not operators. @code{(&(objectClass=Person)(mail=*)(|(sn=Smith)(givenname=John)))} matches records of class @code{Person} containing a @code{mail} -attribute and corresponding to people whose last name is @code{Smith} or +attribute and corresponding to people whose last name is @code{Smith} or whose first name is @code{John}. diff --git a/man/lispref/lispref.texi b/man/lispref/lispref.texi index 19e4b5a..5003ef5 100644 --- a/man/lispref/lispref.texi +++ b/man/lispref/lispref.texi @@ -247,8 +247,8 @@ Conventions Format of Descriptions -* A Sample Function Description:: -* A Sample Variable Description:: +* A Sample Function Description:: +* A Sample Variable Description:: Lisp Data Types @@ -365,7 +365,7 @@ 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 +* Quoting:: Avoiding evaluation (to put constants in the program). Kinds of Forms @@ -418,11 +418,11 @@ Variables Scoping Rules for Variable Bindings -* Scope:: Scope means where in the program a value +* 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 +* Using Scoping:: How to use dynamic scoping carefully and avoid problems. Buffer-Local Variables @@ -440,11 +440,11 @@ Functions * 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. +* 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 + that have a special bearing on how functions work. Lambda Expressions @@ -480,10 +480,10 @@ Debugging Lisp Programs * Debugger:: How the XEmacs Lisp debugger is implemented. * Syntax Errors:: How to find syntax errors. -* Compilation Errors:: How to find errors that show up in +* Compilation Errors:: How to find errors that show up in byte compilation. * Edebug:: A source-level XEmacs Lisp debugger. - + The Lisp Debugger * Error Debugging:: Entering the debugger when an error happens. @@ -502,10 +502,10 @@ Debugging Invalid Lisp Syntax 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:: 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:: Various data types that can be used as output streams. * Output Functions:: Functions to print Lisp objects as text. @@ -634,7 +634,7 @@ Major and Minor Modes * Major Modes:: Defining major modes. * Minor Modes:: Defining minor modes. * Modeline Format:: Customizing the text that appears in the modeline. -* Hooks:: How to use hooks; how to write code that +* Hooks:: How to use hooks; how to write code that provides hooks. Major Modes @@ -694,7 +694,7 @@ 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 +* 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. @@ -702,17 +702,17 @@ File Names Backups and Auto-Saving -* Backup Files:: How backup files are made; how their names +* 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 +* Reverting:: @code{revert-buffer}, and how to customize what it does. Backup Files * Making Backups:: How XEmacs makes backup files, and when. -* Rename or Copy:: Two alternatives: renaming the old file +* 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. @@ -746,7 +746,7 @@ Windows 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. + 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. @@ -792,7 +792,7 @@ Markers * 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. + 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''. @@ -823,7 +823,7 @@ Text position stored in a register. * Transposition:: Swapping two portions of a buffer. * Change Hooks:: Supplying functions to be run when text is changed. - + The Kill Ring * Kill Ring Concepts:: What text looks like in the kill ring. @@ -1097,20 +1097,20 @@ LDAP Support XEmacs LDAP API * LDAP Variables:: Lisp variables related to LDAP -* The High-Level LDAP API:: High-level LDAP lisp functions +* The High-Level LDAP API:: High-level LDAP lisp functions * The Low-Level LDAP API:: Low-level LDAP lisp primitives * LDAP Internationalization:: I18n variables and functions The Low-Level LDAP API -* The LDAP Lisp Object:: -* Opening and Closing a LDAP Connection:: -* Low-level Operations on a LDAP Server:: +* The LDAP Lisp Object:: +* Opening and Closing a LDAP Connection:: +* Low-level Operations on a LDAP Server:: LDAP Internationalization -* LDAP Internationalization Variables:: -* Encoder/Decoder Functions:: +* LDAP Internationalization Variables:: +* Encoder/Decoder Functions:: Internationalization diff --git a/man/lispref/lists.texi b/man/lispref/lists.texi index d708b8e..cd237e1 100644 --- a/man/lispref/lists.texi +++ b/man/lispref/lists.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/lists.info @node Lists, Sequences Arrays Vectors, Strings and Characters, Top @@ -698,8 +698,8 @@ new @sc{car} or @sc{cdr}. 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}, +@defun setcar cons-cell object +This function stores @var{object} as the new @sc{car} of @var{cons-cell}, replacing its previous @sc{car}. It returns the value @var{object}. For example: @@ -798,8 +798,8 @@ x2: | 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}, +@defun setcdr cons-cell object +This function stores @var{object} as the new @sc{cdr} of @var{cons-cell}, replacing its previous @sc{cdr}. It returns the value @var{object}. @end defun @@ -1598,30 +1598,30 @@ with it. This means that it's a malformed or circular plist. @node Working With Normal Plists @subsection Working With Normal Plists -@defun plist-get plist prop &optional default +@defun plist-get plist property &optional default This function extracts a value from a property list. The function -returns the value corresponding to the given @var{prop}, or -@var{default} if @var{prop} is not one of the properties on the list. +returns the value corresponding to the given @var{property}, or +@var{default} if @var{property} is not one of the properties on the list. @end defun -@defun plist-put plist prop val -This function changes the value in @var{plist} of @var{prop} to -@var{val}. If @var{prop} is already a property on the list, its value is -set to @var{val}, otherwise the new @var{prop} @var{val} pair is added. -The new plist is returned; use @code{(setq x (plist-put x prop val))} to +@defun plist-put plist property value +This function changes the value in @var{plist} of @var{property} to +@var{value}. If @var{property} is already a property on the list, its value is +set to @var{value}, otherwise the new @var{property} @var{value} pair is added. +The new plist is returned; use @code{(setq x (plist-put x property value))} to be sure to use the new value. The @var{plist} is modified by side effects. @end defun -@defun plist-remprop plist prop -This function removes from @var{plist} the property @var{prop} and its +@defun plist-remprop plist property +This function removes from @var{plist} the property @var{property} and its value. The new plist is returned; use @code{(setq x (plist-remprop x -prop val))} to be sure to use the new value. The @var{plist} is +property))} to be sure to use the new value. The @var{plist} is modified by side effects. @end defun -@defun plist-member plist prop -This function returns @code{t} if @var{prop} has a value specified in +@defun plist-member plist property +This function returns @code{t} if @var{property} has a value specified in @var{plist}. @end defun @@ -1657,25 +1657,25 @@ to @code{setq} the value back into where it came from. Recall that a @dfn{lax plist} is a property list whose keys are compared using @code{equal} instead of @code{eq}. -@defun lax-plist-get lax-plist prop &optional default +@defun lax-plist-get lax-plist property &optional default This function extracts a value from a lax property list. The function -returns the value corresponding to the given @var{prop}, or -@var{default} if @var{prop} is not one of the properties on the list. +returns the value corresponding to the given @var{property}, or +@var{default} if @var{property} is not one of the properties on the list. @end defun -@defun lax-plist-put lax-plist prop val -This function changes the value in @var{lax-plist} of @var{prop} to @var{val}. +@defun lax-plist-put lax-plist property value +This function changes the value in @var{lax-plist} of @var{property} to @var{value}. @end defun -@defun lax-plist-remprop lax-plist prop -This function removes from @var{lax-plist} the property @var{prop} and +@defun lax-plist-remprop lax-plist property +This function removes from @var{lax-plist} the property @var{property} and its value. The new plist is returned; use @code{(setq x -(lax-plist-remprop x prop val))} to be sure to use the new value. The +(lax-plist-remprop x property))} to be sure to use the new value. The @var{lax-plist} is modified by side effects. @end defun -@defun lax-plist-member lax-plist prop -This function returns @code{t} if @var{prop} has a value specified in +@defun lax-plist-member lax-plist property +This function returns @code{t} if @var{property} has a value specified in @var{lax-plist}. @end defun diff --git a/man/lispref/loading.texi b/man/lispref/loading.texi index e533588..e3888ed 100644 --- a/man/lispref/loading.texi +++ b/man/lispref/loading.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/loading.info @node Loading, Byte Compilation, Macros, Top @@ -300,9 +300,9 @@ 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 +function. Normally, this is 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 @@ -314,9 +314,9 @@ 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. +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 @@ -335,7 +335,7 @@ object, then it is defined as an autoload object like this: (autoload @var{filename} @var{docstring} @var{interactive} @var{type}) @end example -For example, +For example, @example @group @@ -509,7 +509,7 @@ file should call @code{provide} at the top level to add the feature to 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}, + For example, in @file{emacs/lisp/prolog.el}, the definition for @code{run-prolog} includes the following code: @smallexample @@ -609,11 +609,11 @@ presence or absence of emacs or environment extensions. @var{fexp} can be a symbol, a number, or a list. -If @var{fexp} is a symbol, it is looked up in the `features' variable, +If @var{fexp} is a symbol, it is looked up in the @code{features} variable, and @code{t} is returned if it is found, @code{nil} otherwise. If @var{fexp} is a number, the function returns @code{t} if this Emacs -has an equal or greater number than @code{fexp}, @code{nil} otherwise. +has an equal or greater number than @var{fexp}, @code{nil} otherwise. Note that minor Emacs version is expected to be 2 decimal places wide, so @code{(featurep 20.4)} will return @code{nil} on XEmacs 20.4---you must write @code{(featurep 20.04)}, unless you wish to match for XEmacs @@ -627,7 +627,7 @@ If @var{fexp} is a list whose car is the symbol @code{or}, the function returns @code{t} if any the features in its cdr are present, @code{nil} otherwise. -If @var{fexp} is a list whose car is the symbol @code{not}, the function +If @var{fexp} is a list whose car is the symbol @code{not}, the function returns @code{t} if the feature is not present, @code{nil} otherwise. Examples: diff --git a/man/lispref/locals.texi b/man/lispref/locals.texi index ef9359d..2d3ed27 100644 --- a/man/lispref/locals.texi +++ b/man/lispref/locals.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/locals.info @node Standard Buffer-Local Variables, Standard Keymaps, Standard Errors, Top diff --git a/man/lispref/macros.texi b/man/lispref/macros.texi index 92c6dbf..78b43d6 100644 --- a/man/lispref/macros.texi +++ b/man/lispref/macros.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/macros.info @node Macros, Loading, Functions, Top @@ -282,7 +282,7 @@ Here are some examples: @end group @end example -@quotation +@quotation In older versions of Emacs (before XEmacs 19.12 or FSF Emacs version 19.29), @samp{`} used a different syntax which required an extra level of parentheses around the entire backquote construct. Likewise, each @@ -397,7 +397,7 @@ macro. Here is a correct expansion for the @code{for} macro: @end group @end smallexample -Here is a macro definition that creates this expansion: +Here is a macro definition that creates this expansion: @smallexample @group diff --git a/man/lispref/maps.texi b/man/lispref/maps.texi index 1421e91..15e9fb4 100644 --- a/man/lispref/maps.texi +++ b/man/lispref/maps.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/maps.info @node Standard Keymaps, Standard Hooks, Standard Buffer-Local Variables, Top @@ -163,7 +163,7 @@ The minibuffer keymap used for reading Lisp expressions. @item read-shell-command-map @vindex read-shell-command-map -The minibuffer keymap used by shell-command and related commands. +The minibuffer keymap used by @code{shell-command} and related commands. @item shared-lisp-mode-map @vindex shared-lisp-mode-map diff --git a/man/lispref/markers.texi b/man/lispref/markers.texi index 44920a8..b22c287 100644 --- a/man/lispref/markers.texi +++ b/man/lispref/markers.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/markers.info @node Markers, Text, Positions, Top @@ -258,7 +258,7 @@ chapter. @end example @end defun -@defun copy-marker marker-or-integer +@defun copy-marker marker-or-integer &optional marker-type 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, @@ -271,8 +271,11 @@ 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. +An error is signaled if @var{marker-or-integer} is neither a marker nor +an integer. + +Optional second argument @var{marker-type} specifies the insertion type +of the new marker; see @code{marker-insertion-type}. @example @group @@ -399,11 +402,14 @@ 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. +@var{position} can be a marker, an integer or @code{nil}. If +@var{position} is an integer, @code{set-marker} moves @var{marker} to +point before the @var{position}th character in @var{buffer}. If +@var{position} is @code{nil}, @var{marker} is made to point nowhere. +Then it no longer slows down editing in any buffer. If @var{position} +is less than 1, @var{marker} is moved to the beginning of @var{buffer}. +If @var{position} is greater than the size of @var{buffer}, @var{marker} +is moved to the end of @var{buffer}. The value returned is @var{marker}. @@ -510,7 +516,7 @@ If you are using this in an editing command, you are most likely making a mistake; see the documentation of @code{set-mark} below. @end defun -@defun mark-marker inactive-p buffer +@defun mark-marker &optional force buffer This function returns @var{buffer}'s mark. @var{buffer} defaults to the current buffer if omitted. This is the very marker that records the mark location inside XEmacs, not a copy. Therefore, changing this @@ -576,9 +582,9 @@ example: @example @group -(let ((beg (point))) +(let ((start (point))) (forward-line 1) - (delete-region beg (point))). + (delete-region start (point))). @end group @end example @end defun @@ -621,7 +627,7 @@ marks of the current buffer, most recent first. @example @group mark-ring -@result{} (# +@result{} (# # @dots{}) @end group diff --git a/man/lispref/menus.texi b/man/lispref/menus.texi index 7f6e158..53d1ef7 100644 --- a/man/lispref/menus.texi +++ b/man/lispref/menus.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1997 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1997 Free Software Foundation, Inc. @c Copyright (C) 1995 Sun Microsystems. @c See the file lispref.texi for copying conditions. @setfilename ../../info/menu.info @@ -366,7 +366,7 @@ also specifies a particular item to be modified. For example, top-level ``File'' menu. @code{("Menu" "Foo" "Item")} means the menu item called ``Item'' under the ``Foo'' submenu of ``Menu''. -@defun add-submenu menu-path submenu &optional before +@defun add-submenu menu-path submenu &optional before in-menu This function adds a menu to the menubar or one of its submenus. If the named menu exists already, it is changed. @@ -379,9 +379,12 @@ to the menubar itself. @var{before}, if provided, is the name of a menu before which this menu should be added, if this menu is not on its parent already. If the menu is already present, it will not be moved. + +If @var{in-menu} is present use that instead of @code{current-menubar} +as the menu to change. @end defun -@defun add-menu-button menu-path menu-leaf &optional before +@defun add-menu-button menu-path menu-leaf &optional before in-menu This function adds a menu item to some menu, creating the menu first if necessary. If the named item exists already, it is changed. @@ -393,11 +396,17 @@ be inserted. @var{before}, if provided, is the name of a menu before which this item should be added, if this item is not on the menu already. If the item is already present, it will not be moved. + +If @var{in-menu} is present use that instead of @code{current-menubar} +as the menu to change. @end defun -@defun delete-menu-item menu-item-path +@defun delete-menu-item menu-item-path &optional from-menu This function removes the menu item specified by @var{menu-item-path} from the menu hierarchy. + +If @var{from-menu} is present use that instead of @code{current-menubar} +as the menu to change. @end defun @defun enable-menu-item menu-item-path @@ -526,10 +535,10 @@ more information. @section Pop-Up Menus @cindex pop-up menu -@defun popup-menu menu-desc -This function pops up a menu specified by @var{menu-desc}, which is a -menu description (@pxref{Menu Format}). The menu is displayed at the -current mouse position. +@defun popup-menu menu-description &optional event +This function pops up a menu specified by @var{menu-description}, which +is a menu description (@pxref{Menu Format}). The menu is displayed at +the current mouse position. @end defun @defun popup-menu-up-p @@ -579,14 +588,15 @@ run. The following convenience functions are provided for displaying pop-up menus. -@defun popup-buffer-menu event +@deffn Command popup-buffer-menu event This function pops up a copy of the @samp{Buffers} menu (from the menubar) -where the mouse is clicked. -@end defun +where the mouse is clicked. It should be bound to a mouse button event. +@end deffn -@defun popup-menubar-menu event +@deffn Command popup-menubar-menu event This function pops up a copy of menu that also appears in the menubar. -@end defun +It should be bound to a mouse button event. +@end deffn @node Menu Accelerators @section Menu Accelerators @@ -651,10 +661,10 @@ for more information about how to modify the menu traversal keys. @node Menu Accelerator Functions @subsection Menu Accelerator Functions -@defun accelerate-menu +@deffn Command accelerate-menu Make the menubar immediately active and place the cursor on the left most entry in the top level menu. Menu items can be selected as usual. -@end defun +@end deffn @defvar menu-accelerator-enabled Whether menu accelerator keys can cause the menubar to become active. diff --git a/man/lispref/minibuf.texi b/man/lispref/minibuf.texi index ac8b10d..d897a0e 100644 --- a/man/lispref/minibuf.texi +++ b/man/lispref/minibuf.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/minibuf.info @node Minibuffers, Command Loop, Read and Print, Top @@ -95,7 +95,7 @@ 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 +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. @@ -156,9 +156,9 @@ arguments @var{prompt} and @var{initial} are used as in @code{read-from-minibuffer}. The keymap used is @code{minibuffer-local-map}. -The optional argument @var{history}, if non-nil, specifies a history +The optional argument @var{history}, if non-@code{nil}, specifies a history list and optionally the initial position in the list. The optional -argument @var{default} specifies a default value to return if the user +argument @var{default-value} specifies a default value to return if the user enters null input; it should be a string. This function is a simplified interface to the @@ -213,7 +213,7 @@ This function reads a Lisp object using the minibuffer, and returns it without evaluating it. The arguments @var{prompt} and @var{initial} are used as in @code{read-from-minibuffer}. -The optional argument @var{history}, if non-nil, specifies a history +The optional argument @var{history}, if non-@code{nil}, specifies a history list and optionally the initial position in the list. The optional argument @var{default-value} specifies a default value to return if the user enters null input; it should be a string. @@ -264,7 +264,7 @@ This function reads a Lisp expression using the minibuffer, evaluates it, then returns the result. The arguments @var{prompt} and @var{initial} are used as in @code{read-from-minibuffer}. -The optional argument @var{history}, if non-nil, specifies a history +The optional argument @var{history}, if non-@code{nil}, specifies a history list and optionally the initial position in the list. The optional argument @var{default-value} specifies a default value to return if the user enters null input; it should be a string. @@ -281,10 +281,10 @@ This function simply evaluates the result of a call to @end smallexample @end defun -@defun edit-and-eval-command prompt command &optional history +@defun edit-and-eval-command prompt form &optional history 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{command} is not +@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{"}) @@ -304,7 +304,7 @@ text which is a valid form already: @group (edit-and-eval-command "Please edit: " '(forward-word 1)) -;; @r{After evaluation of the preceding expression,} +;; @r{After evaluation of the preceding expression,} ;; @r{the following appears in the minibuffer:} @end group @@ -456,7 +456,7 @@ 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 +This function returns the longest common prefix 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). @@ -506,7 +506,7 @@ is @code{t}. @smallexample @group -(try-completion +(try-completion "foo" '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))) @result{} "fooba" @@ -536,44 +536,40 @@ too short). Both of those begin with the string @samp{foobar}. @smallexample @group -(defun test (s) +(defun test (s) (> (length (car s)) 6)) @result{} test @end group @group -(try-completion +(try-completion "foo" - '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) + '(("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 arguments to this function are the same as those of -@code{try-completion}. +@defun all-completions string collection &optional predicate +This function returns a list of all possible completions of @var{string}. +The arguments to this function are the same as those of @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) +(defun test (s) (> (length (car s)) 6)) @result{} test @end group @group -(all-completions +(all-completions "foo" '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) 'test) @@ -583,7 +579,7 @@ example for @code{try-completion}: @end defun @defvar completion-ignore-case -If the value of this variable is +If the value of this variable is non-@code{nil}, XEmacs does not consider case significant in completion. @end defvar @@ -649,7 +645,7 @@ Here's an example of using @code{completing-read}: @end group @group -;; @r{After evaluation of the preceding expression,} +;; @r{After evaluation of the preceding expression,} ;; @r{the following appears in the minibuffer:} ---------- Buffer: Minibuffer ---------- @@ -834,7 +830,7 @@ only buffer name starting with the given input is @example (read-buffer "Buffer name? " "foo" t) @group -;; @r{After evaluation of the preceding expression,} +;; @r{After evaluation of the preceding expression,} ;; @r{the following prompt appears,} ;; @r{with an empty minibuffer:} @end group @@ -869,13 +865,13 @@ enters null input, the return value is @code{nil}. (read-command "Command name? ") @group -;; @r{After evaluation of the preceding expression,} +;; @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 ---------- +Command name? ---------- Buffer: Minibuffer ---------- @end group @end example @@ -894,7 +890,7 @@ as to complete in the set of extant Lisp symbols, and it uses the @group (read-command @var{prompt}) @equiv{} -(intern (completing-read @var{prompt} obarray +(intern (completing-read @var{prompt} obarray 'commandp t nil)) @end group @end example @@ -906,7 +902,7 @@ symbol. The argument @var{default-value} specifies what to return if the user enters null input. It can be a symbol or a string; if it is a string, -@code{read-variable} interns it before returning it. If @var{default} +@code{read-variable} interns it before returning it. If @var{default-value} is @code{nil}, that means no default has been specified; then if the user enters null input, the return value is @code{nil}. @@ -914,8 +910,8 @@ user enters null input, the return value is @code{nil}. @group (read-variable "Variable name? ") -;; @r{After evaluation of the preceding expression,} -;; @r{the following prompt appears,} +;; @r{After evaluation of the preceding expression,} +;; @r{the following prompt appears,} ;; @r{with an empty minibuffer:} @end group @@ -980,13 +976,13 @@ 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: +Here is an example: @example @group (read-file-name "The file is ") -;; @r{After evaluation of the preceding expression,} +;; @r{After evaluation of the preceding expression,} ;; @r{the following appears in the minibuffer:} @end group @@ -1172,13 +1168,13 @@ invalid. At the next prompt the user types @kbd{y}. @group (y-or-n-p "Do you need a lift? ") -;; @r{After evaluation of the preceding expression,} +;; @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) +Do you need a lift? (y or n) ---------- Echo area ---------- @end group @@ -1186,7 +1182,7 @@ Do you need a lift? (y or n) @group ---------- Echo area ---------- -Please answer y or n. Do you need a lift? (y or n) +Please answer y or n. Do you need a lift? (y or n) ---------- Echo area ---------- @end group @@ -1225,14 +1221,14 @@ Here is an example: @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{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) +Do you really want to remove everything? (yes or no) ---------- Buffer: minibuffer ---------- @end group @end smallexample @@ -1390,13 +1386,13 @@ and inserted in the minibuffer. If @var{default} is @code{nil}, then @end defun @defopt passwd-invert-frame-when-keyboard-grabbed -If non-nil swap the foreground and background colors of all faces while -reading a password. Default values is @code{t} unless feature +If non-@code{nil}, swap the foreground and background colors of all faces while +reading a password. Default values is @code{t}, unless feature @code{infodock} is provided. @end defopt @defopt passwd-echo -This specifies the character echoed when typing a password. When nil, +This specifies the character echoed when typing a password. When @code{nil}, nothing is echoed. @end defopt @@ -1478,7 +1474,7 @@ other frame's minibuffer window. @end defun @c Emacs 19 feature -@defun window-minibuffer-p window +@defun window-minibuffer-p &optional window This function returns non-@code{nil} if @var{window} is a minibuffer window. @end defun @@ -1515,7 +1511,7 @@ 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 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 diff --git a/man/lispref/modes.texi b/man/lispref/modes.texi index d338082..5db9648 100644 --- a/man/lispref/modes.texi +++ b/man/lispref/modes.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/modes.info @node Modes, Documentation, Drag and Drop, Top @@ -79,7 +79,7 @@ Fundamental mode. Rmail mode is a complicated and specialized mode. * Example Major Modes:: Text mode and Lisp modes. * Auto Major Mode:: How XEmacs 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 +* Derived Modes:: Defining a new major mode based on another major mode. @end menu @@ -249,7 +249,7 @@ the conventions listed above: @smallexample @group ;; @r{Create mode-specific tables.} -(defvar text-mode-syntax-table nil +(defvar text-mode-syntax-table nil "Syntax table used while in text mode.") @end group @@ -285,7 +285,7 @@ the conventions listed above: @smallexample @group (defun text-mode () - "Major mode for editing text intended for humans to read. + "Major mode for editing text intended for humans to read. Special commands: \\@{text-mode-map@} @end group @group @@ -315,7 +315,7 @@ correspondingly more complicated. Here are excerpts from @smallexample @group ;; @r{Create mode-specific table variables.} -(defvar lisp-mode-syntax-table nil "") +(defvar lisp-mode-syntax-table nil "") (defvar emacs-lisp-mode-syntax-table nil "") (defvar lisp-mode-abbrev-table nil "") @end group @@ -331,7 +331,7 @@ correspondingly more complicated. Here are excerpts from ;; @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) + (while (< i ?0) (modify-syntax-entry i "_ " emacs-lisp-mode-syntax-table) (setq i (1+ i))) @dots{} @@ -432,7 +432,7 @@ set up. This lets the user customize the keymap. @smallexample @group -(defvar emacs-lisp-mode-map () "") +(defvar emacs-lisp-mode-map () "") (if emacs-lisp-mode-map () (setq emacs-lisp-mode-map (make-sparse-keymap)) @@ -442,7 +442,7 @@ set up. This lets the user customize the keymap. @end smallexample Finally, here is the complete major mode function definition for -Emacs Lisp mode. +Emacs Lisp mode. @smallexample @group @@ -545,7 +545,7 @@ the @samp{mode:} local variable near the end of a file; the How Major Modes are Chosen, emacs, The XEmacs Reference Manual}. @end defun -@defopt default-major-mode +@defopt default-major-mode This variable holds the default major mode for new buffers. The standard value is @code{fundamental-mode}. @@ -593,7 +593,7 @@ For example, @end group @group ("\\.el\\'" . emacs-lisp-mode) - ("\\.c\\'" . c-mode) + ("\\.c\\'" . c-mode) ("\\.h\\'" . c-mode) @dots{}) @end group @@ -621,11 +621,11 @@ Here is an example of how to prepend several pattern pairs to @smallexample @group (setq auto-mode-alist - (append + (append ;; @r{File name starts with a dot.} - '(("/\\.[^/]*\\'" . fundamental-mode) + '(("/\\.[^/]*\\'" . fundamental-mode) ;; @r{File name has no dot.} - ("[^\\./]*\\'" . fundamental-mode) + ("[^\\./]*\\'" . fundamental-mode) ;; @r{File name ends in @samp{.C}.} ("\\.C\\'" . c++-mode)) auto-mode-alist)) @@ -697,7 +697,7 @@ This construct defines @var{variant} as a major mode command, using The new command @var{variant} is defined to call the function @var{parent}, then override certain aspects of that parent mode: -@itemize @bullet +@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 @@ -706,25 +706,25 @@ The new mode has its own keymap, named @code{@var{variant}-map}. @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{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{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 +(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 +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 @@ -1028,18 +1028,18 @@ directory. (setq modeline-format (list "" 'modeline-modified - "%b--" + "%b--" @end group (getenv "HOST") ; @r{One element is not constant.} - ":" + ":" 'default-directory " " 'global-mode-string " %[(" - 'mode-name - 'modeline-process - 'minor-mode-alist - "%n" + 'mode-name + 'modeline-process + 'minor-mode-alist + "%n" ")%]----" @group '(line-number-mode "L%l--") @@ -1120,9 +1120,9 @@ The default value of @code{minor-mode-alist} is: @group minor-mode-alist @result{} ((vc-mode vc-mode) - (abbrev-mode " Abbrev") - (overwrite-mode overwrite-mode) - (auto-fill-function " Fill") + (abbrev-mode " Abbrev") + (overwrite-mode overwrite-mode) + (auto-fill-function " Fill") (defining-kbd-macro " Def") (isearch-mode isearch-mode)) @end group @@ -1158,12 +1158,12 @@ The default value of @code{default-modeline-format} is: " " global-mode-string " %[(" - mode-name + mode-name @end group @group modeline-process - minor-mode-alist - "%n" + minor-mode-alist + "%n" ")%]----" (line-number-mode "L%l--") (-3 . "%p") @@ -1294,7 +1294,7 @@ up in the @file{.emacs} file, but Lisp programs can set them also. Most of the hooks in XEmacs 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 usually tell when a hook is a normal hook, because its +way. You can usually 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 @@ -1333,7 +1333,7 @@ expression. @cindex lambda expression in hook @example @group -(add-hook 'c-mode-hook +(add-hook 'c-mode-hook (function (lambda () (setq c-indent-level 4 c-argdecl-indent 0 @@ -1358,17 +1358,17 @@ modified for a particular class of buffers only. (setq modeline-format '(modeline-modified "Emacs: %14b" - " " + " " @end group @group default-directory " " global-mode-string - "%[(" - mode-name - minor-mode-alist - "%n" - modeline-process + "%[(" + mode-name + minor-mode-alist + "%n" + modeline-process ") %]---" (-3 . "%p") "-%-"))))) @@ -1440,7 +1440,7 @@ difference. @end defun @defun make-local-hook hook -This function makes the hook variable @code{hook} local to the current +This function makes the hook variable @var{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. diff --git a/man/lispref/mouse.texi b/man/lispref/mouse.texi index 9f9424a..495ab44 100644 --- a/man/lispref/mouse.texi +++ b/man/lispref/mouse.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/mouse.info @node Mouse @@ -27,14 +27,14 @@ 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} +@defun x-contour-region window start end +This function draws lines to make a box around the text from @var{start} to @var{end}, in window @var{window}. @end defun -@defun x-uncontour-region window beg end +@defun x-uncontour-region window start 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 +from @var{start} 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 diff --git a/man/lispref/mule.texi b/man/lispref/mule.texi index d227bcc..9483964 100644 --- a/man/lispref/mule.texi +++ b/man/lispref/mule.texi @@ -47,7 +47,7 @@ hugely variant shapes as the "same" character. Sometimes, especially where characters are extremely complicated to write, completely different shapes may be defined as the "same" character in national standards. The Taiwanese variant of Hanzi is generally the most -complicated; over the centuries, the Japanese, Koreans, and the People's +complicated; over the centuries, the Japanese, Koreans, and the People's Republic of China have adopted simplifications of the shape, but the line of descent from the original shape is recorded, and the meanings and pronunciation of different forms of the same character are @@ -399,8 +399,8 @@ properties of a charset. This function returns the name of @var{charset}. This will be a symbol. @end defun -@defun charset-doc-string charset -This function returns the doc string of @var{charset}. +@defun charset-description charset +This function returns the documentation string of @var{charset}. @end defun @defun charset-registry charset @@ -416,7 +416,7 @@ This function returns the number of characters per dimension of @var{charset}. @end defun -@defun charset-columns charset +@defun charset-width charset This function returns the number of display columns per character (in TTY mode) of @var{charset}. @end defun @@ -426,12 +426,12 @@ This function returns the display direction of @var{charset}---either @code{l2r} or @code{r2l}. @end defun -@defun charset-final charset +@defun charset-iso-final-char charset This function returns the final byte of the ISO 2022 escape sequence designating @var{charset}. @end defun -@defun charset-graphic charset +@defun charset-iso-graphic-plane charset This function returns either 0 or 1, depending on whether the position codes of characters in @var{charset} map to the left or right half of their font, respectively. @@ -520,13 +520,13 @@ This function makes a multi-byte character from @var{charset} and octets @var{arg1} and @var{arg2}. @end defun -@defun char-charset ch -This function returns the character set of char @var{ch}. +@defun char-charset character +This function returns the character set of char @var{character}. @end defun -@defun char-octet ch &optional n +@defun char-octet character &optional n This function returns the octet (i.e. position code) numbered @var{n} -(should be 0 or 1) of char @var{ch}. @var{n} defaults to 0 if omitted. +(should be 0 or 1) of char @var{character}. @var{n} defaults to 0 if omitted. @end defun @defun find-charset-region start end &optional buffer @@ -550,7 +550,7 @@ character is the result of overstriking all the characters in the string. @end defun -@defun composite-char-string ch +@defun composite-char-string character This function returns a string of the characters comprising a composite character. @end defun @@ -702,7 +702,7 @@ character set and UTF-8, for example). ISO 2022 provides for switching between character sets via escape sequences. This switching is somewhat complicated, because ISO 2022 provides for both legacy applications like Internet mail that accept -only 7 significant bits in some contexts (RFC 822 headers, for example), +only 7 significant bits in some contexts (RFC 822 headers, for example), and more modern "8-bit clean" applications. It also provides for compact and transparent representation of languages like Japanese which mix ASCII and a national script (even outside of computer programs). @@ -719,7 +719,7 @@ the control character "ASCII DEL" respectively. C1 (0x80-0x9F), and GR (0xA0-0xFF). GL and GR stand for "graphic left" and "graphic right", respectively, because of the standard method of displaying graphic character sets in tables with the high byte indexing -columns and the low byte indexing rows. I don't find it very intuitive, +columns and the low byte indexing rows. I don't find it very intuitive, but these are called "registers". An ISO 2022-conformant encoding for a graphic character set must use a @@ -890,7 +890,7 @@ bit environments. (#### Ben says: I think the above is slightly incorrect. It appears that SS2 invokes G2 into GR and SS3 invokes G3 into GR, whereas ESC N and -ESC O behave as indicated. The above definitions will not parse +ESC O behave as indicated. The above definitions will not parse EUC-encoded text correctly, and it looks like the code in mule-coding.c has similar problems.) @@ -1021,25 +1021,25 @@ End-of-line conversion to be used. It should be one of the types listed in @ref{EOL Conversion}. @item eol-lf -The coding system which is the same as this one, except that it uses the +The coding system which is the same as this one, except that it uses the Unix line-breaking convention. @item eol-crlf -The coding system which is the same as this one, except that it uses the +The coding system which is the same as this one, except that it uses the DOS line-breaking convention. @item eol-cr -The coding system which is the same as this one, except that it uses the +The coding system which is the same as this one, except that it uses the Macintosh line-breaking convention. @item post-read-conversion Function called after a file has been read in, to perform the decoding. -Called with two arguments, @var{beg} and @var{end}, denoting a region of +Called with two arguments, @var{start} and @var{end}, denoting a region of the current buffer to be decoded. @item pre-write-conversion Function called before a file is written out, to perform the encoding. -Called with two arguments, @var{beg} and @var{end}, denoting a region of +Called with two arguments, @var{start} and @var{end}, denoting a region of the current buffer to be encoded. @end table @@ -1098,7 +1098,7 @@ designation by escape sequence. If non-@code{nil}, don't use ISO6429's direction specification. @item escape-quoted -If non-nil, literal control characters that are the same as the +If non-@code{nil}, literal control characters that are the same as the beginning of a recognized ISO 2022 or ISO 6429 escape sequence (in particular, ESC (0x1B), SO (0x0E), SI (0x0F), SS2 (0x8E), SS3 (0x8F), and CSI (0x9B)) are ``quoted'' with an escape character so that they can @@ -1274,10 +1274,10 @@ This function decodes a JIS X 0208 character of Shift-JIS coding-system. The corresponding character is returned. @end defun -@defun encode-shift-jis-char ch -This function encodes a JIS X 0208 character @var{ch} to SHIFT-JIS -coding-system. The corresponding character code in SHIFT-JIS is -returned as a cons of two bytes. +@defun encode-shift-jis-char character +This function encodes a JIS X 0208 character @var{character} to +SHIFT-JIS coding-system. The corresponding character code in SHIFT-JIS +is returned as a cons of two bytes. @end defun @defun decode-big5-char code @@ -1286,8 +1286,8 @@ This function decodes a Big5 character @var{code} of BIG5 coding-system. is returned. @end defun -@defun encode-big5-char ch -This function encodes the Big5 character @var{char} to BIG5 +@defun encode-big5-char character +This function encodes the Big5 character @var{character} to BIG5 coding-system. The corresponding character code in Big5 is returned. @end defun @@ -1297,16 +1297,16 @@ coding-system. The corresponding character code in Big5 is returned. MULE initializes most of the commonly used coding systems at XEmacs's startup. A few others are initialized only when the relevant language environment is selected and support libraries are loaded. (NB: The -following list is based on XEmacs 21.2.19, the development branch at the +following list is based on XEmacs 21.2.19, the development branch at the time of writing. The list may be somewhat different for other versions. Recent versions of GNU Emacs 20 implement a few more rare coding systems; work is being done to port these to XEmacs.) - Unfortunately, there is not a consistent naming convention for character -sets, and for practical purposes coding systems often take their name + Unfortunately, there is not a consistent naming convention for character +sets, and for practical purposes coding systems often take their name from their principal character sets (ASCII, KOI8-R, Shift JIS). Others -take their names from the coding system (ISO-2022-JP, EUC-KR), and a few -from their non-text usages (internal, binary). To provide for this, and +take their names from the coding system (ISO-2022-JP, EUC-KR), and a few +from their non-text usages (internal, binary). To provide for this, and for the fact that many coding systems have several common names, an aliasing system is provided. Finally, some effort has been made to use names that are registered as MIME charsets (this is why the name @@ -1337,7 +1337,7 @@ table of coding systems.) need language usage for the ISO-8859 family. Note that although true coding system aliases have been implemented for -XEmacs 21.2, the coding system initialization has not yet been converted +XEmacs 21.2, the coding system initialization has not yet been converted as of 21.2.19. So coding systems described as aliases have the same properties as the aliased coding system, but will not be equal as Lisp objects. @@ -1671,7 +1671,7 @@ implements a virtual machine with 8 registers called @code{r0}, ..., @code{r7}, a number of control structures, and some I/O operators. Take care when using registers @code{r0} (used in implicit @dfn{set} statements) and especially @code{r7} (used internally by several -statements and operations, especially for multiple return values and I/O +statements and operations, especially for multiple return values and I/O operations). CCL is used for code conversion during process I/O and file I/O for @@ -1707,9 +1707,9 @@ executed when the input is exhausted. Both the main block and the EOF block are CCL blocks. A @dfn{CCL block} is either a CCL statement or list of CCL statements. -A @dfn{CCL statement} is either a @dfn{set statement} (either an integer +A @dfn{CCL statement} is either a @dfn{set statement} (either an integer or an @dfn{assignment}, which is a list of a register to receive the -assignment, an assignment operator, and an expression) or a @dfn{control +assignment, an assignment operator, and an expression) or a @dfn{control statement} (a list starting with a keyword, whose allowable syntax depends on the keyword). @@ -1804,7 +1804,7 @@ the form @code{(r0 = @var{integer})}. @heading I/O statements: The @dfn{read} statement takes one or more registers as arguments. It -reads one byte (a C char) from the input into each register in turn. +reads one byte (a C char) from the input into each register in turn. The @dfn{write} takes several forms. In the form @samp{(write @var{reg} ...)} it takes one or more registers as arguments and writes each in @@ -1841,7 +1841,7 @@ array, and the @code{branch} statement uses the @var{expression} as the index of the CCL block to execute. Null CCL blocks may be used as no-ops, continuing execution with the statement following the @code{branch} statement in the containing CCL block. Out-of-range -values for the @var{EXPRESSION} are also treated as no-ops. +values for the @var{expression} are also treated as no-ops. The @dfn{read-branch} variant of the @dfn{branch} statement takes an @var{register}, a @var{CCL block}, and an optional @var{second CCL @@ -1852,19 +1852,19 @@ block just as the @code{branch} statement does. @heading Loop control statements: The @dfn{loop} statement creates a block with an implied jump from the -end of the block back to its head. The loop is exited on a @code{break} +end of the block back to its head. The loop is exited on a @code{break} statement, and continued without executing the tail by a @code{repeat} statement. The @dfn{break} statement, written @samp{(break)}, terminates the current loop and continues with the next statement in the current -block. +block. The @dfn{repeat} statement has three variants, @code{repeat}, @code{write-repeat}, and @code{write-read-repeat}. Each continues the current loop from its head, possibly after performing I/O. @code{repeat} takes no arguments and does no I/O before jumping. -@code{write-repeat} takes a single argument (a register, an +@code{write-repeat} takes a single argument (a register, an integer, or a string), writes it to the output, then jumps. @code{write-read-repeat} takes one or two arguments. The first must be a register. The second may be an integer or an array; if absent, it @@ -1950,7 +1950,7 @@ other CCL programs, and from Lisp using these functions: @defun ccl-execute ccl-program status Execute @var{ccl-program} with registers initialized by @var{status}. @var{ccl-program} is a vector of compiled CCL code -created by @code{ccl-compile}. It is an error for the program to try to +created by @code{ccl-compile}. It is an error for the program to try to execute a CCL I/O command. @var{status} must be a vector of nine values, specifying the initial value for the R0, R1 .. R7 registers and for the instruction counter IC. A @code{nil} value for a register @@ -1958,10 +1958,10 @@ initializer causes the register to be set to 0. A @code{nil} value for the IC initializer causes execution to start at the beginning of the program. When the program is done, @var{status} is modified (by side-effect) to contain the ending values for the corresponding -registers and IC. +registers and IC. @end defun -@defun ccl-execute-on-string ccl-program status str &optional continue +@defun ccl-execute-on-string ccl-program status string &optional continue Execute @var{ccl-program} with initial @var{status} on @var{string}. @var{ccl-program} is a vector of compiled CCL code created by @code{ccl-compile}. @var{status} must be a vector of nine @@ -1969,11 +1969,11 @@ values, specifying the initial value for the R0, R1 .. R7 registers and for the instruction counter IC. A @code{nil} value for a register initializer causes the register to be set to 0. A @code{nil} value for the IC initializer causes execution to start at the beginning of the -program. An optional fourth argument @var{continue}, if non-nil, causes +program. An optional fourth argument @var{continue}, if non-@code{nil}, causes the IC to remain on the unsatisfied read operation if the program terminates due to exhaustion of the input buffer. Otherwise the IC is set to the end -of the program. When the program is done, @var{status} is modified (by +of the program. When the program is done, @var{status} is modified (by side-effect) to contain the ending values for the corresponding registers and IC. Returns the resulting string. @end defun @@ -1982,9 +1982,9 @@ registers and IC. Returns the resulting string. registered: @defun register-ccl-program name ccl-program -Register @var{name} for CCL program @var{program} in -@code{ccl-program-table}. @var{program} should be the compiled form of -a CCL program, or nil. Return index number of the registered CCL +Register @var{name} for CCL program @var{ccl-program} in +@code{ccl-program-table}. @var{ccl-program} should be the compiled form of +a CCL program, or @code{nil}. Return index number of the registered CCL program. @end defun @@ -2034,8 +2034,8 @@ whether the character is in that category. Special Lisp functions are provided that abstract this, so you do not have to directly manipulate bit vectors. -@defun category-table-p obj -This function returns @code{t} if @var{arg} is a category table. +@defun category-table-p object +This function returns @code{t} if @var{object} is a category table. @end defun @defun category-table &optional buffer @@ -2049,24 +2049,23 @@ This function returns the standard category table. This is the one used for new buffers. @end defun -@defun copy-category-table &optional table -This function constructs a new category table and return it. It is a -copy of the @var{table}, which defaults to the standard category table. +@defun copy-category-table &optional category-table +This function returns a new category table which is a copy of +@var{category-table}, which defaults to the standard category table. @end defun -@defun set-category-table table &optional buffer -This function selects a new category table for @var{buffer}. One -argument, a category table. @var{buffer} defaults to the current buffer -if omitted. +@defun set-category-table category-table &optional buffer +This function selects @var{category-table} as the new category table for +@var{buffer}. @var{buffer} defaults to the current buffer if omitted. @end defun -@defun category-designator-p obj -This function returns @code{t} if @var{arg} is a category designator (a +@defun category-designator-p object +This function returns @code{t} if @var{object} is a category designator (a char in the range @samp{' '} to @samp{'~'}). @end defun -@defun category-table-value-p obj -This function returns @code{t} if @var{arg} is a category table value. +@defun category-table-value-p object +This function returns @code{t} if @var{object} is a category table value. Valid values are @code{nil} or a bit vector of size 95. @end defun diff --git a/man/lispref/numbers.texi b/man/lispref/numbers.texi index 241de5d..6258217 100644 --- a/man/lispref/numbers.texi +++ b/man/lispref/numbers.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/numbers.info @node Numbers, Strings and Characters, Lisp Data Types, Top @@ -37,17 +37,17 @@ they have a fixed, limited amount of precision. The range of values for an integer depends on the machine. The minimum range is @minus{}134217728 to 134217727 (28 bits; i.e., -@ifinfo +@ifinfo -2**27 @end ifinfo -@tex +@tex $-2^{27}$ @end tex -to -@ifinfo +to +@ifinfo 2**27 - 1), @end ifinfo -@tex +@tex $2^{27}-1$), @end tex but some machines may provide a wider range. Many examples in this @@ -410,8 +410,11 @@ if any argument is floating. 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. +@defun 1+ number +This function returns @var{number} plus one. @var{number} may be a +number, character or marker. Markers and characters are converted to +integers. + For example, @example @@ -442,18 +445,23 @@ more convenient and natural way to increment a variable is @w{@code{(incf foo)}}. @end defun -@defun 1- number-or-marker -This function returns @var{number-or-marker} minus 1. +@defun 1- number +This function returns @var{number} minus one. @var{number} may be a +number, character or marker. Markers and characters are converted to +integers. @end defun @defun abs number This returns the absolute value of @var{number}. @end defun -@defun + &rest numbers-or-markers +@defun + &rest numbers This function adds its arguments together. When given no arguments, @code{+} returns 0. +If any of the arguments are characters or markers, they are first +converted to integers. + @example (+) @result{} 0 @@ -464,12 +472,15 @@ This function adds its arguments together. When given no arguments, @end example @end defun -@defun - &optional number-or-marker &rest other-numbers-or-markers +@defun - &optional number &rest other-numbers 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. +the @var{other-numbers} from @var{number}, cumulatively. If there are +no arguments, an error is signaled. + +If any of the arguments are characters or markers, they are first +converted to integers. @example (- 10 1 2 3 4) @@ -481,10 +492,13 @@ cumulatively. If there are no arguments, the result is 0. @end example @end defun -@defun * &rest numbers-or-markers +@defun * &rest numbers This function multiplies its arguments together, and returns the product. When given no arguments, @code{*} returns 1. +If any of the arguments are characters or markers, they are first +converted to integers. + @example (*) @result{} 1 @@ -495,13 +509,14 @@ product. When given no arguments, @code{*} returns 1. @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. +@defun / dividend &rest divisors +The @code{/} function serves two purposes: inversion and division. When +@code{/} has a single argument, the value is the inverse of the +argument. When there are multiple arguments, @code{/} divides +@var{dividend} by each of the @var{divisors}, cumulatively, returning +the quotient. If there are no arguments, an error is signaled. -If all the arguments are integers, then the result is an integer too. +If none of the arguments are floats, then the result is an integer. 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 @@ -509,6 +524,9 @@ differently with negative arguments. This is because the Lisp function permits machine-dependent rounding. As a practical matter, all known machines round in the standard fashion. +If any of the arguments are characters or markers, they are first +converted to integers. + @cindex @code{arith-error} in division If you divide by 0, an @code{arith-error} error is signaled. (@xref{Errors}.) @@ -522,6 +540,8 @@ If you divide by 0, an @code{arith-error} error is signaled. @result{} 2 (/ 25 3 2) @result{} 4 +(/ 3.0) + @result{} 0.3333333333333333 (/ -17 6) @result{} -2 @end example @@ -627,23 +647,23 @@ 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 +@defun ffloor number +This function rounds @var{number} 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 +@defun fceiling number +This function rounds @var{number} 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 +@defun ftruncate number +This function rounds @var{number} 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, +@defun fround number +This function rounds @var{number} to the nearest integral value, and returns that value as a floating point number. @end defun @@ -698,7 +718,7 @@ like this (with 8-bit binary numbers): (lsh 3 2) @result{} 12 ;; @r{Decimal 3 becomes decimal 12.} -00000011 @result{} 00001100 +00000011 @result{} 00001100 @end group @end example @@ -709,14 +729,14 @@ On the other hand, shifting one place to the right looks like this: (lsh 6 -1) @result{} 3 ;; @r{Decimal 6 becomes decimal 3.} -00000110 @result{} 00000011 +00000110 @result{} 00000011 @end group @group (lsh 5 -1) @result{} 2 ;; @r{Decimal 5 becomes decimal 2.} -00000101 @result{} 00000010 +00000101 @result{} 00000010 @end group @end example @@ -739,7 +759,7 @@ 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 +0111 1111 1111 1111 1111 1111 1111 @end group @end example @@ -749,7 +769,7 @@ which becomes the following when left shifted: @example @group ;; @r{Decimal @minus{}2} -1111 1111 1111 1111 1111 1111 1110 +1111 1111 1111 1111 1111 1111 1110 @end group @end example @end defun @@ -770,10 +790,10 @@ looks like this: @example @group -(ash -6 -1) @result{} -3 +(ash -6 -1) @result{} -3 ;; @r{Decimal @minus{}6 becomes decimal @minus{}3.} 1111 1111 1111 1111 1111 1111 1010 - @result{} + @result{} 1111 1111 1111 1111 1111 1111 1101 @end group @end example @@ -786,7 +806,7 @@ In contrast, shifting the pattern of bits one place to the right with (lsh -6 -1) @result{} 134217725 ;; @r{Decimal @minus{}6 becomes decimal 134,217,725.} 1111 1111 1111 1111 1111 1111 1010 - @result{} + @result{} 0111 1111 1111 1111 1111 1111 1101 @end group @end example @@ -944,7 +964,7 @@ 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) +(lognot 5) @result{} -6 ;; 5 = @r{0000 0000 0000 0000 0000 0000 0101} ;; @r{becomes} @@ -961,71 +981,60 @@ These mathematical functions are available if floating point is supported (which is the normal state of affairs). They allow integers as well as floating point numbers as arguments. -@defun sin arg -@defunx cos arg -@defunx tan arg +@defun sin number +@defunx cos number +@defunx tan number 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} +@defun asin number +The value of @code{(asin @var{number})} is a number between @minus{}pi/2 +and pi/2 (inclusive) whose sine is @var{number}; if, however, @var{number} 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} +@defun acos number +The value of @code{(acos @var{number})} is a number between 0 and pi +(inclusive) whose cosine is @var{number}; if, however, @var{number} 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}. +@defun atan number &optional number2 +The value of @code{(atan @var{number})} is a number between @minus{}pi/2 +and pi/2 (exclusive) whose tangent is @var{number}. + +If optional argument @var{number2} is supplied, the function returns +@code{atan2(@var{number},@var{number2})}. @end defun -@defun sinh arg -@defunx cosh arg -@defunx tanh arg +@defun sinh number +@defunx cosh number +@defunx tanh number These are the ordinary hyperbolic trigonometric functions. @end defun -@defun asinh arg -@defunx acosh arg -@defunx atanh arg +@defun asinh number +@defunx acosh number +@defunx atanh number These are the inverse hyperbolic trigonometric functions. @end defun -@defun exp arg +@defun exp number This is the exponential function; it returns @i{e} to the power -@var{arg}. @i{e} is a fundamental mathematical constant also called the +@var{number}. @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} +@defun log number &optional base +This function returns the logarithm of @var{number}, with base @var{base}. +If you don't specify @var{base}, the base @var{e} is used. If @var{number} 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})} +@defun log10 number +This function returns the logarithm of @var{number}, with base 10. If +@var{number} is negative, the result is a NaN. @code{(log10 @var{x})} @equiv{} @code{(log @var{x} 10)}, at least approximately. @end defun @@ -1036,13 +1045,13 @@ 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, +@defun sqrt number +This returns the square root of @var{number}. If @var{number} is negative, the value is a NaN. @end defun -@defun cube-root arg -This returns the cube root of @var{arg}. +@defun cube-root number +This returns the cube root of @var{number}. @end defun @node Random Numbers diff --git a/man/lispref/objects.texi b/man/lispref/objects.texi index 320c41e..e14d9f9 100644 --- a/man/lispref/objects.texi +++ b/man/lispref/objects.texi @@ -1081,11 +1081,11 @@ where @var{property-data} consists of zero or more elements, in groups of three as follows: @example -@var{beg} @var{end} @var{plist} +@var{start} @var{end} @var{plist} @end example @noindent -The elements @var{beg} and @var{end} are integers, and together specify +The elements @var{start} and @var{end} are integers, and together specify a range of indices in the string; @var{plist} is the property list for that range. @end ignore @@ -2255,7 +2255,7 @@ to @code{old-eq} when executed under XEmacs 20. @end defun -@defun old-eq obj1 obj2 +@defun old-eq object1 object2 This function exists under XEmacs 20 and is exactly like @code{eq} except that it suffers from the char-int confoundance disease. In other words, it returns @code{t} if given a character and the diff --git a/man/lispref/os.texi b/man/lispref/os.texi index afe40ac..67d1ff3 100644 --- a/man/lispref/os.texi +++ b/man/lispref/os.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/os.info @node System Interface, X-Windows, Processes, Top @@ -77,13 +77,13 @@ It loads the library @file{site-start}, unless the option @file{site-start.el}. @cindex @file{site-start.el} -@item +@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 +@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 @@ -98,7 +98,7 @@ 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 +@item It loads the terminal-specific Lisp file, if any, except when in batch mode or using a window system. @@ -106,10 +106,10 @@ mode or using a window system. It displays the initial echo area message, unless you have suppressed that with @code{inhibit-startup-echo-area-message}. -@item +@item It processes the action arguments from the command line. -@item +@item It runs @code{term-setup-hook}. @item @@ -117,10 +117,10 @@ It calls @code{frame-notice-user-settings}, which modifies the parameters of the selected frame according to whatever the init files specify. -@item +@item It runs @code{window-setup-hook}. @xref{Terminal-Specific}. -@item +@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}. @@ -272,7 +272,7 @@ 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 +@defvar term-setup-hook This variable is a normal hook that XEmacs runs after loading your @file{.emacs} file, the default initialization file (if any) and the terminal-specific Lisp file. @@ -346,7 +346,7 @@ form: -@var{option} @end example -The elements of the @code{command-switch-alist} look like this: +The elements of the @code{command-switch-alist} look like this: @example (@var{option} . @var{handler-function}) @@ -416,7 +416,7 @@ common. parent process normally resumes control. The low-level primitive for killing XEmacs is @code{kill-emacs}. -@defun kill-emacs &optional exit-data +@deffn Command kill-emacs &optional exit-data This function exits the XEmacs process and kills it. If @var{exit-data} is an integer, then it is used as the exit status @@ -426,7 +426,7 @@ of the XEmacs process. (This is useful primarily in batch operation; see 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 +@end deffn All the information in the XEmacs process, aside from files that have been saved, is lost when the XEmacs is killed. Because killing XEmacs @@ -470,15 +470,15 @@ 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 XEmacs is an X client. -@defun suspend-emacs string +@deffn Command suspend-emacs &optional stuffstring This function stops XEmacs and returns control to the superior process. If and when the superior process resumes XEmacs, @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 XEmacs's superior shell. The characters in -@var{string} are not echoed by the superior shell; only the results -appear. +If optional arg @var{stuffstring} is non-@code{nil}, its characters are +sent to be read as terminal input by XEmacs's superior shell. The +characters in @var{stuffstring} 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 @@ -538,7 +538,7 @@ lewis@@slug[24] % fg Resumed! @end group @end smallexample -@end defun +@end deffn @defvar suspend-hook This variable is a normal hook run before suspending. @@ -597,9 +597,6 @@ UniSoft UniPlus. @item usg-unix-v AT&T System V. -@item vax-vms -VAX VMS. - @item windows-nt Microsoft windows NT. @@ -645,12 +642,14 @@ done when XEmacs starts up, the value actually used is the one saved when XEmacs was dumped. @xref{Building XEmacs}.) @end defvar -@defun getenv var +@deffn Command getenv var &optional interactivep @cindex environment variable access This function returns the value of the environment variable @var{var}, as a string. Within XEmacs, the environment variable values are kept in the Lisp variable @code{process-environment}. +When invoked interactively, @code{getenv} prints the value in the echo area. + @example @group (getenv "USER") @@ -668,10 +667,9 @@ SHELL=/bin/csh HOME=/user/lewis @end group @end example -@end defun +@end deffn -@c Emacs 19 feature -@deffn Command setenv variable value +@deffn Command setenv variable &optional value unset 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 @@ -680,18 +678,18 @@ variable with @code{let} is also reasonable practice. @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. +variable. The functions @code{getenv} and @code{setenv} work by +manipulating this variable. @smallexample @group process-environment @result{} ("l=/usr/stanford/lib/gnuemacs/lisp" "PATH=.:/user/lewis/bin:/usr/class:/nfsusr/local/bin" - "USER=lewis" + "USER=lewis" @end group @group - "TERM=ibmapa16" + "TERM=ibmapa16" "SHELL=/bin/csh" "HOME=/user/lewis") @end group @@ -729,7 +727,7 @@ This function returns a list of the current 1-minute, 5-minute and system load averages. (The load averages indicate the number of processes trying to run.) -When @var{use-floats} is non-@code{nil}, floats will be returned instead +When @var{use-floats} is non-@code{nil}, floats will be returned instead of integers. These floats are not multiplied by 100. @example @@ -750,7 +748,7 @@ lewis@@rocky[5] % uptime If the 5-minute or 15-minute load averages are not available, return a shortened list, containing only those averages which are available. -On some systems, this function may require special privileges to run, or +On some systems, this function may require special privileges to run, or it may be unimplemented for the particular system type. In that case, the function will signal an error. @end defun @@ -759,18 +757,6 @@ the function will signal an error. 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 @@ -807,7 +793,7 @@ environment variables @code{LOGNAME} and @code{USER}. @defvar user-full-name This variable holds the name of the user running this Emacs. It is initialized at startup time from the value of @code{NAME} environment -variable. You can change the value of this variable to alter the result +variable. You can change the value of this variable to alter the result of the @code{user-full-name} function. @end defvar @@ -817,7 +803,7 @@ This function returns the full name of @var{user}. If @var{user} is the value of @code{user-full-name} variable, if non-@code{nil}, will be used. -If @var{user} is specified explicitly, @code{user-full-name} variable is +If @var{user} is specified explicitly, @code{user-full-name} variable is ignored. @example @@ -855,7 +841,7 @@ This function returns the real @sc{uid} of the user. @end defun @defun user-uid -This function returns the effective @sc{uid} of the user. +This function returns the effective @sc{uid} of the user. @end defun @defun user-home-directory @@ -1052,9 +1038,14 @@ This stands for the time zone abbreviation. @end table @end defun -@defun decode-time time +@defun decode-time &optional specified-time This function converts a time value into calendrical information. The -return value is a list of nine elements, as follows: +optional @var{specified-time} should be a list of +(@var{high} @var{low} . @var{ignored}) or (@var{high} . @var{low}), as from +@code{current-time} and @code{file-attributes}, or @code{nil} to use the +current time. + +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}) @@ -1117,8 +1108,8 @@ has elapsed. @var{secs} is a number of seconds, expressed as an integer or a float. @var{function} will be called after that many seconds have elapsed, with one argument, the given @var{object}. If the optional @var{resignal} argument is provided, then after this timeout expires, -`add-timeout' will automatically be called again with @var{resignal} as the -first argument. +@code{add-timeout} will automatically be called again with +@var{resignal} as the first argument. This function returns an object which is the @dfn{id} of this particular timeout. You can pass that object to @code{disable-timeout} to turn off @@ -1170,7 +1161,7 @@ functions. @cindex input modes @cindex terminal input modes -@defun set-input-mode interrupt flow meta quit-char +@defun set-input-mode interrupt flow meta &optional quit-char console This function sets the mode for reading keyboard input. If @var{interrupt} is non-null, then XEmacs uses input interrupts. If it is @code{nil}, then it uses @sc{cbreak} mode. When XEmacs communicates @@ -1203,7 +1194,7 @@ The @code{current-input-mode} function returns the input mode settings XEmacs is currently using. @c Emacs 19 feature -@defun current-input-mode +@defun current-input-mode &optional console 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 @@ -1306,10 +1297,11 @@ such as @code{recent-keys} and dribble files record the characters after translation. @end defvar -@defun keyboard-translate from to +@defun keyboard-translate &rest pairs 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. +or enlarges the translate table if necessary. Multiple +@var{from}-@var{to} pairs may be specified. @end defun @end ignore @@ -1441,7 +1433,7 @@ return. By default, 100 events are stored. @end defun @defun set-recent-keys-ring-size size -This function changes the number of events stored by XEmacs and returned +This function changes the number of events stored by XEmacs and returned by @code{recent-keys}. For example, @code{(set-recent-keys-ring-size 250)} will make XEmacs @@ -1449,7 +1441,7 @@ remember last 250 events and will make @code{recent-keys} return last 250 events by default. @end defun -@deffn Command open-dribble-file filename +@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 @@ -1505,10 +1497,10 @@ the proper value, but others do not. If XEmacs has the wrong value, it makes decisions that are less than optimal. To fix the problem, use @code{set-device-baud-rate}. -@defun set-device-baud-rate &optional device +@defun set-device-baud-rate device baud-rate This function sets the output speed of @var{device}. See @code{device-baud-rate}. @var{device} defaults to the selected device -(usually the only device) if omitted. +(usually the only device) if @code{nil}. @end defun @defun send-string-to-terminal char-or-string &optional stdout-p device @@ -1629,11 +1621,15 @@ terminals, this problem is gradually being cured. For the mean time, XEmacs provides a convenient way of enabling flow control if you want it: call the function @code{enable-flow-control}. -@defun enable-flow-control +@deffn Command enable-flow-control &optional argument 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 + +With optional argument @var{argument} (interactively the prefix +argument), enable flow control mode if @var{argument} is positive; else +disable it. +@end deffn You can use the function @code{enable-flow-control-on} in your @file{.emacs} file to enable flow control automatically on certain diff --git a/man/lispref/positions.texi b/man/lispref/positions.texi index 1383201..85e05a7 100644 --- a/man/lispref/positions.texi +++ b/man/lispref/positions.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/positions.info @node Positions, Markers, Consoles and Devices, Top @@ -249,26 +249,26 @@ Likewise, to move to the end of the buffer, use: 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 +@deffn Command beginning-of-buffer &optional count 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. +mark at the previous position. If @var{count} is non-@code{nil}, then it +puts point @var{count} 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}. +In an interactive call, @var{count} is the numeric prefix argument, +if provided; otherwise @var{count} defaults to @code{nil}. Don't use this function in Lisp programs! @end deffn -@deffn Command end-of-buffer &optional n +@deffn Command end-of-buffer &optional count 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. +at the previous position. If @var{count} is non-@code{nil}, then it puts +point @var{count} 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}. +In an interactive call, @var{count} is the numeric prefix argument, +if provided; otherwise @var{count} defaults to @code{nil}. Don't use this function in Lisp programs! @end deffn @@ -353,7 +353,7 @@ 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 +@defun count-lines start end &optional ignore-invisible-lines-flag @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 @@ -362,6 +362,16 @@ This function returns the number of lines between the positions because the text between them, considered in isolation, must contain at least one line unless it is empty. +With optional @var{ignore-invisible-lines-flag} non-@code{nil}, lines +collapsed with selective-display are excluded from the line count. + +@strong{Note:} The expression to return the current line number is not +obvious: + +@example +(1+ (count-lines 1 (point-at-bol))) +@end example + Here is an example of using @code{count-lines}: @example @@ -475,7 +485,7 @@ performance of your code. @xref{Text Lines, cache-long-line-scans}. This function moves point to the start of the frame line @var{count} frame lines down from the frame line containing point. If @var{count} is negative, it moves up instead. The optional second argument -@var{window} may be used to specify a window other than the +@var{window} may be used to specify a window other than the selected window in which to perform the motion. Normally, @code{vertical-motion} returns the number of lines moved. The @@ -592,7 +602,7 @@ beginning of the first screen line. @xref{Minibuffer Misc}. @end ignore @node List Motion -@subsection Moving over Balanced Expressions +@subsection Moving over Balanced Expressions @cindex sexp motion @cindex Lisp expression motion @cindex list motion @@ -612,29 +622,30 @@ quotes are ignored.) @var{arg} defaults to 1 if omitted. If @var{arg} is negative, move backward across that many groups of parentheses. @end deffn -@deffn Command backward-list &optional arg -This function moves backward across @var{arg} balanced groups of +@deffn Command backward-list &optional count +This function moves backward across @var{count} balanced groups of parentheses. (Other syntactic entities such as words or paired string -quotes are ignored.) @var{arg} defaults to 1 if omitted. If @var{arg} -is negative, move forward across that many groups of parentheses. +quotes are ignored.) @var{count} defaults to 1 if omitted. If +@var{count} is negative, move forward across that many groups of +parentheses. @end deffn -@deffn Command up-list arg -This function moves forward out of @var{arg} levels of parentheses. +@deffn Command up-list &optional count +This function moves forward out of @var{count} 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). +@deffn Command down-list &optional count +This function moves forward into @var{count} levels of parentheses. +A negative argument means move backward but still go deeper in +parentheses (@minus{}@var{count} levels). @end deffn -@deffn Command forward-sexp &optional arg -This function moves forward across @var{arg} balanced expressions. +@deffn Command forward-sexp &optional count +This function moves forward across @var{count} balanced expressions. Balanced expressions include both those delimited by parentheses and -other kinds, such as words and string constants. @var{arg} defaults to -1 if omitted. If @var{arg} is negative, move backward across that many +other kinds, such as words and string constants. @var{count} defaults to +1 if omitted. If @var{count} is negative, move backward across that many balanced expressions. For example, @example @@ -655,24 +666,24 @@ balanced expressions. For example, @end example @end deffn -@deffn Command backward-sexp &optional arg -This function moves backward across @var{arg} balanced expressions. -@var{arg} defaults to 1 if omitted. If @var{arg} is negative, move +@deffn Command backward-sexp &optional count +This function moves backward across @var{count} balanced expressions. +@var{count} defaults to 1 if omitted. If @var{count} is negative, move forward across that many balanced expressions. @end deffn -@deffn Command beginning-of-defun &optional 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. @var{arg} defaults -to 1 if omitted. +@deffn Command beginning-of-defun &optional count +This function moves back to the @var{count}th beginning of a defun. +If @var{count} is negative, this actually moves forward, but it still +moves to the beginning of a defun, not to the end of one. @var{count} +defaults to 1 if omitted. @end deffn -@deffn Command end-of-defun &optional 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. @var{arg} defaults -to 1 if omitted. +@deffn Command end-of-defun &optional count +This function moves forward to the @var{count}th end of a defun. +If @var{count} is negative, this actually moves backward, but it still +moves to the end of a defun, not to the beginning of one. @var{count} +defaults to 1 if omitted. @end deffn @defopt defun-prompt-regexp @@ -813,9 +824,9 @@ This special form evaluates @var{forms} with @var{buffer} as the current buffer. It returns the value of the last form. @end defspec -@defspec with-temp-file file forms@dots{} +@defspec with-temp-file filename forms@dots{} This special form creates a new buffer, evaluates @var{forms} there, and -writes the buffer to @var{file}. It returns the value of the last form +writes the buffer to @var{filename}. It returns the value of the last form evaluated. @end defspec @@ -925,13 +936,13 @@ tool for the job. Here is what you must use instead: @example @group -(let ((beg (point-min-marker)) +(let ((start (point-min-marker)) (end (point-max-marker))) (unwind-protect (progn @var{body}) (save-excursion - (set-buffer (marker-buffer beg)) - (narrow-to-region beg end)))) + (set-buffer (marker-buffer start)) + (narrow-to-region start end)))) @end group @end example diff --git a/man/lispref/postgresql.texi b/man/lispref/postgresql.texi index f565f44..d22ab29 100644 --- a/man/lispref/postgresql.texi +++ b/man/lispref/postgresql.texi @@ -781,7 +781,7 @@ Returns: t if successfully submitted Retrieve an asynchronous result from a query. @var{conn} A database connection object. -NIL is returned when no more query work remains. +@code{nil} is returned when no more query work remains. @end defun @defun pq-set-nonblocking conn arg diff --git a/man/lispref/processes.texi b/man/lispref/processes.texi index f664474..d750074 100644 --- a/man/lispref/processes.texi +++ b/man/lispref/processes.texi @@ -60,7 +60,7 @@ 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 + Synchronous and asynchronous processes are explained in the following sections. Since the three functions are all called in a similar fashion, their common arguments are described here. @@ -98,6 +98,10 @@ since they are passed directly to the specified program. name of the program; it may not contain any command-line arguments. You must use @var{args} to provide those. +If you want to use features of the shell, then invoke the shell directly +using, for example, @var{program} of @code{"sh"}, and @var{args} of +@code{"-c"} and @var{"command line..."}. + The subprocess gets its current directory from the value of @code{default-directory} (@pxref{File Name Expansion}). @@ -246,13 +250,13 @@ of @code{call-process}: @end smallexample @end defun -@defun call-process-region start end program &optional delete destination display &rest args +@defun call-process-region start end program &optional deletep destination displayp &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} +sent if @var{deletep} 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 +The arguments @var{destination} and @var{displayp} 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, @@ -406,7 +410,9 @@ 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. +to waste them. A rule of thumb is to use ptys for processes the user +interacts with directly, and pipes for processes that are hidden from +the user. The value @code{process-connection-type} is used when @code{start-process} is called. So you can specify how to communicate @@ -425,6 +431,16 @@ To determine whether a given subprocess actually got a pipe or a Information}). @end defvar +Lisp functions that manipulate processes usually accept a @var{process} +argument. Besides using an actual process object for this argument, you +can use a process name, a buffer object, the name of a buffer, or +@code{nil}. Specifying a buffer or buffer name for the @var{process} +argument means use the process associated with the buffer (or the most +recent one, if there is more than one). @code{nil} means use the +process associated with the current buffer. +@xref{Process Information}. +@xref{Process Buffers}. + @node Deleting Processes @section Deleting Processes @cindex deleting processes @@ -500,9 +516,12 @@ This function returns a list of all processes that have not been deleted. @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. +@defun get-process process-name +This function returns the process named @var{process-name}. If +@var{process-name} is a string and there is no process with that name, the +value is @code{nil}. If @var{process-name} is actually a process, it is +returned as given. (That is not very useful, so the argument is usually +a name.) For example: @smallexample @group @@ -538,9 +557,9 @@ process is started and remains constant as long as the process exists. 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 +@defun process-status process +This function returns the status of @var{process} as a symbol. +The argument @var{process} must be a process, a buffer, a process name (string) or a buffer name (string). The possible values for an actual subprocess are: @@ -561,7 +580,7 @@ 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. +if @var{process} does not identify an existing process. @end table @smallexample @@ -619,15 +638,21 @@ 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. +@sc{pty}. On these systems, XEmacs sends long input in chunks, with +@sc{eof} characters added amidst the other characters, to force the +operating system to periodically drain the input buffer. For most +programs, these @sc{eof}s do no harm. + +@defun process-send-string process string &optional start end +This function sends @var{process} the contents of @var{string} as +standard input. -@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 argument @var{process} may be a process or the name of a process, or +a buffer or the name of a buffer, in which case the buffer's process is +used. If it is @code{nil}, the current buffer's process is used. + +Optional arguments @var{start} and @var{end} specify part of @var{string}; +see @code{substring}. The function returns @code{nil}. @@ -650,26 +675,28 @@ introduction.txt text.texi~ @end smallexample @end defun -@deffn Command process-send-region process-name start end +@defun process-send-region process start end &optional buffer 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.) +@var{end} as standard input to @var{process}. + +The argument @var{process} may be a process or the name of a process, or +a buffer or the name of a buffer, in which case the buffer's process is +used. 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 +@end defun -@defun process-send-eof &optional process-name - This function makes @var{process-name} see an end-of-file in its +@defun process-send-eof &optional process + This function makes @var{process} 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. +@var{process} may be a process, a buffer, the name of a process or +buffer, or @code{nil}, indicating the current buffer's process. An +error is signaled if @var{process} does not identify any process. - The function returns @var{process-name}. +The function returns the process object identified by @var{process}. @smallexample @group @@ -779,11 +806,11 @@ it the signal @code{SIGCONT}. This presumes that @var{process} was stopped previously. @end defun -@defun signal-process pid signal +@deffn Command signal-process pid signal This function sends a signal to the process with process id @var{pid}, which need not be a child of XEmacs. The argument @var{signal} specifies which signal to send. -@end defun +@end deffn @node Output from Processes @section Receiving Output from Processes @@ -862,10 +889,10 @@ associated with no buffer. @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. +If there are several processes associated with @var{buffer-or-name}, +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 @@ -926,20 +953,20 @@ Here is how to do these things: @smallexample @group -(defun ordinary-insertion-filter (proc string) +(defun ordinary-insertion-filter (process string) (let ((old-buffer (current-buffer))) (unwind-protect (let (moving) - (set-buffer (process-buffer proc)) - (setq moving (= (point) (process-mark proc))) + (set-buffer (process-buffer process)) + (setq moving (= (point) (process-mark process))) @end group @group (save-excursion ;; @r{Insert the text, moving the process-marker.} - (goto-char (process-mark proc)) + (goto-char (process-mark process)) (insert string) - (set-marker (process-mark proc) (point))) - (if moving (goto-char (process-mark proc)))) + (set-marker (process-mark process) (point))) + (if moving (goto-char (process-mark process)))) (set-buffer old-buffer)))) @end group @end smallexample @@ -954,7 +981,7 @@ text arrives, insert the following line just before the @code{unwind-protect}: @smallexample -(display-buffer (process-buffer proc)) +(display-buffer (process-buffer process)) @end smallexample To force point to move to the end of the new output no matter where @@ -1032,15 +1059,15 @@ there is no filter function: @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) +(defun my-process-filter (process string) (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)) + (insert string) + (set-marker (process-mark process) (point-max)) (select-window cur))) @end group @end smallexample @@ -1254,21 +1281,35 @@ 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 +@defun open-network-stream name buffer-or-name host service &optional protocol This function opens a TCP connection for a service to a host. It returns a process object to represent the connection. +Input and output work as for other process objects. +@code{delete-process} closes 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. +connection. It can be a buffer or the name of one. 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 or IP address (a string), and @var{service} is the name of a defined network service (a string) or a port number (an integer). + +Optional fifth arg @var{protocol} is the network protocol to use. +Currently only @code{tcp} (Transmission Control Protocol) and @code{udp} +(User Datagram Protocol) are supported. When omitted, @code{tcp} is assumed. + +Output via @code{process-send-string} and input via buffer or filter +(see @code{set-process-filter}) are stream-oriented. That means +UDP datagrams are not guaranteed to be sent and received in +discrete packets. (But small datagrams around 500 bytes that are not +truncated by @code{process-send-string} are usually fine.) Note further +that the UDP protocol does not guard against lost packets. @end defun diff --git a/man/lispref/range-tables.texi b/man/lispref/range-tables.texi index 900eda5..6424d49 100644 --- a/man/lispref/range-tables.texi +++ b/man/lispref/range-tables.texi @@ -36,37 +36,38 @@ Return non-@code{nil} if @var{object} is a range table. Make a new, empty range table. @end defun -@defun copy-range-table old-table -Make a new range table which contains the same values for the same -ranges as the given table. The values will not themselves be copied. +@defun copy-range-table range-table +This function returns a new range table which contains the same values +for the same ranges as @var{range-table}. The values will not +themselves be copied. @end defun @node Working With Range Tables @section Working With Range Tables -@defun get-range-table pos table &optional default -This function finds value for position @var{pos} in @var{table}. If -there is no corresponding value, return @var{default} (defaults to +@defun get-range-table pos range-table &optional default +This function finds value for position @var{pos} in @var{range-table}. +If there is no corresponding value, return @var{default} (defaults to @code{nil}). @end defun -@defun put-range-table start end val table +@defun put-range-table start end value range-table This function sets the value for range (@var{start}, @var{end}) to be -@var{val} in @var{table}. +@var{value} in @var{range-table}. @end defun -@defun remove-range-table start end table +@defun remove-range-table start end range-table This function removes the value for range (@var{start}, @var{end}) in -@var{table}. +@var{range-table}. @end defun -@defun clear-range-table table -This function flushes @var{table}. +@defun clear-range-table range-table +This function flushes @var{range-table}. @end defun -@defun map-range-table function table -This function maps @var{function} over entries in @var{table}, calling -it with three args, the beginning and end of the range and the +@defun map-range-table function range-table +This function maps @var{function} over entries in @var{range-table}, +calling it with three args, the beginning and end of the range and the corresponding value. @end defun diff --git a/man/lispref/searching.texi b/man/lispref/searching.texi index 2436514..a8ec820 100644 --- a/man/lispref/searching.texi +++ b/man/lispref/searching.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/searching.info @node Searching and Matching, Syntax Tables, Text, Top @@ -35,15 +35,14 @@ portions of it. 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} +@var{limit} and @var{noerror} are set to @code{nil}, and @var{count} is set to 1. -@deffn Command search-forward string &optional limit noerror repeat +@deffn Command search-forward string &optional limit noerror count buffer 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 @@ -81,25 +80,26 @@ 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. +If @var{count} is supplied (it must be an integer), then the search is +repeated that many times (each time starting at the end of the previous +time's match). If @var{count} is negative, the search direction is +backward. If the successive searches succeed, the function succeeds, +moving point and returning its new value. Otherwise the search fails. + +@var{buffer} is the buffer to search in, and defaults to the current buffer. @end deffn -@deffn Command search-backward string &optional limit noerror repeat +@deffn Command search-backward string &optional limit noerror count buffer 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 +@deffn Command word-search-forward string &optional limit noerror count buffer @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 @@ -140,11 +140,13 @@ 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 +If @var{count} is non-@code{nil}, then the search is repeated that many times. Point is positioned at the end of the last match. + +@var{buffer} is the buffer to search in, and defaults to the current buffer. @end deffn -@deffn Command word-search-backward string &optional limit noerror repeat +@deffn Command word-search-backward string &optional limit noerror count buffer 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 @@ -585,7 +587,7 @@ whitespace: Here is a complicated regexp, used by XEmacs to recognize the end of a sentence together with any whitespace that follows. It is the value of -the variable @code{sentence-end}. +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 @@ -604,7 +606,7 @@ will see the following: @group sentence-end @result{} -"[.?!][]\"')@}]*\\($\\| $\\| \\| \\)[ +"[.?!][]\"')@}]*\\($\\| $\\| \\| \\)[ ]*" @end group @end example @@ -655,7 +657,7 @@ Search, emacs, The XEmacs Reference 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 +@deffn Command re-search-forward regexp &optional limit noerror count buffer 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 @@ -674,7 +676,7 @@ error is signaled. If @var{noerror} is @code{t}, @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 +If @var{count} 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 @@ -704,7 +706,7 @@ comes back" twice. @end example @end deffn -@deffn Command re-search-backward regexp &optional limit noerror repeat +@deffn Command re-search-backward regexp &optional limit noerror count buffer 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. @@ -723,12 +725,17 @@ 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 +@defun string-match regexp string &optional start buffer 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}. + +Optional arg @var{buffer} controls how case folding is done (according +to the value of @code{case-fold-search} in @var{buffer} and +@var{buffer}'s case tables) and defaults to the current buffer. + For example, @example @@ -801,7 +808,7 @@ components are separated with the characters specified with be @samp{:}, while under Windows, it will be @samp{;}. @end defun -@defun looking-at regexp +@defun looking-at regexp &optional buffer 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 @@ -846,28 +853,32 @@ 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 +@deffn Command posix-search-forward regexp &optional limit noerror count buffer 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 +@end deffn -@defun posix-search-backward regexp &optional limit noerror repeat +@deffn Command posix-search-backward regexp &optional limit noerror count buffer 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 +@end deffn -@defun posix-looking-at regexp +@defun posix-looking-at regexp &optional buffer 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 +@defun posix-string-match regexp string &optional start buffer This is like @code{string-match} except that it performs the full backtracking specified by the POSIX standard for regular expression matching. + +Optional arg @var{buffer} controls how case folding is done (according +to the value of @code{case-fold-search} in @var{buffer} and +@var{buffer}'s case tables) and defaults to the current buffer. @end defun @ignore @@ -900,29 +911,29 @@ that all men are created @end deffn @deffn Command flush-lines regexp -This function is the same as @code{delete-matching-lines}. +This function is an alias of @code{delete-matching-lines}. @end deffn -@defun delete-non-matching-lines regexp +@deffn Command 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 +@end deffn @deffn Command keep-lines regexp This function is the same as @code{delete-non-matching-lines}. @end deffn -@deffn Command how-many regexp +@deffn Command count-matches 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}. +@deffn Command how-many regexp +This function is an alias of @code{count-matches}. @end deffn -@deffn Command list-matching-lines regexp nlines +@deffn Command list-matching-lines regexp &optional 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, @@ -1124,7 +1135,7 @@ positions within the text: @group (string-match "\\(qu\\)\\(ick\\)" "The quick fox jumped quickly.") - ;0123456789 + ;0123456789 @result{} 4 @end group @@ -1191,7 +1202,7 @@ character of the buffer counts as 1.) @var{replacement}. @cindex case in replacements -@defun replace-match replacement &optional fixedcase literal string +@defun replace-match replacement &optional fixedcase literal string strbuffer 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}. @@ -1205,6 +1216,12 @@ 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 the fourth argument @var{string} is a string, fifth argument +@var{strbuffer} specifies the buffer to be used for syntax-table and +case-table lookup and defaults to the current buffer. When @var{string} +is not a string, the buffer that the match occurred in has automatically +been remembered and you do not need to specify it. + 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 @@ -1216,7 +1233,7 @@ 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}. +regardless of the value of @var{fixedcase}. @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. @@ -1247,7 +1264,7 @@ Subexpressions are those expressions grouped inside @samp{\(@dots{}\)}. The functions @code{match-data} and @code{set-match-data} read or write the entire match data, all at once. -@defun match-data +@defun match-data &optional integers reuse 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 @@ -1272,9 +1289,13 @@ 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.) +string with @code{string-match}. However, if the optional first +argument @var{integers} is non-@code{nil}, always use integers (rather +than markers) to represent buffer positions. + +If the optional second argument @var{reuse} is a list, reuse it as part +of the value. If @var{reuse} is long enough to hold all the values, and if +@var{integers} is non-@code{nil}, no new lisp objects are created. 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 @@ -1324,10 +1345,10 @@ that shows the problem that arises if you fail to save the match data: You can save and restore the match data with @code{save-match-data}: -@defmac save-match-data body@dots{} +@defspec save-match-data body@dots{} This special form executes @var{body}, saving and restoring the match data around it. -@end defmac +@end defspec 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 diff --git a/man/lispref/sequences.texi b/man/lispref/sequences.texi index fd7f170..43bab70 100644 --- a/man/lispref/sequences.texi +++ b/man/lispref/sequences.texi @@ -603,9 +603,9 @@ This function returns @code{t} if @var{object} is a bit vector. This function returns @code{t} if @var{object} is either 0 or 1. @end defun -@defun bit-vector &rest objects +@defun bit-vector &rest bits This function creates and returns a bit vector whose elements are the -arguments @var{objects}. The elements must be either of the two +arguments @var{bits}. Each argument must be a bit, i.e. one of the two integers 0 or 1. @example @@ -618,9 +618,10 @@ integers 0 or 1. @end example @end defun -@defun make-bit-vector length object +@defun make-bit-vector length bit This function creates and returns a bit vector consisting of -@var{length} elements, each initialized to @var{object}. +@var{length} elements, each initialized to @var{bit}, which must be +one of the two integers 0 or 1. @example @group diff --git a/man/lispref/specifiers.texi b/man/lispref/specifiers.texi index 660d251..adb36ff 100644 --- a/man/lispref/specifiers.texi +++ b/man/lispref/specifiers.texi @@ -478,7 +478,7 @@ In many circumstances, the higher-level function @code{set-specifier} is more convenient and should be used instead. @end defun -@deffn Macro let-specifier specifier-list &rest body +@defspec let-specifier specifier-list &rest body This special form temporarily adds specifications to specifiers, evaluates forms in @var{body} and restores the specifiers to their previous states. The specifiers and their temporary specifications are @@ -516,9 +516,9 @@ selected window for the duration of a second: (let-specifier ((modeline-shadow-thickness 0 (selected-window))) (sit-for 1)) @end example -@end deffn +@end defspec -@defun set-specifier specifier value &optional how-to-add +@defun set-specifier specifier value &optional locale tag-set how-to-add This function adds some specifications to @var{specifier}. @var{value} can be a single instantiator or tagged instantiator (added as a global specification), a list of tagged and/or untagged instantiators (added as @@ -527,7 +527,8 @@ and instantiator list, a list of such conses, or nearly any other reasonable form. More specifically, @var{value} can be anything accepted by @code{canonicalize-spec-list}. -@var{how-to-add} is the same as in @code{add-spec-to-specifier}. +@var{locale}, @var{tag-set}, and @var{how-to-add} are the same as in +@code{add-spec-to-specifier}. Note that @code{set-specifier} is exactly complementary to @code{specifier-specs} except in the case where @var{specifier} has no @@ -626,7 +627,7 @@ If @var{locale} is a particular locale (a window, buffer, frame, device, or the symbol @code{global}), a spec-list consisting of the specification for that locale will be returned. -If @var{locale} is a locale type (i.e. a symbol @code{window}, +If @var{locale} is a locale type (i.e. one of the symbols @code{window}, @code{buffer}, @code{frame}, or @code{device}), a spec-list of the specifications for all locales of that type will be returned. @@ -639,7 +640,7 @@ on each element of the list and the results concatenated together. Only instantiators where @var{tag-set} (a list of zero or more tags) is a subset of (or possibly equal to) the instantiator's tag set are -returned. (The default value of@code{ nil} is a subset of all tag sets, +returned. (The default value of @code{nil} is a subset of all tag sets, so in this case no instantiators will be screened out.) If @var{exact-p} is non-@code{nil}, however, @var{tag-set} must be equal to an instantiator's tag set for the instantiator to be returned. @@ -922,8 +923,8 @@ whose value can be per-buffer, per-window, per-frame, or per-device, and can further be restricted to a particular device-type or device-class. Specifiers are used, for example, for the various built-in properties of a face; this allows a face to have different values in different frames, -buffers, etc. For more information, see `specifier-instance', -`specifier-specs', and `add-spec-to-specifier'; or, for a detailed +buffers, etc. For more information, see @code{specifier-instance}, +@code{specifier-specs}, and @code{add-spec-to-specifier}; or, for a detailed description of specifiers, including how they are instantiated over a particular domain (i.e. how their value in that domain is determined), see the chapter on specifiers in the XEmacs Lisp Reference Manual. @@ -1024,7 +1025,7 @@ buffer, and @code{global}. (@code{nil} is not valid.) @end defun @defun valid-specifier-locale-type-p locale-type -Given a specifier @var{locale-type}, this function returns non-nil if it +Given a specifier @var{locale-type}, this function returns non-@code{nil} if it is valid. Valid locale types are the symbols @code{global}, @code{device}, @code{frame}, @code{window}, and @code{buffer}. (Note, however, that in functions that accept either a locale or a locale type, @@ -1101,7 +1102,7 @@ is non-@code{nil}, however, @var{tag-set} must be equal to an instantiator's tag set for the instantiator to be copied. Optional argument @var{how-to-add} specifies what to do with existing -specifications in @var{dest}. If nil, then whichever locales or locale +specifications in @var{dest}. If @code{nil}, then whichever locales or locale types are copied will first be completely erased in @var{dest}. Otherwise, it is the same as in @code{add-spec-to-specifier}. @end defun diff --git a/man/lispref/streams.texi b/man/lispref/streams.texi index 98b6494..0128d22 100644 --- a/man/lispref/streams.texi +++ b/man/lispref/streams.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/streams.info @node Read and Print, Minibuffers, Debugging, Top @@ -558,13 +558,13 @@ characters are used. @code{print} returns @var{object}. For example: (progn (print 'The\ cat\ in) (print "the hat") (print " came back")) - @print{} + @print{} @print{} The\ cat\ in - @print{} + @print{} @print{} "the hat" - @print{} + @print{} @print{} " came back" - @print{} + @print{} @result{} " came back" @end group @end example @@ -578,8 +578,8 @@ This function outputs the printed representation of @var{object} to @example @group -(progn (prin1 'The\ cat\ in) - (prin1 "the hat") +(progn (prin1 'The\ cat\ in) + (prin1 "the hat") (prin1 " came back")) @print{} The\ cat\ in"the hat"" came back" @result{} " came back" @@ -789,7 +789,7 @@ The precision in any of these cases is the number of digits following the decimal point. With @samp{f}, a precision of 0 means to omit the decimal point. 0 is not allowed with @samp{f} or @samp{g}. -A value of nil means to use @samp{%.16g}. +A value of @code{nil} means to use @samp{%.16g}. Regardless of the value of @code{float-output-format}, a floating point number will never be printed in such a way that it is ambiguous with an diff --git a/man/lispref/strings.texi b/man/lispref/strings.texi index d9d00a0..8cd793b 100644 --- a/man/lispref/strings.texi +++ b/man/lispref/strings.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/strings.info @node Strings and Characters, Lists, Numbers, Top @@ -138,13 +138,14 @@ putting strings together, or by taking them apart. Analogous functions operating on other data types include @code{list}, @code{cons} (@pxref{Building Lists}), @code{vector} (@pxref{Vectors}) -and @code{bit-vector} (@pxref{Bit Vectors}). This function has not been +and @code{bit-vector} (@pxref{Bit Vectors}). This function has not been available in XEmacs prior to 21.0 and FSF Emacs prior to 20.3. @end defun -@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. +@defun make-string length character +This function returns a new string consisting entirely of @var{length} +successive copies of @var{character}. @var{length} must be a +non-negative integer. @example (make-string 5 ?x) @@ -179,7 +180,7 @@ 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: +signifies the index of the last character of the string. For example: @example @group @@ -312,7 +313,7 @@ This function returns @code{t} if @var{object} is an integer or character. @node Character Codes @section Character Codes -@defun char-int ch +@defun char-int character This function converts a character into an equivalent integer. The resulting integer will always be non-negative. The integers in the range 0 - 255 map to characters as follows: @@ -357,10 +358,11 @@ integer that can be converted into one. @section Comparison of Characters and Strings @cindex string equality -@defun char-equal character1 character2 +@defun char-equal character1 character2 &optional buffer 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}. +in case if the value of @code{case-fold-search} is non-@code{nil} in +@var{buffer}, which defaults to the current buffer. @example (char-equal ?x ?x) @@ -460,7 +462,7 @@ no characters is less than any other string. (string< "abc" "ab") @result{} nil (string< "" "") - @result{} nil + @result{} nil @end group @end example @end defun @@ -560,13 +562,13 @@ See also the function @code{format} in @ref{Formatting Strings}. @defun string-to-number string &optional base @cindex string to number -This function returns the numeric value of the characters in -@var{string}, read in @var{base}. 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. +This function returns the numeric value represented by @var{string}, +read in @var{base}. 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. If @var{base} is not specified, it defaults to ten. With @var{base} other than ten, only integers can be read. @@ -637,7 +639,7 @@ 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 +@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 @@ -745,9 +747,9 @@ operation} error. (format "The buffer object prints as %s." (current-buffer)) @result{} "The buffer object prints as #." -(format "The octal value of %d is %o, +(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, + @result{} "The octal value of 18 is 22, and the hex value is 12." @end group @end example @@ -782,9 +784,9 @@ An optional precision, preceded by a @samp{.} character. specifications. Normally the first specification uses the first argument, the second specification uses the second argument, etc. Using a repositioning specification, you can change this. By placing a number -@var{N} followed by a @samp{$} between the @samp{%} and the format -character, you cause the specification to use the @var{N}th argument. -The next specification will use the @var{N}+1'th argument, etc. +@var{n} followed by a @samp{$} between the @samp{%} and the format +character, you cause the specification to use the @var{n}th argument. +The next specification will use the @var{n}+1'th argument, etc. For example: @@ -846,23 +848,23 @@ 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 +@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." + @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." + "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." + @result{} "The word `foo ' actually has 3 letters in it." @end group @end smallexample @@ -899,9 +901,9 @@ conversions. @node Character Case @section Character Case -@cindex upper case -@cindex lower case -@cindex 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 @@ -912,7 +914,7 @@ 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 +@defun downcase string-or-char &optional buffer This function converts a character or a string to lower case. When the argument to @code{downcase} is a string, the function creates @@ -923,6 +925,9 @@ corresponding lower case character. (This value is actually an integer under XEmacs 19.) If the original character is lower case, or is not a letter, then the value equals the original character. +Optional second arg @var{buffer} specifies which buffer's case tables to +use, and defaults to the current buffer. + @example (downcase "The cat in the hat") @result{} "the cat in the hat" @@ -934,7 +939,7 @@ letter, then the value equals the original character. @end example @end defun -@defun upcase string-or-char +@defun upcase string-or-char &optional buffer This function converts a character or a string to upper case. When the argument to @code{upcase} is a string, the function creates @@ -946,6 +951,9 @@ the corresponding upper case character. (This value is actually an integer under XEmacs 19.) If the original character is upper case, or is not a letter, then the value equals the original character. +Optional second arg @var{buffer} specifies which buffer's case tables to +use, and defaults to the current buffer. + @example (upcase "The cat in the hat") @result{} "THE CAT IN THE HAT" @@ -956,7 +964,7 @@ is not a letter, then the value equals the original character. @end example @end defun -@defun capitalize string-or-char +@defun capitalize string-or-char &optional buffer @cindex capitalization This function capitalizes strings or characters. If @var{string-or-char} is a string, the function creates and returns a new @@ -972,6 +980,9 @@ table (@pxref{Syntax Class Table}). When the argument to @code{capitalize} is a character, @code{capitalize} has the same result as @code{upcase}. +Optional second arg @var{buffer} specifies which buffer's case tables to +use, and defaults to the current buffer. + @example (capitalize "The cat in the hat") @result{} "The Cat In The Hat" @@ -1045,21 +1056,22 @@ 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. +@defun set-standard-case-table case-table +This function makes @var{case-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. +@defun current-case-table &optional buffer +This function returns the case table of @var{buffer}, which defaults to +the current buffer. @end defun -@defun set-case-table table -This sets the current buffer's case table to @var{table}. +@defun set-case-table case-table +This sets the current buffer's case table to @var{case-table}. @end defun The following three functions are convenient subroutines for packages @@ -1171,8 +1183,8 @@ character. Higher-level Lisp functions are provided for working with syntax tables. The valid values are integers. @end table -@defun char-table-type table -This function returns the type of char table @var{table}. +@defun char-table-type char-table +This function returns the type of char table @var{char-table}. @end defun @defun char-table-type-list @@ -1192,9 +1204,9 @@ This function makes a new, empty char table of type @var{type}. @code{display}, @code{generic}, or @code{syntax}. @end defun -@defun put-char-table range val table -This function sets the value for chars in @var{range} to be @var{val} in -@var{table}. +@defun put-char-table range value char-table +This function sets the value for chars in @var{range} to be @var{value} in +@var{char-table}. @var{range} specifies one or more characters to be affected and should be one of the following: @@ -1211,24 +1223,24 @@ A vector of two elements: a two-octet charset and a row number A single character @end itemize -@var{val} must be a value appropriate for the type of @var{table}. +@var{value} must be a value appropriate for the type of @var{char-table}. @end defun -@defun get-char-table ch table -This function finds the value for char @var{ch} in @var{table}. +@defun get-char-table character char-table +This function finds the value for @var{character} in @var{char-table}. @end defun -@defun get-range-char-table range table &optional multi -This function finds the value for a range in @var{table}. If there is +@defun get-range-char-table range char-table &optional multi +This function finds the value for a range in @var{char-table}. If there is more than one value, @var{multi} is returned (defaults to @code{nil}). @end defun -@defun reset-char-table table -This function resets a char table to its default state. +@defun reset-char-table char-table +This function resets @var{char-table} to its default state. @end defun -@defun map-char-table function table &optional range -This function maps @var{function} over entries in @var{table}, calling +@defun map-char-table function char-table &optional range +This function maps @var{function} over entries in @var{char-table}, calling it with two args, each key and value in the table. @var{range} specifies a subrange to map over and is in the same format diff --git a/man/lispref/symbols.texi b/man/lispref/symbols.texi index ef25af8..268648d 100644 --- a/man/lispref/symbols.texi +++ b/man/lispref/symbols.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/symbols.info @node Symbols, Evaluation, Sequences Arrays Vectors, Top @@ -532,7 +532,7 @@ stored in the property list @var{plist}. For example, @end example @end defun -@defun putf plist property value +@defmac putf 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 @@ -547,7 +547,7 @@ in the place where you got @var{plist}. For example, (setq my-plist (putf my-plist 'quux '(a))) @result{} (quux (a) bar t foo 5) @end example -@end defun +@end defmac @defun plists-eq a b This function returns non-@code{nil} if property lists @var{a} and @var{b} diff --git a/man/lispref/syntax.texi b/man/lispref/syntax.texi index 82b93a0..2bbbdd6 100644 --- a/man/lispref/syntax.texi +++ b/man/lispref/syntax.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/syntax.info @node Syntax Tables, Abbrevs, Searching and Matching, Top @@ -368,7 +368,7 @@ prefix (@samp{'}). @xref{Motion and Syntax}. In this section we describe functions for creating, accessing and altering syntax tables. -@defun make-syntax-table &optional table +@defun make-syntax-table &optional oldtable 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 @@ -377,28 +377,28 @@ 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. +@defun copy-syntax-table &optional syntax-table +This function constructs a copy of @var{syntax-table} and returns it. +If @var{syntax-table} is not supplied (or is @code{nil}), it returns a +copy of the current syntax table. Otherwise, an error is signaled if +@var{syntax-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}. +@deffn Command modify-syntax-entry char-range syntax-descriptor &optional syntax-table +This function sets the syntax entry for @var{char-range} according to +@var{syntax-descriptor}. @var{char-range} is either a single character +or a range of characters, as used with @code{put-char-table}. The syntax +is changed only for @var{syntax-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. +the table for @var{char-range} 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. +one of the twelve syntax class designator characters. @example @group @@ -434,12 +434,18 @@ signaled if @var{char} is not a character. @end example @end deffn -@defun char-syntax character +@defun char-syntax character &optional syntax-table 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. +An error is signaled if @var{character} is not a character. + +The characters that correspond to various syntax codes +are listed in the documentation of @code{modify-syntax-entry}. + +Optional second argument @var{syntax-table} is the syntax table to be +used, and defaults to the current buffer's syntax table. The following examples apply to C mode. The first example shows that the syntax class of space is whitespace (represented by a space). The @@ -467,9 +473,9 @@ character, @samp{)}. @end example @end defun -@defun set-syntax-table table &optional buffer -This function makes @var{table} the syntax table for @var{buffer}, which -defaults to the current buffer if omitted. It returns @var{table}. +@defun set-syntax-table syntax-table &optional buffer +This function makes @var{syntax-table} the syntax table for @var{buffer}, which +defaults to the current buffer if omitted. It returns @var{syntax-table}. @end defun @defun syntax-table &optional buffer @@ -560,33 +566,33 @@ The result is a list of eight elements describing the final state of the parse: @enumerate 0 -@item +@item The depth in parentheses, counting from 0. -@item +@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 +@item @cindex previous complete subexpression The character position of the start of the last complete subexpression terminated; @code{nil} if none. -@item +@item @cindex inside string Non-@code{nil} if inside a string. More precisely, this is the character that will terminate the string. -@item +@item @cindex inside comment @code{t} if inside a comment (of either style). -@item +@item @cindex quote character @code{t} if point is just after a quote character. -@item +@item The minimum parenthesis depth encountered during this scan. @item diff --git a/man/lispref/text.texi b/man/lispref/text.texi index 7aad873..b4ec428 100644 --- a/man/lispref/text.texi +++ b/man/lispref/text.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/text.info @node Text, Searching and Matching, Markers, Top @@ -329,13 +329,16 @@ a buffer other than the current one (otherwise you could just use @code{insert}). @end defun -@defun insert-char character count &optional buffer +@defun insert-char character &optional count ignored buffer This function inserts @var{count} instances of @var{character} into @var{buffer} before point. @var{count} must be a number, and -@var{character} must be a character. The value is @code{nil}. If -optional argument @var{buffer} is @code{nil}, the current buffer is -assumed. (In FSF Emacs, the third argument is called @var{inherit} -and refers to text properties.) +@var{character} must be a character. + +If optional argument @var{buffer} is @code{nil}, the current buffer is +assumed. (In FSF Emacs, the third argument is called @var{inherit} and +refers to text properties. In XEmacs, it is always ignored.) + +This function always returns @code{nil}. @end defun @defun insert-buffer-substring from-buffer-or-name &optional start end @@ -403,19 +406,19 @@ 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 +@deffn Command newline &optional count This command inserts newlines into the current buffer before point. -If @var{number-of-newlines} is supplied, that many newline characters +If @var{count} 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 +@var{count} 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}. +auto-fill if @var{count} is non-@code{nil}. This command indents to the left margin if that is not zero. @xref{Margins}. @@ -453,7 +456,7 @@ cases. All of the deletion functions operate on the current buffer, and all return a value of @code{nil}. -@defun erase-buffer &optional buffer +@deffn Command erase-buffer &optional buffer This function deletes the entire text of @var{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 @@ -465,7 +468,7 @@ 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 +@end deffn @deffn Command delete-region start end &optional buffer This command deletes the text in @var{buffer} in the region defined by @@ -564,7 +567,7 @@ You thought @end example @end deffn -@deffn Command delete-indentation &optional join-following-p +@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}, @@ -601,7 +604,7 @@ 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 +@deffn Command 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}. @@ -637,7 +640,7 @@ This has too many spaces at the start of (this list) ---------- Buffer: foo ---------- @end group @end smallexample -@end defun +@end deffn @deffn Command just-one-space @comment !!SourceFile simple.el @@ -738,7 +741,7 @@ 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 +@deffn Command kill-region start end &optional verbose 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}. @@ -822,26 +825,32 @@ 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 +@defun current-kill count &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 +designates the ``front'' of the kill ring by @var{count} 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. +returns the @var{count}th kill, counting from the current yanking pointer. -If @var{n} is zero, indicating a request for the latest kill, +If @var{count} 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). +@defun kill-new string &optional replace +This function makes the text @var{string} the latest entry in the kill +ring, and sets @code{kill-ring-yank-pointer} to point to it. + +Normally, @var{string} is added to the front of the kill ring as a new +entry. However, if optional argument @var{replace} is non-@code{nil}, +the entry previously at the front of the kill ring is discarded, and +@var{string} replaces it. + +This function runs the functions on @code{kill-hooks}, and also invokes +the value of @code{interprogram-cut-function} (see below). @end defun @defun kill-append string before-p @@ -884,7 +893,7 @@ to the newly killed text. 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. +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 @@ -909,7 +918,7 @@ 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")}. +different piece of text" "yet older text")}. @example @group @@ -917,11 +926,11 @@ kill-ring kill-ring-yank-pointer | | | ___ ___ ---> ___ ___ ___ ___ --> |___|___|------> |___|___|--> |___|___|--> nil - | | | - | | | - | | -->"yet older text" + | | | + | | | + | | -->"yet older text" | | - | --> "a different piece of text" + | --> "a different piece of text" | --> "some text" @end group @@ -973,9 +982,9 @@ 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}) +@item (@var{start} . @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 +Upon insertion, the text occupied the range @var{start}--@var{end} in the buffer. @item (@var{text} . @var{position}) @@ -991,12 +1000,12 @@ 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}) +@item (nil @var{property} @var{value} @var{start} . @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}) +(put-text-property @var{start} @var{end} @var{property} @var{value}) @end example @item @var{position} @@ -1072,8 +1081,8 @@ 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 +@deffn Command buffer-disable-undo &optional buffer +@deffnx Command 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 @@ -1086,7 +1095,7 @@ 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 +@end deffn As editing continues, undo lists get longer and longer. To prevent them from using up all available memory space, garbage collection trims @@ -1321,11 +1330,14 @@ 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 +@defun delete-to-left-margin &optional 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. + +The arguments @var{from} and @var{to} are optional; the default is the +whole buffer. @end defun @defun indent-to-left-margin @@ -1441,16 +1453,16 @@ definition for @code{sort-lines}: @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) +(defun sort-lines (reverse start 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)." +and START and END (the region to sort)." (interactive "P\nr") (save-restriction - (narrow-to-region beg end) + (narrow-to-region start end) (goto-char (point-min)) (sort-subr reverse 'forward-line @@ -1469,8 +1481,8 @@ its @code{sort-subr} call looks like this: @example @group (sort-subr reverse - (function - (lambda () + (function + (lambda () (skip-chars-forward "\n \t\f"))) 'forward-paragraph) @end group @@ -1582,16 +1594,16 @@ region. Fields are separated by whitespace and numbered starting from 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 +@deffn Command sort-columns reverse &optional start end +This command sorts the lines in the region between @var{start} 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 +The column positions of @var{start} 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 +containing position @var{start}, 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, @@ -1620,17 +1632,29 @@ occupying a number of columns that depends on the value of amount of horizontal scrolling. Consequently, a column value can be arbitrarily high. The first (or leftmost) column is numbered 0. -@defun current-column +@defun current-column &optional buffer 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. +columns, counting from 0 at the left margin. + +This is calculated by adding together the widths of all the displayed +representations of the character between the start of the previous line +and point. (e.g. control characters will have a width of 2 or 4, tabs +will have a variable width.) + +Ignores the finite width of frame displaying the buffer, which means +that this function may return values greater than +@code{(frame-width)}. + +Whether the line is visible (if @code{selective-display} is t) has no effect; +however, ^M is treated as end of line when @code{selective-display} is t. + +If @var{buffer} is nil, the current buffer is assumed. 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 +@defun move-to-column column &optional force buffer 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 @@ -1649,10 +1673,11 @@ converts the tab into spaces so that it can move precisely to column @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 +enough to reach column @var{column}; in that case, unless the value of +@var{force} is the special value @code{coerce}, 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. +If @var{column} is not a non-negative integer, an error is signaled. The return value is the column number actually moved to. @end defun @@ -1682,7 +1707,7 @@ count from zero at the left margin. insert indentation. The functions in the following sections use these primitives. -@defun current-indentation +@defun current-indentation &optional buffer @comment !!Type Primitive Function @comment !!SourceFile indent.c This function returns the indentation of the current line, which is @@ -1691,7 +1716,7 @@ 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 +@deffn Command indent-to column &optional minimum buffer @comment !!Type Primitive Function @comment !!SourceFile indent.c This function indents from point with tabs and spaces until @var{column} @@ -1699,7 +1724,7 @@ 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. +indentation ends. If @var{buffer} is @code{nil}, the current buffer is assumed. @end deffn @defopt indent-tabs-mode @@ -1734,7 +1759,7 @@ 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 +@deffn Command indent-for-tab-command &optional prefix-arg 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 @@ -1826,13 +1851,13 @@ In Mail mode, @kbd{C-c C-y} (@code{mail-yank-original}) uses replied to. @end deffn -@defun indent-code-rigidly start end columns &optional nochange-regexp +@deffn Command 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 +@end deffn @node Relative Indent @subsection Indentation Relative to Previous Lines @@ -1946,7 +1971,7 @@ interactively. These commands, primarily for interactive use, act based on the indentation in the text. -@deffn Command back-to-indentation +@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 @@ -1974,7 +1999,7 @@ buffer. @xref{Character Case}, for case conversion commands that work on strings and characters. @xref{Case Tables}, for how to customize which characters are upper or lower case and how to convert them. -@deffn Command capitalize-region start end +@deffn Command capitalize-region start end &optional buffer 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 @@ -2004,7 +2029,7 @@ This Is The Contents Of The 5th Foo. @end example @end deffn -@deffn Command downcase-region start end +@deffn Command downcase-region start end &optional buffer 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}. @@ -2013,7 +2038,7 @@ 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 +@deffn Command upcase-region start end &optional buffer 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}. @@ -2022,7 +2047,7 @@ 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 +@deffn Command capitalize-word count &optional buffer 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. @@ -2037,7 +2062,7 @@ When @code{capitalize-word} is called interactively, @var{count} is set to the numeric prefix argument. @end deffn -@deffn Command downcase-word count +@deffn Command downcase-word count &optional buffer 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. @@ -2047,7 +2072,7 @@ When @code{downcase-word} is called interactively, @var{count} is set to the numeric prefix argument. @end deffn -@deffn Command upcase-word count +@deffn Command upcase-word count &optional buffer 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. @@ -2115,7 +2140,7 @@ functions to examine the properties of a number of characters at once. positions in a string start from 0, whereas positions in a buffer start from 1.) -@defun get-text-property pos prop &optional object +@defun get-text-property pos prop &optional object at-flag 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 @@ -2127,7 +2152,7 @@ the @var{prop} property of that symbol. @end ignore @end defun -@defun get-char-property pos prop &optional object +@defun get-char-property pos prop &optional object at-flag This function is like @code{get-text-property}, except that it checks all extents, not just text-property extents. @@ -2280,7 +2305,7 @@ 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, +@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 @@ -2311,7 +2336,7 @@ returns the position of the first character beyond @var{pos} whose @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, +@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 @@ -2321,14 +2346,14 @@ 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} +This is like @code{next-property-change}, but scans backward 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 +This is like @code{next-single-property-change}, but scans backward 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}. @@ -2372,7 +2397,7 @@ The predefined properties are the same as those for extents. @cindex saving text properties You can save text properties in files, and restore text properties -when inserting the files, using these two hooks: +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 @@ -2422,7 +2447,7 @@ uses may be possible. 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 +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 @@ -2477,7 +2502,7 @@ This function applies a translation table to the characters in the buffer between positions @var{start} and @var{end}. The translation table @var{table} can be either a string, a vector, or a char-table. -If @var{table} is a string, its @var{n}th element is the mapping for the +If @var{table} is a string, its @var{n}th element is the mapping for the character with code @var{n}. If @var{table} is a vector, its @var{n}th element is the mapping for @@ -2557,44 +2582,44 @@ 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 +@defun get-register register This function returns the contents of the register -@var{reg}, or @code{nil} if it has no contents. +@var{register}, 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}. +@defun set-register register value +This function sets the contents of register @var{register} 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}. +@deffn Command view-register register +This command displays what is contained in register @var{register}. @end deffn @ignore -@deffn Command point-to-register reg +@deffn Command point-to-register register This command stores both the current location of point and the current -buffer in register @var{reg} as a marker. +buffer in register @var{register} as a marker. @end deffn -@deffn Command jump-to-register reg -@deffnx Command register-to-point reg +@deffn Command jump-to-register register +@deffnx Command register-to-point register @comment !!SourceFile register.el -This command restores the status recorded in register @var{reg}. +This command restores the status recorded in register @var{register}. -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{register} 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. +If @var{register} 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 +@deffn Command insert-register register &optional beforep +This command inserts contents of register @var{register} into the current buffer. Normally, this command puts point before the inserted text, and the @@ -2613,39 +2638,39 @@ changed in the future. @end deffn @ignore -@deffn Command copy-to-register reg start end &optional delete-flag +@deffn Command copy-to-register register 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 +register @var{register}. 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 +@deffn Command prepend-to-register register 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 +register @var{register}. 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 +@deffn Command append-to-register register 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 +text already in register @var{register}. 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 +@deffn Command copy-rectangle-to-register register 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 +into register @var{register}. 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 +@deffn Command window-configuration-to-register register This function stores the window configuration of the selected frame in -register @var{reg}. +register @var{register}. @end deffn -@deffn Command frame-configuration-to-register reg +@deffn Command frame-configuration-to-register register This function stores the current frame configuration in register -@var{reg}. +@var{register}. @end deffn @end ignore @@ -2742,14 +2767,23 @@ target digest. MD5 is used heavily by various authentication schemes. Emacs Lisp interface to MD5 consists of a single function @code{md5}: -@defun md5 object &optional start end +@defun md5 object &optional start end coding noerror This function returns the MD5 message digest of @var{object}, a buffer or string. Optional arguments @var{start} and @var{end} denote positions for computing the digest of a portion of @var{object}. -Some examples of usage: +The optional @var{coding} argument specifies the coding system the text +is to be represented in while computing the digest. If unspecified, it +defaults to the current format of the data, or is guessed. + +If @var{noerror} is non-@code{nil}, silently assume binary coding if the +guesswork fails. Normally, an error is signaled in such case. + +@var{coding} and @var{noerror} arguments are meaningful only in XEmacsen +with file-coding or Mule support. Otherwise, they are ignored. Some +examples of usage: @example @group @@ -2779,13 +2813,13 @@ binary bodies, and to encode binary characters in message headers. The Lisp interface to base64 consists of four functions: -@defun base64-encode-region beg end &optional no-line-break -This function encodes the region between @var{beg} and @var{end} of the -current buffer to base64 format. This means that the original region is +@deffn Command base64-encode-region start end &optional no-line-break +This function encodes the region between @var{start} and @var{end} of the +current buffer to base64 format. This means that the original region is deleted, and replaced with its base64 equivalent. Normally, encoded base64 output is multi-line, with 76-character lines. -If @var{no-line-break} is non-@code{nil}, newlines will not be inserted, +If @var{no-line-break} is non-@code{nil}, newlines will not be inserted, resulting in single-line output. Mule note: you should make sure that you convert the multibyte @@ -2805,12 +2839,16 @@ an error. The function can also be used interactively, in which case it works on the currently active region. -@end defun +@end deffn -@defun base64-encode-string string +@defun base64-encode-string string &optional no-line-break This function encodes @var{string} to base64, and returns the encoded string. +Normally, encoded base64 output is multi-line, with 76-character lines. +If @var{no-line-break} is non-@code{nil}, newlines will not be inserted, +resulting in single-line output. + For Mule, the same considerations apply as for @code{base64-encode-region}. @@ -2822,12 +2860,12 @@ For Mule, the same considerations apply as for @end example @end defun -@defun base64-decode-region beg end -This function decodes the region between @var{beg} and @var{end} of the +@deffn Command base64-decode-region start end +This function decodes the region between @var{start} and @var{end} of the current buffer. The region should be in base64 encoding. If the region was decoded correctly, @code{base64-decode-region} returns -the length of the decoded region. If the decoding failed, @code{nil} is +the length of the decoded region. If the decoding failed, @code{nil} is returned. @example @@ -2836,7 +2874,7 @@ returned. (base64-decode-region (point-min) (point-max)) @end group @end example -@end defun +@end deffn @defun base64-decode-string string This function decodes @var{string} to base64, and returns the decoded diff --git a/man/lispref/tips.texi b/man/lispref/tips.texi index 5e952ab..eb4be94 100644 --- a/man/lispref/tips.texi +++ b/man/lispref/tips.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/tips.info @node Tips, Building XEmacs and Object Allocation, MULE, Top @@ -160,7 +160,7 @@ standard names instead. @item Redefining an Emacs primitive is an even worse idea. -It may do the right thing for a particular program, but +It may do the right thing for a particular program, but there is no telling what other programs might break as a result. @item @@ -284,7 +284,7 @@ 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, +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} @@ -369,13 +369,13 @@ 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 +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 diff --git a/man/lispref/toolbar.texi b/man/lispref/toolbar.texi index 3d725a6..7cf6a90 100644 --- a/man/lispref/toolbar.texi +++ b/man/lispref/toolbar.texi @@ -210,7 +210,7 @@ the user to choose where the toolbar should go. @defvr Specifier default-toolbar The position of this toolbar is specified in the function -@code{default-toolbar-position}. If the corresponding +@code{default-toolbar-position}. If the corresponding position-specific toolbar (e.g. @code{top-toolbar} if @code{default-toolbar-position} is @code{top}) does not specify a toolbar in a particular domain, then the value of @code{default-toolbar} @@ -270,7 +270,7 @@ Specifier for the toolbar at the right edge of the frame. @end defvr @defun toolbar-specifier-p object -This function returns non-nil if @var{object} is a toolbar specifier. +This function returns non-@code{nil} if @var{object} is a toolbar specifier. Toolbar specifiers are the actual objects contained in the toolbar variables described above, and their valid instantiators are toolbar descriptors (@pxref{Toolbar Descriptor Format}). @@ -366,7 +366,7 @@ Thus, for example, if you set the frame width to 80 characters and the left toolbar width for that frame to 68 pixels, then the frame will be sized to fit 80 characters plus a 68-pixel left toolbar. If you then set the left toolbar width to 0 for a particular buffer (or if that -buffer does not specify a left toolbar or has a nil value specified for +buffer does not specify a left toolbar or has a @code{nil} value specified for @code{left-toolbar-visible-p}), you will find that, when that buffer is displayed in the selected window, the window will have a width of 86 or 87 characters---the frame is sized for a 68-pixel left toolbar but the diff --git a/man/lispref/tooltalk.texi b/man/lispref/tooltalk.texi index 0140d16..0ce1334 100644 --- a/man/lispref/tooltalk.texi +++ b/man/lispref/tooltalk.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/tooltalk.info @node ToolTalk Support, LDAP Support, X-Windows, top @@ -38,7 +38,7 @@ the callback is specified with a Lisp symbol (the symbol should have a function binding). @item -The session attribute for messages and patterns is always +The session attribute for messages and patterns is always initialized to the default session. @item @@ -74,8 +74,8 @@ stored in the first argument of the message. (message "Random query turns up nothing"))))) (defvar random-query-message - '( class TT_REQUEST - scope TT_SESSION + '( class TT_REQUEST + scope TT_SESSION address TT_PROCEDURE op "random-query" args '((TT_INOUT "?" "string")) @@ -90,12 +90,12 @@ stored in the first argument of the message. @defun make-tooltalk-message attributes Create a ToolTalk message and initialize its attributes. -The value of @var{attributes} must be a list of alternating keyword/values, -where keywords are symbols that name valid message attributes. +The value of @var{attributes} must be a list of alternating keyword/values, +where keywords are symbols that name valid message attributes. For example: @example - (make-tooltalk-message + (make-tooltalk-message '(class TT_NOTICE scope TT_SESSION address TT_PROCEDURE @@ -223,12 +223,16 @@ nulls (use @code{arg_bval}). @refill @end defun -@defun create-tooltalk-message +@defun create-tooltalk-message &optional no-callback Create a new ToolTalk message. The message's session attribute is initialized to the default session. Other attributes can be initialized with @code{set-tooltalk-message-attribute}. @code{make-tooltalk-message} is the preferred way to create and initialize a message. + +Optional arg @var{no-callback} says don't add a C-level callback at all. +Normally don't do that; just don't specify the Lisp callback when +calling @code{make-tooltalk-message}. @refill @end defun @@ -275,19 +279,19 @@ string to display. @defun make-tooltalk-pattern attributes Create a ToolTalk pattern and initialize its attributes. -The value of attributes must be a list of alternating keyword/values, +The value of attributes must be a list of alternating keyword/values, where keywords are symbols that name valid pattern attributes or lists of valid attributes. For example: @example - (make-tooltalk-pattern + (make-tooltalk-pattern '(category TT_OBSERVE scope TT_SESSION op ("operation1" "operation2") args ("arg1" 12345 (TT_INOUT "arg3" "string")))) @end example -Attribute names are the same as those supported by +Attribute names are the same as those supported by @code{add-tooltalk-pattern-attribute}, plus @code{'args}. Values must always be strings, integers, or symbols that represent @@ -316,15 +320,15 @@ chapter 3 of the @cite{ToolTalk Programmer's Guide}. @refill @end defun -@defun register-tooltalk-pattern pat +@defun register-tooltalk-pattern pattern XEmacs will begin receiving messages that match this pattern. @end defun -@defun unregister-tooltalk-pattern pat +@defun unregister-tooltalk-pattern pattern XEmacs will stop receiving messages that match this pattern. @end defun -@defun add-tooltalk-pattern-attribute value pat indicator +@defun add-tooltalk-pattern-attribute value pattern indicator Add one value to the indicated pattern attribute. The names of attributes are the same as the ToolTalk accessors used to set them less the @samp{tooltalk_pattern_} prefix and the @samp{_add} suffix. For @@ -340,9 +344,9 @@ argument. It will be called each time the pattern matches an incoming message. @end defun -@defun add-tooltalk-pattern-arg pat mode type value +@defun add-tooltalk-pattern-arg pattern mode vtype &optional value Add one fully-specified argument to a ToolTalk pattern. @var{mode} must -be one of @code{TT_IN}, @code{TT_INOUT}, or @code{TT_OUT}. @var{type} +be one of @code{TT_IN}, @code{TT_INOUT}, or @code{TT_OUT}. @var{vtype} must be a string. @var{value} can be an integer, string or @code{nil}. If @var{value} is an integer then an integer argument (@samp{tt_pattern_iarg_add}) is added; otherwise a string argument is @@ -355,7 +359,7 @@ Create a new ToolTalk pattern and initialize its session attribute to be the default session. @end defun -@defun destroy-tooltalk-pattern pat +@defun destroy-tooltalk-pattern pattern Apply @samp{tt_pattern_destroy} to the pattern. This effectively unregisters the pattern. @end defun diff --git a/man/lispref/variables.texi b/man/lispref/variables.texi index d5d5ab5..6d3cc9d 100644 --- a/man/lispref/variables.texi +++ b/man/lispref/variables.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/variables.info @node Variables, Functions, Control Structures, Top @@ -190,7 +190,7 @@ which is 2, not the new value, 1. @result{} 2 @end group @group -(let ((Y 1) +(let ((Y 1) (Z Y)) (list Y Z)) @result{} (1 2) @@ -635,7 +635,7 @@ The value of the @code{setq} form is the value of the last @var{form}. x ; @r{@code{x} now has a global value.} @result{} 3 @group -(let ((x 5)) +(let ((x 5)) (setq x 6) ; @r{The local binding of @code{x} is set.} x) @result{} 6 @@ -652,7 +652,7 @@ second @var{symbol} is set, and so on: @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 + @result{} 11 @end group @end example @end defspec @@ -1101,10 +1101,26 @@ local to the current buffer at the time. The value returned is @var{variable}. @end deffn -@defun local-variable-p variable &optional buffer +@defun local-variable-p variable buffer &optional after-set This returns @code{t} if @var{variable} is buffer-local in buffer -@var{buffer} (which defaults to the current buffer); otherwise, -@code{nil}. +@var{buffer}; else @code{nil}. + +If optional third arg @var{after-set} is non-@code{nil}, return @code{t} +if @var{symbol} would be buffer-local after it is set, regardless of +whether it is so presently. + +A @code{nil} value for @var{buffer} is @emph{not} the same as +@code{(current-buffer)}, but means "no buffer". Specifically: + +If @var{buffer} is @code{nil} and @var{after-set} is @code{nil}, a +return value of @code{t} indicates that the variable is one of the +special built-in variables that is always buffer-local. (This includes +@code{buffer-file-name}, @code{buffer-read-only}, +@code{buffer-undo-list}, and others.) + +If @var{buffer} is @code{nil} and @var{after-set} is @code{t}, a return +value of @code{t} indicates that the variable has had +@code{make-variable-buffer-local} applied to it. @end defun @defun buffer-local-variables &optional buffer @@ -1129,7 +1145,7 @@ the current buffer is used. (mode-name . "Fundamental") @dots{} @group - ;; @r{Next, non-built-in local variables.} + ;; @r{Next, non-built-in local variables.} ;; @r{This one is local and void:} foobar ;; @r{This one is local and nonvoid:} @@ -1330,13 +1346,13 @@ cannot be a built-in variable, a variable that has a buffer-local value in any buffer, or the symbols @code{nil} or @code{t}. @end defun -@defun variable-alias variable +@defun variable-alias variable &optional follow-past-lisp-magic If @var{variable} is aliased to another variable, this function returns that variable. @var{variable} should be a symbol. If @var{variable} is not aliased, this function returns @code{nil}. @end defun -@defun indirect-variable object +@defun indirect-variable object &optional follow-past-lisp-magic This function returns the variable at the end of @var{object}'s variable-alias chain. If @var{object} is a symbol, follow all variable aliases and return the final (non-aliased) symbol. If @var{object} is diff --git a/man/lispref/windows.texi b/man/lispref/windows.texi index 287184b..b05616e 100644 --- a/man/lispref/windows.texi +++ b/man/lispref/windows.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/windows.info @node Windows, Frames, Buffers, Top @@ -22,7 +22,7 @@ displayed in windows. * 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. + 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. @@ -66,31 +66,31 @@ life. (@xref{Deleting Windows}.) @item containing frame -@item +@item window height -@item +@item window width -@item +@item window edges with respect to the frame or screen -@item +@item the buffer it displays -@item +@item position within the buffer at the upper left of the window -@item +@item amount of horizontal scrolling, in columns -@item +@item point -@item +@item the mark -@item +@item how recently the window was selected @end itemize @@ -139,33 +139,15 @@ but not always: @code{pop-to-buffer} and @code{display-buffer} The two ``halves'' of the split window initially display the same buffer previously visible in the window that was split. -@defun one-window-p &optional no-mini all-frames +@defun one-window-p &optional nomini which-frames which-devices 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 +argument @var{nomini}, 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-frame} controls which set of windows are -counted. -@itemize @bullet -@item -If it is @code{nil} or omitted, then count only the selected frame, plus -the minibuffer it uses (which may be on another frame). -@item -If it is @code{t}, then windows on all frames that currently exist -(including invisible and iconified frames) are counted. -@item -If it is the symbol @code{visible}, then windows on all visible frames -are counted. -@item -If it is the number 0, then windows on all visible and iconified frames -are counted. -@item -If it is any other value, then precisely the windows in @var{window}'s -frame are counted, excluding the minibuffer in use if it lies in -some other frame. -@end itemize +The remaining arguments controls which set of windows are counted, as +with @code{next-window}. @end defun @deffn Command split-window &optional window size horizontal @@ -202,7 +184,7 @@ lines high by 80 columns wide; then the window is split. @group ;; @r{Returns window created} -(setq w2 (split-window w 15)) +(setq w2 (split-window w 15)) @result{} # @end group @group @@ -220,8 +202,8 @@ The frame looks like this: @smallexample @group - __________ - | | line 0 + __________ + | | line 0 | w | |__________| | | line 15 @@ -259,8 +241,8 @@ Now, the screen looks like this: @smallexample @group column 35 - __________ - | | | line 0 + __________ + | | | line 0 | w | w3 | |___|______| | | line 15 @@ -281,7 +263,7 @@ characters; see @ref{Display Tables}. 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}. +This function is simply an interface to @code{split-window}. Here is the complete function definition for it: @smallexample @@ -298,7 +280,7 @@ Here is the complete function definition for it: 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 +This function is simply an interface to @code{split-window}. Here is the complete definition for @code{split-window-horizontally} (except for part of the documentation string): @@ -312,35 +294,6 @@ part of the documentation string): @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 @@ -366,15 +319,21 @@ This function returns @code{nil} if @var{window} is deleted, and 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. +@deffn Command delete-window &optional window force +This function removes @var{window} from the display. If @var{window} is +omitted, then the selected window is deleted. If window is the only one +on its frame, the frame is deleted as well. + +Normally, you cannot delete the last non-minibuffer-only frame (you must +use @code{save-buffers-kill-emacs} or @code{kill-emacs}); an error is +signaled instead. However, if optional second argument @var{force} is +non-@code{nil}, you can delete the last frame. (This will automatically +call @code{save-buffers-kill-emacs}.) This function returns @code{nil}. -When @code{delete-window} is called interactively, @var{window} -defaults to the selected window. +When @code{delete-window} is called interactively, the selected window +is deleted. @end deffn @deffn Command delete-other-windows &optional window @@ -385,7 +344,7 @@ deleting the other windows in that frame. If @var{window} is omitted or The result is @code{nil}. @end deffn -@deffn Command delete-windows-on buffer &optional frame +@deffn Command delete-windows-on buffer &optional which-frames which-devices This function deletes all windows showing @var{buffer}. If there are no windows showing @var{buffer}, it does nothing. @@ -397,20 +356,52 @@ 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: +The argument @var{which-frames} 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 +@table @asis +@item @code{nil} +Delete all windows showing @var{buffer} in any frame. + +@item @code{t} +Delete only windows showing @var{buffer} in the selected frame. + +@item @code{visible} +Delete all windows showing @var{buffer} in any visible frame. + +@item @code{0} +Delete all windows showing @var{buffer} in any visible frame. + +@item @var{frame} +If it is a frame, delete all windows showing @var{buffer} in that frame. +@end table + +@strong{Warning:} This is similar to, but not identical to, the meaning +of the @var{which-frames} argument to @code{next-window}; the meanings +of @code{nil} and @code{t} are reversed. + +The optional argument @var{which-devices} further clarifies on which +devices to search for frames as specified by @var{which-frames}. +This value is only meaningful if @var{which-frames} is not @code{t}. + +@table @asis +@item @code{nil} +Consider all devices on the selected console. + +@item @var{device} +Consider only the one device @var{device}. + +@item @var{console} +Consider all devices on @var{console}. + +@item @var{device-type} +Consider all devices with device type @var{device-type}. + +@item @code{window-system} +Consider all devices on window system consoles. + +@item anything else +Consider all devices without restriction. +@end table This function always returns @code{nil}. @end deffn @@ -438,7 +429,7 @@ appears in @var{window} (on redisplay). The buffer being displayed in If optional argument @var{norecord} is non-@code{nil} then the global and per-frame buffer orderings are not modified, as by the function -@code{record-buffer}. +@code{record-buffer}. The return value is @var{window}. @@ -451,19 +442,18 @@ The return value is @var{window}. @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 +@defspec save-selected-window forms@dots{} +This special form 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 defspec @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 +@defun get-lru-window &optional which-frames which-devices This function returns the window least recently ``used'' (that is, selected). The selected window is always the most recently used window. @@ -471,23 +461,59 @@ 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. +By default, only the windows in the selected frame are considered. +The optional argument @var{which-frames} changes this behavior. +Here are the possible values and their meanings: + +@table @asis +@item @code{nil} +Consider all the windows in the selected windows'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 @code{0} +Consider all windows in all visible or iconified frames. + +@item @var{frame} +Consider all windows on frame @var{frame}. + +@item anything else +Consider precisely the windows in the selected window's frame, and no others. +@end table + +The optional argument @var{which-devices} further clarifies on which +devices to search for frames as specified by @var{which-frames}. +This value is only meaningful if @var{which-frames} is non-@code{nil}. + +@table @asis +@item @code{nil} +Consider all devices on the selected console. + +@item @var{device} +Consider only the one device @var{device}. + +@item @var{console} +Consider all devices on @var{console}. + +@item @var{device-type} +Consider all devices with device type @var{device-type}. + +@item @code{window-system} +Consider all devices on window system consoles. + +@item anything else +Consider all devices without restriction. +@end table -@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 +@defun get-largest-window &optional which-frames which-devices 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. @@ -496,15 +522,15 @@ 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. +The remaining arguments control which set of windows are considered. +See @code{next-window}, above. @end defun @node Cyclic Window Ordering @section Cyclic Ordering of Windows @cindex cyclic ordering of windows @cindex ordering of windows, cyclic -@cindex window ordering, 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 @@ -523,7 +549,7 @@ 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 +@defun next-window &optional window minibuf which-frames which-devices @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 @@ -543,8 +569,9 @@ 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: +By default, only the windows in the selected frame are considered. +The optional argument @var{which-frames} changes this behavior. +Here are the possible values and their meanings: @table @asis @item @code{nil} @@ -558,14 +585,47 @@ Consider all windows in all existing frames. Consider all windows in all visible frames. (To get useful results, you must ensure @var{window} is in a visible frame.) -@item 0 +@item @code{0} Consider all windows in all visible or iconified frames. +@item @var{frame} +Consider all windows on frame @var{frame}. + @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 +The optional argument @var{which-devices} further clarifies on which +devices to search for frames as specified by @var{which-frames}. +This value is only meaningful if @var{which-frames} is non-@code{nil}. + +@table @asis +@item @code{nil} +Consider all devices on the selected console. + +@item @var{device} +Consider only the one device @var{device}. + +@item @var{console} +Consider all devices on @var{console}. + +@item @var{device-type} +Consider all devices with device type @var{device-type}. + +@item @code{window-system} +Consider all devices on window system consoles. + +@item anything else +Consider all devices without restriction. +@end table + +If you use consistent values for @var{minibuf}, @var{which-frames}, and +@var{which-devices}, you can use @code{next-window} to iterate through the +entire cycle of acceptable windows, eventually ending up back at the +window you started with. @code{previous-window} traverses the same +cycle, in the reverse order. + +This example assumes there are two windows, both displaying the buffer @samp{windows.texi}: @example @@ -584,48 +644,29 @@ buffer @samp{windows.texi}: @end example @end defun -@defun previous-window &optional window minibuf all-frames +@defun previous-window &optional window minibuf which-frames which-devices 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 &optional frame -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 +@deffn Command other-window count &optional which-frames which-devices +This function selects the @var{count}th following window in the cyclic order. +If @var{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. -The argument @var{frame} controls which set of windows are considered. -@itemize @bullet -@item -If it is @code{nil} or omitted, then windows on the selected frame are -considered. -@item -If it is a frame, then windows on that frame are considered. -@item -If it is @code{t}, then windows on all frames that currently exist -(including invisible and iconified frames) are considered. -@item -If it is the symbol @code{visible}, then windows on all visible frames -are considered. -@item -If it is the number 0, then windows on all visible and iconified frames -are considered. -@item -If it is any other value, then the behavior is undefined. -@end itemize +The other arguments specify which windows to include in the cycle, as in +@code{next-window}. @end deffn -@c Emacs 19 feature -@defun walk-windows proc &optional minibuf all-frames -This function cycles through all windows, calling @code{proc} +@defun walk-windows function &optional minibuf which-frames which-devices +This function cycles through all windows, calling @code{function} 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. +The other arguments specify which windows to cycle through, as in +@code{next-window}. @end defun @node Buffers and Windows @@ -647,9 +688,14 @@ 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 +@defun set-window-buffer window buffer-or-name &optional norecord This function makes @var{window} display @var{buffer-or-name} as its -contents. It returns @code{nil}. +contents. @var{buffer-or-name} can be a buffer or a buffer name. + +With non-@code{nil} optional argument @var{norecord}, do not modify the +global or per-frame buffer ordering. + +This function returns @code{nil}. @example @group @@ -672,27 +718,15 @@ selected window. @end example @end defun -@defun get-buffer-window buffer-or-name &optional frame +@defun get-buffer-window buffer-or-name &optional which-frames which-devices 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 +The remaining arguments control which windows to consider. They have +the same meaning as for @code{next-window}. @end defun @node Displaying Buffers @@ -801,13 +835,16 @@ buffer on. Functions}. @end defun -@deffn Command replace-buffer-in-windows buffer +@deffn Command replace-buffer-in-windows buffer &optional which-frames which-devices 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. +The optional arguments @var{which-frames} and @var{which-devices} have +the same meaning as with @code{delete-windows-on}. + This function returns @code{nil}. @end deffn @@ -819,12 +856,14 @@ 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 +@deffn Command display-buffer buffer-or-name &optional not-this-window override-frame 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. +@var{buffer-or-name} can be a buffer or the name of one. + 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 @@ -832,8 +871,10 @@ 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}. +If @var{override-frame} is non-@code{nil}, display on that frame instead +of the current frame (or the dedicated frame). + +@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. @@ -1039,13 +1080,14 @@ point and the buffer's point always move together; they remain equal. when the user switches to another buffer, the cursor jumps to the position of point in that buffer. -@defun window-point window +@defun window-point &optional window This function returns the current position of point in @var{window}. For a non-selected 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. +current buffer, the value returned is the same as the value of 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} @@ -1071,7 +1113,7 @@ inevitably, at the beginning of a text line. @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, +used. For example, @example @group @@ -1088,19 +1130,25 @@ For a realistic example, see the description of @code{count-lines} in @ref{Text Lines}. @end defun -@defun window-end &optional window +@defun window-end &optional window guarantee 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. +Simply changing the buffer text or setting @code{window-start} 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. + +If optional arg @var{guarantee} is non-@code{nil}, the return value is +guaranteed to be the same as @code{window-end} would return at the end +of the next full redisplay assuming nothing else changes in the +meantime. This function is potentially much slower with this flag set. + @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, @@ -1229,33 +1277,33 @@ names that fit the user's point of view. 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 +@deffn Command scroll-up &optional lines This function scrolls the text in the selected window upward -@var{count} lines. If @var{count} is negative, scrolling is actually +@var{lines} lines. If @var{lines} is negative, scrolling is actually downward. -If @var{count} is @code{nil} (or omitted), then the length of scroll +If @var{lines} 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 modeline). @code{scroll-up} returns @code{nil}. @end deffn -@deffn Command scroll-down &optional count +@deffn Command scroll-down &optional lines This function scrolls the text in the selected window downward -@var{count} lines. If @var{count} is negative, scrolling is actually +@var{lines} lines. If @var{lines} is negative, scrolling is actually upward. -If @var{count} is omitted or @code{nil}, then the length of the scroll +If @var{lines} 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 +@deffn Command scroll-other-window &optional lines +This function scrolls the text in another window upward @var{lines} +lines. Negative values of @var{lines}, or @code{nil}, are handled as in @code{scroll-up}. You can specify a buffer to scroll with the variable @@ -1305,26 +1353,27 @@ bottom of the window appear instead at the top. The default value is @code{2}. @end defopt -@deffn Command recenter &optional count +@deffn Command recenter &optional location window @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. +This function scrolls @var{window} (which defaults to 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} +If @var{location} is a nonnegative number, it puts the line containing +point @var{location} lines down from the top of the window. If @var{location} 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 +If @var{location} 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 +If @var{location} 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 +When @code{recenter} is called interactively, @var{location} 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 +@var{location} to a non-@code{nil} list, while typing @kbd{C-u 4} sets +@var{location} to 4, which positions the current line four lines from the top. With an argument of zero, @code{recenter} positions the current line at @@ -1336,10 +1385,10 @@ separate key binding to do this. For example, (defun line-to-top-of-window () "Scroll current line to top of window. Replaces three keystroke sequence C-u 0 C-l." - (interactive) + (interactive) (recenter 0)) -(global-set-key [kp-multiply] 'line-to-top-of-window) +(global-set-key [kp-multiply] 'line-to-top-of-window) @end group @end example @end deffn @@ -1368,14 +1417,14 @@ 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 +@deffn Command scroll-left &optional 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 +@deffn Command scroll-right &optional 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 @@ -1433,9 +1482,9 @@ is off the screen due to horizontal scrolling: @example @group (defun hscroll-on-screen (window position) - (save-excursion + (save-excursion (goto-char position) - (and + (and (>= (- (current-column) (window-hscroll window)) 0) (< (- (current-column) (window-hscroll window)) (window-width window))))) @@ -1590,7 +1639,7 @@ and divider, if any, is not counted. This function returns the height in pixels of the text displayed in @var{window}, which defaults to the selected window. Unlike @code{window-text-area-pixel-height}, any blank space below the -end of the buffer is not included. If optional argument @var{noclipped} +end of the buffer is not included. If optional argument @var{noclipped} is non-@code{nil}, any space occupied by clipped lines will not be included. @end defun @@ -1611,20 +1660,20 @@ 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 pixel used by @var{window} (including any left margin, right -margin, or vertical scrollbar displayed alongside it), and +@var{window}'s frame. The element @var{right} of the value is one more +than the rightmost pixel used by @var{window} (including any left +margin, right margin, or vertical scrollbar displayed alongside it), and @var{bottom} is one more than the bottommost pixel used by @var{window} -(including any modeline or horizontal scrollbar displayed above -or below it). The frame area does not include any frame menubars or -toolbars that may be displayed; thus, for example, if there is only -one window on the frame, the values for @var{left} and @var{top} will -always be 0. +(including any modeline or horizontal scrollbar displayed above or below +it). The frame area does not include any frame menubars, toolbars, or +gutters that may be displayed; thus, for example, if there is only one +window on the frame, the values for @var{left} and @var{top} will always +be 0. 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-pixel-width)} and @code{(window-pixel-height)} -respectively, and @var{top} and @var{bottom} are zero. +respectively, and @var{left} and @var{top} are zero. @end defun There is no longer a function @code{window-edges} because it does not @@ -1660,15 +1709,15 @@ that change the size of windows and low-level functions that access window size. XEmacs does not permit overlapping windows or gaps between windows, so resizing one window affects other windows. -@deffn Command enlarge-window size &optional horizontal window -This function makes the selected window @var{size} lines taller, +@deffn Command enlarge-window count &optional horizontal window +This function makes the selected window @var{count} 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 +@var{window} wider by @var{count} columns, stealing columns instead of lines. If a window from which columns are stolen shrinks below @code{window-min-width} columns, that window disappears. @@ -1676,15 +1725,15 @@ 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 +If @var{count} is negative, this function shrinks the window by +@minus{}@var{count} 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. If @var{window} is non-@code{nil}, it specifies a window to change instead of the selected window. -@code{enlarge-window} returns @code{nil}. +@code{enlarge-window} returns @code{nil}. @end deffn @deffn Command enlarge-window-horizontally columns @@ -1700,20 +1749,20 @@ It could be defined as follows: @end deffn @deffn Command enlarge-window-pixels count &optional side window -This function makes the selected window @var{count} pixels larger. When -called from Lisp, optional second argument @var{side} non-@code{nil} -means to grow sideways @var{count} pixels, and optional third argument -@var{window} specifies the window to change instead of the selected -window. +This function makes the selected window @var{count} pixels larger. +When called from Lisp, optional second argument @var{side} +non-@code{nil} means to grow sideways @var{count} pixels, and optional +third argument @var{window} specifies the window to change instead of +the selected window. @end deffn -@deffn Command shrink-window size &optional horizontal window +@deffn Command shrink-window count &optional horizontal window This function is like @code{enlarge-window} but negates the argument -@var{size}, making the selected window smaller by giving lines (or +@var{count}, 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} +If @var{count} is negative, the window is enlarged by @minus{}@var{count} lines or columns. If @var{window} is non-@code{nil}, it specifies a window to change @@ -1800,13 +1849,15 @@ configuration previously saved. configuration instead of a window configuration. @xref{Frame Configurations}. -@defun current-window-configuration -This function returns a new object representing XEmacs'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. +@defun current-window-configuration &optional frame +This function returns a new object representing the current current +window configuration of @var{frame}, 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. + +@var{frame} defaults to the selected frame. @end defun @defun set-window-configuration configuration diff --git a/man/lispref/x-windows.texi b/man/lispref/x-windows.texi index 1cadf17..04a521d 100644 --- a/man/lispref/x-windows.texi +++ b/man/lispref/x-windows.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the XEmacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. @c See the file lispref.texi for copying conditions. @setfilename ../../info/x-windows.texinfo @node X-Windows, ToolTalk Support, System Interface, Top @@ -72,11 +72,23 @@ This function returns the contents of cut buffer number @var{n}. (This function is called @code{x-get-cut-buffer} in FSF Emacs.) @end defun -@defun x-store-cutbuffer string +@defun x-store-cutbuffer string &optional push This function stores @var{string} into the first cut buffer (cut buffer -0), moving the other values down through the series of cut buffers, -kill-ring-style. (This function is called @code{x-set-cut-buffer} in FSF -Emacs.) +0). + +Normally, the contents of the first cut buffer are simply replaced by +@var{string}. However, if optional argument @var{push} is +non-@code{nil}, the cut buffers are rotated. This means that the +previous value of the first cut buffer moves to the second cut buffer, +and the second to the third, and so on, moving the other values down +through the series of cut buffers, kill-ring-style. There are 8 cut +buffers altogether. + +Cut buffers are considered obsolete; you should use selections instead. + +This function has no effect if support for cut buffers was not compiled in. + +This function is called @code{x-set-cut-buffer} in FSF Emacs. @end defun @node X Server @@ -237,7 +249,7 @@ be made before the connection to the X server is initialized, that is, this variable may only be changed before XEmacs is dumped, or by setting it in the file @file{lisp/term/x-win.el}. -By default, this variable is nil at startup. When the connection +By default, this variable is @code{nil} at startup. When the connection to the X server is first initialized, the X resource database will be consulted and the value will be set according to whether any resources are found for the application class ``XEmacs''. @@ -251,7 +263,7 @@ get information about the capabilities and origin of the X server corresponding to a particular device. The device argument is generally optional and defaults to the selected device. -@defun x-server-version &optional device +@defun x-server-version &optional device This function returns the list of version numbers of the X server @var{device} is on. The returned value is a list of three integers: the major and minor version numbers of the X protocol in use, and the diff --git a/man/new-users-guide/files.texi b/man/new-users-guide/files.texi index d7219b1..1cfd3bf 100644 --- a/man/new-users-guide/files.texi +++ b/man/new-users-guide/files.texi @@ -6,7 +6,7 @@ The basic unit of stored data in Unix is the @dfn{file}. To edit a file, you must tell Emacs to read the file into a buffer. This is called @dfn{visiting} the file. You can now edit the buffer and to save the -changes you must write the buffer back to the file. +changes you must write the buffer back to the file. In addition to visiting and saving files, Emacs can delete, copy, rename, and append to files, and operate on file directories. @@ -51,7 +51,7 @@ buffer is by using the @b{Describe Variable} option from the @b{Help} menu. When Emacs prompts you for the variable name to describe, type @var{default-directory}. If you wish to open a file in some other directory, use @key{DEL} or the @key{BackSpace} key to go back and type -the path name of the new directory. +the path name of the new directory. You can create a new directory by typing @kbd{M-x make-directory}. This command will prompt you for a directory name: @@ -72,7 +72,7 @@ command. Similarly, you can also remove a directory by using the command @kbd{remove-directory}. The command @kbd{M-x pwd} will print the current buffer's default directory. For more information on file names, @xref{File Names,,,xemacs,XEmacs User's Manual}. - + @node Visiting, Saving Files, File Names, Files @section Visiting Files @@ -109,14 +109,14 @@ screen with its name in the mode-line. If the filename you specify already exists in Emacs, the buffer containing that file will be selected. You will get an error message if the filename does not exist. If you still press @key{RET}, a new buffer with the given -filename will be displayed on the screen. +filename will be displayed on the screen. @item C-x C-v @kindex C-x C-v @findex find-alternate-file This command (@code{find-alternate-file}), will visit a different file instead of the one visited last. It is similar to @kbd{C-c C-f} except -that it kills the current buffer (after offering to save it). +that it kills the current buffer (after offering to save it). @item C-x 5 C-f @kindex C-x 5 C-f @@ -126,7 +126,7 @@ This command will visit a file in another frame frame. The @b{Open in New Frame...} from the @b{File} menu will do the same thing. It will prompt you for a file name in the echo area. After you type the file name and press @key{RET}, the specified file will be -read into a new buffer and displayed on a new frame. +read into a new buffer and displayed on a new frame. @end table @node Saving Files, , Visiting, Files @@ -153,7 +153,7 @@ Wrote /usr/workspace/myfile.texinfo @noindent Try using this command twice. You will get the above message the first time you use this command, the second time you will get the following -message: +message: @example (No changes need to be saved) @@ -161,7 +161,7 @@ message: @noindent This message indicates that you haven't made any changes since the last -time you saved the file. +time you saved the file. @item C-x s @kindex C-x s @@ -175,7 +175,7 @@ Save file /usr/workspace/myfile.texinfo? (y or n) @noindent You will get the above message for all the buffers. Type "y" if you want -to save the buffer. +to save the buffer. @item C-x C-w @findex write file @@ -191,17 +191,17 @@ Write file: /usr/workspace/ @noindent After you type in a file name, press @key{RET}. The buffer will be saved in a new file. You can make copies of a particular file using this -command. +command. @end table You can also undo all the changes made since the file was visited or saved by reading the text from the file again (called @dfn{reverting}). For more information on this option, -@xref{Reverting,,,xemacs,XEmacs User's Manual}. +@xref{Reverting,,,xemacs,XEmacs User's Manual}. @vindex make-backup-files When you save a file in Emacs, it destroys its old contents. However, -if you set the variable @var{make-backup-files} to non-@var{nil} +if you set the variable @var{make-backup-files} to non-@code{nil} i.e. @samp{t}, Emacs will create a @dfn{backup} file. Select the @b{Describe variable} option from the @b{Help} menu and look at the documentation for this variable. Its default value should be @@ -209,7 +209,7 @@ documentation for this variable. Its default value should be to @samp{t} (@pxref{Setting Variables}). The backup file will contain the contents from the last time you visited the file. Emacs also provides options for creating numbered backups. For more information on -backups, @xref{Backup,,,xemacs,XEmacs User's Manual}. +backups, @xref{Backup,,,xemacs,XEmacs User's Manual}. @cindex auto saving Emacs also saves all the files from time to time so that in case of a @@ -219,7 +219,7 @@ being saved automatically. The auto saved files are named by putting the character @samp{#} in front and back. For example a file called "myfile.texinfo" would be named as @file{#myfile.texinfo#}. For information on controlling auto-saving and recovering data from -auto-saving, @xref{Auto Save Files,,,xemacs,XEmacs User's Manual}. +auto-saving, @xref{Auto Save Files,,,xemacs,XEmacs User's Manual}. @cindex simultaneous editing Emacs provides protection from simultaneous editing which occurs if @@ -230,9 +230,9 @@ the user about the lock and provide some options. For more information on protection against simultaneous editing, @xref{Interlocking,,,xemacs,XEmacs User's Manual}. - - + + diff --git a/man/new-users-guide/search.texi b/man/new-users-guide/search.texi index cedc71e..d4cc7f6 100644 --- a/man/new-users-guide/search.texi +++ b/man/new-users-guide/search.texi @@ -12,9 +12,9 @@ of the text they are searching, i.e. if you are searching for "String", then "string" will also be one of the selections. If you want a case sensitive search select the @b{Case Sensitive Search} from the @b{Option} menu. You can also set the variable @var{case-fold-search} to -@var{nil} for making searches case-sensitive. For information on setting +@code{nil} for making searches case-sensitive. For information on setting variables, @xref{Setting Variables}. The two commands for searching for -strings in XEmacs are: +strings in XEmacs are: @table @kbd @item C-s @@ -34,9 +34,9 @@ string which has been found so far. If you find the correct match just hit @key{RET} or type @kbd{C-f} or @kbd{C-b} to set the cursor's position. If you find a matching string "myname" but you were looking for a different occurrence of it, use @kbd{C-s} again. If the search is -unable to find the string, it will give you an error message. +unable to find the string, it will give you an error message. -@item C-r +@item C-r @findex isearch-backward @kindex C-r This command will perform an incremental search in the backward @@ -56,7 +56,7 @@ you an error message. If you make a mistake while typing the string names when you use the above commands, you can use the @key{DEL} key to erase characters. Each @key{DEL} will erase the last character. At any time if you want to quit -the search, just type @kbd{C-g}. +the search, just type @kbd{C-g}. To do a non-incremental search i.e. to start the search only after you have typed the whole string you can use the following commands: @@ -64,7 +64,7 @@ you have typed the whole string you can use the following commands: @table @kbd @item C-s RET @dfn{string} RET This command will search for the specified string in the forward -direction and will give an error message if the string is not found. +direction and will give an error message if the string is not found. @item C-r RET @dfn{string} RET This command will search for the specified string in the backward @@ -72,13 +72,13 @@ direction. @end table For information on how Emacs searches for words and regular -expressions, @xref{Search,,,xemacs,XEmacs User's Manual}. +expressions, @xref{Search,,,xemacs,XEmacs User's Manual}. To replace all occurrences of a string in Emacs, you can use the -following command: +following command: @findex replace-string @example -M-x replace-string +M-x replace-string @end example @noindent @@ -111,8 +111,8 @@ check the spelling of a word or a region. You can use menus to check for spellings: @noindent -Evaluate the expression @code{(load "big-menubar")}. To evaluate this +Evaluate the expression @code{(load "big-menubar")}. To evaluate this expression you need to hit the @key{META} or the @key{ESC} key twice and type in the expression in the echo area before hitting @key{RET}. You will get an extensive menubar. Select the @b{Spell Check} menu item from -the @b{Utilities} menu for checking spellings. +the @b{Utilities} menu for checking spellings. diff --git a/man/widget.texi b/man/widget.texi index 46f6bd1..4a797d5 100644 --- a/man/widget.texi +++ b/man/widget.texi @@ -94,7 +94,7 @@ implement forms are: @enumerate @item -More complex field than just editable text are supported. +More complex fields than just editable text are supported. @item You can give the user immediate feedback if he enters invalid data in a text field, and sometimes prevent entering invalid data. @@ -430,7 +430,7 @@ NAME ::= (NAME [KEYWORD ARGUMENT]... ARGS) | NAME @end example -Where, @var{name} is a widget name, @var{keyword} is the name of a +where @var{name} is a widget name, @var{keyword} is the name of a property, @var{argument} is the value of the property, and @var{args} are interpreted in a widget specific way. @@ -510,7 +510,7 @@ The value of the symbol is expanded according to this table. @end table @item :doc -The string inserted by the @samp{%d} escape in the format +The string inserted by the @samp{%d} or @samp{%h} escape in the format string. @item :tag @@ -559,7 +559,7 @@ Should be a function called with two arguments, the widget and a value, and returning non-nil if the widget can represent the specified value. @item :validate -A function which takes a widget as an argument, and return nil if the +A function which takes a widget as an argument, and returns nil if the widget's current value is valid for the widget. Otherwise it should return the widget containing the invalid data, and set that widget's @code{:error} property to a string explaining the error. @@ -722,8 +722,10 @@ The following extra properties are recognized. @table @code @item :size -The width of the editable field.@* -By default the field will reach to the end of the line. +The minimum width of the editable field.@* +By default the field will reach to the end of the line. If the +content is too large, the displayed representation will expand to +contain it. The content is not truncated to size. @item :value-face Face used for highlighting the editable field. Default is @@ -742,7 +744,7 @@ which matches everything. @item :keymap Keymap used in the editable field. The default value is @code{widget-field-keymap}, which allows you to use all the normal -editing commands, even if the buffers major mode suppress some of them. +editing commands, even if the buffer's major mode suppress some of them. Pressing return invokes the function specified by @code{:action}. @end table diff --git a/man/xemacs-faq.texi b/man/xemacs-faq.texi index 7014895..d683baa 100644 --- a/man/xemacs-faq.texi +++ b/man/xemacs-faq.texi @@ -7,7 +7,7 @@ @finalout @titlepage @title XEmacs FAQ -@subtitle Frequently asked questions about XEmacs @* Last Modified: $Date: 2000/09/19 07:50:41 $ +@subtitle Frequently asked questions about XEmacs @* Last Modified: $Date: 2000/11/02 21:51:16 $ @sp 1 @author Tony Rossini @author Ben Wing @@ -148,6 +148,8 @@ Installation and Trouble Shooting * Q2.0.10:: After I run configure I find a coredump, is something wrong? * Q2.0.11:: XEmacs can't resolve host names. * Q2.0.12:: Why can't I strip XEmacs? +* Q2.0.13:: I don't need no steenkin' packages. Do I? (NEW) +* Q2.0.14:: How do I figure out which packages to install? (NEW) Trouble Shooting: * Q2.1.1:: XEmacs just crashed on me! @@ -174,6 +176,7 @@ Trouble Shooting: * Q2.1.22:: XEmacs seems to take a really long time to do some things. * Q2.1.23:: Movemail on Linux does not work for XEmacs 19.15 and later. * Q2.1.24:: XEmacs won't start without network. (NEW) +* Q2.1.25:: After upgrading, XEmacs won't do `foo' any more! (NEW) Customization and Options @@ -787,23 +790,23 @@ developers responsible for the 19.16/20.x releases are: @itemize @bullet @item @email{martin@@xemacs.org, Martin Buchholz} -@ifhtml +@html
Portrait of Martin Buchholz
-@end ifhtml +@end html @item @email{steve@@xemacs.org, Steve Baur} -@ifhtml +@html
Portrait of Steve Baur
-@end ifhtml +@end html @item @email{hniksic@@xemacs.org, Hrvoje Niksic} -@ifhtml +@html
Portrait of Hrvoje Niksic
-@end ifhtml +@end html @end itemize @@ -811,26 +814,26 @@ The developers responsible for the 19.14 release are: @itemize @bullet @item @email{cthomp@@xemacs.org, Chuck Thompson} -@ifhtml +@html
Portrait of Chuck Thompson
-@end ifhtml +@end html Chuck was Mr. XEmacs from 19.11 through 19.14, and is responsible for XEmacs becoming a widely distributed program over the Internet. @item @email{ben@@xemacs.org, Ben Wing} -@ifhtml +@html
Portrait of Ben Wing
-@end ifhtml +@end html @end itemize @itemize @bullet @item @email{jwz@@jwz.org, Jamie Zawinski} -@ifhtml +@html
Portrait of Jamie Zawinski
-@end ifhtml +@end html Jamie Zawinski was Mr. Lucid Emacs from 19.0 through 19.10, the last release actually named Lucid Emacs. Richard Mlynarik was crucial to @@ -1212,6 +1215,8 @@ Installation: * Q2.0.10:: After I run configure I find a coredump, is something wrong? * Q2.0.11:: XEmacs can't resolve host names. * Q2.0.12:: Why can't I strip XEmacs? +* Q2.0.13:: I don't need no steenkin' packages. Do I? (NEW) +* Q2.0.14:: I don't want to install a million .els one at a time! (NEW) Trouble Shooting: * Q2.1.1:: XEmacs just crashed on me! @@ -1238,6 +1243,7 @@ Trouble Shooting: * Q2.1.22:: XEmacs seems to take a really long time to do some things. * Q2.1.23:: Movemail on Linux does not work for XEmacs 19.15 and later. * Q2.1.24:: XEmacs won't start without network. (NEW) +* Q2.1.25:: After upgrading, XEmacs won't do `foo' any more! (NEW) @end menu @node Q2.0.1, Q2.0.2, Installation, Installation @@ -1520,7 +1526,7 @@ check to see if you've put DNS in the shared libc and will then proceed to link against the DNS resolver library code. @end quotation -@node Q2.0.12, Q2.1.1, Q2.0.11, Installation +@node Q2.0.12, Q2.0.13, Q2.0.11, Installation @unnumberedsubsec Q2.0.12: Why can't I strip XEmacs? @email{cognot@@fronsac.ensg.u-nancy.fr, Richard Cognot} writes: @@ -1575,7 +1581,42 @@ cp lib-src/DOC-19.16-XEmacs @end enumerate @end quotation -@node Q2.1.1, Q2.1.2, Q2.0.12, Installation +@node Q2.0.13, Q2.0.14, Q2.0.12, Installation +@unnumberedsubsec Q2.0.13: I don't need no steenkin' packages. Do I? (NEW) + +Strictly speaking, no. XEmacs will build and install just fine without +any packages installed. However, only the most basic editing functions +will be available with no packages installed, so installing packages is +an essential part of making your installed XEmacs _useful_. + +@node Q2.0.14, Q2.1.1, Q2.0.13, Installation +@unnumberedsubsec Q2.0.12: How do I figure out which packages to install? (NEW) + +Many people really liked the old way that packages were bundled and do +not want to mess with packages at all. You can grab all the packages at +once like you used to with old XEmacs versions. Download the file + +@file{xemacs-sumo.tar.gz} + +For an XEmacs compiled with Mule you also need + +@file{xemacs-mule-sumo.tar.gz} + +from the @file{packages} directory on your XEmacs mirror archive. +N.B. They are called 'Sumo Tarballs' for good reason. They are +currently about 15MB and 2.3MB (gzipped) respectively. + +Install them by + +@code{cd $prefix/lib/xemacs ; gunzip -c | tar xf -} + +See README.packages for more detailed installation instructions. + +As the Sumo tarballs are not regenerated as often as the individual +packages, it is recommended that you use the automatic package tools +afterwards to pick up any recent updates. + +@node Q2.1.1, Q2.1.2, Q2.0.14, Installation @unnumberedsec 2.1: Trouble Shooting @unnumberedsubsec Q2.1.1: Help! XEmacs just crashed on me! @@ -2274,7 +2315,7 @@ and uncomment the line that reads: @end example @end quotation -@node Q2.1.24, , Q2.1.23, Installation +@node Q2.1.24, Q2.1.25, Q2.1.23, Installation @unnumberedsubsec Q2.1.24: XEmacs won't start without network. (NEW) If XEmacs starts when you're on the network, but fails when you're not @@ -2287,6 +2328,18 @@ on the network, you may be missing a "localhost" entry in your Add that line, and XEmacs will be happy. +@node Q2.1.25, , Q2.1.24, Installation +@unnumberedsubsec Q2.1.25:: After upgrading, XEmacs won't do `foo' any more! (NEW) + +You have been used to doing `foo', but now when you invoke it (or click +the toolbar button or select the menu item), nothing (or an error) +happens. The simplest explanation is that you are missing a package +that is essential to you. You can either track it down and install it +(there is a list of packages and brief descriptions of their contents in +@file{etc/PACKAGES}), or install the `Sumo Tarball' (see @pxref{Q2.0.14}). + +@c #### should xref to XEmacs manual here + @node Customization, Subsystems, Installation, Top @unnumbered 3 Customization and Options diff --git a/man/xemacs/abbrevs.texi b/man/xemacs/abbrevs.texi index f7fd2ac..28a6814 100644 --- a/man/xemacs/abbrevs.texi +++ b/man/xemacs/abbrevs.texi @@ -1,5 +1,5 @@ -@node Abbrevs, Picture, Packages, Top +@node Abbrevs, Picture, Running, Top @chapter Abbrevs @cindex abbrevs @cindex expansion (of abbrevs) diff --git a/man/xemacs/basic.texi b/man/xemacs/basic.texi index 542d289..0d6b4e5 100644 --- a/man/xemacs/basic.texi +++ b/man/xemacs/basic.texi @@ -1,7 +1,7 @@ @c This is part of the XEmacs manual. @c Copyright (C) 1985, 86, 87, 93, 94, 95, 1997 Free Software Foundation, Inc. @c See file xemacs.texi for copying conditions. -@node Basic, Undo, Startup Paths, Top +@node Basic, Undo, Packages, Top @chapter Basic Editing Commands @kindex C-h t diff --git a/man/xemacs/building.texi b/man/xemacs/building.texi index e7d3589..479a53d 100644 --- a/man/xemacs/building.texi +++ b/man/xemacs/building.texi @@ -1,5 +1,5 @@ -@node Running, Packages, Programs, Top +@node Running, Abbrevs, Programs, Top @chapter Compiling and Testing Programs The previous chapter discusses the Emacs commands that are useful for @@ -71,7 +71,7 @@ compilation is finished. You do not have to keep this buffer visible; compilation continues in any case. @findex kill-compilation - To kill the compilation process, type @kbd{M-x-kill-compilation}. The mode + To kill the compilation process, type @kbd{M-x kill-compilation}. The mode line of the @samp{*compilation*} buffer changes to say @samp{signal} instead of @samp{run}. Starting a new compilation also kills any running compilation, as only one can occur at any time. Starting a new diff --git a/man/xemacs/files.texi b/man/xemacs/files.texi index 7ee4fcf..ba63163 100644 --- a/man/xemacs/files.texi +++ b/man/xemacs/files.texi @@ -212,8 +212,10 @@ non-@code{nil}, the @code{find-file} command will check the @code{buffer-file-truename} of all visited files when deciding whether a given file is already in a buffer, instead of just @code{buffer-file-name}. If you attempt to visit another file which is -a hard-link or symbolic-link to a file that is already in a buffer, the -existing buffer will be found instead of a newly created one. +a symbolic link to a file that is already in a buffer, the existing +buffer will be found instead of a newly created one. This works if any +component of the pathname (including a non-terminal component) is a +symbolic link as well, but doesn't work with hard links (nothing does). @cindex creating files If you want to create a file, just visit it. Emacs prints diff --git a/man/xemacs/menus.texi b/man/xemacs/menus.texi index d64afe4..6513323 100644 --- a/man/xemacs/menus.texi +++ b/man/xemacs/menus.texi @@ -21,6 +21,9 @@ Perform standard editing operations, such as cutting, copying, pasting, and killing selected text. @cindex Edit menu +@c #### The Mule menu needs to be documented, but this is not the place +@c for it since Ben just moved it. + @item Apps Access to sub-applications implemented within XEmacs, such as the mail reader, the World Wide Web browser, the spell-checker, and the calendar diff --git a/man/xemacs/packages.texi b/man/xemacs/packages.texi index 15197a9..ccd8f07 100644 --- a/man/xemacs/packages.texi +++ b/man/xemacs/packages.texi @@ -1,4 +1,7 @@ -@node Packages, Abbrevs, Running, Top +@c This is part of the XEmacs manual. +@c Copyright (C) 1985, 86, 87, 93, 94, 95, 1997 Free Software Foundation, Inc. +@c See file xemacs.texi for copying conditions. +@node Packages, Basic, Startup Paths, Top @comment node-name, next, previous, up @section Packages @@ -16,6 +19,7 @@ local needs with safe removal of unnecessary code. * Package Terminology:: Understanding different kinds of packages. * Using Packages:: How to install and use packages. * Building Packages:: Building packages from sources. +* Available Packages:: A brief, out-of-date, directory of packaged LISP. @end menu @node Package Terminology, Using Packages, , Packages @@ -335,7 +339,7 @@ changed packages. @end enumerate -@node Building Packages, , Using Packages, Packages +@node Building Packages, Available Packages, Using Packages, Packages @comment node-name, next, previous, up Source packages are available from the @file{packages/source-packages} @@ -397,3 +401,272 @@ Runs the rules @code{srckit} followed by @code{binkit}. This is primarily of use by XEmacs maintainers producing files for distribution. @end table + +@node Available Packages, , Building Packages, Packages +@comment node-name, next, previous, up + +This section is surely out-of-date. If you're sure that XEmacs is +able to do something, but your installed XEmacs won't do it for you, +it's probably in a package. If you can't find it in this section, +that's a bug---please report it. It is very hard to keep this section +up-to-date; your reports, comments, and questions will help a lot. + +This data is up-to-date as of 10 February 1999. (Ouch! I told you!) + +@subsection Library Packages (libs) + +These packages are required to build and support most of the rest of +XEmacs. By design, xemacs-base is a `regular' package. Use restraint +when adding new files there as it is required by almost everything. + +@table @file +@item Sun +Support for Sparcworks. + +@item apel +A Portable Emacs Library. Used by XEmacs MIME support. + +@item edebug +A Lisp debugger. + +@item dired +The DIRectory EDitor is for manipulating, and running commands on +files in a directory. + +@item efs +Treat files on remote systems the same as local files. + +@item mail-lib +Fundamental lisp files for providing email support. + +@item tooltalk +Support for building with Tooltalk. + +@item xemacs-base +Fundamental XEmacs support. Install this unless you wish a totally +naked XEmacs. + +@item xemacs-devel +XEmacs Lisp developer support. This package contains utilities for +supporting Lisp development. It is a single-file package so it may be +tailored. +@end table + +@subsection Communications Packages (comm) + +These packages provide support for various communications, primarily +email and usenet. + +@table @file +@item footnote +Footnoting in mail message editing modes. + +@item gnats +XEmacs bug reports. + +@item gnus +The Gnus Newsreader and Mailreader. + +@item mailcrypt +Support for messaging encryption with PGP. + +@item mh-e +Front end support for MH. + +@item net-utils +Miscellaneous Networking Utilities. This is a single-file package and +files may be deleted at will. + +@item ph +Emacs implementation of the ph client to CCSO/qi directory servers. + +@item rmail +An obsolete Emacs mailer. If you do not already use it don't start. + +@item supercite +An Emacs citation tool. Useful with all Emacs Mailers and Newsreaders. + +@item tm +Emacs MIME support. + +@item vm +An Emacs mailer. + +@item w3 +A Web browser. +@end table + +@subsection Games and Amusements (games) + +@table @file +@item cookie +Spook and Yow (Zippy quotes). + +@item games +Tetris, Sokoban, and Snake. + +@item mine +Minehunt. + +@item misc-games +Other amusements and diversions. +@end table + +@subsection Mule Support (mule) + +@table @file +@item egg-its +Wnn (4.2 and 6) support. SJ3 support. Must be installed prior to +XEmacs build. + +@item leim +Quail. Used for everything other than English and Japanese. + +@item locale +Used for localized menubars (French and Japanese) and localized splash +screens (Japanese). + +@item mule-base +Basic Mule support. Must be installed prior to building with Mule. + +@item skk +Another Japanese Language Input Method. Can be used without a +separate process running as a dictionary server. +@end table + +@subsection Productivity Packages (oa) + +@table @file +@item calendar +Calendar and diary support. + +@item edit-utils +Single file lisp packages for various XEmacs goodies. Load this and +weed out the junk you don't want. + +@item forms +Forms editing support (obsolete, use the builtin Widget instead). + +@item frame-icon +Provide a WM icon based on major mode. + +@item hm--html-menus +HTML editing. + +@item ispell +Spell-checking with ispell. + +@item pc +PC style interface emulation. + +@item psgml +Validated HTML/SGML editing. + +@item sgml +SGML/Linuxdoc-SGML editing. + +@item slider +User interface tool. + +@item speedbar +??? Document me. + +@item strokes +Mouse enhancement utility. + +@item text-modes +Various single file lisp packages for editing text files. + +@item time +Display time & date on the modeline. +@end table + +@subsection Operating System Utilities (os) + +@table @file +@item eterm +Terminal emulator. + +@item igrep +Enhanced front-end for Grep. + +@item ilisp +Front-end for Inferior Lisp. + +@item os-utils +Miscellaneous single-file O/S utilities, for printing, archiving, +compression, remote shells, etc. + +@item view-process +A Unix process browsing tool. +@end table + +@subsection Program Editing Support (prog) + +@table @file +@item ada +Ada language support. + +@item c-support +Basic single-file add-ons for editing C code. + +@item cc-mode +C, C++ and Java language support. + +@item debug +GUD, gdb, dbx debugging support. + +@item ediff +Interface over patch. + +@item emerge +Another interface over patch. + +@item pcl-cvs +CVS frontend. + +@item prog-modes +Miscellaneous single-file lisp files for various programming languages. + +@item scheme +Front-end support for Inferior Scheme. + +@item sh-script +Support for editing shell scripts. + +@item vc +Version Control for Free systems. + +@item vc-cc +Version Control for ClearCase. This package must be installed prior +to building XEmacs [broken as of XEmacs 20.5-beta19]. + +@item vhdl +Support for VHDL. +@end table + +@subsection Word Processing (wp) + +@table @file +@item auctex +Basic TeX/LaTeX support. + +@item crisp +Crisp/Brief emulation. + +@item edt +DEC EDIT/EDT emulation. + +@item texinfo +XEmacs TeXinfo support. + +@item textools +Single-file TeX support. + +@item tpu +DEC EDIT/TPU support. + +@item viper +VI emulation support. +@end table + diff --git a/man/xemacs/startup.texi b/man/xemacs/startup.texi index f7bd171..dde0945 100644 --- a/man/xemacs/startup.texi +++ b/man/xemacs/startup.texi @@ -1,4 +1,4 @@ -@node Startup Paths, Basic, Command Switches, Top +@node Startup Paths, Packages, Command Switches, Top @comment node-name, next, previous, up @section How XEmacs finds Directories and Files diff --git a/man/xemacs/windows.texi b/man/xemacs/windows.texi index 17e903e..2dd07c3 100644 --- a/man/xemacs/windows.texi +++ b/man/xemacs/windows.texi @@ -6,7 +6,7 @@ Emacs can split the frame into two or many windows, which can display parts of different buffers or different parts of one buffer. If you are running XEmacs under X, that means you can have the X window that contains -the Emacs frame have multiple subwindows. +the Emacs frame have multiple subwindows. @menu * Basic Window:: Introduction to Emacs windows. @@ -30,7 +30,7 @@ show different parts of it, because each window has its own value of point. displayed by that window is the current buffer. The cursor shows the location of point in that window. Each other window has a location of point as well, but since the terminal has only one cursor, it -cannot show the location of point in the other windows. +cannot show the location of point in the other windows. 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 @@ -127,7 +127,7 @@ order, generally top to bottom and left to right. From the rightmost and bottommost window, it goes back to the one at the upper left corner. A numeric argument, @var{n}, moves several steps in the cyclic order of windows. A negative numeric argument moves around the cycle in the -opposite order. If the optional second argument @var{all-frames} is +opposite order. If the optional second argument @var{which-frames} is non-@code{nil}, the function cycles through all frames. 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, @@ -146,7 +146,7 @@ are no more windows. The usual scrolling commands (@pxref{Display}) apply to the selected window only. @kbd{M-C-v} (@code{scroll-other-window}) scrolls the window that @kbd{C-x o} would select. Like @kbd{C-v}, it takes positive -and negative arguments. +and negative arguments. @findex compare-windows The command @kbd{M-x compare-windows} compares the text in the current @@ -178,7 +178,7 @@ buffer to select. @findex mail-other-window @table @kbd @item C-x 4 b @var{bufname} @key{RET} -Select buffer @var{bufname} in another window. This runs +Select buffer @var{bufname} in another window. This runs @code{switch-to-buffer-other-window}. @item C-x 4 f @var{filename} @key{RET} Visit file @var{filename} and select its buffer in another window. This @@ -209,10 +209,10 @@ work using this function. @table @kbd @item C-x 0 -Get rid of the selected window (@code{delete-window}). That is a zero. +Get rid of the selected window (@code{delete-window}). That is a zero. If there is more than one Emacs frame, deleting the sole remaining window on that frame deletes the frame as well. If the current frame -is the only frame, it is not deleted. +is the only frame, it is not deleted. @item C-x 1 Get rid of all windows except the selected one (@code{delete-other-windows}). diff --git a/man/xemacs/xemacs.texi b/man/xemacs/xemacs.texi index 8dc6609..abb9efb 100644 --- a/man/xemacs/xemacs.texi +++ b/man/xemacs/xemacs.texi @@ -129,7 +129,8 @@ Important General Concepts * Command Switches:: Hairy startup options. * Startup Paths:: - How XEmacs finds Directories and Files + How XEmacs finds Directories and Files. +* Packages:: How XEmacs organizes its high-level functionality. Fundamental Editing Commands * Basic:: The most basic editing commands. @@ -168,7 +169,6 @@ Advanced Features * Text:: Commands and modes for editing English. * Programs:: Commands and modes for editing programs. * Running:: Compiling, running and debugging programs. -* Packages:: How to add new packages to XEmacs. * Abbrevs:: How to define text abbreviations to reduce the number of characters you must type. * Picture:: Editing pictures made up of characters @@ -234,6 +234,13 @@ Pull-down Menus * Menu Customization:: Adding and removing menu items and related operations. +Packages + +* Packages:: Introduction to XEmacs Packages. +* Package Terminology:: Understanding different kinds of packages. +* Using Packages:: How to install and use packages. +* Building Packages:: Building packages from sources. + Basic Editing Commands * Blank Lines:: Commands to make or delete blank lines. @@ -503,13 +510,6 @@ Lisp Libraries * Compiling Libraries:: Compiling a library makes it load and run faster. * Mocklisp:: Converting Mocklisp to Lisp so XEmacs can run it. -Packages - -* Packages:: Introduction to XEmacs Packages. -* Package Terminology:: Understanding different kinds of packages. -* Using Packages:: How to install and use packages. -* Building Packages:: Building packages from sources. - Abbrevs * Defining Abbrevs:: Defining an abbrev, so it will expand when typed. diff --git a/modules/base64/base64.c b/modules/base64/base64.c index 48459a7..2c5bac1 100644 --- a/modules/base64/base64.c +++ b/modules/base64/base64.c @@ -66,7 +66,7 @@ determined. Else assume binary coding if all else fails. /* set up the in stream */ if (BUFFERP (object)) { - struct buffer *b = decode_buffer (object, 1); + struct buffer *b = XBUFFER (object); Bufpos begv, endv; /* Figure out where we need to get info from */ get_buffer_range_char (b, start, end, &begv, &endv, GB_ALLOW_NIL); @@ -256,7 +256,7 @@ determined. Else assume binary coding if all else fails. /* set up the in stream */ if (BUFFERP (object)) { - struct buffer *b = decode_buffer (object, 1); + struct buffer *b = XBUFFER (object); Bufpos begv, endv; /* Figure out where we need to get info from */ get_buffer_range_char (b, start, end, &begv, &endv, GB_ALLOW_NIL); diff --git a/nt/ChangeLog b/nt/ChangeLog index d91476c..90971b2 100644 --- a/nt/ChangeLog +++ b/nt/ChangeLog @@ -1,3 +1,27 @@ +2000-11-14 Martin Buchholz + + * XEmacs 21.2.37 is released. + +2000-10-27 Martin Buchholz + + * config.h: Oops, _getpt ==> _getpty + +2000-10-11 Martin Buchholz + + * config.h (HAVE_XFREE86): Remove. + (HAVE_XREGISTERIMINSTANTIATECALLBACK): New. + (XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE): New. + +2000-10-10 Martin Buchholz + + * config.h: + Sync with pty/signaling related changes to src/config.h.in + +2000-10-07 Adrian Aichner + + * xemacs.mak (default): Enforce runnig nmake from xemacs.mak's + directory to avoid problems with relative paths. + 2000-10-04 Martin Buchholz * XEmacs 21.2.36 is released. diff --git a/nt/README b/nt/README index dba6c22..439eda5 100644 --- a/nt/README +++ b/nt/README @@ -137,7 +137,7 @@ If you want support for X you will also need: it somewhere. Copy nt\tiff.mak from the xemacs sources to the contrib\winnt subdirectory of the tiff sources, cd to that directory and build libtiff with 'nmake -f tiff.mak'. Note: tiff.mak has only been - verified to work under WinNT, not Win95 or 98. However, the lastest + verified to work under WinNT, not Win95 or 98. However, the latest distribution of libtiff includes a contrib\win95\makefile.w95; that might work. diff --git a/nt/config.h b/nt/config.h index 34ac06b..6dd1f1c 100644 --- a/nt/config.h +++ b/nt/config.h @@ -92,8 +92,8 @@ Boston, MA 02111-1307, USA. */ #define FUNCPROTO 15 #endif -/* Define this if you're using XFree386. */ -#undef HAVE_XFREE386 +#define HAVE_XREGISTERIMINSTANTIATECALLBACK +#undef XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE #undef THIS_IS_X11R4 #undef THIS_IS_X11R5 @@ -148,7 +148,6 @@ Boston, MA 02111-1307, USA. */ /* Some things figured out by the configure script, grouped as they are in configure.in. */ #undef HAVE_MACH_MACH_H -#undef HAVE_SYS_STROPTS_H #undef HAVE_SYS_TIMEB_H #undef HAVE_UNISTD_H #undef HAVE_UTIME_H @@ -261,6 +260,22 @@ Boston, MA 02111-1307, USA. */ #undef HAVE_TZSET #undef HAVE_UTIMES #undef HAVE_WAITPID +#undef HAVE_VSNPRINTF + +/* PTY support functions */ +#undef HAVE_GETPT /* glibc's easy pty allocation function */ +#undef HAVE__GETPTY /* SGI's easy pty allocation function */ +#undef HAVE_OPENPTY /* BSD's easy pty allocation function */ +#undef HAVE_GRANTPT /* Unix98 */ +#undef HAVE_UNLOCKPT /* Unix98 */ +#undef HAVE_PTSNAME /* Unix98 */ +#undef HAVE_KILLPG /* BSD */ +#undef HAVE_TCGETPGRP /* Posix 1 */ +#undef HAVE_ISASTREAM /* SysV streams */ +#undef HAVE_PTY_H /* Linux, Tru64 openpty */ +#undef HAVE_LIBUTIL_H /* BSD openpty */ +#undef HAVE_STROPTS_H /* SysV streams */ +#undef HAVE_STRTIO_H /* SysV streams TIOCSIGNAL */ #define HAVE_SOCKETS #undef HAVE_SOCKADDR_SUN_LEN diff --git a/nt/xemacs.mak b/nt/xemacs.mak index b0ffd19..f081407 100644 --- a/nt/xemacs.mak +++ b/nt/xemacs.mak @@ -26,7 +26,14 @@ default: all -XEMACS=.. +# APA: Since there seems to be no way to determine the directory where +# xemacs.mak is located (from within nmake) we just insist on the user +# to invoke nmake in the directory where xemacs.mak is. +!if !exist("$(MAKEDIR)\xemacs.mak") +!error Please run nmake from the directory of this makefile (xemacs\nt). +!endif + +XEMACS=$(MAKEDIR)\.. LISP=$(XEMACS)\lisp LIB_SRC=$(XEMACS)\lib-src MODULES=$(XEMACS)\modules diff --git a/src/ChangeLog b/src/ChangeLog index 3596a7d..612d720 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -2583,10 +2583,776 @@ (Vcharset_thai_tis620): Likewise. (Vcharset_katakana_jisx0201): Likewise. +2000-11-14 Martin Buchholz + + * XEmacs 21.2.37 is released. + +2000-11-13 Yoshiki Hayashi + + * fileio.c (Finsert_file_contents_internal): UNGCPRO before return. + Add comments about discarded return value. + +2000-11-09 Yoshiki Hayashi + + * callint.c: + * event-stream.c: Fix comments. Remove some #if 0'ed part. + +2000-10-27 Andy Piper + + * gutter.c (Fset_default_gutter_position): default left and right + gutters to visible. + (calculate_gutter_size): calculate resonable heuristic for left + and right gutter sizes. + (specifier_vars_of_gutter): change left and right gutter sizes to + autodetect. + (calculate_gutter_size_from_display_lines): new function. + (output_gutter): check for resizing on left and right gutters. + (clear_gutter): don't special case top and left gutters. + (specifier_vars_of_gutter): use new signature for + set_specifier_caching. + + * glyphs-x.c (x_redisplay_widget): spelling fix. + * glyphs.c (specifier_vars_of_glyphs): + * menubar.c (specifier_vars_of_menubar): + * redisplay.c (specifier_vars_of_redisplay): + * toolbar.c (specifier_vars_of_toolbar): + * window.c (specifier_vars_of_window): + * scrollbar.c (specifier_vars_of_scrollbar): + (complex_vars_of_scrollbar): use new signature for + set_specifier_caching. + + * specifier.c (set_specifier_caching): include recompute flag. + (recompute_one_cached_specifier_in_window): always recompute if + flag set. + (recompute_one_cached_specifier_in_frame): ditto. + + * specifier.h (struct specifier_caching): add recompute flag. + +2000-10-24 Andy Piper + + * unexcw.c (copy_executable_and_dump_data_section): add new + BSS_PAD_SIZE so that we can re-instate a mini-bss. This keeps gdb + 5.0 happy. + +2000-11-06 Yoshiki Hayashi + + * console-x.h (x_device): New member modifier_release_time. + * event-Xt.c (x_handle_sticky_modifiers): + Bound interval modifier keys are sticky. + * event-stream.c (Vmodifier_keys_sticky_time): New variable. + * events.h: extern it. + +2000-11-06 Yoshiki Hayashi + + * cmdloop.c (Fcommand_loop_1): Just add C-g to event queue. + +2000-11-06 Yoshiki Hayashi + + * event-stream.c (execute_command_event): Preserve current_events + and the like when event is misc-user-event. + Inhibit quit during the call to maybe_echo_keys. + +2000-10-31 Yoshiki Hayashi + + * filelock.c (lock_buffer): Cope with kill-buffer. Don't create a + symlink when buffer is killed. + (inhibit_clash_detection): New variable. + +2000-10-30 Yoshiki Hayashi + + * console.c (Fset_input_method): Trigger redisplay on tty. + +2000-11-07 Martin Buchholz + + * process.c (Fprocess_status): Revert to previous behavior: + (process-status "nosuchprocess") ==> nil + +2000-11-06 Martin Buchholz + + * mule-charset.h (CHARSET_BY_LEADING_BYTE): + Work around another GCC 2.95.2 optimizer bug. + +2000-11-02 Martin Buchholz + + * process.c (Fget_process): Use LIST_LOOP_2. + (kill_buffer_processes): Use LIST_LOOP_2. + + * minibuf.c (Fall_completions): + Delete old non-functional code for FSF fourth argument. + + * frame.c (frame_matches_frame_spec): + Renamed from `frame_matches_frametype'. Update all callers. + (device_matches_device_spec): + Renamed from 'device_matches_console_spec'. Update all callers. + + * doc.c (Fsubstitute_command_keys): + Remove buffer overflow crash. Small code cleanups. + + * casetab.c (check_case_table): Simpler code. + + * window.c (Freplace_buffer_in_windows): + Give this the same WHICH-FRAMES and WHICH-DEVICES parameters + (and similar implementation) as Fdelete_windows_on. + Update all callers. + + * alloc.c (Fmake_list): + * alloc.c (make_vector): + * alloc.c (Fmake_vector): + * alloc.c (make_bit_vector): + * alloc.c (Fmake_bit_vector): + * alloc.c (Fbit_vector): + * alloc.c (Fmake_string): + * alloc.c (Fpurecopy): + * alloc.c (Fmemory_limit): + * buffer.c: + * buffer.c (Fget_buffer): + * buffer.c (Fkill_buffer): + * buffer.c (complex_vars_of_buffer): + * bytecode.c (Fcompiled_function_stack_depth): + * callint.c (Fprefix_numeric_value): + * event-stream.c: + * event-stream.c (Fread_key_sequence): + * casetab.c: + * casetab.c (Fcase_table_p): + * casetab.c (check_case_table): + * casetab.c (Fset_case_table): + * casetab.c (Fset_standard_case_table): + * chartab.c: + * chartab.c (Fchar_table_type): + * chartab.c (Freset_char_table): + * chartab.c (Fget_char_table): + * chartab.c (Fget_range_char_table): + * chartab.c (Fput_char_table): + * chartab.c (Fmap_char_table): + * chartab.c (Fcategory_table_p): + * chartab.c (Fcheck_category_at): + * chartab.c (Fchar_in_category_p): + * chartab.c (Fcategory_table): + * chartab.c (Fcopy_category_table): + * chartab.c (Fset_category_table): + * chartab.c (Fcategory_designator_p): + * chartab.c (Fcategory_table_value_p): + * cmds.c (Fdelete_char): + * cmds.c (Fdelete_backward_char): + * cmds.c (Fself_insert_command): + * cmds.c (Fself_insert_internal): + * console.c (Fvalid_console_type_p): + * console.c (Fcdfw_console): + * console.c (Fconsole_type): + * console.c (Fconsole_name): + * console.c (Fconsole_device_list): + * console.c (Fconsole_on_window_system_p): + * data.c: + * data.c (Feq): + * data.c (Fold_eq): + * data.c (Fsubr_interactive): + * data.c (Fchar_to_int): + * data.c (Fint_to_char): + * data.c (Fsetcar): + * data.c (Fsetcdr): + * data.c (Fnumber_to_string): + * data.c (Fstring_to_number): + * data.c (Frem): + * database.c (mark_database): + * database.c (finalize_database): + * database.c (Fdatabase_live_p): + * database.c (Fdatabasep): + * device-x.c (Fx_get_resource): + * device.c (Fdfw_device): + * dired.c: + * dired.c (Ffile_name_completion): + * dired.c (Ffile_name_all_completions): + * dired.c (Fuser_name_completion): + * dired.c (Fuser_name_completion_1): + * dired.c (Fuser_name_all_completions): + * doc.c (Fdocumentation): + * doc.c (Fdocumentation_property): + * doc.c (Fsubstitute_command_keys): + * editfns.c: + * editfns.c (Fchar_to_string): + * editfns.c (Fstring_to_char): + * editfns.c (Ftemp_directory): + * editfns.c (Finsert_char): + * editfns.c (Fbuffer_substring_no_properties): + * editfns.c (Fnarrow_to_region): + * editfns.c (Fchar_equal): + * editfns.c (Fchar_Equal): + * editfns.c (Ftranspose_regions): + * emacs.c (Fdump_emacs): + * eval.c (Fthrow): + * eval.c (Fcommand_execute): + * eval.c (Fautoload): + * eval.c (Fbacktrace): + * eval.c (Fbacktrace_frame): + * events.c: + * events.c (Fcopy_event): + * events.c (Fcharacter_to_event): + * events.c (Fevent_button): + * events.c (Fevent_process): + * extents.c: + * extents.c (Fnext_extent_change): + * extents.c (Fextent_property): + * faces.c (Ffacep): + * faces.c (Fmake_face): + * file-coding.c: + * file-coding.c (Fencode_shift_jis_char): + * file-coding.c (Fencode_big5_char): + * fileio.c (Ffile_name_directory): + * fileio.c (Ffile_name_nondirectory): + * fileio.c (Ffile_name_as_directory): + * fileio.c (Fdirectory_file_name): + * fileio.c (Ffile_truename): + * fileio.c (Fsubstitute_in_file_name): + * fileio.c (Ffile_modes): + * fileio.c (Fset_file_modes): + * fileio.c (Fset_default_file_modes): + * fileio.c (Fverify_visited_file_modtime): + * floatfns.c (Facos): + * floatfns.c (Fasin): + * floatfns.c (Fatan): + * floatfns.c (Fcos): + * floatfns.c (Fsin): + * floatfns.c (Ftan): + * floatfns.c (Fbessel_j0): + * floatfns.c (Fbessel_j1): + * floatfns.c (Fbessel_jn): + * floatfns.c (Fbessel_y0): + * floatfns.c (Fbessel_y1): + * floatfns.c (Fbessel_yn): + * floatfns.c (Ferf): + * floatfns.c (Ferfc): + * floatfns.c (Flog_gamma): + * floatfns.c (Fexp): + * floatfns.c (Fexpt): + * floatfns.c (Flog): + * floatfns.c (Flog10): + * floatfns.c (Fsqrt): + * floatfns.c (Fcube_root): + * floatfns.c (Facosh): + * floatfns.c (Fasinh): + * floatfns.c (Fatanh): + * floatfns.c (Fcosh): + * floatfns.c (Fsinh): + * floatfns.c (Ftanh): + * floatfns.c (Fabs): + * floatfns.c (Ffloat): + * floatfns.c (Flogb): + * floatfns.c (Fceiling): + * floatfns.c (Ffloor): + * floatfns.c (Fround): + * floatfns.c (Ftruncate): + * floatfns.c (Ffceiling): + * floatfns.c (Fffloor): + * floatfns.c (Ffround): + * floatfns.c (Fftruncate): + * fns.c (Fstring_equal): + * fns.c (Fstring_lessp): + * fns.c (concat2): + * fns.c (concat3): + * fns.c (vconcat2): + * fns.c (vconcat3): + * fns.c (Fsubstring): + * fns.c (Fassoc): + * fns.c (Fold_assoc): + * fns.c (assoc_no_quit): + * fns.c (Fassq): + * fns.c (Fold_assq): + * fns.c (assq_no_quit): + * fns.c (Frassoc): + * fns.c (Fold_rassoc): + * fns.c (Frassq): + * fns.c (Fold_rassq): + * fns.c (rassq_no_quit): + * fns.c (Fremassoc): + * fns.c (remassoc_no_quit): + * fns.c (Fremassq): + * fns.c (remassq_no_quit): + * fns.c (Fremrassoc): + * fns.c (Fremrassq): + * fns.c (remrassq_no_quit): + * fns.c (Fsort): + * fns.c (Fplist_get): + * fns.c (Fplist_put): + * fns.c (Fplist_remprop): + * fns.c (Fplist_member): + * fns.c (Flax_plist_get): + * fns.c (Flax_plist_put): + * fns.c (Flax_plist_remprop): + * fns.c (Flax_plist_member): + * fns.c (Fequal): + * fns.c (Fold_equal): + * fns.c (Frequire): + * fns.c (Fbase64_encode_region): + * fns.c (Fbase64_encode_string): + * fns.c (Fbase64_decode_region): + * frame.c: + * frame.c (frame_matches_frame_spec): + * frame.c (device_matches_device_spec): + * frame.c (next_frame): + * frame.c (previous_frame): + * frame.c (Fnext_frame): + * frame.c (Fprevious_frame): + * frame.c (Fframe_property): + * frame.c (Fset_frame_height): + * frame.c (Fset_frame_size): + * frame.h: + * glyphs.c: + * glyphs.c (if): + * glyphs.c (decode_error_behavior_flag): + * glyphs.c (Fmake_image_instance): + * indent.c (Findent_to): + * intl.c (Fignore_defer_gettext): + * keymap.c (Fkeymapp): + * keymap.c (Flookup_key): + * lread.c: + * lread.c (Fload_internal): + * lread.c (Feval_buffer): + * lread.c (Feval_region): + * macros.c (Fexecute_kbd_macro): + * marker.c (set_marker_internal): + * marker.c (Fset_marker): + * marker.c (set_marker_restricted): + * marker.c (Fcopy_marker): + * marker.c (noseeum_copy_marker): + * menubar.c: + * menubar.c (Fpopup_menu): + * minibuf.c: + * mule-charset.c (Fcharset_name): + * mule-charset.c (Fchar_charset): + * mule-charset.c (Fchar_octet): + * mule-charset.c (Fsplit_char): + * mule-wnnfns.c (Fwnn_open): + * mule-wnnfns.c (Fwnn_dict_comment): + * mule-wnnfns.c (Fwnn_quit_henkan): + * mule-wnnfns.c (Fwnn_word_toroku): + * mule-wnnfns.c (Fwnn_word_sakujo): + * mule-wnnfns.c (Fwnn_word_use): + * mule-wnnfns.c (Fwnn_hindo_set): + * objects.c: + * objects.c (Fmake_color_instance): + * objects.c (Fmake_font_instance): + * print.c (Fwrite_char): + * process.c: + * process.c (mark_process): + * process.c (print_process): + * process.c (get_process_from_usid): + * process.c (Fprocessp): + * process.c (Fprocess_live_p): + * process.c (Fget_process): + * process.c (Fget_buffer_process): + * process.c (get_process): + * process.c (Fprocess_id): + * process.c (Fprocess_name): + * process.c (Fprocess_command): + * process.c (init_process_io_handles): + * process.c (start_process_unwind): + * process.c (Fstart_process_internal): + * process.c (Fopen_multicast_group_internal): + * process.c (Fset_process_window_size): + * process.c (read_process_output): + * process.c (send_process): + * process.c (Fprocess_tty_name): + * process.c (Fset_process_buffer): + * process.c (Fprocess_buffer): + * process.c (Fprocess_mark): + * process.c (set_process_filter): + * process.c (Fset_process_filter): + * process.c (Fprocess_filter): + * process.c (Fprocess_send_region): + * process.c (Fprocess_send_string): + * process.c (exec_sentinel): + * process.c (Fset_process_sentinel): + * process.c (Fprocess_sentinel): + * process.c (status_notify): + * process.c (Fprocess_status): + * process.c (Fprocess_exit_status): + * process.c (process_send_signal): + * process.c (Fprocess_send_eof): + * process.c (deactivate_process): + * process.c (remove_process): + * process.c (Fdelete_process): + * process.c (kill_buffer_processes): + * process.c (Fprocess_kill_without_query): + * process.c (Fprocess_kill_without_query_p): + * rangetab.c: + * rangetab.c (Fget_range_table): + * rangetab.c (Fput_range_table): + * rangetab.c (Fremove_range_table): + * rangetab.c (Fclear_range_table): + * search.c: + * search.c (Fskip_chars_forward): + * search.c (Fskip_chars_backward): + * search.c (Fskip_syntax_forward): + * search.c (Fskip_syntax_backward): + * search.c (search_command): + * search.c (Freplace_match): + * search.c (Fregexp_quote): + * select.c (Fown_selection_internal): + * select.c (Fselection_owner_p): + * select.c (Fselection_exists_p): + * select.c (Fget_selection_internal): + * specifier.c: + * symbols.c: + * symbols.c (Fintern): + * symbols.c (Fintern_soft): + * symbols.c (Funintern): + * symbols.c (Fapropos_internal): + * symbols.c (Fset_default): + * syntax.c: + * syntax.c (Fsyntax_table_p): + * syntax.c (Fcopy_syntax_table): + * syntax.c (Fset_syntax_table): + * syntax.c (Fchar_syntax): + * syntax.c (syntax_match): + * syntax.c (Fmatching_paren): + * syntax.c (Fforward_word): + * syntax.c (scan_lists): + * syntax.c (Fscan_lists): + * syntax.c (Fscan_sexps): + * syntax.c (Fparse_partial_sexp): + * toolbar.c (Fcheck_toolbar_button_syntax): + * tooltalk.doc: + * window.c: + * window.c (Fwindowp): + * window.c (Fwindow_live_p): + * window.c (Fwindow_point): + * window.c (Fdelete_window): + * window.c (Fnext_window): + * window.c (Fprevious_window): + * window.c (Fother_window): + * window.c (window_loop): + * window.c (Fget_lru_window): + * window.c (Fsplit_window): + * window.c (Fenlarge_window): + * window.c (Fenlarge_window_pixels): + * window.c (Fshrink_window): + * window.c (Fshrink_window_pixels): + * window.c (change_window_height): + * window.c (Fwindow_configuration_p): + * window.c (Fcurrent_window_configuration): + * window.h: + * casefiddle.c (casify_object): + * casefiddle.c (Fupcase): + * casefiddle.c (Fdowncase): + * casefiddle.c (Fcapitalize): + * casefiddle.c (Fupcase_initials): + * casefiddle.c (casify_region_internal): + * casefiddle.c (casify_region): + * casefiddle.c (Fupcase_region): + * casefiddle.c (Fdowncase_region): + * casefiddle.c (Fcapitalize_region): + * casefiddle.c (Fupcase_initials_region): + * casefiddle.c (Fupcase_word): + * casefiddle.c (Fdowncase_word): + * casefiddle.c (Fcapitalize_word): + Docstring arglist/Texinfo fixes. See man/ChangeLog for details. + Replace 0 with '\0' when working with bytes. + Replace initial "(" with "\(" in docstrings. + +2000-11-01 Martin Buchholz + + * config.h.in: Handle alloca with Compaq C on Alpha Linux. + + * m/alpha.h: Let configure handle SYSTEM_MALLOC on Linux. + +2000-10-31 Martin Buchholz + + * eldap.c (print_ldap): 64-bit cleaner. Fixes warning. + +2000-10-30 Yoshiki Hayashi + + * doprnt.c (emacs_do_prnt_1): Format (format "%01.2d" 10) + correctly. + +2000-10-30 Yoshiki Hayashi + + * fileio.c (Vauto_save_list_file_prefix): Moved from startup.el. + (inhibit_auto_save_session): New variable. + (vars_of_fileio): Declare and initialize them. + * fileio.c (Fdo_auto_save): Don't create session file if + Vinhibit_auto_save_session or Vauto_save_list_file_prefix is non-nil. + +2000-10-31 Martin Buchholz + + * sgiplay.c (play_internal): C++ compilability. + * alloc.c (SWEEP_FIXED_TYPE_BLOCK): Remove unused var `SFTB_prev'. + * callproc.c (Fold_call_process_internal): + Remove unused vars `env', `first'. + * scrollbar.c (update_scrollbar_instance): + #### unused var `current_window'. + * redisplay-tty.c: Put currently unused vars insert_mode_on, + etc. within #ifdef NOT_YET. + * emacs.c: #### unused vars `initial_argc', `initial_argv'. + * dialog-x.c (dbox_descriptor_to_widget_value): ### unused var `title'. + * specifier.c (specifier_instance): + #### unused var `tag'. + Use WINDOW_BUFFER, FRAME_DEVICE instead of their expansion. + +2000-10-27 Martin Buchholz + + * fns.c (Fbutlast): + * fns.c (list_sort): + * fns.c (Ffillarray): + * fns.c (bytecode_nconc2): + * fns.c (Fnconc): + * fns.c (mapcar1): + * fns.c (Fmapconcat): + Be pedantically 64-bit correct. For the time when someone will + want to have a list with length > 2**32. + + * lisp.h (PRIVATE_EXTERNAL_LIST_LOOP_6): + Work around MIPSpro compiler bug. + + * process-unix.c (unix_kill_child_process): Add snarky comment. + * process-unix.c (try_to_initialize_subtty): Oops, `=' ==> `==' + + * config.h.in: Oops, _getpt ==> _getpty + +2000-10-26 Martin Buchholz + + * config.h.in: + * regex.c: + Use void*, not char*, as return type of alloca(). + + * alloc.c (free_marker): Side effect inside assert expression! + +2000-10-16 MIYASHITA Hisashi + + * mule-charset.c (Fset_charset_ccl_program): To check + if the given ccl program is valid, use setup_ccl_program() + instead of CHECK_VECTOR(). + (Fmake_charset): Likewise. + +2000-10-20 Golubev I. N. + + * faces.c (get_extent_fragment_face_cache_index): + Fix cachel.merged_faces memory leak. + +2000-10-14 MIYASHITA Hisashi + + * mule-ccl.c (ccl_driver): + Reset MSB of octets obtained by DECODE_SJIS + because of the incompatibility with Emacs. + (ccl_driver): + Set MSB of octets before passing them to + ENCODE_SJIS because of the incompatibility + with Emacs. + +2000-10-18 Daiki Ueno + + * lrecord.h (DECLARE_TYPECHECK_LRECORD): Abolish. + (DECLARE_LRECORD): Undo the last change. + (DECLARE_EXTERNAL_LRECORD): Expand typechecking stuff. + +2000-10-17 Daiki Ueno + + * lrecord.h (INIT_EXTERNAL_LRECORD_IMPLEMENTATION): Connect + the implementation to lrecord_implementations_table. + +2000-10-14 Daiki Ueno + + * lrecord.h (MAKE_EXTERNAL_LRECORD_IMPLEMENTATION): Don't set the + initial value of `lrecord_type_##c_name' and + `lrecord_##c_name.lrecord_type_index'; discard "const" qualifier. + (INIT_EXTERNAL_LRECORD_IMPLEMENTATION): New macro. + [ERROR_CHECK_TYPECHECK] (DECLARE_TYPECHECK_LRECORD): New macro. + [ERROR_CHECK_TYPECHECK] (DECLARE_LRECORD): Use it. + [ERROR_CHECK_TYPECHECK] (DECLARE_EXTERNAL_LRECORD): Use it. + +2000-10-17 Martin Buchholz + + * miscplay.c (sndcnv8S_2mono): + (sndcnv2monounsigned): + (sndcnvULaw_2linear): + (sndcnv16swap): + Remove implementation-defined behavior. + +2000-10-12 Martin Buchholz + + * input-method-xlib.c: Warning suppression. + +2000-10-05 MIYASHITA Hisashi + + * mule-ccl.c: Sync up with Emacs 21.0.90. + (ccl_driver): Disabled. + Do nothing. + (ccl_driver): + Likewise. + (ccl_driver[WriteMultibyteChar2]): Bug fix. + Use MAX_LEADING_BYTE_OFFICIAL_2 instead of + MIN_LEADING_BYTE_OFFICIAL_2 to check whether the + leading char belongs to official 2-dimensional charset. + (CCL_WRITE_CHAR): When CCL_MODE_ENCODING, + write the given character as is. Otherwise, + if it is a multibyte char, convert it by + non_ascii_set_charptr_emchar, then write it. + (CCL_WRITE_STRING): Likewise. + (ccl_get_compiled_code): New function. + (setup_ccl_program): When ccl_prog is invalid, + return -1. + (Fregister_code_conversion_map): New function. + (syms_of_mule_ccl): defsubr Fregister_code_conversion_map. + + * mule-ccl.h: Sync up with Emacs 21.0.90. + (Fregister_ccl_program): export it. + + * redisplay-msw.c (separate_textual_runs): + If ccl program is not valid, don't do ccl conversion. + + * redisplay-x.c (separate_textual_runs): Ditto. + + * file-coding.c (Fmake_coding_system): + When type is ccl and value is vector, register it + with a proper symbol. And checks whether the + given ccl program is valid. + (mule_decode): When calling ccl_driver, if src indicates + NULL pointer, set an empty string instead. + (mule_encode): Likewise. + +2000-10-11 Martin Buchholz + + The following large batch of changes gets us back to a state of + C++ compilability. Extbyte is now a char, which means that + Extbyte * and Bufbyte * cannot be freely interchanged - a win! + + * tooltalk.c (Fset_tooltalk_message_attribute): Type correctness. + + * sound.c (Fplay_sound): Type correctness. + + * select-x.c (hack_motif_clipboard_selection): Type correctness. + (x_get_window_property): Type correctness. + (receive_incremental_selection): unsigned char ==> Extbyte + (selection_data_to_lisp_data): unsigned char ==> Extbyte + (Fx_get_cutbuffer_internal): unsigned char ==> Extbyte + (Fx_store_cutbuffer_internal): Type correctness. + + * process-unix.c (try_to_initialize_subtty): Type correctness. + + * objects-x.c (x_print_color_instance): Type correctness. + (x_print_font_instance): Type correctness. + (x_list_fonts): SExtbyte ==> Extbyte. + (valid_x_font_name_p): SExtbyte ==> Extbyte. + (x_find_charset_font): SExtbyte ==> Extbyte. + Use TO_INTERNAL_FORMAT. build_string ==> make_string. + (truename_via_XListFonts): SExtbyte ==> Extbyte. + (x_font_instance_properties): Use TO_INTERNAL_FORMAT. + Use bufbyte_strcmp. + + * mule-charset.h (LEADING_BYTE_PREFIX_P): unsigned char ==> Bufbyte + (PRIVATE_LEADING_BYTE_PREFIX): Add paranoia cast. + (BYTE_ASCII_P): Use bit ops for char-signedness safety. + (BYTE_C0_P): Use bit ops for char-signedness safety. + (BYTE_C1_P): Use bit ops for char-signedness safety. + (CHARSET_BY_LEADING_BYTE): + (CHARSET_BY_ATTRIBUTES): + Always use inline function. + Use type_checking_assert. + Hide chlook. + + * mule-charset.c (non_ascii_charptr_copy_char): + Modify to work with both ASCII and non-ASCII characters. + Improve docs and variable names. + Replace over-clever fall-through switch with a simple loop. + (Lstream_get_emchar_1): + Replace over-clever fall-through switch with a simple loop. + + * menubar-x.c (menu_item_descriptor_to_widget_value_1): + Warning suppression. + + * lstream.h (Lstream_get_emchar): BYTE_ASCII_P cannot be used on + the return value of Lstream_getc, which could be EOF as well. + + * lstream.c (Lstream_raw_read): Now returns ssize_t, not int. + + * lisp.h: Make Extbyte a char, not unsigned char, so that external + APIs can be used on Extbytes without casts. Risky! + (SExtbyte): Remove. + (UExtbyte): Remove. + + * input-method-xlib.c (XIM_init_device): + Use Xlib.h instead of IntrinsicP.h. + Use HAVE_XREGISTERIMINSTANTIATECALLBACK instead of THIS_IS_X11R6, + which will break in X11R7. + Use XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE, + to call XRegisterIMInstantiateCallback with correct types. + + * gui-x.c (button_item_to_widget_value): Type correctness. + + * glyphs.c (bitmap_to_lisp_data): Type correctness. + + * glyphs-x.c (pixmap_from_xbm_inline): Type correctness. + (xbm_instantiate_1): Type correctness. + (BUILD_GLYPH_INST): Type correctness. + + * fileio.c (Fsubstitute_in_file_name): Type correctness. + + * file-coding.c: + (decode_coding_sjis): + (decode_coding_big5): + (decode_coding_ucs4): + (decode_coding_utf8): + (decode_coding_iso2022): + (decode_coding_no_conversion): + Make all decoding functions take an Extbyte * arg. + (encode_coding_sjis): + (encode_coding_big5): + (encode_coding_ucs4): + (encode_coding_utf8): + (encode_coding_iso2022): + (encode_coding_no_conversion): + Make all encoding functions take a Bufbyte * arg. + Use size_t instead of unsigned int for memory sizes. + Only cast to unsigned char whenever dereferencing Extbyte *. + + * doc.c (unparesseuxify_doc_string): Type correctness. + + * console-x.c (split_up_display_spec): + Rewrite without using details of internal string representation. + (x_semi_canonicalize_device_connection): Type correctness. + + * config.h.in: + (HAVE_XREGISTERIMINSTANTIATECALLBACK): New. + (XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE): New. + (HAVE_XFREE386): Removed. + + * buffer.h (DEC_CHARPTR): `const' correctness. + (bufbyte_strcmp): New. + (bufbyte_memcmp): New. + + * buffer.c (dfc_convert_to_internal_format): Extbyte ==> Bufbyte + + * buffer.h (XCHAR_OR_CHAR_INT): + Always use inline function. + Remove redundant type checking assert() - XINT will abort quite nicely. + +2000-10-03 Yoshiki Hayashi + + * search.c (Freplace_match): Set newtext to an empty string. + +2000-10-10 Martin Buchholz + + * s/decosf1-3.h: Remove #include of stropts.h + * s/ptx.h: Remove #include of stropts.h + * s/usg5-4.h: Remove #include of stropts.h + * sysproc.h: + * config.h.in: + Use stropts.h, not sys/stropts.h. + Use strtio.h, not sys/strtio.h. + 2000-10-04 Martin Buchholz * XEmacs 21.2.36 is released. +2000-09-21 Andy Piper + + * glyphs-x.c (x_redisplay_widget): make sure non-structural + changes still involve copying the widget tree. + (update_widget_face): make sure a change is register in the widget + tree. Call update_tab_widget_face appropriately. + (update_tab_widget_face): ditto. + (x_tab_control_redisplay): make sure non-structural changes still + involve copying the widget tree. + 2000-08-31 Daiki Ueno * lread.c (locate_file): Check the path element is non-nil. @@ -8775,7 +9541,7 @@ Fatal error: assertion failed, file /project/xemacs/ws/dev/src/frame.h, line 245 * glyphs.h: Prototyped it. * redisplay.c (add_glyph_rune): Call it. - (redisplay_window): Reset glyphs cachels when frame faces has + (redisplay_window): Reset glyphs cachels when frame faces have changed, thus forcing recomputation of built-in border glyphs. 2000-01-30 Martin Buchholz diff --git a/src/alloc.c b/src/alloc.c index 9287177..6cb81ee 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -1048,9 +1048,9 @@ list6 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2, Lisp_Object obj3, } DEFUN ("make-list", Fmake_list, 2, 2, 0, /* -Return a new list of length LENGTH, with each element being INIT. +Return a new list of length LENGTH, with each element being OBJECT. */ - (length, init)) + (length, object)) { CHECK_NATNUM (length); @@ -1059,7 +1059,7 @@ Return a new list of length LENGTH, with each element being INIT. size_t size = XINT (length); while (size--) - val = Fcons (init, val); + val = Fcons (object, val); return val; } } @@ -1170,13 +1170,13 @@ make_vector_internal (size_t sizei) } Lisp_Object -make_vector (size_t length, Lisp_Object init) +make_vector (size_t length, Lisp_Object object) { Lisp_Vector *vecp = make_vector_internal (length); Lisp_Object *p = vector_data (vecp); while (length--) - *p++ = init; + *p++ = object; { Lisp_Object vector; @@ -1254,13 +1254,13 @@ make_vector_newer (Lisp_Object v) #endif DEFUN ("make-vector", Fmake_vector, 2, 2, 0, /* -Return a new vector of length LENGTH, with each element being INIT. +Return a new vector of length LENGTH, with each element being OBJECT. See also the function `vector'. */ - (length, init)) + (length, object)) { CONCHECK_NATNUM (length); - return make_vector (XINT (length), init); + return make_vector (XINT (length), object); } DEFUN ("vector", Fvector, 0, MANY, 0, /* @@ -1409,14 +1409,14 @@ make_bit_vector_internal (size_t sizei) } Lisp_Object -make_bit_vector (size_t length, Lisp_Object init) +make_bit_vector (size_t length, Lisp_Object bit) { Lisp_Bit_Vector *p = make_bit_vector_internal (length); size_t num_longs = BIT_VECTOR_LONG_STORAGE (length); - CHECK_BIT (init); + CHECK_BIT (bit); - if (ZEROP (init)) + if (ZEROP (bit)) memset (p->bits, 0, num_longs * sizeof (long)); else { @@ -1452,19 +1452,20 @@ make_bit_vector_from_byte_vector (unsigned char *bytevec, size_t length) } DEFUN ("make-bit-vector", Fmake_bit_vector, 2, 2, 0, /* -Return a new bit vector of length LENGTH. with each bit being INIT. -Each element is set to INIT. See also the function `bit-vector'. +Return a new bit vector of length LENGTH. with each bit set to BIT. +BIT must be one of the integers 0 or 1. See also the function `bit-vector'. */ - (length, init)) + (length, bit)) { CONCHECK_NATNUM (length); - return make_bit_vector (XINT (length), init); + return make_bit_vector (XINT (length), bit); } DEFUN ("bit-vector", Fbit_vector, 0, MANY, 0, /* Return a newly created bit vector with specified arguments as elements. Any number of arguments, even zero arguments, are allowed. +Each argument must be one of the integers 0 or 1. */ (int nargs, Lisp_Object *args)) { @@ -2145,21 +2146,21 @@ set_string_char (Lisp_String *s, Charcount i, Emchar c) #endif /* MULE */ DEFUN ("make-string", Fmake_string, 2, 2, 0, /* -Return a new string of length LENGTH, with each character being INIT. -LENGTH must be an integer and INIT must be a character. +Return a new string consisting of LENGTH copies of CHARACTER. +LENGTH must be a non-negative integer. */ - (length, init)) + (length, character)) { CHECK_NATNUM (length); - CHECK_CHAR_COERCE_INT (init); + CHECK_CHAR_COERCE_INT (character); { Bufbyte init_str[MAX_EMCHAR_LEN]; - int len = set_charptr_emchar (init_str, XCHAR (init)); + int len = set_charptr_emchar (init_str, XCHAR (character)); Lisp_Object val = make_uninit_string (len * XINT (length)); if (len == 1) /* Optimize the single-byte case */ - memset (XSTRING_DATA (val), XCHAR (init), XSTRING_LENGTH (val)); + memset (XSTRING_DATA (val), XCHAR (character), XSTRING_LENGTH (val)); else { size_t i; @@ -2438,9 +2439,9 @@ Make a copy of OBJECT in pure storage. Recursively copies contents of vectors and cons cells. Does not copy symbols. */ - (obj)) + (object)) { - return obj; + return object; } @@ -2797,12 +2798,10 @@ sweep_bit_vectors_1 (Lisp_Object *prev, #define SWEEP_FIXED_TYPE_BLOCK(typename, obj_type) \ do { \ struct typename##_block *SFTB_current; \ - struct typename##_block **SFTB_prev; \ int SFTB_limit; \ int num_free = 0, num_used = 0; \ \ - for (SFTB_prev = ¤t_##typename##_block, \ - SFTB_current = current_##typename##_block, \ + for (SFTB_current = current_##typename##_block, \ SFTB_limit = current_##typename##_block_index; \ SFTB_current; \ ) \ @@ -2832,7 +2831,6 @@ do { \ UNMARK_##typename (SFTB_victim); \ } \ } \ - SFTB_prev = &(SFTB_current->prev); \ SFTB_current = SFTB_current->prev; \ SFTB_limit = countof (current_##typename##_block->block); \ } \ @@ -3056,7 +3054,7 @@ void free_marker (Lisp_Marker *ptr) { /* Perhaps this will catch freeing an already-freed marker. */ - gc_checking_assert (ptr->lheader.type = lrecord_type_marker); + gc_checking_assert (ptr->lheader.type == lrecord_type_marker); #ifndef ALLOC_NO_POOLS FREE_FIXED_TYPE_WHEN_NOT_IN_GC (marker, Lisp_Marker, ptr); @@ -3825,7 +3823,7 @@ If this value exceeds `gc-cons-threshold', a garbage collection happens. } #if 0 -DEFUN ("memory-limit", Fmemory_limit, 0, 0, "", /* +DEFUN ("memory-limit", Fmemory_limit, 0, 0, 0, /* Return the address of the last byte Emacs has allocated, divided by 1024. This may be helpful in debugging Emacs's memory usage. The value is divided by 1024 to make sure it will fit in a lisp integer. diff --git a/src/buffer.c b/src/buffer.c index 1c1a86d..ce9f92b 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -402,11 +402,10 @@ assoc_ignore_text_properties (REGISTER Lisp_Object key, Lisp_Object list) #endif /* FSFmacs */ DEFUN ("get-buffer", Fget_buffer, 1, 1, 0, /* -Return the buffer named NAME (a string). -If there is no live buffer named NAME, return nil. -NAME may also be a buffer; if so, the value is that buffer. +Return the buffer named BUFFER-NAME (a string), or nil if there is none. +BUFFER-NAME may also be a buffer; if so, the value is that buffer. */ - (name)) + (buffer_name)) { #ifdef I18N3 /* #### Doc string should indicate that the buffer name will get @@ -415,9 +414,9 @@ NAME may also be a buffer; if so, the value is that buffer. /* #### This might return a dead buffer. This is gross. This is called FSF compatibility. */ - if (BUFFERP (name)) - return name; - return get_buffer (name, 0); + if (BUFFERP (buffer_name)) + return buffer_name; + return get_buffer (buffer_name, 0); /* FSFmacs 19.29 calls assoc_ignore_text_properties() here. Bleagh!! */ } @@ -633,10 +632,11 @@ The value is never nil. DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, 2, 2, "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", /* -Create and return an indirect buffer for buffer BASE, named NAME. -BASE should be an existing buffer (or buffer name). +Create and return an indirect buffer for buffer BASE-BUFFER, named NAME. +BASE-BUFFER should be an existing buffer (or buffer name). NAME should be a string which is not the name of an existing buffer. -If BASE is an indirect buffer itself, the base buffer for that buffer + +If BASE-BUFFER is itself an indirect buffer, the base buffer for that buffer is made the base buffer for the newly created buffer. (Thus, there will never be indirect buffers whose base buffers are themselves indirect.) */ @@ -924,7 +924,7 @@ as BUFFER means use current buffer. display). We still need to make sure redisplay realizes that the contents have potentially altered and it needs to do some work. */ - buf = decode_buffer(buffer, 0); + buf = decode_buffer (buffer, 0); BUF_MODIFF (buf)++; BUF_SAVE_MODIFF (buf) = NILP (flag) ? BUF_MODIFF (buf) : 0; MARK_MODELINE_CHANGED; @@ -1078,7 +1078,7 @@ VISIBLE-OK. } DEFUN ("buffer-disable-undo", Fbuffer_disable_undo, 0, 1, "", /* -Make BUFFER stop keeping undo information. +Stop keeping undo information for BUFFER. Any undo records it already has are discarded. No argument or nil as argument means do this for the current buffer. */ @@ -1091,7 +1091,7 @@ No argument or nil as argument means do this for the current buffer. } DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, 0, 1, "", /* -Start keeping undo information for buffer BUFFER. +Start keeping undo information for BUFFER. No argument or nil as argument means do this for the current buffer. */ (buffer)) @@ -1280,7 +1280,7 @@ with `delete-process'. /* #### This is a problem if this buffer is in a dedicated window. Need to undedicate any windows of this buffer first (and delete them?) */ - Freplace_buffer_in_windows (buf); + Freplace_buffer_in_windows (buf, Qnil, Qnil); font_lock_buffer_was_killed (b); @@ -1524,7 +1524,7 @@ Use `switch-to-buffer' or `pop-to-buffer' to switch buffers permanently. DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only, 0, 3, 0, /* -Signal a `buffer-read-only' error if the buffer is read-only. +Signal a `buffer-read-only' error if BUFFER is read-only. Optional argument BUFFER defaults to the current buffer. If optional argument START is non-nil, all extents in the buffer @@ -1974,7 +1974,7 @@ dfc_convert_to_external_format (dfc_conversion_type source_type, if (sink_type != DFC_TYPE_LISP_LSTREAM) { sink->data.len = Dynarr_length (conversion_out_dynarr); - Dynarr_add (conversion_out_dynarr, 0); + Dynarr_add (conversion_out_dynarr, '\0'); /* NUL-terminate! */ sink->data.ptr = Dynarr_atp (conversion_out_dynarr, 0); } } @@ -2023,7 +2023,7 @@ dfc_convert_to_internal_format (dfc_conversion_type source_type, for (; ptr < end; ptr++) { - Extbyte c = *ptr; + Bufbyte c = *ptr; #ifdef UTF2000 if (BYTE_ASCII_P (c)) @@ -2122,7 +2122,7 @@ dfc_convert_to_internal_format (dfc_conversion_type source_type, if (sink_type != DFC_TYPE_LISP_LSTREAM) { sink->data.len = Dynarr_length (conversion_in_dynarr); - Dynarr_add (conversion_in_dynarr, 0); /* remember to zero-terminate! */ + Dynarr_add (conversion_in_dynarr, '\0'); /* NUL-terminate! */ sink->data.ptr = Dynarr_atp (conversion_in_dynarr, 0); } } @@ -2232,16 +2232,16 @@ the read-only state of the buffer. See also `kill-all-local-variables'. Vchange_major_mode_hook = Qnil; DEFVAR_BOOL ("find-file-compare-truenames", &find_file_compare_truenames /* -If this is true, then the find-file command will check the truenames +If this is true, then the `find-file' command will check the truenames of all visited files when deciding whether a given file is already in -a buffer, instead of just the buffer-file-name. This means that if you -attempt to visit another file which is a symbolic-link to a file which is -already in a buffer, the existing buffer will be found instead of a newly- -created one. This works if any component of the pathname (including a non- -terminal component) is a symbolic link as well, but doesn't work with hard -links (nothing does). - -See also the variable find-file-use-truenames. +a buffer, instead of just `buffer-file-name'. This means that if you +attempt to visit another file which is a symbolic link to a file which +is already in a buffer, the existing buffer will be found instead of a +newly-created one. This works if any component of the pathname +(including a non-terminal component) is a symbolic link as well, but +doesn't work with hard links (nothing does). + +See also the variable `find-file-use-truenames'. */ ); find_file_compare_truenames = 0; @@ -2252,7 +2252,7 @@ will never be a symbolic link anywhere in its directory path. That is, the buffer-file-name and buffer-file-truename will be equal. This doesn't work with hard links. -See also the variable find-file-compare-truenames. +See also the variable `find-file-compare-truenames'. */ ); find_file_use_truenames = 0; @@ -2936,8 +2936,8 @@ and VALUE is the old value. List of undo entries in current buffer. Recent changes come first; older changes follow newer. -An entry (BEG . END) represents an insertion which begins at -position BEG and ends at position END. +An entry (START . END) represents an insertion which begins at +position START and ends at position END. An entry (TEXT . POSITION) represents the deletion of the string TEXT from (abs POSITION). If POSITION is positive, point was at the front @@ -3021,8 +3021,8 @@ The default is t, which means that text is invisible if it has (or is covered by an extent with) a non-nil `invisible' property. If the value is a list, a text character is invisible if its `invisible' property is an element in that list. -If an element is a cons cell of the form (PROP . ELLIPSIS), -then characters with property value PROP are invisible, +If an element is a cons cell of the form (PROPERTY . ELLIPSIS), +then characters with property value PROPERTY are invisible, and they have an ellipsis as well if ELLIPSIS is non-nil. Note that the actual characters used for the ellipsis are controllable using `invisible-text-glyph', and default to "...". diff --git a/src/buffer.h b/src/buffer.h index 323fb09..9923e9f 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -770,8 +770,8 @@ Bufpos bytind_to_bufpos (struct buffer *buf, Bytind x); DATA, (ptr, len), // input data is a fixed buffer of size len ALLOCA, (ptr, len), // output data is in a alloca()ed buffer of size len MALLOC, (ptr, len), // output data is in a malloc()ed buffer of size len - C_STRING_ALLOCA, ptr, // equivalent to ALLOCA (ptr, len_ignored) on output. - C_STRING_MALLOC, ptr, // equivalent to MALLOC (ptr, len_ignored) on output. + C_STRING_ALLOCA, ptr, // equivalent to ALLOCA (ptr, len_ignored) on output + C_STRING_MALLOC, ptr, // equivalent to MALLOC (ptr, len_ignored) on output C_STRING, ptr, // equivalent to DATA, (ptr, strlen (ptr) + 1) on input LISP_STRING, string, // input or output is a Lisp_Object of type string LISP_BUFFER, buffer, // output is written to (point) in lisp buffer @@ -1460,4 +1460,60 @@ UPCASE (struct buffer *buf, Emchar ch) #define DOWNCASE(buf, ch) DOWNCASE_TABLE_OF (buf, ch) +/************************************************************************/ +/* Lisp string representation convenience functions */ +/************************************************************************/ +/* Because the representation of internally formatted data is subject to change, + It's bad style to do something like strcmp (XSTRING_DATA (s), "foo") + Instead, use the portable: bufbyte_strcmp (XSTRING_DATA (s), "foo") + or bufbyte_memcmp (XSTRING_DATA (s), "foo", 3) */ + +/* Like strcmp, except first arg points at internally formatted data, + while the second points at a string of only ASCII chars. */ +INLINE_HEADER int +bufbyte_strcmp (const Bufbyte *bp, const char *ascii_string); +INLINE_HEADER int +bufbyte_strcmp (const Bufbyte *bp, const char *ascii_string) +{ +#ifdef MULE + while (1) + { + int diff; + type_checking_assert (BYTE_ASCII_P (*ascii_string)); + if ((diff = charptr_emchar (bp) - *(Bufbyte *) ascii_string) != 0) + return diff; + if (*ascii_string == '\0') + return 0; + ascii_string++; + INC_CHARPTR (bp); + } +#else + return strcmp ((char *)bp, ascii_string); +#endif +} + + +/* Like memcmp, except first arg points at internally formatted data, + while the second points at a string of only ASCII chars. */ +INLINE_HEADER int +bufbyte_memcmp (const Bufbyte *bp, const char *ascii_string, size_t len); +INLINE_HEADER int +bufbyte_memcmp (const Bufbyte *bp, const char *ascii_string, size_t len) +{ +#ifdef MULE + while (len--) + { + int diff = charptr_emchar (bp) - *(Bufbyte *) ascii_string; + type_checking_assert (BYTE_ASCII_P (*ascii_string)); + if (diff != 0) + return diff; + ascii_string++; + INC_CHARPTR (bp); + } + return 0; +#else + return memcmp (bp, ascii_string, len); +#endif +} + #endif /* INCLUDED_buffer_h_ */ diff --git a/src/bytecode.c b/src/bytecode.c index 5bbb326..8a2c963 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -2264,7 +2264,7 @@ Return the constants vector of the compiled-function object FUNCTION. } DEFUN ("compiled-function-stack-depth", Fcompiled_function_stack_depth, 1, 1, 0, /* -Return the max stack depth of the compiled-function object FUNCTION. +Return the maximum stack depth of the compiled-function object FUNCTION. */ (function)) { diff --git a/src/callint.c b/src/callint.c index 25bbd0c..b3abc7b 100644 --- a/src/callint.c +++ b/src/callint.c @@ -53,6 +53,9 @@ Lisp_Object Vmark_even_if_inactive; #endif #if 0 /* ill-conceived */ +/* FSF calls Qmouse_leave_buffer_hook at all sorts of random places, + including a bunch of places in their mouse.el. If this is + implemented, it has to be done cleanly. */ Lisp_Object Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook; #endif @@ -807,14 +810,6 @@ when reading the arguments. } case 'S': /* Any symbol. */ { -#if 0 /* Historical crock */ - Lisp_Object tem = intern ("minibuffer-local-ns-map"); - tem = find_symbol_value (tem); - if (UNBOUNDP (tem)) tem = Qnil; - tem = call3 (Qread_from_minibuffer, PROMPT (), Qnil, - tem); - args[argnum] = Fintern (tem, Qnil); -#else /* 1 */ visargs[argnum] = Qnil; for (;;) { @@ -837,7 +832,6 @@ when reading the arguments. directly */ break; } -#endif /* 1 */ arg_from_tty = 1; break; } @@ -952,7 +946,7 @@ when reading the arguments. } DEFUN ("prefix-numeric-value", Fprefix_numeric_value, 1, 1, 0, /* -Return numeric meaning of raw prefix argument ARG. +Return numeric meaning of raw prefix argument RAW. A raw prefix argument is what you get from `(interactive "P")'. Its numeric meaning is what you would get from `(interactive "p")'. */ diff --git a/src/callproc.c b/src/callproc.c index b908a3a..35a62a7 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -331,9 +331,6 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you REGISTER char **save_environ = environ; REGISTER int fd1 = fd[1]; int fd_error = fd1; - char **env; - - env = environ; /* Record that we're about to create a synchronous process. */ synch_process_alive = 1; @@ -452,7 +449,6 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you { int nread; - int first = 1; int total_read = 0; Lisp_Object instream; struct gcpro ngcpro1; @@ -536,7 +532,6 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you if (!NILP (display) && INTERACTIVE) { - first = 0; redisplay (); } } diff --git a/src/casefiddle.c b/src/casefiddle.c index 88fe83e..49cf028 100644 --- a/src/casefiddle.c +++ b/src/casefiddle.c @@ -30,28 +30,29 @@ Boston, MA 02111-1307, USA. */ enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP}; static Lisp_Object -casify_object (enum case_action flag, Lisp_Object obj, Lisp_Object buffer) +casify_object (enum case_action flag, Lisp_Object string_or_char, + Lisp_Object buffer) { struct buffer *buf = decode_buffer (buffer, 0); retry: - if (CHAR_OR_CHAR_INTP (obj)) + if (CHAR_OR_CHAR_INTP (string_or_char)) { Emchar c; - CHECK_CHAR_COERCE_INT (obj); - c = XCHAR (obj); + CHECK_CHAR_COERCE_INT (string_or_char); + c = XCHAR (string_or_char); c = (flag == CASE_DOWN) ? DOWNCASE (buf, c) : UPCASE (buf, c); return make_char (c); } - if (STRINGP (obj)) + if (STRINGP (string_or_char)) { Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table); Bufbyte *storage = - alloca_array (Bufbyte, XSTRING_LENGTH (obj) * MAX_EMCHAR_LEN); + alloca_array (Bufbyte, XSTRING_LENGTH (string_or_char) * MAX_EMCHAR_LEN); Bufbyte *newp = storage; - Bufbyte *oldp = XSTRING_DATA (obj); + Bufbyte *oldp = XSTRING_DATA (string_or_char); int wordp = 0, wordp_prev; while (*oldp) @@ -87,91 +88,90 @@ casify_object (enum case_action flag, Lisp_Object obj, Lisp_Object buffer) return make_string (storage, newp - storage); } - obj = wrong_type_argument (Qchar_or_string_p, obj); + string_or_char = wrong_type_argument (Qchar_or_string_p, string_or_char); goto retry; } DEFUN ("upcase", Fupcase, 1, 2, 0, /* -Convert OBJECT to upper case and return that. -OBJECT may be a character or string. The result has the same type. -OBJECT is not altered--the value is a copy. +Convert STRING-OR-CHAR to upper case and return that. +STRING-OR-CHAR may be a character or string. The result has the same type. +STRING-OR-CHAR is not altered--the value is a copy. See also `capitalize', `downcase' and `upcase-initials'. Optional second arg BUFFER specifies which buffer's case tables to use, and defaults to the current buffer. */ - (object, buffer)) + (string_or_char, buffer)) { - return casify_object (CASE_UP, object, buffer); + return casify_object (CASE_UP, string_or_char, buffer); } DEFUN ("downcase", Fdowncase, 1, 2, 0, /* -Convert OBJECT to lower case and return that. -OBJECT may be a character or string. The result has the same type. -OBJECT is not altered--the value is a copy. +Convert STRING-OR-CHAR to lower case and return that. +STRING-OR-CHAR may be a character or string. The result has the same type. +STRING-OR-CHAR is not altered--the value is a copy. Optional second arg BUFFER specifies which buffer's case tables to use, and defaults to the current buffer. */ - (object, buffer)) + (string_or_char, buffer)) { - return casify_object (CASE_DOWN, object, buffer); + return casify_object (CASE_DOWN, string_or_char, buffer); } DEFUN ("capitalize", Fcapitalize, 1, 2, 0, /* -Convert OBJECT to capitalized form and return that. +Convert STRING-OR-CHAR to capitalized form and return that. This means that each word's first character is upper case and the rest is lower case. -OBJECT may be a character or string. The result has the same type. -OBJECT is not altered--the value is a copy. +STRING-OR-CHAR may be a character or string. The result has the same type. +STRING-OR-CHAR is not altered--the value is a copy. Optional second arg BUFFER specifies which buffer's case tables to use, and defaults to the current buffer. */ - (object, buffer)) + (string_or_char, buffer)) { - return casify_object (CASE_CAPITALIZE, object, buffer); + return casify_object (CASE_CAPITALIZE, string_or_char, buffer); } /* Like Fcapitalize but change only the initial characters. */ DEFUN ("upcase-initials", Fupcase_initials, 1, 2, 0, /* -Convert the initial of each word in OBJECT to upper case. +Convert the initial of each word in STRING-OR-CHAR to upper case. Do not change the other letters of each word. -OBJECT may be a character or string. The result has the same type. -OBJECT is not altered--the value is a copy. +STRING-OR-CHAR may be a character or string. The result has the same type. +STRING-OR-CHAR is not altered--the value is a copy. Optional second arg BUFFER specifies which buffer's case tables to use, and defaults to the current buffer. */ - (object, buffer)) + (string_or_char, buffer)) { - return casify_object (CASE_CAPITALIZE_UP, object, buffer); + return casify_object (CASE_CAPITALIZE_UP, string_or_char, buffer); } /* flag is CASE_UP, CASE_DOWN or CASE_CAPITALIZE or CASE_CAPITALIZE_UP. - b and e specify range of buffer to operate on. */ + START and END specify range of buffer to operate on. */ static void -casify_region_internal (enum case_action flag, Lisp_Object b, Lisp_Object e, - struct buffer *buf) +casify_region_internal (enum case_action flag, Lisp_Object start, + Lisp_Object end, struct buffer *buf) { /* This function can GC */ - REGISTER Bufpos i; - Bufpos start, end; + Bufpos pos, s, e; Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table); int mccount; - Emchar oldc, c; int wordp = 0, wordp_prev; - if (EQ (b, e)) + if (EQ (start, end)) /* Not modifying because nothing marked */ return; - get_buffer_range_char (buf, b, e, &start, &end, 0); + get_buffer_range_char (buf, start, end, &s, &e, 0); - mccount = begin_multiple_change (buf, start, end); - record_change (buf, start, end - start); + mccount = begin_multiple_change (buf, s, e); + record_change (buf, s, e - s); - for (i = start; i < end; i++) + for (pos = s; pos < e; pos++) { - c = oldc = BUF_FETCH_CHAR (buf, i); + Emchar oldc = BUF_FETCH_CHAR (buf, pos); + Emchar c = oldc; switch (flag) { @@ -199,7 +199,7 @@ casify_region_internal (enum case_action flag, Lisp_Object b, Lisp_Object e, } if (oldc == c) continue; - buffer_replace_char (buf, i, c, 1, (i == start)); + buffer_replace_char (buf, pos, c, 1, (pos == s)); BUF_MODIFF (buf)++; } @@ -207,10 +207,10 @@ casify_region_internal (enum case_action flag, Lisp_Object b, Lisp_Object e, } static Lisp_Object -casify_region (enum case_action flag, Lisp_Object b, Lisp_Object e, +casify_region (enum case_action flag, Lisp_Object start, Lisp_Object end, Lisp_Object buffer) { - casify_region_internal (flag, b, e, decode_buffer (buffer, 1)); + casify_region_internal (flag, start, end, decode_buffer (buffer, 1)); return Qnil; } @@ -222,10 +222,10 @@ These arguments specify the starting and ending character numbers of See also `capitalize-region'. Optional third arg BUFFER defaults to the current buffer. */ - (b, e, buffer)) + (start, end, buffer)) { /* This function can GC */ - return casify_region (CASE_UP, b, e, buffer); + return casify_region (CASE_UP, start, end, buffer); } DEFUN ("downcase-region", Fdowncase_region, 2, 3, "r", /* @@ -235,10 +235,10 @@ These arguments specify the starting and ending character numbers of point and the mark is operated on. Optional third arg BUFFER defaults to the current buffer. */ - (b, e, buffer)) + (start, end, buffer)) { /* This function can GC */ - return casify_region (CASE_DOWN, b, e, buffer); + return casify_region (CASE_DOWN, start, end, buffer); } DEFUN ("capitalize-region", Fcapitalize_region, 2, 3, "r", /* @@ -249,10 +249,10 @@ In programs, give two arguments, the starting and ending character positions to operate on. Optional third arg BUFFER defaults to the current buffer. */ - (b, e, buffer)) + (start, end, buffer)) { /* This function can GC */ - return casify_region (CASE_CAPITALIZE, b, e, buffer); + return casify_region (CASE_CAPITALIZE, start, end, buffer); } /* Like Fcapitalize_region but change only the initials. */ @@ -264,9 +264,9 @@ In programs, give two arguments, the starting and ending character positions to operate on. Optional third arg BUFFER defaults to the current buffer. */ - (b, e, buffer)) + (start, end, buffer)) { - return casify_region (CASE_CAPITALIZE_UP, b, e, buffer); + return casify_region (CASE_CAPITALIZE_UP, start, end, buffer); } @@ -288,39 +288,39 @@ casify_word (enum case_action flag, Lisp_Object arg, Lisp_Object buffer) } DEFUN ("upcase-word", Fupcase_word, 1, 2, "p", /* -Convert following word (or N words) to upper case, moving over. +Convert following word (or COUNT words) to upper case, moving over. With negative argument, convert previous words but do not move. See also `capitalize-word'. Optional second arg BUFFER defaults to the current buffer. */ - (n, buffer)) + (count, buffer)) { /* This function can GC */ - return casify_word (CASE_UP, n, buffer); + return casify_word (CASE_UP, count, buffer); } DEFUN ("downcase-word", Fdowncase_word, 1, 2, "p", /* -Convert following word (or N words) to lower case, moving over. +Convert following word (or COUNT words) to lower case, moving over. With negative argument, convert previous words but do not move. Optional second arg BUFFER defaults to the current buffer. */ - (n, buffer)) + (count, buffer)) { /* This function can GC */ - return casify_word (CASE_DOWN, n, buffer); + return casify_word (CASE_DOWN, count, buffer); } DEFUN ("capitalize-word", Fcapitalize_word, 1, 2, "p", /* -Capitalize the following word (or N words), moving over. +Capitalize the following word (or COUNT words), moving over. This gives the word(s) a first character in upper case and the rest lower case. With negative argument, capitalize previous words but do not move. Optional second arg BUFFER defaults to the current buffer. */ - (n, buffer)) + (count, buffer)) { /* This function can GC */ - return casify_word (CASE_CAPITALIZE, n, buffer); + return casify_word (CASE_CAPITALIZE, count, buffer); } diff --git a/src/casetab.c b/src/casetab.c index 2d52a84..4bb1cde 100644 --- a/src/casetab.c +++ b/src/casetab.c @@ -55,16 +55,16 @@ static void compute_trt_inverse (Lisp_Object trt, Lisp_Object inverse); #define STRING256_P(obj) (STRINGP (obj) && XSTRING_CHAR_LENGTH (obj) == 256) DEFUN ("case-table-p", Fcase_table_p, 1, 1, 0, /* -Return t if ARG is a case table. +Return t if OBJECT is a case table. See `set-case-table' for more information on these data structures. */ - (table)) + (object)) { Lisp_Object down, up, canon, eqv; - if (!CONSP (table)) return Qnil; down = XCAR (table); table = XCDR (table); - if (!CONSP (table)) return Qnil; up = XCAR (table); table = XCDR (table); - if (!CONSP (table)) return Qnil; canon = XCAR (table); table = XCDR (table); - if (!CONSP (table)) return Qnil; eqv = XCAR (table); + if (!CONSP (object)) return Qnil; down = XCAR (object); object = XCDR (object); + if (!CONSP (object)) return Qnil; up = XCAR (object); object = XCDR (object); + if (!CONSP (object)) return Qnil; canon = XCAR (object); object = XCDR (object); + if (!CONSP (object)) return Qnil; eqv = XCAR (object); return (STRING256_P (down) && (NILP (up) || STRING256_P (up)) @@ -75,13 +75,11 @@ See `set-case-table' for more information on these data structures. } static Lisp_Object -check_case_table (Lisp_Object obj) +check_case_table (Lisp_Object object) { - REGISTER Lisp_Object tem; - - while (tem = Fcase_table_p (obj), NILP (tem)) - obj = wrong_type_argument (Qcase_tablep, obj); - return (obj); + while (NILP (Fcase_table_p (object))) + object = wrong_type_argument (Qcase_tablep, object); + return object; } DEFUN ("current-case-table", Fcurrent_case_table, 0, 1, 0, /* @@ -113,7 +111,7 @@ static Lisp_Object set_case_table (Lisp_Object table, int standard); DEFUN ("set-case-table", Fset_case_table, 1, 1, 0, /* -Select a new case table for the current buffer. +Select CASE-TABLE as the new case table for the current buffer. A case table is a list (DOWNCASE UPCASE CANONICALIZE EQUIVALENCES) where each element is either nil or a string of length 256. DOWNCASE maps each character to its lower-case equivalent. @@ -134,18 +132,18 @@ BUG: Under XEmacs/Mule, translations to or from non-ASCII characters will not correctly conflate a-umlaut and A-umlaut even if the case tables call for this. */ - (table)) + (case_table)) { - return set_case_table (table, 0); + return set_case_table (case_table, 0); } DEFUN ("set-standard-case-table", Fset_standard_case_table, 1, 1, 0, /* -Select a new standard case table for new buffers. +Select CASE-TABLE as the new standard case table for new buffers. See `set-case-table' for more info on case tables. */ - (table)) + (case_table)) { - return set_case_table (table, 1); + return set_case_table (case_table, 1); } #ifdef MULE diff --git a/src/chartab.c b/src/chartab.c index b00cee7..e90bb3d 100644 --- a/src/chartab.c +++ b/src/chartab.c @@ -468,12 +468,12 @@ assigned values are -- all characters -- a single character -To create a char table, use `make-char-table'. To modify a char -table, use `put-char-table' or `remove-char-table'. To retrieve the -value for a particular character, use `get-char-table'. See also -`map-char-table', `clear-char-table', `copy-char-table', -`valid-char-table-type-p', `char-table-type-list', `valid-char-table-value-p', -and `check-char-table-value'. +To create a char table, use `make-char-table'. +To modify a char table, use `put-char-table' or `remove-char-table'. +To retrieve the value for a particular character, use `get-char-table'. +See also `map-char-table', `clear-char-table', `copy-char-table', +`valid-char-table-type-p', `char-table-type-list', +`valid-char-table-value-p', and `check-char-table-value'. */ (object)) { @@ -533,13 +533,13 @@ sorts of values. The different char table types are } DEFUN ("char-table-type", Fchar_table_type, 1, 1, 0, /* -Return the type of char table TABLE. +Return the type of CHAR-TABLE. See `valid-char-table-type-p'. */ - (table)) + (char_table)) { - CHECK_CHAR_TABLE (table); - return char_table_type_to_symbol (XCHAR_TABLE (table)->type); + CHECK_CHAR_TABLE (char_table); + return char_table_type_to_symbol (XCHAR_TABLE (char_table)->type); } void @@ -559,14 +559,14 @@ fill_char_table (Lisp_Char_Table *ct, Lisp_Object value) } DEFUN ("reset-char-table", Freset_char_table, 1, 1, 0, /* -Reset a char table to its default state. +Reset CHAR-TABLE to its default state. */ - (table)) + (char_table)) { Lisp_Char_Table *ct; - CHECK_CHAR_TABLE (table); - ct = XCHAR_TABLE (table); + CHECK_CHAR_TABLE (char_table); + ct = XCHAR_TABLE (char_table); switch (ct->type) { @@ -666,18 +666,18 @@ copy_char_table_entry (Lisp_Object entry) #endif /* MULE */ DEFUN ("copy-char-table", Fcopy_char_table, 1, 1, 0, /* -Make a new char table which is a copy of OLD-TABLE. +Return a new char table which is a copy of CHAR-TABLE. It will contain the same values for the same characters and ranges -as OLD-TABLE. The values will not themselves be copied. +as CHAR-TABLE. The values will not themselves be copied. */ - (old_table)) + (char_table)) { Lisp_Char_Table *ct, *ctnew; Lisp_Object obj; int i; - CHECK_CHAR_TABLE (old_table); - ct = XCHAR_TABLE (old_table); + CHECK_CHAR_TABLE (char_table); + ct = XCHAR_TABLE (char_table); ctnew = alloc_lcrecord_type (Lisp_Char_Table, &lrecord_char_table); ctnew->type = ct->type; @@ -852,32 +852,29 @@ get_char_table (Emchar ch, Lisp_Char_Table *ct) DEFUN ("get-char-table", Fget_char_table, 2, 2, 0, /* -Find value for char CH in TABLE. +Find value for CHARACTER in CHAR-TABLE. */ - (ch, table)) + (character, char_table)) { - Lisp_Char_Table *ct; - - CHECK_CHAR_TABLE (table); - ct = XCHAR_TABLE (table); - CHECK_CHAR_COERCE_INT (ch); + CHECK_CHAR_TABLE (char_table); + CHECK_CHAR_COERCE_INT (character); - return get_char_table (XCHAR (ch), ct); + return get_char_table (XCHAR (character), XCHAR_TABLE (char_table)); } DEFUN ("get-range-char-table", Fget_range_char_table, 2, 3, 0, /* -Find value for a range in TABLE. +Find value for a range in CHAR-TABLE. If there is more than one value, return MULTI (defaults to nil). */ - (range, table, multi)) + (range, char_table, multi)) { Lisp_Char_Table *ct; struct chartab_range rainj; if (CHAR_OR_CHAR_INTP (range)) - return Fget_char_table (range, table); - CHECK_CHAR_TABLE (table); - ct = XCHAR_TABLE (table); + return Fget_char_table (range, char_table); + CHECK_CHAR_TABLE (char_table); + ct = XCHAR_TABLE (char_table); decode_char_table_range (range, &rainj); switch (rainj.type) @@ -1148,7 +1145,7 @@ put_char_table (Lisp_Char_Table *ct, struct chartab_range *range, } DEFUN ("put-char-table", Fput_char_table, 3, 3, 0, /* -Set the value for chars in RANGE to be VAL in TABLE. +Set the value for chars in RANGE to be VALUE in CHAR-TABLE. RANGE specifies one or more characters to be affected and should be one of the following: @@ -1159,20 +1156,20 @@ one of the following: (only allowed when Mule support is present) -- A single character -VAL must be a value appropriate for the type of TABLE. +VALUE must be a value appropriate for the type of CHAR-TABLE. See `valid-char-table-type-p'. */ - (range, val, table)) + (range, value, char_table)) { Lisp_Char_Table *ct; struct chartab_range rainj; - CHECK_CHAR_TABLE (table); - ct = XCHAR_TABLE (table); - check_valid_char_table_value (val, ct->type, ERROR_ME); + CHECK_CHAR_TABLE (char_table); + ct = XCHAR_TABLE (char_table); + check_valid_char_table_value (value, ct->type, ERROR_ME); decode_char_table_range (range, &rainj); - val = canonicalize_char_table_value (val, ct->type); - put_char_table (ct, &rainj, val); + value = canonicalize_char_table_value (value, ct->type); + put_char_table (ct, &rainj, value); return Qnil; } @@ -1451,22 +1448,22 @@ slow_map_char_table_fun (struct chartab_range *range, } DEFUN ("map-char-table", Fmap_char_table, 2, 3, 0, /* -Map FUNCTION over entries in TABLE, calling it with two args, +Map FUNCTION over entries in CHAR-TABLE, calling it with two args, each key and value in the table. RANGE specifies a subrange to map over and is in the same format as the RANGE argument to `put-range-table'. If omitted or t, it defaults to the entire table. */ - (function, table, range)) + (function, char_table, range)) { Lisp_Char_Table *ct; struct slow_map_char_table_arg slarg; struct gcpro gcpro1, gcpro2; struct chartab_range rainj; - CHECK_CHAR_TABLE (table); - ct = XCHAR_TABLE (table); + CHECK_CHAR_TABLE (char_table); + ct = XCHAR_TABLE (char_table); if (NILP (range)) range = Qt; decode_char_table_range (range, &rainj); @@ -1583,7 +1580,7 @@ chartab_instantiate (Lisp_Object data) /************************************************************************/ DEFUN ("category-table-p", Fcategory_table_p, 1, 1, 0, /* -Return t if ARG is a category table. +Return t if OBJECT is a category table. A category table is a type of char table used for keeping track of categories. Categories are used for classifying characters for use in regexps -- you can refer to a category rather than having to use @@ -1606,21 +1603,21 @@ whether the character is in that category. Special Lisp functions are provided that abstract this, so you do not have to directly manipulate bit vectors. */ - (obj)) + (object)) { - return (CHAR_TABLEP (obj) && - XCHAR_TABLE_TYPE (obj) == CHAR_TABLE_TYPE_CATEGORY) ? + return (CHAR_TABLEP (object) && + XCHAR_TABLE_TYPE (object) == CHAR_TABLE_TYPE_CATEGORY) ? Qt : Qnil; } static Lisp_Object -check_category_table (Lisp_Object obj, Lisp_Object def) +check_category_table (Lisp_Object object, Lisp_Object default_) { - if (NILP (obj)) - obj = def; - while (NILP (Fcategory_table_p (obj))) - obj = wrong_type_argument (Qcategory_table_p, obj); - return obj; + if (NILP (object)) + object = default_; + while (NILP (Fcategory_table_p (object))) + object = wrong_type_argument (Qcategory_table_p, object); + return object; } int @@ -1643,32 +1640,33 @@ check_category_char (Emchar ch, Lisp_Object table, } DEFUN ("check-category-at", Fcheck_category_at, 2, 4, 0, /* -Return t if category of a character at POS includes DESIGNATOR, -else return nil. Optional third arg specifies which buffer -\(defaulting to current), and fourth specifies the CATEGORY-TABLE, -\(defaulting to the buffer's category table). +Return t if category of the character at POSITION includes DESIGNATOR. +Optional third arg BUFFER specifies which buffer to use, and defaults +to the current buffer. +Optional fourth arg CATEGORY-TABLE specifies the category table to +use, and defaults to BUFFER's category table. */ - (pos, designator, buffer, category_table)) + (position, designator, buffer, category_table)) { Lisp_Object ctbl; Emchar ch; unsigned int des; struct buffer *buf = decode_buffer (buffer, 0); - CHECK_INT (pos); + CHECK_INT (position); CHECK_CATEGORY_DESIGNATOR (designator); des = XCHAR (designator); ctbl = check_category_table (category_table, Vstandard_category_table); - ch = BUF_FETCH_CHAR (buf, XINT (pos)); + ch = BUF_FETCH_CHAR (buf, XINT (position)); return check_category_char (ch, ctbl, des, 0) ? Qt : Qnil; } DEFUN ("char-in-category-p", Fchar_in_category_p, 2, 3, 0, /* -Return t if category of character CHR includes DESIGNATOR, else nil. -Optional third arg specifies the CATEGORY-TABLE to use, -which defaults to the system default table. +Return t if category of CHARACTER includes DESIGNATOR, else nil. +Optional third arg CATEGORY-TABLE specifies the category table to use, +and defaults to the standard category table. */ - (chr, designator, category_table)) + (character, designator, category_table)) { Lisp_Object ctbl; Emchar ch; @@ -1676,16 +1674,15 @@ which defaults to the system default table. CHECK_CATEGORY_DESIGNATOR (designator); des = XCHAR (designator); - CHECK_CHAR (chr); - ch = XCHAR (chr); + CHECK_CHAR (character); + ch = XCHAR (character); ctbl = check_category_table (category_table, Vstandard_category_table); return check_category_char (ch, ctbl, des, 0) ? Qt : Qnil; } DEFUN ("category-table", Fcategory_table, 0, 1, 0, /* -Return the current category table. -This is the one specified by the current buffer, or by BUFFER if it -is non-nil. +Return BUFFER's current category table. +BUFFER defaults to the current buffer. */ (buffer)) { @@ -1702,48 +1699,48 @@ This is the one used for new buffers. } DEFUN ("copy-category-table", Fcopy_category_table, 0, 1, 0, /* -Construct a new category table and return it. -It is a copy of the TABLE, which defaults to the standard category table. +Return a new category table which is a copy of CATEGORY-TABLE. +CATEGORY-TABLE defaults to the standard category table. */ - (table)) + (category_table)) { if (NILP (Vstandard_category_table)) return Fmake_char_table (Qcategory); - table = check_category_table (table, Vstandard_category_table); - return Fcopy_char_table (table); + category_table = + check_category_table (category_table, Vstandard_category_table); + return Fcopy_char_table (category_table); } DEFUN ("set-category-table", Fset_category_table, 1, 2, 0, /* -Select a new category table for BUFFER. -One argument, a category table. +Select CATEGORY-TABLE as the new category table for BUFFER. BUFFER defaults to the current buffer if omitted. */ - (table, buffer)) + (category_table, buffer)) { struct buffer *buf = decode_buffer (buffer, 0); - table = check_category_table (table, Qnil); - buf->category_table = table; + category_table = check_category_table (category_table, Qnil); + buf->category_table = category_table; /* Indicate that this buffer now has a specified category table. */ buf->local_var_flags |= XINT (buffer_local_flags.category_table); - return table; + return category_table; } DEFUN ("category-designator-p", Fcategory_designator_p, 1, 1, 0, /* -Return t if ARG is a category designator (a char in the range ' ' to '~'). +Return t if OBJECT is a category designator (a char in the range ' ' to '~'). */ - (obj)) + (object)) { - return CATEGORY_DESIGNATORP (obj) ? Qt : Qnil; + return CATEGORY_DESIGNATORP (object) ? Qt : Qnil; } DEFUN ("category-table-value-p", Fcategory_table_value_p, 1, 1, 0, /* -Return t if ARG is a category table value. +Return t if OBJECT is a category table value. Valid values are nil or a bit vector of size 95. */ - (obj)) + (object)) { - return CATEGORY_TABLE_VALUEP (obj) ? Qt : Qnil; + return CATEGORY_TABLE_VALUEP (object) ? Qt : Qnil; } @@ -1893,7 +1890,7 @@ Emacs treats a sequence of word constituent characters as a single word (i.e. finds no word boundary between them) iff they belongs to the same charset. But, exceptions are allowed in the following cases. -(1) The case that characters are in different charsets is controlled +\(1) The case that characters are in different charsets is controlled by the variable `word-combining-categories'. Emacs finds no word boundary between characters of different charsets @@ -1907,7 +1904,7 @@ For instance, to tell that ASCII characters and Latin-1 characters can form a single word, the element `(?l . ?l)' should be in this list because both characters have the category `l' (Latin characters). -(2) The case that character are in the same charset is controlled by +\(2) The case that character are in the same charset is controlled by the variable `word-separating-categories'. Emacs find a word boundary between characters of the same charset diff --git a/src/cmdloop.c b/src/cmdloop.c index e015320..80a99dc 100644 --- a/src/cmdloop.c +++ b/src/cmdloop.c @@ -549,9 +549,13 @@ Don't call this unless you know what you're doing. } } +#if 0 /* What's wrong with going through ordinary procedure of quit? + quitting here leaves overriding-terminal-local-map + when you type C-u C-u C-g. */ /* If ^G was typed before we got here (that is, before emacs was idle and waiting for input) then we treat that as an interrupt. */ QUIT; +#endif /* If minibuffer on and echo area in use, wait 2 sec and redraw minibuffer. Treat a ^G here as a command, not an interrupt. diff --git a/src/cmds.c b/src/cmds.c index c902092..82e7568 100644 --- a/src/cmds.c +++ b/src/cmds.c @@ -46,31 +46,31 @@ Lisp_Object Vself_insert_face_command; Lisp_Object Vauto_fill_chars; DEFUN ("forward-char", Fforward_char, 0, 2, "_p", /* -Move point right N characters (left if N negative). +Move point right COUNT characters (left if COUNT is negative). On attempt to pass end of buffer, stop and signal `end-of-buffer'. On attempt to pass beginning of buffer, stop and signal `beginning-of-buffer'. On reaching end of buffer, stop and signal error. */ - (n, buffer)) + (count, buffer)) { struct buffer *buf = decode_buffer (buffer, 1); - EMACS_INT count; + EMACS_INT n; - if (NILP (n)) - count = 1; + if (NILP (count)) + n = 1; else { - CHECK_INT (n); - count = XINT (n); + CHECK_INT (count); + n = XINT (count); } - /* This used to just set point to point + XINT (n), and then check + /* This used to just set point to point + XINT (count), and then check to see if it was within boundaries. But now that SET_PT can potentially do a lot of stuff (calling entering and exiting hooks, etcetera), that's not a good approach. So we validate the proposed position, then set point. */ { - Bufpos new_point = BUF_PT (buf) + count; + Bufpos new_point = BUF_PT (buf) + n; if (new_point < BUF_BEGV (buf)) { @@ -92,49 +92,49 @@ On reaching end of buffer, stop and signal error. } DEFUN ("backward-char", Fbackward_char, 0, 2, "_p", /* -Move point left N characters (right if N negative). +Move point left COUNT characters (right if COUNT is negative). On attempt to pass end of buffer, stop and signal `end-of-buffer'. On attempt to pass beginning of buffer, stop and signal `beginning-of-buffer'. */ - (n, buffer)) + (count, buffer)) { - if (NILP (n)) - n = make_int (-1); + if (NILP (count)) + count = make_int (-1); else { - CHECK_INT (n); - XSETINT (n, - XINT (n)); + CHECK_INT (count); + count = make_int (- XINT (count)); } - return Fforward_char (n, buffer); + return Fforward_char (count, buffer); } DEFUN ("forward-line", Fforward_line, 0, 2, "_p", /* -Move N lines forward (backward if N is negative). -Precisely, if point is on line I, move to the start of line I + N. +Move COUNT lines forward (backward if COUNT is negative). +Precisely, if point is on line I, move to the start of line I + COUNT. If there isn't room, go as far as possible (no error). Returns the count of lines left to move. If moving forward, -that is N - number of lines moved; if backward, N + number moved. -With positive N, a non-empty line at the end counts as one line +that is COUNT - number of lines moved; if backward, COUNT + number moved. +With positive COUNT, a non-empty line at the end counts as one line successfully moved (for the return value). If BUFFER is nil, the current buffer is assumed. */ - (n, buffer)) + (count, buffer)) { struct buffer *buf = decode_buffer (buffer, 1); Bufpos pos2 = BUF_PT (buf); Bufpos pos; - EMACS_INT count, shortage, negp; + EMACS_INT n, shortage, negp; - if (NILP (n)) - count = 1; + if (NILP (count)) + n = 1; else { - CHECK_INT (n); - count = XINT (n); + CHECK_INT (count); + n = XINT (count); } - negp = count <= 0; - pos = scan_buffer (buf, '\n', pos2, 0, count - negp, &shortage, 1); + negp = n <= 0; + pos = scan_buffer (buf, '\n', pos2, 0, n - negp, &shortage, 1); if (shortage > 0 && (negp || (BUF_ZV (buf) > BUF_BEGV (buf) @@ -147,26 +147,26 @@ If BUFFER is nil, the current buffer is assumed. DEFUN ("point-at-bol", Fpoint_at_bol, 0, 2, 0, /* Return the character position of the first character on the current line. -With argument N not nil or 1, move forward N - 1 lines first. +With argument COUNT not nil or 1, move forward COUNT - 1 lines first. If scan reaches end of buffer, return that position. This function does not move point. */ - (n, buffer)) + (count, buffer)) { struct buffer *b = decode_buffer (buffer, 1); REGISTER int orig, end; XSETBUFFER (buffer, b); - if (NILP (n)) - n = make_int (0); + if (NILP (count)) + count = make_int (0); else { - CHECK_INT (n); - n = make_int (XINT (n) - 1); + CHECK_INT (count); + count = make_int (XINT (count) - 1); } orig = BUF_PT (b); - Fforward_line (n, buffer); + Fforward_line (count, buffer); end = BUF_PT (b); BUF_SET_PT (b, orig); @@ -175,75 +175,75 @@ This function does not move point. DEFUN ("beginning-of-line", Fbeginning_of_line, 0, 2, "_p", /* Move point to beginning of current line. -With argument N not nil or 1, move forward N - 1 lines first. +With argument COUNT not nil or 1, move forward COUNT - 1 lines first. If scan reaches end of buffer, stop there without error. If BUFFER is nil, the current buffer is assumed. */ - (n, buffer)) + (count, buffer)) { struct buffer *b = decode_buffer (buffer, 1); - BUF_SET_PT (b, XINT (Fpoint_at_bol (n, buffer))); + BUF_SET_PT (b, XINT (Fpoint_at_bol (count, buffer))); return Qnil; } DEFUN ("point-at-eol", Fpoint_at_eol, 0, 2, 0, /* Return the character position of the last character on the current line. -With argument N not nil or 1, move forward N - 1 lines first. +With argument COUNT not nil or 1, move forward COUNT - 1 lines first. If scan reaches end of buffer, return that position. This function does not move point. */ - (n, buffer)) + (count, buffer)) { struct buffer *buf = decode_buffer (buffer, 1); - int count; + int n; - if (NILP (n)) - count = 1; + if (NILP (count)) + n = 1; else { - CHECK_INT (n); - count = XINT (n); + CHECK_INT (count); + n = XINT (count); } return make_int (find_before_next_newline (buf, BUF_PT (buf), 0, - count - (count <= 0))); + n - (n <= 0))); } DEFUN ("end-of-line", Fend_of_line, 0, 2, "_p", /* Move point to end of current line. -With argument N not nil or 1, move forward N - 1 lines first. +With argument COUNT not nil or 1, move forward COUNT - 1 lines first. If scan reaches end of buffer, stop there without error. If BUFFER is nil, the current buffer is assumed. */ - (n, buffer)) + (count, buffer)) { struct buffer *b = decode_buffer (buffer, 1); - BUF_SET_PT (b, XINT (Fpoint_at_eol (n, buffer))); + BUF_SET_PT (b, XINT (Fpoint_at_eol (count, buffer))); return Qnil; } DEFUN ("delete-char", Fdelete_char, 1, 2, "*p\nP", /* -Delete the following N characters (previous, with negative N). -Optional second arg KILLFLAG non-nil means kill instead (save in kill ring). -Interactively, N is the prefix arg, and KILLFLAG is set if -N was explicitly specified. +Delete the following COUNT characters (previous, with negative COUNT). +Optional second arg KILLP non-nil means kill instead (save in kill ring). +Interactively, COUNT is the prefix arg, and KILLP is set if +COUNT was explicitly specified. */ - (n, killflag)) + (count, killp)) { /* This function can GC */ Bufpos pos; struct buffer *buf = current_buffer; - int count; + int n; - CHECK_INT (n); - count = XINT (n); + CHECK_INT (count); + n = XINT (count); - pos = BUF_PT (buf) + count; - if (NILP (killflag)) + pos = BUF_PT (buf) + n; + if (NILP (killp)) { - if (count < 0) + if (n < 0) { if (pos < BUF_BEGV (buf)) signal_error (Qbeginning_of_buffer, Qnil); @@ -260,22 +260,22 @@ N was explicitly specified. } else { - call1 (Qkill_forward_chars, n); + call1 (Qkill_forward_chars, count); } return Qnil; } DEFUN ("delete-backward-char", Fdelete_backward_char, 1, 2, "*p\nP", /* -Delete the previous N characters (following, with negative N). -Optional second arg KILLFLAG non-nil means kill instead (save in kill ring). -Interactively, N is the prefix arg, and KILLFLAG is set if -N was explicitly specified. +Delete the previous COUNT characters (following, with negative COUNT). +Optional second arg KILLP non-nil means kill instead (save in kill ring). +Interactively, COUNT is the prefix arg, and KILLP is set if +COUNT was explicitly specified. */ - (n, killflag)) + (count, killp)) { /* This function can GC */ - CHECK_INT (n); - return Fdelete_char (make_int (- XINT (n)), killflag); + CHECK_INT (count); + return Fdelete_char (make_int (- XINT (count)), killp); } static void internal_self_insert (Emchar ch, int noautofill); @@ -283,16 +283,17 @@ static void internal_self_insert (Emchar ch, int noautofill); DEFUN ("self-insert-command", Fself_insert_command, 1, 1, "*p", /* Insert the character you type. Whichever character you type to run this command is inserted. +If a prefix arg COUNT is specified, the character is inserted COUNT times. */ - (n)) + (count)) { /* This function can GC */ Emchar ch; Lisp_Object c; - int count; + int n; - CHECK_NATNUM (n); - count = XINT (n); + CHECK_NATNUM (count); + n = XINT (count); if (CHAR_OR_CHAR_INTP (Vlast_command_char)) c = Vlast_command_char; @@ -307,8 +308,8 @@ Whichever character you type to run this command is inserted. ch = XCHAR (c); - while (count--) - internal_self_insert (ch, (count != 0)); + while (n--) + internal_self_insert (ch, (n != 0)); return Qnil; } @@ -447,13 +448,13 @@ internal_self_insert (Emchar c1, int noautofill) /* (this comes from Mule but is a generally good idea) */ DEFUN ("self-insert-internal", Fself_insert_internal, 1, 1, 0, /* -Invoke `self-insert-command' as if CH is entered from keyboard. +Invoke `self-insert-command' as if CHARACTER is entered from keyboard. */ - (ch)) + (character)) { /* This function can GC */ - CHECK_CHAR_COERCE_INT (ch); - internal_self_insert (XCHAR (ch), 0); + CHECK_CHAR_COERCE_INT (character); + internal_self_insert (XCHAR (character), 0); return Qnil; } @@ -506,7 +507,7 @@ More precisely, a char with closeparen syntax is self-inserted. DEFVAR_LISP ("auto-fill-chars", &Vauto_fill_chars /* A char-table for characters which invoke auto-filling. -Such characters has value t in this table. +Such characters have value t in this table. */); Vauto_fill_chars = Fmake_char_table (Qgeneric); XCHAR_TABLE (Vauto_fill_chars)->ascii[' '] = Qt; diff --git a/src/config.h.in b/src/config.h.in index cd8afbd..49ee0a4 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -34,12 +34,15 @@ Boston, MA 02111-1307, USA. */ #ifndef NOT_C_CODE #ifdef __GNUC__ #define alloca __builtin_alloca -#elif HAVE_ALLOCA_H +#elif defined __DECC +#include +#pragma intrinsic(alloca) +#elif defined HAVE_ALLOCA_H #include #elif defined(_AIX) #pragma alloca #elif ! defined (alloca) -char *alloca (); +void *alloca (); #endif #endif /* C code */ @@ -172,8 +175,9 @@ char *alloca (); #define HAVE_UNIXOID_EVENT_LOOP #endif -/* Are we using XFree386? */ -#undef HAVE_XFREE386 +/* XFree86 has a different prototype for this function */ +#undef HAVE_XREGISTERIMINSTANTIATECALLBACK +#undef XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE #undef THIS_IS_X11R4 #undef THIS_IS_X11R5 @@ -331,7 +335,7 @@ char *alloca (); /* PTY support functions */ #undef HAVE_GETPT /* glibc's easy pty allocation function */ -#undef HAVE__GETPT /* SGI's easy pty allocation function */ +#undef HAVE__GETPTY /* SGI's easy pty allocation function */ #undef HAVE_OPENPTY /* BSD's easy pty allocation function */ #undef HAVE_GRANTPT /* Unix98 */ #undef HAVE_UNLOCKPT /* Unix98 */ @@ -341,8 +345,8 @@ char *alloca (); #undef HAVE_ISASTREAM /* SysV streams */ #undef HAVE_PTY_H /* Linux, Tru64 openpty */ #undef HAVE_LIBUTIL_H /* BSD openpty */ -#undef HAVE_SYS_STROPTS_H /* SysV streams */ -#undef HAVE_SYS_STRTIO_H /* SysV streams TIOCSIGNAL */ +#undef HAVE_STROPTS_H /* SysV streams */ +#undef HAVE_STRTIO_H /* SysV streams TIOCSIGNAL */ #undef HAVE_SOCKETS #undef HAVE_SOCKADDR_SUN_LEN @@ -713,7 +717,7 @@ extern "C" { Also, SunOS 4.1.1 contains buggy versions of strcmp and strcpy that sometimes reference memory past the end of the string, which can segv. - I don't know whether this is has been fixed as of 4.1.2 or 4.1.3. */ + I don't know whether this has been fixed as of 4.1.2 or 4.1.3. */ #if defined (sparc) && !defined (USG) #define OBJECTS_SYSTEM sunOS-fix.o strcmp.o strcpy.o #endif diff --git a/src/console-stream.c b/src/console-stream.c index e49ad88..5e099b2 100644 --- a/src/console-stream.c +++ b/src/console-stream.c @@ -279,17 +279,17 @@ void vars_of_console_stream (void) { DEFVAR_LISP ("terminal-console", &Vterminal_console /* -The initial console-object, which represents XEmacs' stdout. +The initial console object, which represents XEmacs' stdout. */ ); Vterminal_console = Qnil; DEFVAR_LISP ("terminal-device", &Vterminal_device /* -The initial device-object, which represents XEmacs' stdout. +The initial device object, which represents XEmacs' stdout. */ ); Vterminal_device = Qnil; DEFVAR_LISP ("terminal-frame", &Vterminal_frame /* -The initial frame-object, which represents XEmacs' stdout. +The initial frame object, which represents XEmacs' stdout. */ ); Vterminal_frame = Qnil; diff --git a/src/console-x.c b/src/console-x.c index dcc7407..f7bcdfb 100644 --- a/src/console-x.c +++ b/src/console-x.c @@ -43,31 +43,43 @@ x_initially_selected_for_input (struct console *con) return 1; } +/* Parse a DISPLAY specification like "host:10.0" or ":0" */ static void split_up_display_spec (Lisp_Object display, int *hostname_length, int *display_length, int *screen_length) { - Bufbyte *dotptr; + Bufbyte *beg = XSTRING_DATA (display); + Bufbyte *end = beg + XSTRING_LENGTH (display); + Bufbyte *p = end; - dotptr = strrchr ((char *) XSTRING_DATA (display), ':'); - if (!dotptr) + while (p > beg) { - *hostname_length = XSTRING_LENGTH (display); - *display_length = 0; - } - else - { - *hostname_length = dotptr - XSTRING_DATA (display); + DEC_CHARPTR (p); + if (charptr_emchar (p) == ':') + { + *hostname_length = p - beg; - dotptr = strchr ((char *) dotptr, '.'); - if (dotptr) - *display_length = (dotptr - XSTRING_DATA (display) - *hostname_length); - else - *display_length = XSTRING_LENGTH (display) - *hostname_length; + while (p < end - 1) + { + INC_CHARPTR (p); + if (charptr_emchar (p) == '.') + { + *display_length = p - beg - *hostname_length; + *screen_length = end - p; + return; + } + } + /* No '.' found. */ + *display_length = XSTRING_LENGTH (display) - *hostname_length; + *screen_length = 0; + return; + } } - *screen_length = (XSTRING_LENGTH (display) - *display_length - - *hostname_length); + /* No ':' found. */ + *hostname_length = XSTRING_LENGTH (display); + *display_length = 0; + *screen_length = 0; } /* Remember, in all of the following functions, we have to verify @@ -182,11 +194,26 @@ x_semi_canonicalize_console_connection (Lisp_Object connection, connection = x_device_to_console_connection (connection, errb); /* Check for a couple of standard special cases */ - if (string_byte (XSTRING (connection), 0) == ':') + if (string_char (XSTRING (connection), 0) == ':') connection = concat2 (build_string ("localhost"), connection); - else if (!strncmp (XSTRING_DATA (connection), "unix:", 5)) - connection = concat2 (build_string ("localhost:"), - Fsubstring (connection, make_int (5), Qnil)); + else + { + /* connection =~ s/^unix:/localhost:/; */ + const Bufbyte *p = XSTRING_DATA (connection); + const Bufbyte *end = XSTRING_DATA (connection) + XSTRING_LENGTH (connection); + size_t i; + + for (i = 0; i < sizeof ("unix:") - 1; i++) + { + if (p == end || charptr_emchar (p) != "unix:"[i]) + goto ok; + INC_CHARPTR (p); + } + + connection = concat2 (build_string ("localhost:"), + make_string (p, end - p)); + } + ok: RETURN_UNGCPRO (connection); } @@ -262,8 +289,8 @@ x_canonicalize_device_connection (Lisp_Object connection, Error_behavior errb) split_up_display_spec (connection, &hostname_length, &display_length, &screen_length); - screen_str = build_string (XSTRING_DATA (connection) - + hostname_length + display_length); + screen_str = make_string (XSTRING_DATA (connection) + + hostname_length + display_length, screen_length); connection = x_canonicalize_console_connection (connection, errb); RETURN_UNGCPRO (concat2 (connection, screen_str)); diff --git a/src/console-x.h b/src/console-x.h index aa89a4e..e9edc10 100644 --- a/src/console-x.h +++ b/src/console-x.h @@ -181,6 +181,7 @@ struct x_device unsigned int need_to_add_mask, down_mask; KeyCode last_downkey; Time release_time; + Time modifier_release_time; }; #define DEVICE_X_DATA(d) DEVICE_TYPE_DATA (d, x) diff --git a/src/console.c b/src/console.c index ab147bc..8e79a8d 100644 --- a/src/console.c +++ b/src/console.c @@ -196,7 +196,7 @@ valid_console_type_p (Lisp_Object type) } DEFUN ("valid-console-type-p", Fvalid_console_type_p, 1, 1, 0, /* -Given a CONSOLE-TYPE, return t if it is valid. +Return t if CONSOLE-TYPE is a valid console type. Valid types are 'x, 'tty, and 'stream. */ (console_type)) @@ -216,9 +216,9 @@ DEFUN ("cdfw-console", Fcdfw_console, 1, 1, 0, /* Given a console, device, frame, or window, return the associated console. Return nil otherwise. */ - (obj)) + (object)) { - return CDFW_CONSOLE (obj); + return CDFW_CONSOLE (object); } @@ -307,7 +307,7 @@ Return non-nil if OBJECT is a console that has not been deleted. } DEFUN ("console-type", Fconsole_type, 0, 1, 0, /* -Return the type of the specified console (e.g. `x' or `tty'). +Return the console type (e.g. `x' or `tty') of CONSOLE. Value is `tty' for a tty console (a character-only terminal), `x' for a console that is an X display, `mswindows' for a console that is a Windows NT/95/97 connection, @@ -327,7 +327,7 @@ Value is `tty' for a tty console (a character-only terminal), } DEFUN ("console-name", Fconsole_name, 0, 1, 0, /* -Return the name of the specified console. +Return the name of CONSOLE. */ (console)) { @@ -750,7 +750,7 @@ Return a list of all consoles. DEFUN ("console-device-list", Fconsole_device_list, 0, 1, 0, /* Return a list of all devices on CONSOLE. -If CONSOLE is nil, the selected console will be used. +If CONSOLE is nil, the selected console is used. */ (console)) { @@ -780,7 +780,8 @@ Disable input on console CONSOLE. } DEFUN ("console-on-window-system-p", Fconsole_on_window_system_p, 0, 1, 0, /* -Return non-nil if this console is on a window system. +Return t if CONSOLE is on a window system. +If CONSOLE is nil, the selected console is used. This generally means that there is support for the mouse, the menubar, the toolbar, glyphs, etc. */ @@ -1023,6 +1024,7 @@ See also `current-input-mode'. TTY_FLAGS (con).flow_control = !NILP (flow); TTY_FLAGS (con).meta_key = meta_key; init_one_console (con); + MARK_FRAME_CHANGED (XFRAME (CONSOLE_SELECTED_FRAME (con))); } #endif diff --git a/src/data.c b/src/data.c index a0f2445..fca3e0e 100644 --- a/src/data.c +++ b/src/data.c @@ -182,9 +182,9 @@ sign_extend_lisp_int (EMACS_INT num) DEFUN ("eq", Feq, 2, 2, 0, /* Return t if the two args are the same Lisp object. */ - (obj1, obj2)) + (object1, object2)) { - return EQ_WITH_EBOLA_NOTICE (obj1, obj2) ? Qt : Qnil; + return EQ_WITH_EBOLA_NOTICE (object1, object2) ? Qt : Qnil; } DEFUN ("old-eq", Fold_eq, 2, 2, 0, /* @@ -199,10 +199,10 @@ functions with `old-foo' equivalents. Do not use this function! */ - (obj1, obj2)) + (object1, object2)) { /* #### blasphemy */ - return HACKEQ_UNSAFE (obj1, obj2) ? Qt : Qnil; + return HACKEQ_UNSAFE (object1, object2) ? Qt : Qnil; } DEFUN ("null", Fnull, 1, 1, 0, /* @@ -357,7 +357,7 @@ or nil if it takes an arbitrary number of arguments or is a special form. } DEFUN ("subr-interactive", Fsubr_interactive, 1, 1, 0, /* -Return the interactive spec of the subr object, or nil. +Return the interactive spec of the subr object SUBR, or nil. If non-nil, the return value will be a list whose first element is `interactive' and whose second element is the interactive spec. */ @@ -395,7 +395,7 @@ as `char='. } DEFUN ("char-to-int", Fchar_to_int, 1, 1, 0, /* -Convert a character into an equivalent integer. +Convert CHARACTER into an equivalent integer. The resulting integer will always be non-negative. The integers in the range 0 - 255 map to characters as follows: @@ -409,14 +409,14 @@ values. When Mule support exists, the values assigned to other characters may vary depending on the particular version of XEmacs, the order in which character sets were loaded, etc., and you should not depend on them. */ - (ch)) + (character)) { - CHECK_CHAR (ch); - return make_int (XCHAR (ch)); + CHECK_CHAR (character); + return make_int (XCHAR (character)); } DEFUN ("int-to-char", Fint_to_char, 1, 1, 0, /* -Convert an integer into the equivalent character. +Convert integer INTEGER into the equivalent character. Not all integers correspond to valid characters; use `char-int-p' to determine whether this is the case. If the integer cannot be converted, nil is returned. @@ -614,26 +614,26 @@ Return the cdr of OBJECT if it is a cons cell, else nil. } DEFUN ("setcar", Fsetcar, 2, 2, 0, /* -Set the car of CONSCELL to be NEWCAR. Return NEWCAR. +Set the car of CONS-CELL to be NEWCAR. Return NEWCAR. */ - (conscell, newcar)) + (cons_cell, newcar)) { - if (!CONSP (conscell)) - conscell = wrong_type_argument (Qconsp, conscell); + if (!CONSP (cons_cell)) + cons_cell = wrong_type_argument (Qconsp, cons_cell); - XCAR (conscell) = newcar; + XCAR (cons_cell) = newcar; return newcar; } DEFUN ("setcdr", Fsetcdr, 2, 2, 0, /* -Set the cdr of CONSCELL to be NEWCDR. Return NEWCDR. +Set the cdr of CONS-CELL to be NEWCDR. Return NEWCDR. */ - (conscell, newcdr)) + (cons_cell, newcdr)) { - if (!CONSP (conscell)) - conscell = wrong_type_argument (Qconsp, conscell); + if (!CONSP (cons_cell)) + cons_cell = wrong_type_argument (Qconsp, cons_cell); - XCDR (conscell) = newcdr; + XCDR (cons_cell) = newcdr; return newcdr; } @@ -1002,27 +1002,27 @@ lisp_to_word (Lisp_Object item) DEFUN ("number-to-string", Fnumber_to_string, 1, 1, 0, /* -Convert NUM to a string by printing it in decimal. +Convert NUMBER to a string by printing it in decimal. Uses a minus sign if negative. -NUM may be an integer or a floating point number. +NUMBER may be an integer or a floating point number. */ - (num)) + (number)) { char buffer[VALBITS]; - CHECK_INT_OR_FLOAT (num); + CHECK_INT_OR_FLOAT (number); #ifdef LISP_FLOAT_TYPE - if (FLOATP (num)) + if (FLOATP (number)) { char pigbuf[350]; /* see comments in float_to_string */ - float_to_string (pigbuf, XFLOAT_DATA (num)); + float_to_string (pigbuf, XFLOAT_DATA (number)); return build_string (pigbuf); } #endif /* LISP_FLOAT_TYPE */ - long_to_string (buffer, XINT (num)); + long_to_string (buffer, XINT (number)); return build_string (buffer); } @@ -1039,12 +1039,12 @@ digit_to_number (int character, int base) } DEFUN ("string-to-number", Fstring_to_number, 1, 2, 0, /* -Convert STRING to a number by parsing it as a decimal number. +Convert STRING to a number by parsing it as a number in base BASE. This parses both integers and floating point numbers. It ignores leading spaces and tabs. -If BASE, interpret STRING as a number in that base. If BASE isn't -present, base 10 is used. BASE must be between 2 and 16 (inclusive). +If BASE is nil or omitted, base 10 is used. +BASE must be an integer between 2 and 16 (inclusive). Floating point numbers always use base 10. */ (string, base)) @@ -1088,7 +1088,7 @@ Floating point numbers always use base 10. } else { - int digit, negative = 1; + int negative = 1; EMACS_INT v = 0; if (*p == '-') @@ -1100,7 +1100,7 @@ Floating point numbers always use base 10. p++; while (1) { - digit = digit_to_number (*p++, b); + int digit = digit_to_number (*p++, b); if (digit < 0) break; v = v * b + digit; @@ -1417,10 +1417,10 @@ DEFUN ("%", Frem, 2, 2, 0, /* Return remainder of first arg divided by second. Both must be integers, characters or markers. */ - (num1, num2)) + (number1, number2)) { - EMACS_INT ival1 = integer_char_or_marker_to_int (num1); - EMACS_INT ival2 = integer_char_or_marker_to_int (num2); + EMACS_INT ival1 = integer_char_or_marker_to_int (number1); + EMACS_INT ival2 = integer_char_or_marker_to_int (number2); if (ival2 == 0) Fsignal (Qarith_error, Qnil); diff --git a/src/database.c b/src/database.c index e7750b6..9cf085f 100644 --- a/src/database.c +++ b/src/database.c @@ -144,9 +144,9 @@ allocate_database (void) } static Lisp_Object -mark_database (Lisp_Object obj) +mark_database (Lisp_Object object) { - Lisp_Database *db = XDATABASE (obj); + Lisp_Database *db = XDATABASE (object); return db->fname; } @@ -178,11 +178,11 @@ finalize_database (void *header, int for_disksave) if (for_disksave) { - Lisp_Object obj; - XSETDATABASE (obj, db); + Lisp_Object object; + XSETDATABASE (object, db); signal_simple_error - ("Can't dump an emacs containing database objects", obj); + ("Can't dump an emacs containing database objects", object); } db->funcs->close (db); } @@ -226,11 +226,12 @@ Return the subtype of database DATABASE, if any. } DEFUN ("database-live-p", Fdatabase_live_p, 1, 1, 0, /* -Return t if OBJ is an active database. +Return t if OBJECT is an active database. */ - (obj)) + (object)) { - return DATABASEP (obj) && DATABASE_LIVE_P (XDATABASE (obj)) ? Qt : Qnil; + return DATABASEP (object) && DATABASE_LIVE_P (XDATABASE (object)) ? + Qt : Qnil; } DEFUN ("database-file-name", Fdatabase_file_name, 1, 1, 0, /* @@ -244,11 +245,11 @@ Return the filename associated with the database DATABASE. } DEFUN ("databasep", Fdatabasep, 1, 1, 0, /* -Return t if OBJ is a database. +Return t if OBJECT is a database. */ - (obj)) + (object)) { - return DATABASEP (obj) ? Qt : Qnil; + return DATABASEP (object) ? Qt : Qnil; } #ifdef HAVE_DBM diff --git a/src/depend b/src/depend index b5b789c..2b6563e 100644 --- a/src/depend +++ b/src/depend @@ -205,7 +205,7 @@ unexconvex.o: config.h getpagesize.h unexcw.o: config.h sysfile.h unexec.o: $(LISP_H) getpagesize.h unexelf.o: config.h -unexelfsgi.o: $(LISP_H) +unexelfsgi.o: config.h unexenix.o: config.h unexfreebsd.o: config.h unexhp9k3.o: config.h sysdep.h diff --git a/src/device-x.c b/src/device-x.c index a0586b6..a6fc1bc 100644 --- a/src/device-x.c +++ b/src/device-x.c @@ -1434,13 +1434,13 @@ found. If the third arg is `string', a string is returned, and if it is returned value is the list (t) for true, (nil) for false, and is nil to mean ``unspecified''. */ - (name, class, type, locale, device, no_error)) + (name, class, type, locale, device, noerror)) { char* name_string, *class_string; char *raw_result; XrmDatabase db; Display *display; - Error_behavior errb = decode_error_behavior_flag (no_error); + Error_behavior errb = decode_error_behavior_flag (noerror); CHECK_STRING (name); CHECK_STRING (class); diff --git a/src/device.c b/src/device.c index b02ecc3..16c10a6 100644 --- a/src/device.c +++ b/src/device.c @@ -227,9 +227,9 @@ DEFUN ("dfw-device", Fdfw_device, 1, 1, 0, /* Given a device, frame, or window, return the associated device. Return nil otherwise. */ - (obj)) + (object)) { - return DFW_DEVICE (obj); + return DFW_DEVICE (object); } diff --git a/src/dialog-msw.c b/src/dialog-msw.c index 27fbad7..62c70e2 100644 --- a/src/dialog-msw.c +++ b/src/dialog-msw.c @@ -157,6 +157,9 @@ mswindows_is_dialog_msg (MSG *msg) LIST_LOOP_2 (popup, Vpopup_frame_list) { HWND hwnd = FRAME_MSWINDOWS_HANDLE (XFRAME (popup)); + /* This is a windows feature that allows dialog type + processing to be applied to standard windows containing + controls. */ if (IsDialogMessage (hwnd, msg)) return 1; } diff --git a/src/dialog-x.c b/src/dialog-x.c index 3985761..a6dcd2d 100644 --- a/src/dialog-x.c +++ b/src/dialog-x.c @@ -128,7 +128,9 @@ dbox_descriptor_to_widget_value (Lisp_Object keys) int n = 0; int count = specpdl_depth (); Lisp_Object wv_closure, gui_item; - Lisp_Object question = Qnil, title = Qnil, buttons = Qnil; + Lisp_Object question = Qnil; + Lisp_Object title = Qnil; /* #### currently unused */ + Lisp_Object buttons = Qnil; { EXTERNAL_PROPERTY_LIST_LOOP_3 (key, value, keys) diff --git a/src/dired.c b/src/dired.c index 474c828..69142b7 100644 --- a/src/dired.c +++ b/src/dired.c @@ -179,18 +179,18 @@ static Lisp_Object file_name_completion (Lisp_Object file, int all_flag, int ver_flag); DEFUN ("file-name-completion", Ffile_name_completion, 2, 2, 0, /* -Complete file name FILE in directory DIRECTORY. -Returns the longest string common to all filenames in DIRECTORY -that start with FILE. -If there is only one and FILE matches it exactly, returns t. -Returns nil if DIRECTORY contains no name starting with FILE. - -Filenames which end with any member of `completion-ignored-extensions' -are not considered as possible completions for FILE unless there is no -other possible completion. `completion-ignored-extensions' is not applied -to the names of directories. +Complete file name PARTIAL-FILENAME in directory DIRECTORY. +Return the longest prefix common to all file names in DIRECTORY +that start with PARTIAL-FILENAME. +If there is only one and PARTIAL-FILENAME matches it exactly, return t. +Return nil if DIRECTORY contains no name starting with PARTIAL-FILENAME. + +File names which end with any member of `completion-ignored-extensions' +are not considered as possible completions for PARTIAL-FILENAME unless +there is no other possible completion. `completion-ignored-extensions' +is not applied to the names of directories. */ - (file, directory)) + (partial_filename, directory)) { /* This function can GC. GC checked 1996.04.06. */ Lisp_Object handler; @@ -199,27 +199,27 @@ to the names of directories. call the corresponding file handler. */ handler = Ffind_file_name_handler (directory, Qfile_name_completion); if (!NILP (handler)) - return call3 (handler, Qfile_name_completion, file, directory); + return call3 (handler, Qfile_name_completion, partial_filename, directory); /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = Ffind_file_name_handler (file, Qfile_name_completion); + handler = Ffind_file_name_handler (partial_filename, Qfile_name_completion); if (!NILP (handler)) - return call3 (handler, Qfile_name_completion, file, directory); + return call3 (handler, Qfile_name_completion, partial_filename, directory); - return file_name_completion (file, directory, 0, 0); + return file_name_completion (partial_filename, directory, 0, 0); } DEFUN ("file-name-all-completions", Ffile_name_all_completions, 2, 2, 0, /* -Return a list of all completions of file name FILE in directory DIRECTORY. -These are all file names in directory DIRECTORY which begin with FILE. +Return a list of all completions of PARTIAL-FILENAME in DIRECTORY. +These are all file names in DIRECTORY which begin with PARTIAL-FILENAME. File names which end with any member of `completion-ignored-extensions' -are not considered as possible completions for FILE unless there is no -other possible completion. `completion-ignored-extensions' is not applied -to the names of directories. +are not considered as possible completions for PARTIAL-FILENAME unless +there is no other possible completion. `completion-ignored-extensions' +is not applied to the names of directories. */ - (file, directory)) + (partial_filename, directory)) { /* This function can GC. GC checked 1997.06.04. */ Lisp_Object handler; @@ -232,10 +232,10 @@ to the names of directories. handler = Ffind_file_name_handler (directory, Qfile_name_all_completions); UNGCPRO; if (!NILP (handler)) - return call3 (handler, Qfile_name_all_completions, file, + return call3 (handler, Qfile_name_all_completions, partial_filename, directory); - return file_name_completion (file, directory, 1, 0); + return file_name_completion (partial_filename, directory, 1, 0); } static int @@ -516,44 +516,45 @@ static Lisp_Object user_name_completion (Lisp_Object user, int *uniq); DEFUN ("user-name-completion", Fuser_name_completion, 1, 1, 0, /* -Complete user name USER. - -Returns the longest string common to all user names that start -with USER. If there is only one and USER matches it exactly, -returns t. Returns nil if there is no user name starting with USER. +Complete user name from PARTIAL-USERNAME. +Return the longest prefix common to all user names starting with +PARTIAL-USERNAME. If there is only one and PARTIAL-USERNAME matches +it exactly, returns t. Return nil if there is no user name starting +with PARTIAL-USERNAME. */ - (user)) + (partial_username)) { - return user_name_completion (user, 0, NULL); + return user_name_completion (partial_username, 0, NULL); } DEFUN ("user-name-completion-1", Fuser_name_completion_1, 1, 1, 0, /* -Complete user name USER. +Complete user name from PARTIAL-USERNAME. This function is identical to `user-name-completion', except that the cons of the completion and an indication of whether the completion was unique is returned. -The car of the returned value is the longest string common to all -user names that start with USER. If there is only one and USER -matches it exactly, the car is t. The car is nil if there is no -user name starting with USER. The cdr of the result is non-nil -if and only if the completion returned in the car was unique. +The car of the returned value is the longest prefix common to all user +names that start with PARTIAL-USERNAME. If there is only one and +PARTIAL-USERNAME matches it exactly, the car is t. The car is nil if +there is no user name starting with PARTIAL-USERNAME. The cdr of the +result is non-nil if and only if the completion returned in the car +was unique. */ - (user)) + (partial_username)) { int uniq; - Lisp_Object completed = user_name_completion (user, 0, &uniq); + Lisp_Object completed = user_name_completion (partial_username, 0, &uniq); return Fcons (completed, uniq ? Qt : Qnil); } DEFUN ("user-name-all-completions", Fuser_name_all_completions, 1, 1, 0, /* -Return a list of all completions of user name USER. -These are all user names which begin with USER. +Return a list of all user name completions from PARTIAL-USERNAME. +These are all the user names which begin with PARTIAL-USERNAME. */ - (user)) + (partial_username)) { - return user_name_completion (user, 1, NULL); + return user_name_completion (partial_username, 1, NULL); } struct user_name diff --git a/src/doc.c b/src/doc.c index d683fba..88e95af 100644 --- a/src/doc.c +++ b/src/doc.c @@ -138,7 +138,7 @@ unparesseuxify_doc_string (int fd, EMACS_INT position, } /* #### mrb: following STILL completely broken */ - return_me = make_ext_string ((Bufbyte *) buffer, to - buffer, Qbinary); + return_me = make_ext_string (buffer, to - buffer, Qbinary); done: if (buffer != buf) /* We must have allocated buffer above */ @@ -261,7 +261,7 @@ read_doc_string (Lisp_Object filepos) DEFUN ("documentation", Fdocumentation, 1, 2, 0, /* Return the documentation string of FUNCTION. -Unless a non-nil second argument is given, the +Unless a non-nil second argument RAW is given, the string is passed through `substitute-command-keys'. */ (function, raw)) @@ -359,7 +359,7 @@ This is like `get', but it can refer to strings stored in the through `substitute-command-keys'. A non-nil third argument avoids this translation. */ - (sym, prop, raw)) + (symbol, prop, raw)) { /* This function can GC */ REGISTER Lisp_Object doc = Qnil; @@ -370,7 +370,7 @@ translation. GCPRO1 (doc); - doc = Fget (sym, prop, Qnil); + doc = Fget (symbol, prop, Qnil); if (INTP (doc)) doc = get_doc_string (XINT (doc) > 0 ? doc : make_int (- XINT (doc))); else if (CONSP (doc)) @@ -378,7 +378,7 @@ translation. #ifdef I18N3 if (!NILP (doc)) { - domain = Fget (sym, Qvariable_domain, Qnil); + domain = Fget (symbol, Qvariable_domain, Qnil); if (NILP (domain)) doc = Fgettext (doc); else @@ -739,13 +739,13 @@ Return a new string which is STRING with substrings of the form \\=\\[COMMAND] replaced by either: a keystroke sequence that will invoke COMMAND, or "M-x COMMAND" if COMMAND is not on any keys. Substrings of the form \\=\\{MAPVAR} are replaced by summaries -\(made by describe-bindings) of the value of MAPVAR, taken as a keymap. +\(made by `describe-bindings') of the value of MAPVAR, taken as a keymap. Substrings of the form \\=\\ specify to use the value of MAPVAR as the keymap for future \\=\\[COMMAND] substrings. \\=\\= quotes the following character and is discarded; thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ into the output. */ - (str)) + (string)) { /* This function can GC */ Bufbyte *buf; @@ -756,33 +756,30 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int Bytecount idx; Bytecount bsize; Bufbyte *new; - Lisp_Object tem; - Lisp_Object keymap; + Lisp_Object tem = Qnil; + Lisp_Object keymap = Qnil; + Lisp_Object name = Qnil; Bufbyte *start; Bytecount length; - Lisp_Object name; struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; - if (NILP (str)) + if (NILP (string)) return Qnil; - CHECK_STRING (str); - tem = Qnil; - keymap = Qnil; - name = Qnil; - GCPRO4 (str, tem, keymap, name); + CHECK_STRING (string); + GCPRO4 (string, tem, keymap, name); /* There is the possibility that the string is not destined for a translating stream, and it could be argued that we should do the same thing here as in Fformat(), but there are very few times when this will be the case and many calls to this function would have to have `gettext' calls added. (I18N3) */ - str = LISP_GETTEXT (str); + string = LISP_GETTEXT (string); /* KEYMAP is either nil (which means search all the active keymaps) or a specified local map (which means search just that and the global map). If non-nil, it might come from Voverriding_local_map, - or from a \\ construct in STR itself.. */ + or from a \\ construct in STRING itself.. */ #if 0 /* FSFmacs */ /* This is really weird and garbagey. If keymap is nil and there's an overriding-local-map, `where-is-internal' will correctly note @@ -795,13 +792,13 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int */ #endif - strlength = XSTRING_LENGTH (str); + strlength = XSTRING_LENGTH (string); bsize = 1 + strlength; buf = (Bufbyte *) xmalloc (bsize); bufp = buf; /* Have to reset strdata every time GC might be called */ - strdata = XSTRING_DATA (str); + strdata = XSTRING_DATA (string); for (idx = 0; idx < strlength; ) { Bufbyte *strp = strdata + idx; @@ -856,15 +853,15 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int tem = Fwhere_is_internal (tem, keymap, Qt, Qnil, Qnil); #if 0 /* FSFmacs */ - /* Disregard menu bar bindings; it is positively annoying to - mention them when there's no menu bar, and it isn't terribly - useful even when there is a menu bar. */ - if (!NILP (tem)) - { - firstkey = Faref (tem, Qzero); - if (EQ (firstkey, Qmenu_bar)) - tem = Qnil; - } + /* Disregard menu bar bindings; it is positively annoying to + mention them when there's no menu bar, and it isn't terribly + useful even when there is a menu bar. */ + if (!NILP (tem)) + { + firstkey = Faref (tem, Qzero); + if (EQ (firstkey, Qmenu_bar)) + tem = Qnil; + } #endif if (NILP (tem)) /* but not on any keys */ @@ -885,13 +882,8 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int case '{': case '<': { - /* #### jump to label `subst_string|subst' crosses - initialization of `buffer|_buf' */ - Lisp_Object buffer; - struct buffer *buf_; - - buffer = Fget_buffer_create (QSsubstitute); - buf_ = XBUFFER (buffer); + Lisp_Object buffer = Fget_buffer_create (QSsubstitute); + struct buffer *buf_ = XBUFFER (buffer); Fbuffer_disable_undo (buffer); Ferase_buffer (buffer); @@ -926,16 +918,9 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int if (NILP (tem)) { - char boof[255], *b = boof; - *b++ = '\n'; - /* #### This sprintf() is potentially dangerous! */ - sprintf (b, GETTEXT ( - "Uses keymap \"%s\", which is not currently defined."), - (char *) XSTRING_DATA (Fsymbol_name (name))); - b += strlen (b); - *b++ = '\n'; - *b++ = 0; - buffer_insert_c_string (buf_, boof); + buffer_insert_c_string (buf_, "(uses keymap \""); + buffer_insert_lisp_string (buf_, Fsymbol_name (name)); + buffer_insert_c_string (buf_, "\", which is not currently defined) "); if (start[-1] == '<') keymap = Qnil; } @@ -947,31 +932,31 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int tem = make_string_from_buffer (buf_, BUF_BEG (buf_), BUF_Z (buf_) - BUF_BEG (buf_)); Ferase_buffer (buffer); - goto subst_string; - - subst_string: - start = XSTRING_DATA (tem); - length = XSTRING_LENGTH (tem); - subst: - bsize += length; - new = (Bufbyte *) xrealloc (buf, bsize); - bufp += new - buf; - buf = new; - memcpy (bufp, start, length); - bufp += length; - - /* Reset STRDATA in case gc relocated it. */ - strdata = XSTRING_DATA (str); - - break; } + goto subst_string; + + subst_string: + start = XSTRING_DATA (tem); + length = XSTRING_LENGTH (tem); + subst: + bsize += length; + new = (Bufbyte *) xrealloc (buf, bsize); + bufp += new - buf; + buf = new; + memcpy (bufp, start, length); + bufp += length; + + /* Reset STRDATA in case gc relocated it. */ + strdata = XSTRING_DATA (string); + + break; } } if (changed) /* don't bother if nothing substituted */ tem = make_string (buf, bufp - buf); else - tem = str; + tem = string; xfree (buf); UNGCPRO; return tem; diff --git a/src/doprnt.c b/src/doprnt.c index 3e4c3ce..222ca80 100644 --- a/src/doprnt.c +++ b/src/doprnt.c @@ -651,7 +651,7 @@ emacs_doprnt_1 (Lisp_Object stream, const Bufbyte *format_nonreloc, strcat (constructed_spec, " "); if (spec->number_flag) strcat (constructed_spec, "#"); - if (spec->precision >= 0) + if (spec->precision >= 0 && !spec->minwidth) { strcat (constructed_spec, "."); long_to_string (constructed_spec + strlen (constructed_spec), diff --git a/src/editfns.c b/src/editfns.c index 1129eb1..7a8df46 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -99,26 +99,26 @@ init_editfns (void) } DEFUN ("char-to-string", Fchar_to_string, 1, 1, 0, /* -Convert arg CH to a one-character string containing that character. +Convert CHARACTER to a one-character string containing that character. */ - (ch)) + (character)) { Bytecount len; Bufbyte str[MAX_EMCHAR_LEN]; - if (EVENTP (ch)) + if (EVENTP (character)) { - Lisp_Object ch2 = Fevent_to_character (ch, Qt, Qnil, Qnil); + Lisp_Object ch2 = Fevent_to_character (character, Qt, Qnil, Qnil); if (NILP (ch2)) return signal_simple_continuable_error - ("character has no ASCII equivalent:", Fcopy_event (ch, Qnil)); - ch = ch2; + ("character has no ASCII equivalent:", Fcopy_event (character, Qnil)); + character = ch2; } - CHECK_CHAR_COERCE_INT (ch); + CHECK_CHAR_COERCE_INT (character); - len = set_charptr_emchar (str, XCHAR (ch)); + len = set_charptr_emchar (str, XCHAR (character)); return make_string (str, len); } @@ -126,12 +126,12 @@ DEFUN ("string-to-char", Fstring_to_char, 1, 1, 0, /* Convert arg STRING to a character, the first character of that string. An empty string will return the constant `nil'. */ - (str)) + (string)) { Lisp_String *p; - CHECK_STRING (str); + CHECK_STRING (string); - p = XSTRING (str); + p = XSTRING (string); if (string_length (p) != 0) return make_char (string_char (p, 0)); else @@ -611,7 +611,7 @@ DEFUN ("temp-directory", Ftemp_directory, 0, 0, 0, /* Return the pathname to the directory to use for temporary files. On MS Windows, this is obtained from the TEMP or TMP environment variables, defaulting to / if they are both undefined. -On Unix it is obtained from TMPDIR, with /tmp as the default +On Unix it is obtained from TMPDIR, with /tmp as the default. */ ()) { @@ -1579,7 +1579,7 @@ Jamie thinks this is bogus. */ DEFUN ("insert-char", Finsert_char, 1, 4, 0, /* -Insert COUNT (second arg) copies of CHR (first arg). +Insert COUNT copies of CHARACTER into BUFFER. Point and all markers are affected as in the function `insert'. COUNT defaults to 1 if omitted. The optional third arg IGNORED is INHERIT under FSF Emacs. @@ -1588,7 +1588,7 @@ This is highly bogus, however, and XEmacs always behaves as if The optional fourth arg BUFFER specifies the buffer to insert the text into. If BUFFER is nil, the current buffer is assumed. */ - (chr, count, ignored, buffer)) + (character, count, ignored, buffer)) { /* This function can GC */ REGISTER Bufbyte *string; @@ -1600,7 +1600,7 @@ text into. If BUFFER is nil, the current buffer is assumed. struct buffer *b = decode_buffer (buffer, 1); int cou; - CHECK_CHAR_COERCE_INT (chr); + CHECK_CHAR_COERCE_INT (character); if (NILP (count)) cou = 1; else @@ -1609,7 +1609,7 @@ text into. If BUFFER is nil, the current buffer is assumed. cou = XINT (count); } - charlen = set_charptr_emchar (str, XCHAR (chr)); + charlen = set_charptr_emchar (str, XCHAR (character)); n = cou * charlen; if (n <= 0) return Qnil; @@ -1668,7 +1668,7 @@ If BUFFER is nil, the current buffer is assumed. and what the function does is probably good enough for what the user-code will typically want to use it for. */ DEFUN ("buffer-substring-no-properties", Fbuffer_substring_no_properties, 0, 3, 0, /* -Return the text from BEG to END, as a string, without copying the extents. +Return the text from START to END as a string, without copying the extents. */ (start, end, buffer)) { @@ -1991,18 +1991,18 @@ Returns the number of substitutions performed. DEFUN ("delete-region", Fdelete_region, 2, 3, "r", /* Delete the text between point and mark. -When called from a program, expects two arguments, -positions (integers or markers) specifying the stretch to be deleted. -If BUFFER is nil, the current buffer is assumed. +When called from a program, expects two arguments START and END +\(integers or markers) specifying the stretch to be deleted. +If optional third arg BUFFER is nil, the current buffer is assumed. */ - (b, e, buffer)) + (start, end, buffer)) { /* This function can GC */ - Bufpos start, end; + Bufpos bp_start, bp_end; struct buffer *buf = decode_buffer (buffer, 1); - get_buffer_range_char (buf, b, e, &start, &end, 0); - buffer_delete_range (buf, start, end, 0); + get_buffer_range_char (buf, start, end, &bp_start, &bp_end, 0); + buffer_delete_range (buf, bp_start, bp_end, 0); zmacs_region_stays = 0; return Qnil; } @@ -2055,22 +2055,23 @@ See also `save-restriction'. When calling from a program, pass two arguments; positions (integers or markers) bounding the text that should remain visible. */ - (b, e, buffer)) + (start, end, buffer)) { - Bufpos start, end; + Bufpos bp_start, bp_end; struct buffer *buf = decode_buffer (buffer, 1); Bytind bi_start, bi_end; - get_buffer_range_char (buf, b, e, &start, &end, GB_ALLOW_PAST_ACCESSIBLE); - bi_start = bufpos_to_bytind (buf, start); - bi_end = bufpos_to_bytind (buf, end); - - SET_BOTH_BUF_BEGV (buf, start, bi_start); - SET_BOTH_BUF_ZV (buf, end, bi_end); - if (BUF_PT (buf) < start) - BUF_SET_PT (buf, start); - if (BUF_PT (buf) > end) - BUF_SET_PT (buf, end); + get_buffer_range_char (buf, start, end, &bp_start, &bp_end, + GB_ALLOW_PAST_ACCESSIBLE); + bi_start = bufpos_to_bytind (buf, bp_start); + bi_end = bufpos_to_bytind (buf, bp_end); + + SET_BOTH_BUF_BEGV (buf, bp_start, bi_start); + SET_BOTH_BUF_ZV (buf, bp_end, bi_end); + if (BUF_PT (buf) < bp_start) + BUF_SET_PT (buf, bp_start); + if (BUF_PT (buf) > bp_end) + BUF_SET_PT (buf, bp_end); MARK_CLIP_CHANGED; /* Changing the buffer bounds invalidates any recorded current column. */ invalidate_current_column (); @@ -2270,15 +2271,15 @@ Both arguments must be characters (i.e. NOT integers). Case is ignored if `case-fold-search' is non-nil in BUFFER. If BUFFER is nil, the current buffer is assumed. */ - (c1, c2, buffer)) + (character1, character2, buffer)) { Emchar x1, x2; struct buffer *b = decode_buffer (buffer, 1); - CHECK_CHAR_COERCE_INT (c1); - CHECK_CHAR_COERCE_INT (c2); - x1 = XCHAR (c1); - x2 = XCHAR (c2); + CHECK_CHAR_COERCE_INT (character1); + CHECK_CHAR_COERCE_INT (character2); + x1 = XCHAR (character1); + x2 = XCHAR (character2); return (!NILP (b->case_fold_search) ? DOWNCASE (b, x1) == DOWNCASE (b, x2) @@ -2290,12 +2291,12 @@ DEFUN ("char=", Fchar_Equal, 2, 2, 0, /* Return t if two characters match, case is significant. Both arguments must be characters (i.e. NOT integers). */ - (c1, c2)) + (character1, character2)) { - CHECK_CHAR_COERCE_INT (c1); - CHECK_CHAR_COERCE_INT (c2); + CHECK_CHAR_COERCE_INT (character1); + CHECK_CHAR_COERCE_INT (character2); - return EQ (c1, c2) ? Qt : Qnil; + return EQ (character1, character2) ? Qt : Qnil; } #if 0 /* Undebugged FSFmacs code */ @@ -2367,36 +2368,36 @@ Transpose region START1 to END1 with START2 to END2. The regions may not be overlapping, because the size of the buffer is never changed in a transposition. -Optional fifth arg LEAVE_MARKERS, if non-nil, means don't transpose +Optional fifth arg LEAVE-MARKERS, if non-nil, means don't transpose any markers that happen to be located in the regions. (#### BUG: currently -this function always acts as if LEAVE_MARKERS is non-nil.) +this function always acts as if LEAVE-MARKERS is non-nil.) Transposing beyond buffer boundaries is an error. */ - (startr1, endr1, startr2, endr2, leave_markers)) + (start1, end1, start2, end2, leave_markers)) { - Bufpos start1, end1, start2, end2; + Bufpos startr1, endr1, startr2, endr2; Charcount len1, len2; Lisp_Object string1, string2; struct buffer *buf = current_buffer; - get_buffer_range_char (buf, startr1, endr1, &start1, &end1, 0); - get_buffer_range_char (buf, startr2, endr2, &start2, &end2, 0); + get_buffer_range_char (buf, start1, end1, &startr1, &endr1, 0); + get_buffer_range_char (buf, start2, end2, &startr2, &endr2, 0); - len1 = end1 - start1; - len2 = end2 - start2; + len1 = endr1 - startr1; + len2 = endr2 - startr2; - if (start2 < end1) + if (startr2 < endr1) error ("transposed regions not properly ordered"); - else if (start1 == end1 || start2 == end2) + else if (startr1 == endr1 || startr2 == endr2) error ("transposed region may not be of length 0"); - string1 = make_string_from_buffer (buf, start1, len1); - string2 = make_string_from_buffer (buf, start2, len2); - buffer_delete_range (buf, start2, end2, 0); - buffer_insert_lisp_string_1 (buf, start2, string1, 0); - buffer_delete_range (buf, start1, end1, 0); - buffer_insert_lisp_string_1 (buf, start1, string2, 0); + string1 = make_string_from_buffer (buf, startr1, len1); + string2 = make_string_from_buffer (buf, startr2, len2); + buffer_delete_range (buf, startr2, endr2, 0); + buffer_insert_lisp_string_1 (buf, startr2, string1, 0); + buffer_delete_range (buf, startr1, endr1, 0); + buffer_insert_lisp_string_1 (buf, startr1, string2, 0); /* In FSFmacs there is a whole bunch of really ugly code here to attempt to transpose the regions without using up any @@ -2510,7 +2511,7 @@ More specifically: - Commands which operate on the region only work if the region is active. - Only a very small set of commands cause the region to become active: - Those commands whose semantics are to mark an area, like mark-defun. + Those commands whose semantics are to mark an area, like `mark-defun'. - The region is deactivated after each command that is executed, except that: - "Motion" commands do not change whether the region is active or not. diff --git a/src/eldap.c b/src/eldap.c index c26272d..c118529 100644 --- a/src/eldap.c +++ b/src/eldap.c @@ -120,7 +120,7 @@ print_ldap (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) print_internal (ldap->host, printcharfun, 1); if (!ldap->ld) write_c_string ("(dead) ",printcharfun); - sprintf (buf, " 0x%x>", (unsigned int)ldap); + sprintf (buf, " 0x%lx>", (long)ldap); write_c_string (buf, printcharfun); } diff --git a/src/elhash.c b/src/elhash.c index 36b51de..2fb2c04 100644 --- a/src/elhash.c +++ b/src/elhash.c @@ -71,9 +71,9 @@ struct Lisp_Hash_Table #define HASH_TABLE_MIN_SIZE 10 #define HASH_CODE(key, ht) \ -((((ht)->hash_function ? (ht)->hash_function (key) : LISP_HASH (key)) \ - * (ht)->golden_ratio) \ - % (ht)->size) + ((((ht)->hash_function ? (ht)->hash_function (key) : LISP_HASH (key)) \ + * (ht)->golden_ratio) \ + % (ht)->size) #define KEYS_EQUAL_P(key1, key2, testfun) \ (EQ (key1, key2) || ((testfun) && (testfun) (key1, key2))) @@ -1432,7 +1432,7 @@ internal_hash (Lisp_Object obj, int depth) DEFUN ("sxhash", Fsxhash, 1, 1, 0, /* Return a hash value for OBJECT. -(equal obj1 obj2) implies (= (sxhash obj1) (sxhash obj2)). +\(equal obj1 obj2) implies (= (sxhash obj1) (sxhash obj2)). */ (object)) { diff --git a/src/emacs.c b/src/emacs.c index abc8bfe..c8e3b40 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -385,8 +385,8 @@ int nodumpfile; int debug_paths; /* Save argv and argc. */ -static Extbyte **initial_argv; -static int initial_argc; +static Extbyte **initial_argv; /* #### currently unused */ +static int initial_argc; /* #### currently unused */ static void sort_args (int argc, char **argv); @@ -1678,6 +1678,9 @@ main_1 (int argc, char **argv, char **envp, int restart) vars_of_extents (); vars_of_faces (); vars_of_fileio (); +#ifdef CLASH_DETECTION + vars_of_filelock (); +#endif vars_of_floatfns (); vars_of_font_lock (); vars_of_frame (); @@ -2912,13 +2915,13 @@ Remember to set `command-line-processed' to nil before dumping if you want the dumped XEmacs to process its command line and announce itself normally when it is run. */ - (intoname, symname)) + (filename, symfile)) { /* This function can GC */ struct gcpro gcpro1, gcpro2; int opurify; - GCPRO2 (intoname, symname); + GCPRO2 (filename, symfile); #ifdef FREE_CHECKING Freally_free (Qnil); @@ -2927,15 +2930,15 @@ and announce itself normally when it is run. disable_free_hook (); #endif - CHECK_STRING (intoname); - intoname = Fexpand_file_name (intoname, Qnil); - if (!NILP (symname)) + CHECK_STRING (filename); + filename = Fexpand_file_name (filename, Qnil); + if (!NILP (symfile)) { - CHECK_STRING (symname); - if (XSTRING_LENGTH (symname) > 0) - symname = Fexpand_file_name (symname, Qnil); + CHECK_STRING (symfile); + if (XSTRING_LENGTH (symfile) > 0) + symfile = Fexpand_file_name (symfile, Qnil); else - symname = Qnil; + symfile = Qnil; } opurify = purify_flag; @@ -2962,15 +2965,15 @@ and announce itself normally when it is run. UNGCPRO; { - char *intoname_ext; - char *symname_ext; + char *filename_ext; + char *symfile_ext; - LISP_STRING_TO_EXTERNAL (intoname, intoname_ext, Qfile_name); + LISP_STRING_TO_EXTERNAL (filename, filename_ext, Qfile_name); - if (STRINGP (symname)) - LISP_STRING_TO_EXTERNAL (symname, symname_ext, Qfile_name); + if (STRINGP (symfile)) + LISP_STRING_TO_EXTERNAL (symfile, symfile_ext, Qfile_name); else - symname_ext = 0; + symfile_ext = 0; garbage_collect_1 (); @@ -2987,7 +2990,7 @@ and announce itself normally when it is run. modify all the unexec routines to ensure that filename conversion is applied everywhere. Don't worry about memory leakage because this call only happens once. */ - unexec (intoname_ext, symname_ext, (uintptr_t) my_edata, 0, 0); + unexec (filename_ext, symfile_ext, (uintptr_t) my_edata, 0, 0); #ifdef DOUG_LEA_MALLOC free (malloc_state_ptr); #endif @@ -3521,7 +3524,7 @@ This is mainly meant for use in path searching. DEFVAR_LISP ("emacs-program-version", &Vemacs_program_version /* *Version of the Emacs variant. -This typically has the form XX.XX[-bXX]. +This typically has the form NN.NN-bNN. This is mainly meant for use in path searching. */ ); Vemacs_program_version = build_string ((char *) PATH_VERSION); @@ -3540,7 +3543,7 @@ especially executable programs intended for XEmacs to invoke. DEFVAR_LISP ("configure-exec-directory", &Vconfigure_exec_directory /* For internal use by the build procedure only. -configure's idea of what EXEC-DIRECTORY will be. +configure's idea of what `exec-directory' will be. */ ); #ifdef PATH_EXEC Vconfigure_exec_directory = Ffile_name_as_directory @@ -3556,7 +3559,7 @@ configure's idea of what EXEC-DIRECTORY will be. DEFVAR_LISP ("configure-lisp-directory", &Vconfigure_lisp_directory /* For internal use by the build procedure only. -configure's idea of what LISP-DIRECTORY will be. +configure's idea of what `lisp-directory' will be. */ ); #ifdef PATH_LOADSEARCH Vconfigure_lisp_directory = Ffile_name_as_directory @@ -3572,7 +3575,7 @@ configure's idea of what LISP-DIRECTORY will be. DEFVAR_LISP ("configure-module-directory", &Vconfigure_module_directory /* For internal use by the build procedure only. -configure's idea of what MODULE-DIRECTORY will be. +configure's idea of what `module-directory' will be. */ ); #ifdef PATH_MODULESEARCH Vconfigure_module_directory = Ffile_name_as_directory @@ -3602,7 +3605,7 @@ functions `locate-data-file' and `locate-data-directory' and the variable DEFVAR_LISP ("configure-data-directory", &Vconfigure_data_directory /* For internal use by the build procedure only. -configure's idea of what DATA-DIRECTORY will be. +configure's idea of what `data-directory' will be. */ ); #ifdef PATH_DATA Vconfigure_data_directory = Ffile_name_as_directory @@ -3624,7 +3627,7 @@ or were installed as packages, and are intended for XEmacs to use. DEFVAR_LISP ("configure-site-directory", &Vconfigure_site_directory /* For internal use by the build procedure only. -configure's idea of what SITE-DIRECTORY will be. +configure's idea of what `site-directory' will be. */ ); #ifdef PATH_SITE Vconfigure_site_directory = Ffile_name_as_directory @@ -3640,7 +3643,7 @@ configure's idea of what SITE-DIRECTORY will be. DEFVAR_LISP ("configure-site-module-directory", &Vconfigure_site_module_directory /* For internal use by the build procedure only. -configure's idea of what SITE-DIRECTORY will be. +configure's idea of what `site-directory' will be. */ ); #ifdef PATH_SITE_MODULES Vconfigure_site_module_directory = Ffile_name_as_directory @@ -3651,13 +3654,13 @@ configure's idea of what SITE-DIRECTORY will be. DEFVAR_LISP ("doc-directory", &Vdoc_directory /* *Directory containing the DOC file that comes with XEmacs. -This is usually the same as exec-directory. +This is usually the same as `exec-directory'. */ ); Vdoc_directory = Qnil; DEFVAR_LISP ("configure-doc-directory", &Vconfigure_doc_directory /* For internal use by the build procedure only. -configure's idea of what DOC-DIRECTORY will be. +configure's idea of what `doc-directory' will be. */ ); #ifdef PATH_DOC Vconfigure_doc_directory = Ffile_name_as_directory @@ -3668,7 +3671,7 @@ configure's idea of what DOC-DIRECTORY will be. DEFVAR_LISP ("configure-exec-prefix-directory", &Vconfigure_exec_prefix_directory /* For internal use by the build procedure only. -configure's idea of what EXEC-PREFIX-DIRECTORY will be. +configure's idea of what `exec-prefix-directory' will be. */ ); #ifdef PATH_EXEC_PREFIX Vconfigure_exec_prefix_directory = Ffile_name_as_directory @@ -3679,7 +3682,7 @@ configure's idea of what EXEC-PREFIX-DIRECTORY will be. DEFVAR_LISP ("configure-prefix-directory", &Vconfigure_prefix_directory /* For internal use by the build procedure only. -configure's idea of what PREFIX-DIRECTORY will be. +configure's idea of what `prefix-directory' will be. */ ); #ifdef PATH_PREFIX Vconfigure_prefix_directory = Ffile_name_as_directory diff --git a/src/emodules.c b/src/emodules.c index eb03bc8..6458319 100644 --- a/src/emodules.c +++ b/src/emodules.c @@ -79,7 +79,7 @@ XEmacs, and then reload those new or changed modules that are required. Messages informing you of the progress of the load are displayed unless the variable `load-modules-quietly' is non-NIL. */ - (file,name,version)) + (file, name, version)) { char *mod, *mname, *mver; int speccount = specpdl_depth(); @@ -118,7 +118,7 @@ referring to variables inside the module code. However, once you have requested a module to be unloaded, it will be unloaded from memory as soon as the last reference to symbols within the module is destroyed. */ - (file,name,version)) + (file, name, version)) { int x; char *mod, *mname, *mver; diff --git a/src/eval.c b/src/eval.c index d34ba2e..49a9efb 100644 --- a/src/eval.c +++ b/src/eval.c @@ -67,7 +67,7 @@ struct backtrace *backtrace_list; #define AV_8(av) AV_7(av), av[7] #define PRIMITIVE_FUNCALL_1(fn, av, ac) \ -(((Lisp_Object (*)(EXFUN_##ac)) (fn)) (AV_##ac (av))) + (((Lisp_Object (*)(EXFUN_##ac)) (fn)) (AV_##ac (av))) /* If subrs take more than 8 arguments, more cases need to be added to this switch. (But wait - don't do it - if you really need @@ -727,7 +727,7 @@ BODY can be zero or more expressions. If BODY is nil, return nil. } DEFUN ("cond", Fcond, 0, UNEVALLED, 0, /* -(cond CLAUSES...): try each clause until one succeeds. +\(cond CLAUSES...): try each clause until one succeeds. Each clause looks like (CONDITION BODY...). CONDITION is evaluated and, if the value is non-nil, this clause succeeds: then the expressions in BODY are evaluated and the last one's @@ -1471,12 +1471,12 @@ throw_or_bomb_out (Lisp_Object tag, Lisp_Object val, int bomb_out_p, */ DEFUN ("throw", Fthrow, 2, 2, 0, /* -\(throw TAG VALUE): throw to the catch for TAG and return VALUE from it. +Throw to the catch for TAG and return VALUE from it. Both TAG and VALUE are evalled. */ - (tag, val)) + (tag, value)) { - throw_or_bomb_out (tag, val, 0, Qnil, Qnil); /* Doesn't return */ + throw_or_bomb_out (tag, value, 0, Qnil, Qnil); /* Doesn't return */ return Qnil; } @@ -2932,7 +2932,7 @@ Optional second arg RECORD-FLAG is as in `call-interactively'. The argument KEYS specifies the value to use instead of (this-command-keys) when reading the arguments. */ - (cmd, record, keys)) + (cmd, record_flag, keys)) { /* This function can GC */ Lisp_Object prefixarg; @@ -2967,7 +2967,7 @@ when reading the arguments. backtrace.debug_on_exit = 0; PUSH_BACKTRACE (backtrace); - final = Fcall_interactively (cmd, record, keys); + final = Fcall_interactively (cmd, record_flag, keys); POP_BACKTRACE (backtrace); return final; @@ -3066,24 +3066,24 @@ and input is currently coming from the keyboard (not in keyboard macro). /************************************************************************/ DEFUN ("autoload", Fautoload, 2, 5, 0, /* -Define FUNCTION to autoload from FILE. -FUNCTION is a symbol; FILE is a file name string to pass to `load'. -Third arg DOCSTRING is documentation for the function. -Fourth arg INTERACTIVE if non-nil says function can be called interactively. -Fifth arg TYPE indicates the type of the object: +Define FUNCTION to autoload from FILENAME. +FUNCTION is a symbol; FILENAME is a file name string to pass to `load'. +The remaining optional arguments provide additional info about the +real definition. +DOCSTRING is documentation for FUNCTION. +INTERACTIVE, if non-nil, says FUNCTION can be called interactively. +TYPE indicates the type of the object: nil or omitted says FUNCTION is a function, `keymap' says FUNCTION is really a keymap, and `macro' or t says FUNCTION is really a macro. -Third through fifth args give info about the real definition. -They default to nil. -If FUNCTION is already defined other than as an autoload, -this does nothing and returns nil. +If FUNCTION already has a non-void function definition that is not an +autoload object, this function does nothing and returns nil. */ - (function, file, docstring, interactive, type)) + (function, filename, docstring, interactive, type)) { /* This function can GC */ CHECK_SYMBOL (function); - CHECK_STRING (file); + CHECK_STRING (filename); /* If function is defined and not as an autoload, don't override */ { @@ -3095,10 +3095,10 @@ this does nothing and returns nil. if (purify_flag) { /* Attempt to avoid consing identical (string=) pure strings. */ - file = Fsymbol_name (Fintern (file, Qnil)); + filename = Fsymbol_name (Fintern (filename, Qnil)); } - return Ffset (function, Fcons (Qautoload, list4 (file, + return Ffset (function, Fcons (Qautoload, list4 (filename, docstring, interactive, type))); @@ -3897,7 +3897,7 @@ called to run the hook. If the value is a function, it is called with the given arguments and its return value is returned. If it is a list of functions, those functions are called, in order, with the given arguments ARGS. -It is best not to depend on the value return by `run-hook-with-args', +It is best not to depend on the value returned by `run-hook-with-args', as that may change. To make a hook variable buffer-local, use `make-local-hook', @@ -5103,10 +5103,10 @@ backtrace_specials (int speccount, int speclimit, Lisp_Object stream) DEFUN ("backtrace", Fbacktrace, 0, 2, "", /* Print a trace of Lisp function calls currently active. Optional arg STREAM specifies the output stream to send the backtrace to, -and defaults to the value of `standard-output'. Optional second arg -DETAILED means show places where currently active variable bindings, -catches, condition-cases, and unwind-protects were made as well as -function calls. +and defaults to the value of `standard-output'. +Optional second arg DETAILED non-nil means show places where currently +active variable bindings, catches, condition-cases, and +unwind-protects, as well as function calls, were made. */ (stream, detailed)) { @@ -5231,8 +5231,8 @@ function calls. } -DEFUN ("backtrace-frame", Fbacktrace_frame, 1, 1, "", /* -Return the function and arguments N frames up from current execution point. +DEFUN ("backtrace-frame", Fbacktrace_frame, 1, 1, 0, /* +Return the function and arguments NFRAMES up from current execution point. If that frame has not evaluated the arguments yet (or is a special form), the value is (nil FUNCTION ARG-FORMS...). If that frame has evaluated its arguments and called its function already, @@ -5240,7 +5240,7 @@ the value is (t FUNCTION ARG-VALUES...). A &rest arg is represented as the tail of the list ARG-VALUES. FUNCTION is whatever was supplied as car of evaluated list, or a lambda expression for macro calls. -If N is more than the number of frames, the value is nil. +If NFRAMES is more than the number of frames, the value is nil. */ (nframes)) { diff --git a/src/event-Xt.c b/src/event-Xt.c index d597719..ddbb49d 100644 --- a/src/event-Xt.c +++ b/src/event-Xt.c @@ -687,20 +687,29 @@ x_handle_sticky_modifiers (XEvent *ev, struct device *d) { /* Not a modifier key */ Bool key_event_p = (type == KeyPress || type == KeyRelease); - if (type == KeyPress && !xd->last_downkey) - xd->last_downkey = keycode; - else if (type == ButtonPress || - (type == KeyPress && xd->last_downkey && - (keycode != xd->last_downkey || - ev->xkey.time != xd->release_time))) + if (type == ButtonPress + || (type == KeyPress + && ((xd->last_downkey + && ((keycode != xd->last_downkey + || ev->xkey.time != xd->release_time))) + || (INTP (Vmodifier_keys_sticky_time) + && ev->xkey.time + > (xd->modifier_release_time + + XINT (Vmodifier_keys_sticky_time)))))) { xd->need_to_add_mask = 0; xd->last_downkey = 0; } + else if (type == KeyPress && !xd->last_downkey) + xd->last_downkey = keycode; + if (type == KeyPress) xd->release_time = 0; if (type == KeyPress || type == ButtonPress) - xd->down_mask = 0; + { + xd->down_mask = 0; + xd->modifier_release_time = 0; + } if (key_event_p) ev->xkey.state |= xd->need_to_add_mask; @@ -722,7 +731,8 @@ x_handle_sticky_modifiers (XEvent *ev, struct device *d) So we assume that if the release and the next press occur at the same time, the key was actually auto- repeated. Under Open-Windows, at least, this works. */ - xd->release_time = key_event_p ? ev->xkey.time : ev->xbutton.time; + xd->modifier_release_time = xd->release_time + = key_event_p ? ev->xkey.time : ev->xbutton.time; } else /* Modifier key pressed */ { @@ -742,6 +752,15 @@ x_handle_sticky_modifiers (XEvent *ev, struct device *d) xd->need_to_add_mask = 0; } + if (xd->modifier_release_time + && INTP (Vmodifier_keys_sticky_time) + && (ev->xkey.time + > xd->modifier_release_time + XINT (Vmodifier_keys_sticky_time))) + { + xd->need_to_add_mask = 0; + xd->down_mask = 0; + } + #define FROB(mask) \ do { \ if (type == KeyPress) \ @@ -767,6 +786,7 @@ do { \ xd->need_to_add_mask |= mask; \ } \ } \ + xd->modifier_release_time = ev->xkey.time; \ } while (0) for (i = 0; i < xd->x_keysym_map_keysyms_per_code; i++) diff --git a/src/event-msw.c b/src/event-msw.c index 2dfb2fe..a09c81f 100644 --- a/src/event-msw.c +++ b/src/event-msw.c @@ -1276,6 +1276,8 @@ mswindows_drain_windows_queue (void) { char class_name_buf [sizeof (XEMACS_CLASS) + 2] = ""; + /* Don't translate messages destined for a dialog box, this + makes keyboard traversal work. I think?? */ if (mswindows_is_dialog_msg (&msg)) { mswindows_unmodalize_signal_maybe (); @@ -2792,6 +2794,8 @@ mswindows_wnd_proc (HWND hwnd, UINT message_, WPARAM wParam, LPARAM lParam) case CBN_SELCHANGE: if (!NILP (mswindows_handle_gui_wm_command (frame, cid, id))) return 0; + case BN_SETFOCUS: + } /* menubars always must come last since the hashtables do not always exist*/ diff --git a/src/event-stream.c b/src/event-stream.c index 0d09051..68e6c12 100644 --- a/src/event-stream.c +++ b/src/event-stream.c @@ -52,8 +52,6 @@ Boston, MA 02111-1307, USA. */ /* TODO: This stuff is way too hard to maintain - needs rework. - C-x @ h x causes a crash. - The command builder should deal only with key and button events. Other command events should be able to come in the MIDDLE of a key sequence, without disturbing the key sequence composition, or the @@ -121,23 +119,19 @@ Lisp_Object Qpre_idle_hook, Vpre_idle_hook; /* Control gratuitous keyboard focus throwing. */ int focus_follows_mouse; +/* When true, modifier keys are sticky. */ int modifier_keys_are_sticky; +/* Modifier keys are sticky for this many milliseconds. */ +Lisp_Object Vmodifier_keys_sticky_time; -#if 0 /* FSF Emacs crap */ -/* Hook run after a command if there's no more input soon. */ -Lisp_Object Qpost_command_idle_hook, Vpost_command_idle_hook; - -/* Delay time in microseconds before running post-command-idle-hook. */ -int post_command_idle_delay; - -/* List of deferred actions to be performed at a later time. - The precise format isn't relevant here; we just check whether it is nil. */ -Lisp_Object Vdeferred_action_list; +/* Here FSF Emacs 20.7 defines Vpost_command_idle_hook, + post_command_idle_delay, Vdeferred_action_list, and + Vdeferred_action_function, but we don't because that stuff is crap, + and we're smarter than them, and their momas are fat. */ -/* Function to call to handle deferred actions, when there are any. */ -Lisp_Object Vdeferred_action_function; -Lisp_Object Qdeferred_action_function; -#endif /* FSF Emacs crap */ +/* FSF Emacs 20.7 also defines Vinput_method_function, + Qinput_method_exit_on_first_char and Qinput_method_use_echo_area. + I don't know this should be imported or not. */ /* Non-nil disable property on a command means do not execute it; call disabled-command-hook's value instead. */ @@ -502,15 +496,7 @@ event_stream_next_event (Lisp_Event *event) Let's hope it doesn't. I think the code here is fairly clean and doesn't do this. */ emacs_is_blocking = 1; -#if 0 - /* Do this if the poll-for-quit timer seems to be taking too - much CPU time when idle ... */ - reset_poll_for_quit (); -#endif event_stream->next_event_cb (event); -#if 0 - init_poll_for_quit (); -#endif emacs_is_blocking = 0; #ifdef DEBUG_XEMACS @@ -798,7 +784,8 @@ maybe_kbd_translate (Lisp_Object event) keystrokes_since_auto_save is equivalent to the difference between num_nonmacro_input_chars and last_auto_save. */ -/* When an auto-save happens, record the "time", and don't do again soon. */ +/* When an auto-save happens, record the number of keystrokes, and + don't do again soon. */ void record_auto_save (void) @@ -812,10 +799,6 @@ void force_auto_save_soon (void) { keystrokes_since_auto_save = 1 + max (auto_save_interval, 20); - -#if 0 /* FSFmacs */ - record_asynch_buffer_change (); -#endif } static void @@ -1695,19 +1678,6 @@ run_select_frame_hook (void) static void run_deselect_frame_hook (void) { -#if 0 /* unclean! FSF calls this at all sorts of random places, - including a bunch of places in their mouse.el. If this - is implemented, it has to be done cleanly. */ - run_hook (Qmouse_leave_buffer_hook); /* #### Correct? It's also - called in `call-interactively'. - Does this mean it will be - called twice? Oh well, FSF - bug -- FSF calls it in - `handle-switch-frame', - which is approximately the - same as the caller of this - function. */ -#endif run_hook (Qdeselect_frame_hook); } @@ -2684,11 +2654,11 @@ Return non-nil iff we received any output before the timeout expired. } DEFUN ("sleep-for", Fsleep_for, 1, 1, 0, /* -Pause, without updating display, for ARG seconds. -ARG may be a float, meaning pause for some fractional part of a second. +Pause, without updating display, for SECONDS seconds. +SECONDS may be a float, allowing pauses for fractional parts of a second. It is recommended that you never call sleep-for from inside of a process - filter function or timer event (either synchronous or asynchronous). +filter function or timer event (either synchronous or asynchronous). */ (seconds)) { @@ -2751,9 +2721,9 @@ It is recommended that you never call sleep-for from inside of a process } DEFUN ("sit-for", Fsit_for, 1, 2, 0, /* -Perform redisplay, then wait ARG seconds or until user input is available. -ARG may be a float, meaning a fractional part of a second. -Optional second arg non-nil means don't redisplay, just wait for input. +Perform redisplay, then wait SECONDS seconds or until user input is available. +SECONDS may be a float, meaning a fractional part of a second. +Optional second arg NODISPLAY non-nil means don't redisplay; just wait. Redisplay is preempted as always if user input arrives, and does not happen if input is available before it starts. Value is t if waited the full time with no input arriving. @@ -3795,7 +3765,10 @@ execute_command_event (struct command_builder *command_builder, struct gcpro gcpro1; GCPRO1 (event); /* event may be freshly created */ - reset_current_events (command_builder); + + /* To fix C-x @ h x crash. */ + if (XEVENT (event)->event_type != misc_user_event) + reset_current_events (command_builder); switch (XEVENT (event)->event_type) { @@ -3862,17 +3835,15 @@ execute_command_event (struct command_builder *command_builder, post_command_hook (); -#if 0 /* #### here was an attempted fix that didn't work */ - if (XEVENT (event)->event_type == misc_user_event) - ; - else -#endif if (!NILP (con->prefix_arg)) { /* Commands that set the prefix arg don't update last-command, don't reset the echoing state, and don't go into keyboard macros unless - followed by another command. */ + followed by another command. Also don't quit here. */ + int speccount = specpdl_depth (); + specbind (Qinhibit_quit, Qt); maybe_echo_keys (command_builder, 0); + unbind_to (speccount, Qnil); /* If we're recording a keyboard macro, and the last command executed set a prefix argument, then decrement the pointer to @@ -3891,7 +3862,8 @@ execute_command_event (struct command_builder *command_builder, /* Emacs 18 doesn't unconditionally clear the echoed keystrokes, so we don't either */ - reset_this_command_keys (make_console (con), 0); + if (XEVENT (event)->event_type != misc_user_event) + reset_this_command_keys (make_console (con), 0); } } @@ -3955,34 +3927,6 @@ post_command_hook (void) ("Error in `post-command-hook' (setting hook to nil)", Qpost_command_hook, 1); -#if 0 /* FSF Emacs crap */ - if (!NILP (Vdeferred_action_list)) - call0 (Vdeferred_action_function); - - if (NILP (Vunread_command_events) - && NILP (Vexecuting_macro) - && !NILP (Vpost_command_idle_hook) - && !NILP (Fsit_for (make_float ((double) post_command_idle_delay - / 1000000), Qnil))) - safe_run_hook_trapping_errors - ("Error in `post-command-idle-hook' (setting hook to nil)", - Qpost_command_idle_hook, 1); -#endif /* FSF Emacs crap */ - -#if 0 /* FSF Emacs */ - if (!NILP (current_buffer->mark_active)) - { - if (!NILP (Vdeactivate_mark) && !NILP (Vtransient_mark_mode)) - { - current_buffer->mark_active = Qnil; - run_hook (intern ("deactivate-mark-hook")); - } - else if (current_buffer != prev_buffer || - BUF_MODIFF (current_buffer) != prev_modiff) - run_hook (intern ("activate-mark-hook")); - } -#endif /* FSF Emacs */ - /* #### Kludge!!! This is necessary to make sure that things are properly positioned even if post-command-hook moves point. #### There should be a cleaner way of handling this. */ @@ -3991,7 +3935,7 @@ post_command_hook (void) DEFUN ("dispatch-event", Fdispatch_event, 1, 1, 0, /* -Given an event object as returned by `next-event', execute it. +Given an event object EVENT as returned by `next-event', execute it. Key-press, button-press, and button-release events get accumulated until a complete key sequence (see `read-key-sequence') is reached, @@ -4161,13 +4105,6 @@ Magic events are handled as necessary. command_builder->self_insert_countdown = 0; if (NILP (XCONSOLE (console)->prefix_arg) && NILP (Vexecuting_macro) -#if 0 - /* This was done in the days when there was no undo - in the minibuffer. If we don't disable this code, - then each instance of "undo" undoes everything in - the minibuffer. */ - && !EQ (minibuf_window, Fselected_window (Qnil)) -#endif && command_builder->self_insert_countdown == 0) Fundo_boundary (); @@ -4178,13 +4115,13 @@ Magic events are handled as necessary. } execute_command_event (command_builder, - internal_equal (event, command_builder-> most_current_event, 0) + internal_equal (event, command_builder->most_current_event, 0) ? event /* Use the translated event that was most recently seen. This way, last-command-event becomes f1 instead of the P from ESC O P. But we must copy it, else we'll lose when the command-builder events are deallocated. */ - : Fcopy_event (command_builder-> most_current_event, Qnil)); + : Fcopy_event (command_builder->most_current_event, Qnil)); } break; } @@ -4239,7 +4176,7 @@ Magic events are handled as necessary. DEFUN ("read-key-sequence", Fread_key_sequence, 1, 3, 0, /* Read a sequence of keystrokes or mouse clicks. Returns a vector of the event objects read. The vector and the event -objects it contains are freshly created (and will not be side-effected +objects it contains are freshly created (and so will not be side-effected by subsequent calls to this function). The sequence read is sufficient to specify a non-prefix command starting @@ -4247,19 +4184,17 @@ from the current local and global keymaps. A C-g typed while in this function is treated like any other character, and `quit-flag' is not set. First arg PROMPT is a prompt string. If nil, do not prompt specially. -Second (optional) arg CONTINUE-ECHO, if non-nil, means this key echoes -as a continuation of the previous key. -The third (optional) arg DONT-DOWNCASE-LAST, if non-nil, means do not -convert the last event to lower case. (Normally any upper case event -is converted to lower case if the original event is undefined and the lower -case equivalent is defined.) This argument is provided mostly for -FSF compatibility; the equivalent effect can be achieved more generally -by binding `retry-undefined-key-binding-unshifted' to nil around the -call to `read-key-sequence'. +Second optional arg CONTINUE-ECHO non-nil means this key echoes as a +continuation of the previous key. -A C-g typed while in this function is treated like any other character, -and `quit-flag' is not set. +Third optional arg DONT-DOWNCASE-LAST non-nil means do not convert the +last event to lower case. (Normally any upper case event is converted +to lower case if the original event is undefined and the lower case +equivalent is defined.) This argument is provided mostly for FSF +compatibility; the equivalent effect can be achieved more generally by +binding `retry-undefined-key-binding-unshifted' to nil around the call +to `read-key-sequence'. If the user selects a menu item while we are prompting for a key-sequence, the returned value will be a vector of a single menu-selection event. @@ -4267,8 +4202,8 @@ An error will be signalled if you pass this value to `lookup-key' or a related function. `read-key-sequence' checks `function-key-map' for function key -sequences, where they wouldn't conflict with ordinary bindings. See -`function-key-map' for more details. +sequences, where they wouldn't conflict with ordinary bindings. +See `function-key-map' for more details. */ (prompt, continue_echo, dont_downcase_last)) { @@ -4404,10 +4339,10 @@ dribble_out_event (Lisp_Object event) DEFUN ("open-dribble-file", Fopen_dribble_file, 1, 1, "FOpen dribble file: ", /* -Start writing all keyboard characters to a dribble file called FILE. -If FILE is nil, close any open dribble file. +Start writing all keyboard characters to a dribble file called FILENAME. +If FILENAME is nil, close any open dribble file. */ - (file)) + (filename)) { /* This function can GC */ /* XEmacs change: always close existing dribble file. */ @@ -4417,12 +4352,12 @@ If FILE is nil, close any open dribble file. Lstream_close (XLSTREAM (Vdribble_file)); Vdribble_file = Qnil; } - if (!NILP (file)) + if (!NILP (filename)) { int fd; - file = Fexpand_file_name (file, Qnil); - fd = open ((char*) XSTRING_DATA (file), + filename = Fexpand_file_name (filename, Qnil); + fd = open ((char*) XSTRING_DATA (filename), O_WRONLY | O_TRUNC | O_CREAT | OPEN_BINARY, CREAT_MODE); if (fd < 0) @@ -4500,10 +4435,6 @@ syms_of_event_stream (void) defsymbol (&Qpre_idle_hook, "pre-idle-hook"); defsymbol (&Qhandle_pre_motion_command, "handle-pre-motion-command"); defsymbol (&Qhandle_post_motion_command, "handle-post-motion-command"); -#if 0 /* FSF Emacs crap */ - defsymbol (&Qpost_command_idle_hook, "post-command-idle-hook"); - defsymbol (&Qdeferred_action_function, "deferred-action-function"); -#endif defsymbol (&Qretry_undefined_key_binding_unshifted, "retry-undefined-key-binding-unshifted"); defsymbol (&Qauto_show_make_point_visible, @@ -4602,41 +4533,6 @@ used by the window manager, so it is up to the user to set it. */ ); focus_follows_mouse = 0; -#if 0 /* FSF Emacs crap */ - /* Ill-conceived because it's not run in all sorts of cases - where XEmacs is blocking. That's what `pre-idle-hook' - is designed to solve. */ - xxDEFVAR_LISP ("post-command-idle-hook", &Vpost_command_idle_hook /* -Normal hook run after each command is executed, if idle. -`post-command-idle-delay' specifies a time in microseconds that XEmacs -must be idle for in order for the functions on this hook to be called. -Errors running the hook are caught and ignored. -*/ ); - Vpost_command_idle_hook = Qnil; - - xxDEFVAR_INT ("post-command-idle-delay", &post_command_idle_delay /* -Delay time before running `post-command-idle-hook'. -This is measured in microseconds. -*/ ); - post_command_idle_delay = 5000; - - /* Random FSFmacs crap. There is absolutely nothing to gain, - and a great deal to lose, in using this in place of just - setting `post-command-hook'. */ - xxDEFVAR_LISP ("deferred-action-list", &Vdeferred_action_list /* -List of deferred actions to be performed at a later time. -The precise format isn't relevant here; we just check whether it is nil. -*/ ); - Vdeferred_action_list = Qnil; - - xxDEFVAR_LISP ("deferred-action-function", &Vdeferred_action_function /* -Function to call to handle deferred actions, after each command. -This function is called with no arguments after each command -whenever `deferred-action-list' is non-nil. -*/ ); - Vdeferred_action_function = Qnil; -#endif /* FSF Emacs crap */ - DEFVAR_LISP ("last-command-event", &Vlast_command_event /* Last keyboard or mouse button event that was part of a command. This variable is off limits: you may not set its value or modify the event that @@ -4815,9 +4711,22 @@ This means that you can release the modifier key before pressing down the key that you wish to be modified. Although this is non-standard behavior, it is recommended because it reduces the strain on your hand, thus reducing the incidence of the dreaded Emacs-pinky syndrome. + +Modifier keys are sticky within the inverval specified by +`modifier-keys-sticky-time'. */ ); modifier_keys_are_sticky = 0; + DEFVAR_LISP ("modifier-keys-sticky-time", &Vmodifier_keys_sticky_time /* +*Modifier keys are sticky within this many milliseconds. +If you don't want modifier keys sticking to be bounded, set this to +non-integer value. + +This variable has no effect when `modifier-keys-are-sticky' is nil. +Currently only implemented under X Window System. +*/ ); + Vmodifier_keys_sticky_time = make_int (500); + #ifdef HAVE_XIM DEFVAR_LISP ("composed-character-default-binding", &Vcomposed_character_default_binding /* @@ -4936,20 +4845,23 @@ useful testcases for v18/v19 compatibility: (global-set-key "\^Q" 'foo) without the read-key-sequence: - ^Q ==> (65 17 65 [... ^Q] [^Q]) - ^U^U^Q ==> (65 17 65 [... ^U ^U ^Q] [^U ^U ^Q]) - ^U^U^U^G^Q ==> (65 17 65 [... ^U ^U ^U ^G ^Q] [^Q]) + ^Q ==> (?A ?\^Q ?A [... ^Q] [^Q]) + ^U^U^Q ==> (?A ?\^Q ?A [... ^U ^U ^Q] [^U ^U ^Q]) + ^U^U^U^G^Q ==> (?A ?\^Q ?A [... ^U ^U ^U ^G ^Q] [^Q]) with the read-key-sequence: - ^Qb ==> (65 [b] 17 98 [... ^Q b] [b]) - ^U^U^Qb ==> (65 [b] 17 98 [... ^U ^U ^Q b] [b]) - ^U^U^U^G^Qb ==> (65 [b] 17 98 [... ^U ^U ^U ^G ^Q b] [b]) + ^Qb ==> (?A [b] ?\^Q ?b [... ^Q b] [b]) + ^U^U^Qb ==> (?A [b] ?\^Q ?b [... ^U ^U ^Q b] [b]) + ^U^U^U^G^Qb ==> (?A [b] ?\^Q ?b [... ^U ^U ^U ^G ^Q b] [b]) ;the evi-mode command "4dlj.j.j.j.j.j." is also a good testcase (gag) ;(setq x (list (read-char) quit-flag))^J^G ;(let ((inhibit-quit t)) (setq x (list (read-char) quit-flag)))^J^G ;for BOTH, x should get set to (7 t), but no result should be printed. +;; #### According to the doc of quit-flag, second test should return +;; (?\^G nil). Accidentaly XEmacs returns correct value. However, +;; XEmacs 21.1.12 and 21.2.36 both fails on first test. ;also do this: make two frames, one viewing "*scratch*", the other "foo". ;in *scratch*, type (sit-for 20)^J @@ -4969,9 +4881,9 @@ with the read-key-sequence: (quit c)) (read-char))) - (tst)^Ja^G ==> ((quit) 97) with no signal - (tst)^J^Ga ==> ((quit) 97) with no signal - (tst)^Jabc^G ==> ((quit) 97) with no signal, and "bc" inserted in buffer + (tst)^Ja^G ==> ((quit) ?a) with no signal + (tst)^J^Ga ==> ((quit) ?a) with no signal + (tst)^Jabc^G ==> ((quit) ?a) with no signal, and "bc" inserted in buffer ; with sit-for only do the 2nd test. ; Do all 3 tests with (accept-process-output nil 20) diff --git a/src/events.c b/src/events.c index 1e5f9db..af1888b 100644 --- a/src/events.c +++ b/src/events.c @@ -762,11 +762,11 @@ that it is safe to do so. } DEFUN ("copy-event", Fcopy_event, 1, 2, 0, /* -Make a copy of the given event object. -If a second argument is given, the first event is copied into the second -and the second is returned. If the second argument is not supplied (or -is nil) then a new event will be made as with `make-event'. See also -the function `deallocate-event'. +Make a copy of the event object EVENT1. +If a second event argument EVENT2 is given, EVENT1 is copied into +EVENT2 and EVENT2 is returned. If EVENT2 is not supplied (or is nil) +then a new event will be made as with `make-event'. See also the +function `deallocate-event'. */ (event1, event2)) { @@ -1145,46 +1145,48 @@ Note that specifying both ALLOW-META and ALLOW-NON-ASCII is ambiguous, as } DEFUN ("character-to-event", Fcharacter_to_event, 1, 4, 0, /* -Convert keystroke CH into an event structure ,replete with bucky bits. -The keystroke is the first argument, and the event to fill -in is the second. This function contains knowledge about what the codes -``mean'' -- for example, the number 9 is converted to the character ``Tab'', -not the distinct character ``Control-I''. +Convert KEY-DESCRIPTION into an event structure, replete with bucky bits. -Note that CH (the keystroke specifier) can be an integer, a character, -a symbol such as 'clear, or a list such as '(control backspace). +KEY-DESCRIPTION is the first argument, and the event to fill in is the +second. This function contains knowledge about what various kinds of +arguments ``mean'' -- for example, the number 9 is converted to the +character ``Tab'', not the distinct character ``Control-I''. -If the optional second argument is an event, it is modified; -otherwise, a new event object is created. +KEY-DESCRIPTION can be an integer, a character, a symbol such as 'clear, +or a list such as '(control backspace). + +If the optional second argument EVENT is an event, it is modified and +returned; otherwise, a new event object is created and returned. Optional third arg CONSOLE is the console to store in the event, and defaults to the selected console. -If CH is an integer or character, the high bit may be interpreted as the -meta key. (This is done for backward compatibility in lots of places.) -If USE-CONSOLE-META-FLAG is nil, this will always be the case. If -USE-CONSOLE-META-FLAG is non-nil, the `meta' flag for CONSOLE affects -whether the high bit is interpreted as a meta key. (See `set-input-mode'.) -If you don't want this silly meta interpretation done, you should pass -in a list containing the character. +If KEY-DESCRIPTION is an integer or character, the high bit may be +interpreted as the meta key. (This is done for backward compatibility +in lots of places.) If USE-CONSOLE-META-FLAG is nil, this will always +be the case. If USE-CONSOLE-META-FLAG is non-nil, the `meta' flag for +CONSOLE affects whether the high bit is interpreted as a meta +key. (See `set-input-mode'.) If you don't want this silly meta +interpretation done, you should pass in a list containing the +character. Beware that character-to-event and event-to-character are not strictly inverse functions, since events contain much more information than the -ASCII character set can encode. +Lisp character object type can encode. */ - (ch, event, console, use_console_meta_flag)) + (keystroke, event, console, use_console_meta_flag)) { struct console *con = decode_console (console); if (NILP (event)) event = Fmake_event (Qnil, Qnil); else CHECK_LIVE_EVENT (event); - if (CONSP (ch) || SYMBOLP (ch)) - key_desc_list_to_event (ch, event, 1); + if (CONSP (keystroke) || SYMBOLP (keystroke)) + key_desc_list_to_event (keystroke, event, 1); else { - CHECK_CHAR_COERCE_INT (ch); - character_to_event (XCHAR (ch), XEVENT (event), con, + CHECK_CHAR_COERCE_INT (keystroke); + character_to_event (XCHAR (keystroke), XEVENT (event), con, !NILP (use_console_meta_flag), 1); } return event; @@ -1527,7 +1529,7 @@ This will be a character if the event is associated with one, else a symbol. } DEFUN ("event-button", Fevent_button, 1, 1, 0, /* -Return the button-number of the given button-press or button-release event. +Return the button-number of the button-press or button-release event EVENT. */ (event)) { @@ -2122,7 +2124,7 @@ If the event did not occur over a toolbar button, nil is returned. } DEFUN ("event-process", Fevent_process, 1, 1, 0, /* -Return the process of the given process-output event. +Return the process of the process-output event EVENT. */ (event)) { diff --git a/src/events.h b/src/events.h index e8fa7f8..3dcab79 100644 --- a/src/events.h +++ b/src/events.h @@ -533,6 +533,7 @@ EXFUN (Fmake_event, 2); extern Lisp_Object QKbackspace, QKdelete, QKescape, QKlinefeed, QKreturn; extern Lisp_Object QKspace, QKtab, Qmouse_event_p, Vcharacter_set_property; extern Lisp_Object Qcancel_mode_internal; +extern Lisp_Object Vmodifier_keys_sticky_time; /* Note: under X Windows, XEMACS_MOD_ALT is generated by the Alt key if there are both Alt and Meta keys. If there are no Meta keys, then Alt generates diff --git a/src/extents.c b/src/extents.c index 910c0aa..a79f7d6 100644 --- a/src/extents.c +++ b/src/extents.c @@ -3426,7 +3426,7 @@ DEFUN ("next-extent-change", Fnext_extent_change, 1, 2, 0, /* Return the next position after POS where an extent begins or ends. If POS is at the end of the buffer or string, POS will be returned; otherwise a position greater than POS will always be returned. -If BUFFER is nil, the current buffer is assumed. +If OBJECT is nil, the current buffer is assumed. */ (pos, object)) { @@ -4916,7 +4916,7 @@ canonicalize_extent_property (Lisp_Object prop, Lisp_Object value) /* Do we need a lisp-level function ? */ DEFUN ("set-extent-initial-redisplay-function", Fset_extent_initial_redisplay_function, - 2,2,0,/* + 2,2,0, /* Note: This feature is experimental! Set initial-redisplay-function of EXTENT to the function @@ -5437,6 +5437,7 @@ For a list of built-in properties, see `set-extent-property'. DEFUN ("extent-property", Fextent_property, 2, 3, 0, /* Return EXTENT's value for property PROPERTY. +If no such property exists, DEFAULT is returned. See `set-extent-property' for the built-in property names. */ (extent, property, default_)) @@ -6596,7 +6597,7 @@ Scans characters forward from POS till it finds a change in the PROP argument OBJECT is the buffer or string to scan (defaults to the current buffer). The property values are compared with `eq'. -Return nil if the property is constant all the way to the end of BUFFER. +Return nil if the property is constant all the way to the end of OBJECT. If the value is non-nil, it is a position greater than POS, never equal. If the optional fourth argument LIMIT is non-nil, don't search @@ -6663,7 +6664,7 @@ Scans characters backward from POS till it finds a change in the PROP argument OBJECT is the buffer or string to scan (defaults to the current buffer). The property values are compared with `eq'. -Return nil if the property is constant all the way to the start of BUFFER. +Return nil if the property is constant all the way to the start of OBJECT. If the value is non-nil, it is a position less than POS, never equal. If the optional fourth argument LIMIT is non-nil, don't search back diff --git a/src/faces.c b/src/faces.c index 5bd16f1..a134312 100644 --- a/src/faces.c +++ b/src/faces.c @@ -596,7 +596,7 @@ face_property_matching_instance (Lisp_Object face, Lisp_Object property, DEFUN ("facep", Ffacep, 1, 1, 0, /* -Return non-nil if OBJECT is a face. +Return t if OBJECT is a face. */ (object)) { @@ -762,8 +762,8 @@ other non-nil value both permanent and temporary are included. } DEFUN ("make-face", Fmake_face, 1, 3, 0, /* -Define and return a new FACE described by DOC-STRING. -You can modify the font, color, etc of a face with the set-face-* functions. +Define a new face with name NAME (a symbol), described by DOC-STRING. +You can modify the font, color, etc. of a face with the set-face-* functions. If the face already exists, it is unmodified. If TEMPORARY is non-nil, this face will cease to exist if not in use. */ @@ -1575,7 +1575,16 @@ get_extent_fragment_face_cache_index (struct window *w, findex = get_builtin_face_cache_index (w, Vdefault_face); merge_face_cachel_data (w, findex, &cachel); - return get_merged_face_cache_index (w, &cachel); + findex = get_merged_face_cache_index (w, &cachel); + if (cachel.merged_faces && + /* merged_faces did not get stored and available via return value */ + Dynarr_at (w->face_cachels, findex).merged_faces != + cachel.merged_faces) + { + Dynarr_free (cachel.merged_faces); + cachel.merged_faces = 0; + } + return findex; } } diff --git a/src/file-coding.c b/src/file-coding.c index 128abb8..b2a0c26 100644 --- a/src/file-coding.c +++ b/src/file-coding.c @@ -176,68 +176,47 @@ EXFUN (Fcopy_coding_system, 2); #ifdef MULE struct detection_state; static int detect_coding_sjis (struct detection_state *st, - const unsigned char *src, - unsigned int n); -static void decode_coding_sjis (Lstream *decoding, - const unsigned char *src, - unsigned_char_dynarr *dst, - unsigned int n); -static void encode_coding_sjis (Lstream *encoding, - const unsigned char *src, - unsigned_char_dynarr *dst, - unsigned int n); + const Extbyte *src, size_t n); +static void decode_coding_sjis (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n); +static void encode_coding_sjis (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n); static int detect_coding_big5 (struct detection_state *st, - const unsigned char *src, - unsigned int n); -static void decode_coding_big5 (Lstream *decoding, - const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n); -static void encode_coding_big5 (Lstream *encoding, - const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n); + const Extbyte *src, size_t n); +static void decode_coding_big5 (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n); +static void encode_coding_big5 (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n); static int detect_coding_ucs4 (struct detection_state *st, - const unsigned char *src, - unsigned int n); -static void decode_coding_ucs4 (Lstream *decoding, - const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n); -static void encode_coding_ucs4 (Lstream *encoding, - const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n); + const Extbyte *src, size_t n); +static void decode_coding_ucs4 (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n); +static void encode_coding_ucs4 (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n); static int detect_coding_utf8 (struct detection_state *st, - const unsigned char *src, - unsigned int n); -static void decode_coding_utf8 (Lstream *decoding, - const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n); -static void encode_coding_utf8 (Lstream *encoding, - const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n); + const Extbyte *src, size_t n); +static void decode_coding_utf8 (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n); +static void encode_coding_utf8 (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n); static int postprocess_iso2022_mask (int mask); static void reset_iso2022 (Lisp_Object coding_system, struct iso2022_decoder *iso); static int detect_coding_iso2022 (struct detection_state *st, - const unsigned char *src, - unsigned int n); -static void decode_coding_iso2022 (Lstream *decoding, - const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n); -static void encode_coding_iso2022 (Lstream *encoding, - const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n); + const Extbyte *src, size_t n); +static void decode_coding_iso2022 (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n); +static void encode_coding_iso2022 (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n); #endif /* MULE */ -static void decode_coding_no_conversion (Lstream *decoding, - const unsigned char *src, - unsigned_char_dynarr *dst, - unsigned int n); -static void encode_coding_no_conversion (Lstream *encoding, - const unsigned char *src, - unsigned_char_dynarr *dst, - unsigned int n); -static void mule_decode (Lstream *decoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n); -static void mule_encode (Lstream *encoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n); +static void decode_coding_no_conversion (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n); +static void encode_coding_no_conversion (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n); +static void mule_decode (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n); +static void mule_encode (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n); typedef struct codesys_prop codesys_prop; struct codesys_prop @@ -789,12 +768,12 @@ character set. Recognized properties are: 'post-read-conversion Function called after a file has been read in, to perform the - decoding. Called with two arguments, BEG and END, denoting + decoding. Called with two arguments, START and END, denoting a region of the current buffer to be decoded. 'pre-write-conversion Function called before a file is written out, to perform the - encoding. Called with two arguments, BEG and END, denoting + encoding. Called with two arguments, START and END, denoting a region of the current buffer to be encoded. @@ -983,18 +962,42 @@ if TYPE is 'ccl: } else if (EQ (type, Qccl)) { + Lisp_Object sym; + struct ccl_program test_ccl; + Extbyte *suffix; + + /* Check key first. */ if (EQ (key, Qdecode)) - { - CHECK_VECTOR (value); - CODING_SYSTEM_CCL_DECODE (codesys) = value; - } + suffix = "-ccl-decode"; else if (EQ (key, Qencode)) + suffix = "-ccl-encode"; + else + signal_simple_error ("Unrecognized property", key); + + /* If value is vector, register it as a ccl program + associated with an newly created symbol for + backward compatibility. */ + if (VECTORP (value)) { - CHECK_VECTOR (value); - CODING_SYSTEM_CCL_ENCODE (codesys) = value; + sym = Fintern (concat2 (Fsymbol_name (name), + build_string (suffix)), + Qnil); + Fregister_ccl_program (sym, value); } else - signal_simple_error ("Unrecognized property", key); + { + CHECK_SYMBOL (value); + sym = value; + } + /* check if the given ccl programs are valid. */ + if (setup_ccl_program (&test_ccl, sym) < 0) + signal_simple_error ("Invalid CCL program", value); + + if (EQ (key, Qdecode)) + CODING_SYSTEM_CCL_DECODE (codesys) = sym; + else if (EQ (key, Qencode)) + CODING_SYSTEM_CCL_ENCODE (codesys) = sym; + } #endif /* MULE */ else @@ -1628,14 +1631,12 @@ mask_has_at_most_one_bit_p (int mask) } static eol_type_t -detect_eol_type (struct detection_state *st, const unsigned char *src, - unsigned int n) +detect_eol_type (struct detection_state *st, const Extbyte *src, + size_t n) { - int c; - while (n--) { - c = *src++; + unsigned char c = *(unsigned char *)src++; if (c == '\n') { if (st->eol.just_saw_cr) @@ -1674,10 +1675,8 @@ detect_eol_type (struct detection_state *st, const unsigned char *src, static int detect_coding_type (struct detection_state *st, const Extbyte *src, - unsigned int n, int just_do_eol) + size_t n, int just_do_eol) { - int c; - if (st->eol_type == EOL_AUTODETECT) st->eol_type = detect_eol_type (st, src, n); @@ -1688,7 +1687,7 @@ detect_coding_type (struct detection_state *st, const Extbyte *src, { for (; n; n--, src++) { - c = *src; + unsigned char c = *(unsigned char *) src; if ((c < 0x20 && !acceptable_control_char_p (c)) || c >= 0x80) { st->seen_non_ascii = 1; @@ -1914,8 +1913,8 @@ determine_real_coding_system (Lstream *stream, Lisp_Object *codesys_in_out, DEFUN ("detect-coding-region", Fdetect_coding_region, 2, 3, 0, /* Detect coding system of the text in the region between START and END. -Returned a list of possible coding systems ordered by priority. -If only ASCII characters are found, it returns 'undecided or one of +Return a list of possible coding systems ordered by priority. +If only ASCII characters are found, return 'undecided or one of its subsidiary coding systems according to a detected end-of-line type. Optional arg BUFFER defaults to the current buffer. */ @@ -1940,7 +1939,7 @@ type. Optional arg BUFFER defaults to the current buffer. decst.mask = ~0; while (1) { - unsigned char random_buffer[4096]; + Extbyte random_buffer[4096]; ssize_t nread = Lstream_read (istr, random_buffer, sizeof (random_buffer)); if (!nread) @@ -2253,7 +2252,7 @@ decoding_reader (Lstream *stream, unsigned char *data, size_t size) /* There might be some more end data produced in the translation. See the comment above. */ str->flags |= CODING_STATE_END; - mule_decode (stream, data, str->runoff, read_size); + mule_decode (stream, (Extbyte *) data, str->runoff, read_size); } if (data - orig_data == 0) @@ -2271,7 +2270,7 @@ decoding_writer (Lstream *stream, const unsigned char *data, size_t size) /* Decode all our data into the runoff, and then attempt to write it all out to the other end. Remove whatever chunk we succeeded in writing. */ - mule_decode (stream, data, str->runoff, size); + mule_decode (stream, (Extbyte *) data, str->runoff, size); retval = Lstream_write (str->other_end, Dynarr_atp (str->runoff, 0), Dynarr_length (str->runoff)); if (retval > 0) @@ -2423,8 +2422,8 @@ make_decoding_output_stream (Lstream *stream, Lisp_Object codesys) be used for both reading and writing. */ static void -mule_decode (Lstream *decoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +mule_decode (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n) { struct decoding_stream *str = DECODING_STREAM_DATA (decoding); @@ -2488,7 +2487,10 @@ mule_decode (Lstream *decoding, const unsigned char *src, break; case CODESYS_CCL: str->ccl.last_block = str->flags & CODING_STATE_END; - ccl_driver (&str->ccl, src, dst, n, 0, CCL_MODE_DECODING); + /* When applying ccl program to stream, MUST NOT set NULL + pointer to src. */ + ccl_driver (&str->ccl, (src ? (unsigned char *)src : (unsigned char*)""), + dst, n, 0, CCL_MODE_DECODING); break; case CODESYS_ISO2022: decode_coding_iso2022 (decoding, src, dst, n); @@ -2871,8 +2873,8 @@ make_encoding_output_stream (Lstream *stream, Lisp_Object codesys) Store the encoded data into DST. */ static void -mule_encode (Lstream *encoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +mule_encode (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n) { struct encoding_stream *str = ENCODING_STREAM_DATA (encoding); @@ -2904,7 +2906,10 @@ mule_encode (Lstream *encoding, const unsigned char *src, break; case CODESYS_CCL: str->ccl.last_block = str->flags & CODING_STATE_END; - ccl_driver (&str->ccl, src, dst, n, 0, CCL_MODE_ENCODING); + /* When applying ccl program to stream, MUST NOT set NULL + pointer to src. */ + ccl_driver (&str->ccl, ((src) ? src : (unsigned char*)""), + dst, n, 0, CCL_MODE_ENCODING); break; case CODESYS_ISO2022: encode_coding_iso2022 (encoding, src, dst, n); @@ -3018,14 +3023,11 @@ text. BUFFER defaults to the current buffer if unspecified. ((c) >= 0xA1 && (c) <= 0xDF) static int -detect_coding_sjis (struct detection_state *st, const unsigned char *src, - unsigned int n) +detect_coding_sjis (struct detection_state *st, const Extbyte *src, size_t n) { - int c; - while (n--) { - c = *src++; + unsigned char c = *(unsigned char *)src++; if (c == ISO_CODE_ESC || c == ISO_CODE_SI || c == ISO_CODE_SO) return 0; if (st->shift_jis.in_second_byte) @@ -3043,10 +3045,9 @@ detect_coding_sjis (struct detection_state *st, const unsigned char *src, /* Convert Shift-JIS data to internal format. */ static void -decode_coding_sjis (Lstream *decoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +decode_coding_sjis (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n) { - unsigned char c; struct decoding_stream *str = DECODING_STREAM_DATA (decoding); unsigned int flags = str->flags; unsigned int ch = str->ch; @@ -3054,7 +3055,7 @@ decode_coding_sjis (Lstream *decoding, const unsigned char *src, while (n--) { - c = *src++; + unsigned char c = *(unsigned char *)src++; if (ch) { @@ -3111,10 +3112,9 @@ decode_coding_sjis (Lstream *decoding, const unsigned char *src, /* Convert internally-formatted data to Shift-JIS. */ static void -encode_coding_sjis (Lstream *encoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +encode_coding_sjis (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n) { - unsigned char c; struct encoding_stream *str = ENCODING_STREAM_DATA (encoding); unsigned int flags = str->flags; unsigned int ch = str->ch; @@ -3125,7 +3125,7 @@ encode_coding_sjis (Lstream *encoding, const unsigned char *src, while (n--) { - c = *src++; + Bufbyte c = *src++; #ifdef UTF2000 switch (char_boundary) { @@ -3267,16 +3267,16 @@ Return the corresponding character. } DEFUN ("encode-shift-jis-char", Fencode_shift_jis_char, 1, 1, 0, /* -Encode a JISX0208 character CHAR to SHIFT-JIS coding-system. +Encode a JISX0208 character CHARACTER to SHIFT-JIS coding-system. Return the corresponding character code in SHIFT-JIS as a cons of two bytes. */ - (ch)) + (character)) { Lisp_Object charset; int c1, c2, s1, s2; - CHECK_CHAR_COERCE_INT (ch); - BREAKUP_CHAR (XCHAR (ch), charset, c1, c2); + CHECK_CHAR_COERCE_INT (character); + BREAKUP_CHAR (XCHAR (character), charset, c1, c2); if (EQ (charset, Vcharset_japanese_jisx0208)) { ENCODE_SJIS (c1 | 0x80, c2 | 0x80, s1, s2); @@ -3391,14 +3391,11 @@ Return the corresponding character code in SHIFT-JIS as a cons of two bytes. } while (0) static int -detect_coding_big5 (struct detection_state *st, const unsigned char *src, - unsigned int n) +detect_coding_big5 (struct detection_state *st, const Extbyte *src, size_t n) { - int c; - while (n--) { - c = *src++; + unsigned char c = *(unsigned char *)src++; if (c == ISO_CODE_ESC || c == ISO_CODE_SI || c == ISO_CODE_SO || (c >= 0x80 && c <= 0xA0)) return 0; @@ -3417,10 +3414,9 @@ detect_coding_big5 (struct detection_state *st, const unsigned char *src, /* Convert Big5 data to internal format. */ static void -decode_coding_big5 (Lstream *decoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +decode_coding_big5 (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n) { - unsigned char c; struct decoding_stream *str = DECODING_STREAM_DATA (decoding); unsigned int flags = str->flags; unsigned int ch = str->ch; @@ -3428,7 +3424,7 @@ decode_coding_big5 (Lstream *decoding, const unsigned char *src, while (n--) { - c = *src++; + unsigned char c = *(unsigned char *)src++; if (ch) { /* Previous character was first byte of Big5 char. */ @@ -3467,8 +3463,8 @@ decode_coding_big5 (Lstream *decoding, const unsigned char *src, /* Convert internally-formatted data to Big5. */ static void -encode_coding_big5 (Lstream *encoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +encode_coding_big5 (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n) { #ifndef UTF2000 unsigned char c; @@ -3557,16 +3553,16 @@ Return the corresponding character. } DEFUN ("encode-big5-char", Fencode_big5_char, 1, 1, 0, /* -Encode the Big5 character CH to BIG5 coding-system. +Encode the Big5 character CHARACTER in the BIG5 coding-system. Return the corresponding character code in Big5. */ - (ch)) + (character)) { Lisp_Object charset; int c1, c2, b1, b2; - CHECK_CHAR_COERCE_INT (ch); - BREAKUP_CHAR (XCHAR (ch), charset, c1, c2); + CHECK_CHAR_COERCE_INT (character); + BREAKUP_CHAR (XCHAR (character), charset, c1, c2); if (EQ (charset, Vcharset_chinese_big5_1) || EQ (charset, Vcharset_chinese_big5_2)) { @@ -3743,12 +3739,11 @@ encode_ucs4 (Lisp_Object charset, #endif static int -detect_coding_ucs4 (struct detection_state *st, const unsigned char *src, - unsigned int n) +detect_coding_ucs4 (struct detection_state *st, const Extbyte *src, size_t n) { while (n--) { - int c = *src++; + unsigned char c = *(unsigned char *)src++; switch (st->ucs4.in_byte) { case 0: @@ -3768,8 +3763,8 @@ detect_coding_ucs4 (struct detection_state *st, const unsigned char *src, } static void -decode_coding_ucs4 (Lstream *decoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +decode_coding_ucs4 (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n) { struct decoding_stream *str = DECODING_STREAM_DATA (decoding); unsigned int flags = str->flags; @@ -3778,7 +3773,7 @@ decode_coding_ucs4 (Lstream *decoding, const unsigned char *src, while (n--) { - unsigned char c = *src++; + unsigned char c = *(unsigned char *)src++; switch (counter) { case 0: @@ -3804,8 +3799,8 @@ decode_coding_ucs4 (Lstream *decoding, const unsigned char *src, } static void -encode_coding_ucs4 (Lstream *encoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +encode_coding_ucs4 (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n) { #ifndef UTF2000 struct encoding_stream *str = ENCODING_STREAM_DATA (encoding); @@ -3871,9 +3866,9 @@ encode_coding_ucs4 (Lstream *encoding, const unsigned char *src, { /* #### Bother! We don't know how to handle this yet. */ - Dynarr_add (dst, 0); - Dynarr_add (dst, 0); - Dynarr_add (dst, 0); + Dynarr_add (dst, '\0'); + Dynarr_add (dst, '\0'); + Dynarr_add (dst, '\0'); Dynarr_add (dst, '~'); } else @@ -3945,12 +3940,11 @@ encode_coding_ucs4 (Lstream *encoding, const unsigned char *src, /************************************************************************/ static int -detect_coding_utf8 (struct detection_state *st, const unsigned char *src, - unsigned int n) +detect_coding_utf8 (struct detection_state *st, const Extbyte *src, size_t n) { while (n--) { - unsigned char c = *src++; + unsigned char c = *(unsigned char *)src++; switch (st->utf8.in_byte) { case 0: @@ -3980,8 +3974,8 @@ detect_coding_utf8 (struct detection_state *st, const unsigned char *src, } static void -decode_coding_utf8 (Lstream *decoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +decode_coding_utf8 (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n) { struct decoding_stream *str = DECODING_STREAM_DATA (decoding); unsigned int flags = str->flags; @@ -3991,7 +3985,7 @@ decode_coding_utf8 (Lstream *decoding, const unsigned char *src, while (n--) { - unsigned char c = *src++; + unsigned char c = *(unsigned char *)src++; switch (counter) { case 0: @@ -4096,8 +4090,8 @@ encode_utf8 (Lisp_Object charset, #endif static void -encode_coding_utf8 (Lstream *encoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +encode_coding_utf8 (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n) { struct encoding_stream *str = ENCODING_STREAM_DATA (encoding); unsigned int flags = str->flags; @@ -4877,8 +4871,7 @@ parse_iso2022_esc (Lisp_Object codesys, struct iso2022_decoder *iso, } static int -detect_coding_iso2022 (struct detection_state *st, const unsigned char *src, - unsigned int n) +detect_coding_iso2022 (struct detection_state *st, const Extbyte *src, size_t n) { int mask; @@ -4908,7 +4901,7 @@ detect_coding_iso2022 (struct detection_state *st, const unsigned char *src, while (n--) { - int c = *src++; + unsigned char c = *(unsigned char *)src++; if (c >= 0xA0) { mask &= ~CODING_CATEGORY_ISO_7_MASK; @@ -5068,8 +5061,8 @@ ensure_correct_direction (int direction, Lisp_Coding_System *codesys, /* Convert ISO2022-format data to internal format. */ static void -decode_coding_iso2022 (Lstream *decoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +decode_coding_iso2022 (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n) { struct decoding_stream *str = DECODING_STREAM_DATA (decoding); unsigned int flags = str->flags; @@ -5089,7 +5082,7 @@ decode_coding_iso2022 (Lstream *decoding, const unsigned char *src, while (n--) { - unsigned char c = *src++; + unsigned char c = *(unsigned char *)src++; if (flags & CODING_STATE_ESCAPE) { /* Within ESC sequence */ int retval = parse_iso2022_esc (coding_system, &str->iso2022, @@ -5413,8 +5406,8 @@ ensure_shift_out (struct encoding_stream *str, unsigned_char_dynarr *dst) /* Convert internally-formatted data to ISO2022 format. */ static void -encode_coding_iso2022 (Lstream *encoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +encode_coding_iso2022 (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n) { unsigned char charmask, c; unsigned char char_boundary; @@ -5940,10 +5933,9 @@ encode_coding_iso2022 (Lstream *encoding, const unsigned char *src, contain all 256 possible byte values and that are not to be interpreted as being in any particular decoding. */ static void -decode_coding_no_conversion (Lstream *decoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +decode_coding_no_conversion (Lstream *decoding, const Extbyte *src, + unsigned_char_dynarr *dst, size_t n) { - unsigned char c; struct decoding_stream *str = DECODING_STREAM_DATA (decoding); unsigned int flags = str->flags; unsigned int ch = str->ch; @@ -5951,7 +5943,7 @@ decode_coding_no_conversion (Lstream *decoding, const unsigned char *src, while (n--) { - c = *src++; + unsigned char c = *(unsigned char *)src++; DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst); DECODE_ADD_BINARY_CHAR (c, dst); @@ -5965,8 +5957,8 @@ decode_coding_no_conversion (Lstream *decoding, const unsigned char *src, } static void -encode_coding_no_conversion (Lstream *encoding, const unsigned char *src, - unsigned_char_dynarr *dst, unsigned int n) +encode_coding_no_conversion (Lstream *encoding, const Bufbyte *src, + unsigned_char_dynarr *dst, size_t n) { unsigned char c; struct encoding_stream *str = ENCODING_STREAM_DATA (encoding); diff --git a/src/fileio.c b/src/fileio.c index 49f9262..a726938 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -94,6 +94,12 @@ Lisp_Object Vwrite_region_annotations_so_far; /* File name in which we write a list of all our auto save files. */ Lisp_Object Vauto_save_list_file_name; +/* Prefix used to construct Vauto_save_list_file_name. */ +Lisp_Object Vauto_save_list_file_prefix; + +/* When non-nil, it prevents auto-save list file creation. */ +int inhibit_auto_save_session; + int disable_auto_save_when_buffer_shrinks; Lisp_Object Vdirectory_sep_char; @@ -393,31 +399,31 @@ call3_check_string (Lisp_Object fn, Lisp_Object arg0, DEFUN ("file-name-directory", Ffile_name_directory, 1, 1, 0, /* -Return the directory component in file name NAME. -Return nil if NAME does not include a directory. +Return the directory component in file name FILENAME. +Return nil if FILENAME does not include a directory. Otherwise return a directory spec. Given a Unix syntax file name, returns a string ending in slash. */ - (file)) + (filename)) { /* This function can GC. GC checked 2000-07-28 ben */ Bufbyte *beg; Bufbyte *p; Lisp_Object handler; - CHECK_STRING (file); + CHECK_STRING (filename); /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = Ffind_file_name_handler (file, Qfile_name_directory); + handler = Ffind_file_name_handler (filename, Qfile_name_directory); if (!NILP (handler)) - return call2_check_string_or_nil (handler, Qfile_name_directory, file); + return call2_check_string_or_nil (handler, Qfile_name_directory, filename); #ifdef FILE_SYSTEM_CASE - file = FILE_SYSTEM_CASE (file); + filename = FILE_SYSTEM_CASE (filename); #endif - beg = XSTRING_DATA (file); - p = beg + XSTRING_LENGTH (file); + beg = XSTRING_DATA (filename); + p = beg + XSTRING_LENGTH (filename); while (p != beg && !IS_ANY_SEP (p[-1]) #ifdef WIN32_NATIVE @@ -452,27 +458,27 @@ Given a Unix syntax file name, returns a string ending in slash. } DEFUN ("file-name-nondirectory", Ffile_name_nondirectory, 1, 1, 0, /* -Return file name NAME sans its directory. +Return file name FILENAME sans its directory. For example, in a Unix-syntax file name, this is everything after the last slash, or the entire name if it contains no slash. */ - (file)) + (filename)) { /* This function can GC. GC checked 2000-07-28 ben */ Bufbyte *beg, *p, *end; Lisp_Object handler; - CHECK_STRING (file); + CHECK_STRING (filename); /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = Ffind_file_name_handler (file, Qfile_name_nondirectory); + handler = Ffind_file_name_handler (filename, Qfile_name_nondirectory); if (!NILP (handler)) - return call2_check_string (handler, Qfile_name_nondirectory, file); + return call2_check_string (handler, Qfile_name_nondirectory, filename); - beg = XSTRING_DATA (file); - end = p = beg + XSTRING_LENGTH (file); + beg = XSTRING_DATA (filename); + end = p = beg + XSTRING_LENGTH (filename); while (p != beg && !IS_ANY_SEP (p[-1]) #ifdef WIN32_NATIVE @@ -493,7 +499,7 @@ If FILENAME is a directly usable file itself, return The `call-process' and `start-process' functions use this function to get a current directory to run processes in. */ - (filename)) + (filename)) { /* This function can GC. GC checked 2000-07-28 ben */ Lisp_Object handler; @@ -543,23 +549,23 @@ or passed as second argument to `expand-file-name'. For a Unix-syntax file name, just appends a slash, except for (file-name-as-directory \"\") => \"./\". */ - (file)) + (filename)) { /* This function can GC. GC checked 2000-07-28 ben */ char *buf; Lisp_Object handler; - CHECK_STRING (file); + CHECK_STRING (filename); /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = Ffind_file_name_handler (file, Qfile_name_as_directory); + handler = Ffind_file_name_handler (filename, Qfile_name_as_directory); if (!NILP (handler)) - return call2_check_string (handler, Qfile_name_as_directory, file); + return call2_check_string (handler, Qfile_name_as_directory, filename); - buf = (char *) alloca (XSTRING_LENGTH (file) + 10); + buf = (char *) alloca (XSTRING_LENGTH (filename) + 10); return build_string (file_name_as_directory - (buf, (char *) XSTRING_DATA (file))); + (buf, (char *) XSTRING_DATA (filename))); } /* @@ -588,8 +594,8 @@ directory_file_name (const char *src, char *dst) } DEFUN ("directory-file-name", Fdirectory_file_name, 1, 1, 0, /* -Return the file name of the directory named DIR. -This is the name of the file that holds the data for the directory DIR. +Return the file name of the directory named DIRECTORY. +This is the name of the file that holds the data for the directory. This operation exists because a directory is also a file, but its name as a directory is different from its name as a file. In Unix-syntax, this function just removes the final slash. @@ -731,7 +737,7 @@ DEFUN ("expand-file-name", Fexpand_file_name, 1, 2, 0, /* Convert filename NAME to absolute, and canonicalize it. Second arg DEFAULT-DIRECTORY is directory to start with if NAME is relative (does not start with slash); if DEFAULT-DIRECTORY is nil or missing, -the current buffer's value of default-directory is used. +the current buffer's value of `default-directory' is used. File name components that are `.' are removed, and so are file name components followed by `..', along with the `..' itself; note that these simplifications are done without checking the resulting @@ -1247,10 +1253,10 @@ See also the function `substitute-in-file-name'. } DEFUN ("file-truename", Ffile_truename, 1, 2, 0, /* -Return the canonical name of the given FILE. -Second arg DEFAULT is directory to start with if FILE is relative +Return the canonical name of FILENAME. +Second arg DEFAULT is directory to start with if FILENAME is relative (does not start with slash); if DEFAULT is nil or missing, - the current buffer's value of default-directory is used. + the current buffer's value of `default-directory' is used. No component of the resulting pathname will be a symbolic link, as in the realpath() function. */ @@ -1389,12 +1395,11 @@ DEFUN ("substitute-in-file-name", Fsubstitute_in_file_name, 1, 1, 0, /* Substitute environment variables referred to in FILENAME. `$FOO' where FOO is an environment variable name means to substitute the value of that variable. The variable name should be terminated -with a character not a letter, digit or underscore; otherwise, enclose +with a character, not a letter, digit or underscore; otherwise, enclose the entire variable name in braces. If `/~' appears, all of FILENAME through that `/' is discarded. - */ - (string)) + (filename)) { /* This function can GC. GC checked 2000-07-28 ben. */ Bufbyte *nm; @@ -1406,17 +1411,17 @@ If `/~' appears, all of FILENAME through that `/' is discarded. Bufbyte *xnm; Lisp_Object handler; - CHECK_STRING (string); + CHECK_STRING (filename); /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = Ffind_file_name_handler (string, Qsubstitute_in_file_name); + handler = Ffind_file_name_handler (filename, Qsubstitute_in_file_name); if (!NILP (handler)) return call2_check_string_or_nil (handler, Qsubstitute_in_file_name, - string); + filename); - nm = XSTRING_DATA (string); - endp = nm + XSTRING_LENGTH (string); + nm = XSTRING_DATA (filename); + endp = nm + XSTRING_LENGTH (filename); /* If /~ or // appears, discard everything through first slash. */ @@ -1496,11 +1501,11 @@ If `/~' appears, all of FILENAME through that `/' is discarded. } if (!substituted) - return string; + return filename; - /* If substitution required, recopy the string and do it */ + /* If substitution required, recopy the filename and do it */ /* Make space in stack frame for the new copy */ - xnm = (Bufbyte *) alloca (XSTRING_LENGTH (string) + total + 1); + xnm = (Bufbyte *) alloca (XSTRING_LENGTH (filename) + total + 1); x = xnm; /* Copy the rest of the name through, replacing $ constructs with values */ @@ -1572,13 +1577,13 @@ If `/~' appears, all of FILENAME through that `/' is discarded. return make_string (xnm, x - xnm); badsubst: - syntax_error ("Bad format environment-variable substitution", string); + syntax_error ("Bad format environment-variable substitution", filename); missingclose: syntax_error ("Missing \"}\" in environment-variable substitution", - string); + filename); badvar: syntax_error_2 ("Substituting nonexistent environment variable", - string, build_string (target)); + filename, build_string ((char *) target)); /* NOTREACHED */ return Qnil; /* suppress compiler warning */ @@ -1662,7 +1667,7 @@ barf_or_query_if_file_exists (Lisp_Object absname, const char *querystring, DEFUN ("copy-file", Fcopy_file, 2, 4, "fCopy file: \nFCopy %s to file: \np\nP", /* -Copy FILE to NEWNAME. Both args must be strings. +Copy FILENAME to NEWNAME. Both args must be strings. Signals a `file-already-exists' error if file NEWNAME already exists, unless a third argument OK-IF-ALREADY-EXISTS is supplied and non-nil. A number as third arg means request confirmation if NEWNAME already exists. @@ -1922,8 +1927,8 @@ internal_delete_file (Lisp_Object filename) DEFUN ("rename-file", Frename_file, 2, 3, "fRename file: \nFRename %s to file: \np", /* -Rename FILE as NEWNAME. Both args strings. -If file has names other than FILE, it continues to have those names. +Rename FILENAME as NEWNAME. Both args must be strings. +If file has names other than FILENAME, it continues to have those names. Signals a `file-already-exists' error if a file NEWNAME already exists unless optional third argument OK-IF-ALREADY-EXISTS is non-nil. A number as third arg means request confirmation if NEWNAME already exists. @@ -2006,7 +2011,7 @@ This is what happens in interactive use with M-x. DEFUN ("add-name-to-file", Fadd_name_to_file, 2, 3, "fAdd name to file: \nFName to add to %s: \np", /* -Give FILE additional name NEWNAME. Both args strings. +Give FILENAME additional name NEWNAME. Both args must be strings. Signals a `file-already-exists' error if a file NEWNAME already exists unless optional third argument OK-IF-ALREADY-EXISTS is non-nil. A number as third arg means request confirmation if NEWNAME already exists. @@ -2494,7 +2499,7 @@ This is the sort of file that holds an ordinary stream of data bytes. } DEFUN ("file-modes", Ffile_modes, 1, 1, 0, /* -Return mode bits of FILE, as an integer. +Return mode bits of file named FILENAME, as an integer. */ (filename)) { @@ -2531,7 +2536,7 @@ Return mode bits of FILE, as an integer. } DEFUN ("set-file-modes", Fset_file_modes, 2, 2, 0, /* -Set mode bits of FILE to MODE (an integer). +Set mode bits of file named FILENAME to MODE (an integer). Only the 12 low bits of MODE are used. */ (filename, mode)) @@ -2563,9 +2568,9 @@ Only the 12 low bits of MODE are used. DEFUN ("set-default-file-modes", Fset_default_file_modes, 1, 1, 0, /* Set the file permission bits for newly created files. -MASK should be an integer; if a permission's bit in MASK is 1, -subsequently created files will not have that permission enabled. -Only the low 9 bits are used. +The argument MODE should be an integer; if a bit in MODE is 1, +subsequently created files will not have the permission corresponding +to that bit enabled. Only the low 9 bits are used. This setting is inherited by subprocesses. */ (mode)) @@ -2669,13 +2674,12 @@ it should be a symbol, and the actual coding system that was used for the decoding is stored into it. It will in general be different from CODESYS if CODESYS specifies automatic encoding detection or end-of-line detection. -Currently BEG and END refer to byte positions (as opposed to character +Currently START and END refer to byte positions (as opposed to character positions), even in Mule. (Fixing this is very difficult.) */ - (filename, visit, beg, end, replace, codesys, used_codesys)) + (filename, visit, start, end, replace, codesys, used_codesys)) { /* This function can call lisp */ - /* #### dmoore - this function hasn't been checked for gc recently */ struct stat st; int fd; int saverrno = 0; @@ -2720,7 +2724,7 @@ positions), even in Mule. (Fixing this is very difficult.) if (!NILP (handler)) { val = call6 (handler, Qinsert_file_contents, filename, - visit, beg, end, replace); + visit, start, end, replace); goto handled; } @@ -2729,7 +2733,7 @@ positions), even in Mule. (Fixing this is very difficult.) CHECK_SYMBOL (used_codesys); #endif - if ( (!NILP (beg) || !NILP (end)) && !NILP (visit) ) + if ( (!NILP (start) || !NILP (end)) && !NILP (visit) ) error ("Attempt to visit less than an entire file"); fd = -1; @@ -2746,7 +2750,7 @@ positions), even in Mule. (Fixing this is very difficult.) #ifdef S_IFREG /* Signal an error if we are accessing a non-regular file, with - REPLACE, BEG or END being non-nil. */ + REPLACE, START or END being non-nil. */ if (!S_ISREG (st.st_mode)) { not_regular = 1; @@ -2754,21 +2758,22 @@ positions), even in Mule. (Fixing this is very difficult.) if (!NILP (visit)) goto notfound; - if (!NILP (replace) || !NILP (beg) || !NILP (end)) + if (!NILP (replace) || !NILP (start) || !NILP (end)) { end_multiple_change (buf, mc_count); - return Fsignal (Qfile_error, - list2 (build_translated_string("not a regular file"), - filename)); + RETURN_UNGCPRO + (Fsignal (Qfile_error, + list2 (build_translated_string("not a regular file"), + filename))); } } #endif /* S_IFREG */ - if (!NILP (beg)) - CHECK_INT (beg); + if (!NILP (start)) + CHECK_INT (start); else - beg = Qzero; + start = Qzero; if (!NILP (end)) CHECK_INT (end); @@ -2911,7 +2916,7 @@ positions), even in Mule. (Fixing this is very difficult.) same_at_end += overlap; /* Arrange to read only the nonmatching middle part of the file. */ - beg = make_int (same_at_start - BUF_BEGV (buf)); + start = make_int (same_at_start - BUF_BEGV (buf)); end = make_int (st.st_size - (BUF_ZV (buf) - same_at_end)); buffer_delete_range (buf, same_at_start, same_at_end, @@ -2923,7 +2928,7 @@ positions), even in Mule. (Fixing this is very difficult.) if (!not_regular) { - total = XINT (end) - XINT (beg); + total = XINT (end) - XINT (start); /* Make sure point-max won't overflow after this insertion. */ if (total != XINT (make_int (total))) @@ -2934,7 +2939,7 @@ positions), even in Mule. (Fixing this is very difficult.) will make the stream functions read as much as possible. */ total = -1; - if (XINT (beg) != 0 + if (XINT (start) != 0 #ifdef FSFMACS_SPEEDY_INSERT /* why was this here? asked jwz. The reason is that the replace-mode connivings above will normally put the file pointer other than @@ -2943,7 +2948,7 @@ positions), even in Mule. (Fixing this is very difficult.) #endif /* !FSFMACS_SPEEDY_INSERT */ ) { - if (lseek (fd, XINT (beg), 0) < 0) + if (lseek (fd, XINT (start), 0) < 0) report_file_error ("Setting file position", list1 (filename)); } @@ -3027,6 +3032,9 @@ positions), even in Mule. (Fixing this is very difficult.) it could be called here. But that's just silly. There's no reason C code can't call out to Lisp code, and it's a lot cleaner this way. */ + /* Note: compute-buffer-file-truename is called for + side-effect! Its return value is intentionally + ignored. */ if (!NILP (Ffboundp (Qcompute_buffer_file_truename))) call1 (Qcompute_buffer_file_truename, make_buffer (buf)); } @@ -3647,18 +3655,18 @@ Decrypt STRING using KEY. DEFUN ("verify-visited-file-modtime", Fverify_visited_file_modtime, 1, 1, 0, /* -Return t if last mod time of BUF's visited file matches what BUF records. +Return t if last mod time of BUFFER's visited file matches what BUFFER records. This means that the file has not been changed since it was visited or saved. */ - (buf)) + (buffer)) { /* This function can call lisp; GC checked 2000-07-11 ben */ struct buffer *b; struct stat st; Lisp_Object handler; - CHECK_BUFFER (buf); - b = XBUFFER (buf); + CHECK_BUFFER (buffer); + b = XBUFFER (buffer); if (!STRINGP (b->filename)) return Qt; if (b->modtime == 0) return Qt; @@ -3668,7 +3676,7 @@ This means that the file has not been changed since it was visited or saved. handler = Ffind_file_name_handler (b->filename, Qverify_visited_file_modtime); if (!NILP (handler)) - return call2 (handler, Qverify_visited_file_modtime, buf); + return call2 (handler, Qverify_visited_file_modtime, buffer); if (xemacs_stat ((char *) XSTRING_DATA (b->filename), &st) < 0) { @@ -3982,7 +3990,9 @@ Non-nil second argument means save only current buffer. /* Open the auto-save list file, if necessary. We only do this now so that the file only exists if we actually auto-saved any files. */ - if (!auto_saved && STRINGP (listfile) && listdesc < 0) + if (!auto_saved && !inhibit_auto_save_session + && !NILP (Vauto_save_list_file_prefix) + && STRINGP (listfile) && listdesc < 0) { listdesc = open ((char *) XSTRING_DATA (listfile), O_WRONLY | O_TRUNC | O_CREAT | OPEN_BINARY, @@ -4298,6 +4308,18 @@ File name in which we write a list of all auto save file names. */ ); Vauto_save_list_file_name = Qnil; + DEFVAR_LISP ("auto-save-list-file-prefix", &Vauto_save_list_file_prefix /* +Prefix for generating auto-save-list-file-name. +Emacs's pid and the system name will be appended to +this prefix to create a unique file name. +*/ ); + Vauto_save_list_file_prefix = build_string ("~/.saves-"); + + DEFVAR_BOOL ("inhibit-auto-save-session", &inhibit_auto_save_session /* +When non-nil, inhibit auto save list file creation. +*/ ); + inhibit_auto_save_session = 0; + DEFVAR_BOOL ("disable-auto-save-when-buffer-shrinks", &disable_auto_save_when_buffer_shrinks /* If non-nil, auto-saving is disabled when a buffer shrinks too much. diff --git a/src/filelock.c b/src/filelock.c index 7a645c2..308565b 100644 --- a/src/filelock.c +++ b/src/filelock.c @@ -32,6 +32,7 @@ Boston, MA 02111-1307, USA. */ Lisp_Object Qask_user_about_supersession_threat; Lisp_Object Qask_user_about_lock; +int inhibit_clash_detection; #ifdef CLASH_DETECTION @@ -311,10 +312,15 @@ lock_file (Lisp_Object fn) register Lisp_Object attack, orig_fn; register char *lfname, *locker; lock_info_type lock_info; - struct gcpro gcpro1,gcpro2; + struct gcpro gcpro1, gcpro2, gcpro3; + Lisp_Object old_current_buffer; Lisp_Object subject_buf; - GCPRO2 (fn, subject_buf); + if (inhibit_clash_detection) + return; + + XSETBUFFER (old_current_buffer, current_buffer); + GCPRO3 (fn, subject_buf, old_current_buffer); orig_fn = fn; fn = Fexpand_file_name (fn, Qnil); @@ -333,8 +339,10 @@ lock_file (Lisp_Object fn) } /* Try to lock the lock. */ - if (lock_if_free (&lock_info, lfname) <= 0) - /* Return now if we have locked it, or if lock creation failed */ + if (current_buffer != XBUFFER (old_current_buffer) + || lock_if_free (&lock_info, lfname) <= 0) + /* Return now if we have locked it, or if lock creation failed + or current buffer is killed. */ goto done; /* Else consider breaking the lock */ @@ -347,7 +355,7 @@ lock_file (Lisp_Object fn) attack = call2_in_buffer (BUFFERP (subject_buf) ? XBUFFER (subject_buf) : current_buffer, Qask_user_about_lock , fn, build_string (locker)); - if (!NILP (attack)) + if (!NILP (attack) && current_buffer == XBUFFER (old_current_buffer)) /* User says take the lock */ { lock_file_1 (lfname, 1); @@ -488,5 +496,13 @@ syms_of_filelock (void) defsymbol (&Qask_user_about_lock, "ask-user-about-lock"); } +void +vars_of_filelock (void) +{ + DEFVAR_BOOL ("inhibit-clash-detection", &inhibit_clash_detection /* +Non-nil inhibits creation of lock file to detect clash. +*/); + inhibit_clash_detection = 0; +} #endif /* CLASH_DETECTION */ diff --git a/src/floatfns.c b/src/floatfns.c index 337c581..de0c407 100644 --- a/src/floatfns.c +++ b/src/floatfns.c @@ -212,86 +212,88 @@ extract_float (Lisp_Object num) #ifdef LISP_FLOAT_TYPE DEFUN ("acos", Facos, 1, 1, 0, /* -Return the inverse cosine of ARG. +Return the inverse cosine of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef FLOAT_CHECK_DOMAIN if (d > 1.0 || d < -1.0) - domain_error ("acos", arg); + domain_error ("acos", number); #endif - IN_FLOAT (d = acos (d), "acos", arg); + IN_FLOAT (d = acos (d), "acos", number); return make_float (d); } DEFUN ("asin", Fasin, 1, 1, 0, /* -Return the inverse sine of ARG. +Return the inverse sine of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef FLOAT_CHECK_DOMAIN if (d > 1.0 || d < -1.0) - domain_error ("asin", arg); + domain_error ("asin", number); #endif - IN_FLOAT (d = asin (d), "asin", arg); + IN_FLOAT (d = asin (d), "asin", number); return make_float (d); } DEFUN ("atan", Fatan, 1, 2, 0, /* -Return the inverse tangent of ARG. +Return the inverse tangent of NUMBER. +If optional second argument NUMBER2 is provided, +return atan2 (NUMBER, NUMBER2). */ - (arg1, arg2)) + (number, number2)) { - double d = extract_float (arg1); + double d = extract_float (number); - if (NILP (arg2)) - IN_FLOAT (d = atan (d), "atan", arg1); + if (NILP (number2)) + IN_FLOAT (d = atan (d), "atan", number); else { - double d2 = extract_float (arg2); + double d2 = extract_float (number2); #ifdef FLOAT_CHECK_DOMAIN if (d == 0.0 && d2 == 0.0) - domain_error2 ("atan", arg1, arg2); + domain_error2 ("atan", number, number2); #endif - IN_FLOAT2 (d = atan2 (d, d2), "atan", arg1, arg2); + IN_FLOAT2 (d = atan2 (d, d2), "atan", number, number2); } return make_float (d); } DEFUN ("cos", Fcos, 1, 1, 0, /* -Return the cosine of ARG. +Return the cosine of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = cos (d), "cos", arg); + double d = extract_float (number); + IN_FLOAT (d = cos (d), "cos", number); return make_float (d); } DEFUN ("sin", Fsin, 1, 1, 0, /* -Return the sine of ARG. +Return the sine of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = sin (d), "sin", arg); + double d = extract_float (number); + IN_FLOAT (d = sin (d), "sin", number); return make_float (d); } DEFUN ("tan", Ftan, 1, 1, 0, /* -Return the tangent of ARG. +Return the tangent of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); double c = cos (d); #ifdef FLOAT_CHECK_DOMAIN if (c == 0.0) - domain_error ("tan", arg); + domain_error ("tan", number); #endif - IN_FLOAT (d = (sin (d) / c), "tan", arg); + IN_FLOAT (d = (sin (d) / c), "tan", number); return make_float (d); } #endif /* LISP_FLOAT_TYPE (trig functions) */ @@ -302,68 +304,68 @@ Return the tangent of ARG. /* #ifdef LISP_FLOAT_TYPE */ DEFUN ("bessel-j0", Fbessel_j0, 1, 1, 0, /* -Return the bessel function j0 of ARG. +Return the bessel function j0 of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = j0 (d), "bessel-j0", arg); + double d = extract_float (number); + IN_FLOAT (d = j0 (d), "bessel-j0", number); return make_float (d); } DEFUN ("bessel-j1", Fbessel_j1, 1, 1, 0, /* -Return the bessel function j1 of ARG. +Return the bessel function j1 of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = j1 (d), "bessel-j1", arg); + double d = extract_float (number); + IN_FLOAT (d = j1 (d), "bessel-j1", number); return make_float (d); } DEFUN ("bessel-jn", Fbessel_jn, 2, 2, 0, /* -Return the order N bessel function output jn of ARG. -The first arg (the order) is truncated to an integer. +Return the order N bessel function output jn of NUMBER. +The first number (the order) is truncated to an integer. */ - (arg1, arg2)) + (number1, number2)) { - int i1 = extract_float (arg1); - double f2 = extract_float (arg2); + int i1 = extract_float (number1); + double f2 = extract_float (number2); - IN_FLOAT (f2 = jn (i1, f2), "bessel-jn", arg1); + IN_FLOAT (f2 = jn (i1, f2), "bessel-jn", number1); return make_float (f2); } DEFUN ("bessel-y0", Fbessel_y0, 1, 1, 0, /* -Return the bessel function y0 of ARG. +Return the bessel function y0 of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = y0 (d), "bessel-y0", arg); + double d = extract_float (number); + IN_FLOAT (d = y0 (d), "bessel-y0", number); return make_float (d); } DEFUN ("bessel-y1", Fbessel_y1, 1, 1, 0, /* -Return the bessel function y1 of ARG. +Return the bessel function y1 of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = y1 (d), "bessel-y0", arg); + double d = extract_float (number); + IN_FLOAT (d = y1 (d), "bessel-y0", number); return make_float (d); } DEFUN ("bessel-yn", Fbessel_yn, 2, 2, 0, /* -Return the order N bessel function output yn of ARG. -The first arg (the order) is truncated to an integer. +Return the order N bessel function output yn of NUMBER. +The first number (the order) is truncated to an integer. */ - (arg1, arg2)) + (number1, number2)) { - int i1 = extract_float (arg1); - double f2 = extract_float (arg2); + int i1 = extract_float (number1); + double f2 = extract_float (number2); - IN_FLOAT (f2 = yn (i1, f2), "bessel-yn", arg1); + IN_FLOAT (f2 = yn (i1, f2), "bessel-yn", number1); return make_float (f2); } @@ -374,32 +376,32 @@ The first arg (the order) is truncated to an integer. /* #ifdef LISP_FLOAT_TYPE */ DEFUN ("erf", Ferf, 1, 1, 0, /* -Return the mathematical error function of ARG. +Return the mathematical error function of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = erf (d), "erf", arg); + double d = extract_float (number); + IN_FLOAT (d = erf (d), "erf", number); return make_float (d); } DEFUN ("erfc", Ferfc, 1, 1, 0, /* -Return the complementary error function of ARG. +Return the complementary error function of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = erfc (d), "erfc", arg); + double d = extract_float (number); + IN_FLOAT (d = erfc (d), "erfc", number); return make_float (d); } DEFUN ("log-gamma", Flog_gamma, 1, 1, 0, /* -Return the log gamma of ARG. +Return the log gamma of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = lgamma (d), "log-gamma", arg); + double d = extract_float (number); + IN_FLOAT (d = lgamma (d), "log-gamma", number); return make_float (d); } @@ -410,35 +412,35 @@ Return the log gamma of ARG. #ifdef LISP_FLOAT_TYPE DEFUN ("exp", Fexp, 1, 1, 0, /* -Return the exponential base e of ARG. +Return the exponential base e of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef FLOAT_CHECK_DOMAIN if (d > 709.7827) /* Assume IEEE doubles here */ - range_error ("exp", arg); + range_error ("exp", number); else if (d < -709.0) return make_float (0.0); else #endif - IN_FLOAT (d = exp (d), "exp", arg); + IN_FLOAT (d = exp (d), "exp", number); return make_float (d); } #endif /* LISP_FLOAT_TYPE */ DEFUN ("expt", Fexpt, 2, 2, 0, /* -Return the exponential ARG1 ** ARG2. +Return the exponential NUMBER1 ** NUMBER2. */ - (arg1, arg2)) + (number1, number2)) { - if (INTP (arg1) && /* common lisp spec */ - INTP (arg2)) /* don't promote, if both are ints */ + if (INTP (number1) && /* common lisp spec */ + INTP (number2)) /* don't promote, if both are ints */ { EMACS_INT retval; - EMACS_INT x = XINT (arg1); - EMACS_INT y = XINT (arg2); + EMACS_INT x = XINT (number1); + EMACS_INT y = XINT (number2); if (y < 0) { @@ -465,98 +467,99 @@ Return the exponential ARG1 ** ARG2. #ifdef LISP_FLOAT_TYPE { - double f1 = extract_float (arg1); - double f2 = extract_float (arg2); + double f1 = extract_float (number1); + double f2 = extract_float (number2); /* Really should check for overflow, too */ if (f1 == 0.0 && f2 == 0.0) f1 = 1.0; # ifdef FLOAT_CHECK_DOMAIN else if ((f1 == 0.0 && f2 < 0.0) || (f1 < 0 && f2 != floor(f2))) - domain_error2 ("expt", arg1, arg2); + domain_error2 ("expt", number1, number2); # endif /* FLOAT_CHECK_DOMAIN */ - IN_FLOAT2 (f1 = pow (f1, f2), "expt", arg1, arg2); + IN_FLOAT2 (f1 = pow (f1, f2), "expt", number1, number2); return make_float (f1); } #else - CHECK_INT_OR_FLOAT (arg1); - CHECK_INT_OR_FLOAT (arg2); - return Fexpt (arg1, arg2); + CHECK_INT_OR_FLOAT (number1); + CHECK_INT_OR_FLOAT (number2); + return Fexpt (number1, number2); #endif /* LISP_FLOAT_TYPE */ } #ifdef LISP_FLOAT_TYPE DEFUN ("log", Flog, 1, 2, 0, /* -Return the natural logarithm of ARG. -If second optional argument BASE is given, return log ARG using that base. +Return the natural logarithm of NUMBER. +If second optional argument BASE is given, return the logarithm of +NUMBER using that base. */ - (arg, base)) + (number, base)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef FLOAT_CHECK_DOMAIN if (d <= 0.0) - domain_error2 ("log", arg, base); + domain_error2 ("log", number, base); #endif if (NILP (base)) - IN_FLOAT (d = log (d), "log", arg); + IN_FLOAT (d = log (d), "log", number); else { double b = extract_float (base); #ifdef FLOAT_CHECK_DOMAIN if (b <= 0.0 || b == 1.0) - domain_error2 ("log", arg, base); + domain_error2 ("log", number, base); #endif if (b == 10.0) - IN_FLOAT2 (d = log10 (d), "log", arg, base); + IN_FLOAT2 (d = log10 (d), "log", number, base); else - IN_FLOAT2 (d = (log (d) / log (b)), "log", arg, base); + IN_FLOAT2 (d = (log (d) / log (b)), "log", number, base); } return make_float (d); } DEFUN ("log10", Flog10, 1, 1, 0, /* -Return the logarithm base 10 of ARG. +Return the logarithm base 10 of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef FLOAT_CHECK_DOMAIN if (d <= 0.0) - domain_error ("log10", arg); + domain_error ("log10", number); #endif - IN_FLOAT (d = log10 (d), "log10", arg); + IN_FLOAT (d = log10 (d), "log10", number); return make_float (d); } DEFUN ("sqrt", Fsqrt, 1, 1, 0, /* -Return the square root of ARG. +Return the square root of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef FLOAT_CHECK_DOMAIN if (d < 0.0) - domain_error ("sqrt", arg); + domain_error ("sqrt", number); #endif - IN_FLOAT (d = sqrt (d), "sqrt", arg); + IN_FLOAT (d = sqrt (d), "sqrt", number); return make_float (d); } DEFUN ("cube-root", Fcube_root, 1, 1, 0, /* -Return the cube root of ARG. +Return the cube root of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef HAVE_CBRT - IN_FLOAT (d = cbrt (d), "cube-root", arg); + IN_FLOAT (d = cbrt (d), "cube-root", number); #else if (d >= 0.0) - IN_FLOAT (d = pow (d, 1.0/3.0), "cube-root", arg); + IN_FLOAT (d = pow (d, 1.0/3.0), "cube-root", number); else - IN_FLOAT (d = -pow (-d, 1.0/3.0), "cube-root", arg); + IN_FLOAT (d = -pow (-d, 1.0/3.0), "cube-root", number); #endif return make_float (d); } @@ -568,90 +571,90 @@ Return the cube root of ARG. /* #if 0 Not clearly worth adding... */ DEFUN ("acosh", Facosh, 1, 1, 0, /* -Return the inverse hyperbolic cosine of ARG. +Return the inverse hyperbolic cosine of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef FLOAT_CHECK_DOMAIN if (d < 1.0) - domain_error ("acosh", arg); + domain_error ("acosh", number); #endif #ifdef HAVE_INVERSE_HYPERBOLIC - IN_FLOAT (d = acosh (d), "acosh", arg); + IN_FLOAT (d = acosh (d), "acosh", number); #else - IN_FLOAT (d = log (d + sqrt (d*d - 1.0)), "acosh", arg); + IN_FLOAT (d = log (d + sqrt (d*d - 1.0)), "acosh", number); #endif return make_float (d); } DEFUN ("asinh", Fasinh, 1, 1, 0, /* -Return the inverse hyperbolic sine of ARG. +Return the inverse hyperbolic sine of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef HAVE_INVERSE_HYPERBOLIC - IN_FLOAT (d = asinh (d), "asinh", arg); + IN_FLOAT (d = asinh (d), "asinh", number); #else - IN_FLOAT (d = log (d + sqrt (d*d + 1.0)), "asinh", arg); + IN_FLOAT (d = log (d + sqrt (d*d + 1.0)), "asinh", number); #endif return make_float (d); } DEFUN ("atanh", Fatanh, 1, 1, 0, /* -Return the inverse hyperbolic tangent of ARG. +Return the inverse hyperbolic tangent of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef FLOAT_CHECK_DOMAIN if (d >= 1.0 || d <= -1.0) - domain_error ("atanh", arg); + domain_error ("atanh", number); #endif #ifdef HAVE_INVERSE_HYPERBOLIC - IN_FLOAT (d = atanh (d), "atanh", arg); + IN_FLOAT (d = atanh (d), "atanh", number); #else - IN_FLOAT (d = 0.5 * log ((1.0 + d) / (1.0 - d)), "atanh", arg); + IN_FLOAT (d = 0.5 * log ((1.0 + d) / (1.0 - d)), "atanh", number); #endif return make_float (d); } DEFUN ("cosh", Fcosh, 1, 1, 0, /* -Return the hyperbolic cosine of ARG. +Return the hyperbolic cosine of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef FLOAT_CHECK_DOMAIN if (d > 710.0 || d < -710.0) - range_error ("cosh", arg); + range_error ("cosh", number); #endif - IN_FLOAT (d = cosh (d), "cosh", arg); + IN_FLOAT (d = cosh (d), "cosh", number); return make_float (d); } DEFUN ("sinh", Fsinh, 1, 1, 0, /* -Return the hyperbolic sine of ARG. +Return the hyperbolic sine of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); #ifdef FLOAT_CHECK_DOMAIN if (d > 710.0 || d < -710.0) - range_error ("sinh", arg); + range_error ("sinh", number); #endif - IN_FLOAT (d = sinh (d), "sinh", arg); + IN_FLOAT (d = sinh (d), "sinh", number); return make_float (d); } DEFUN ("tanh", Ftanh, 1, 1, 0, /* -Return the hyperbolic tangent of ARG. +Return the hyperbolic tangent of NUMBER. */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = tanh (d), "tanh", arg); + double d = extract_float (number); + IN_FLOAT (d = tanh (d), "tanh", number); return make_float (d); } #endif /* LISP_FLOAT_TYPE (inverse trig functions) */ @@ -659,64 +662,64 @@ Return the hyperbolic tangent of ARG. /* Rounding functions */ DEFUN ("abs", Fabs, 1, 1, 0, /* -Return the absolute value of ARG. +Return the absolute value of NUMBER. */ - (arg)) + (number)) { #ifdef LISP_FLOAT_TYPE - if (FLOATP (arg)) + if (FLOATP (number)) { - IN_FLOAT (arg = make_float (fabs (XFLOAT_DATA (arg))), - "abs", arg); - return arg; + IN_FLOAT (number = make_float (fabs (XFLOAT_DATA (number))), + "abs", number); + return number; } #endif /* LISP_FLOAT_TYPE */ - if (INTP (arg)) - return (XINT (arg) >= 0) ? arg : make_int (- XINT (arg)); + if (INTP (number)) + return (XINT (number) >= 0) ? number : make_int (- XINT (number)); - return Fabs (wrong_type_argument (Qnumberp, arg)); + return Fabs (wrong_type_argument (Qnumberp, number)); } #ifdef LISP_FLOAT_TYPE DEFUN ("float", Ffloat, 1, 1, 0, /* -Return the floating point number numerically equal to ARG. +Return the floating point number numerically equal to NUMBER. */ - (arg)) + (number)) { - if (INTP (arg)) - return make_float ((double) XINT (arg)); + if (INTP (number)) + return make_float ((double) XINT (number)); - if (FLOATP (arg)) /* give 'em the same float back */ - return arg; + if (FLOATP (number)) /* give 'em the same float back */ + return number; - return Ffloat (wrong_type_argument (Qnumberp, arg)); + return Ffloat (wrong_type_argument (Qnumberp, number)); } #endif /* LISP_FLOAT_TYPE */ #ifdef LISP_FLOAT_TYPE DEFUN ("logb", Flogb, 1, 1, 0, /* -Return largest integer <= the base 2 log of the magnitude of ARG. +Return largest integer <= the base 2 log of the magnitude of NUMBER. This is the same as the exponent of a float. */ - (arg)) + (number)) { - double f = extract_float (arg); + double f = extract_float (number); if (f == 0.0) return make_int (- (EMACS_INT)(((EMACS_UINT) 1) << (VALBITS - 1))); /* most-negative-fixnum */ #ifdef HAVE_LOGB { Lisp_Object val; - IN_FLOAT (val = make_int ((EMACS_INT) logb (f)), "logb", arg); + IN_FLOAT (val = make_int ((EMACS_INT) logb (f)), "logb", number); return val; } #else #ifdef HAVE_FREXP { int exqp; - IN_FLOAT (frexp (f, &exqp), "logb", arg); + IN_FLOAT (frexp (f, &exqp), "logb", number); return make_int (exqp - 1); } #else @@ -750,33 +753,34 @@ This is the same as the exponent of a float. DEFUN ("ceiling", Fceiling, 1, 1, 0, /* -Return the smallest integer no less than ARG. (Round toward +inf.) +Return the smallest integer no less than NUMBER. (Round toward +inf.) */ - (arg)) + (number)) { #ifdef LISP_FLOAT_TYPE - if (FLOATP (arg)) + if (FLOATP (number)) { double d; - IN_FLOAT ((d = ceil (XFLOAT_DATA (arg))), "ceiling", arg); - return (float_to_int (d, "ceiling", arg, Qunbound)); + IN_FLOAT ((d = ceil (XFLOAT_DATA (number))), "ceiling", number); + return (float_to_int (d, "ceiling", number, Qunbound)); } #endif /* LISP_FLOAT_TYPE */ - if (INTP (arg)) - return arg; + if (INTP (number)) + return number; - return Fceiling (wrong_type_argument (Qnumberp, arg)); + return Fceiling (wrong_type_argument (Qnumberp, number)); } DEFUN ("floor", Ffloor, 1, 2, 0, /* -Return the largest integer no greater than ARG. (Round towards -inf.) -With optional DIVISOR, return the largest integer no greater than ARG/DIVISOR. +Return the largest integer no greater than NUMBER. (Round towards -inf.) +With optional second argument DIVISOR, return the largest integer no +greater than NUMBER/DIVISOR. */ - (arg, divisor)) + (number, divisor)) { - CHECK_INT_OR_FLOAT (arg); + CHECK_INT_OR_FLOAT (number); if (! NILP (divisor)) { @@ -785,20 +789,20 @@ With optional DIVISOR, return the largest integer no greater than ARG/DIVISOR. CHECK_INT_OR_FLOAT (divisor); #ifdef LISP_FLOAT_TYPE - if (FLOATP (arg) || FLOATP (divisor)) + if (FLOATP (number) || FLOATP (divisor)) { - double f1 = extract_float (arg); + double f1 = extract_float (number); double f2 = extract_float (divisor); if (f2 == 0) Fsignal (Qarith_error, Qnil); - IN_FLOAT2 (f1 = floor (f1 / f2), "floor", arg, divisor); - return float_to_int (f1, "floor", arg, divisor); + IN_FLOAT2 (f1 = floor (f1 / f2), "floor", number, divisor); + return float_to_int (f1, "floor", number, divisor); } #endif /* LISP_FLOAT_TYPE */ - i1 = XINT (arg); + i1 = XINT (number); i2 = XINT (divisor); if (i2 == 0) @@ -814,53 +818,53 @@ With optional DIVISOR, return the largest integer no greater than ARG/DIVISOR. } #ifdef LISP_FLOAT_TYPE - if (FLOATP (arg)) + if (FLOATP (number)) { double d; - IN_FLOAT ((d = floor (XFLOAT_DATA (arg))), "floor", arg); - return (float_to_int (d, "floor", arg, Qunbound)); + IN_FLOAT ((d = floor (XFLOAT_DATA (number))), "floor", number); + return (float_to_int (d, "floor", number, Qunbound)); } #endif /* LISP_FLOAT_TYPE */ - return arg; + return number; } DEFUN ("round", Fround, 1, 1, 0, /* -Return the nearest integer to ARG. +Return the nearest integer to NUMBER. */ - (arg)) + (number)) { #ifdef LISP_FLOAT_TYPE - if (FLOATP (arg)) + if (FLOATP (number)) { double d; /* Screw the prevailing rounding mode. */ - IN_FLOAT ((d = emacs_rint (XFLOAT_DATA (arg))), "round", arg); - return (float_to_int (d, "round", arg, Qunbound)); + IN_FLOAT ((d = emacs_rint (XFLOAT_DATA (number))), "round", number); + return (float_to_int (d, "round", number, Qunbound)); } #endif /* LISP_FLOAT_TYPE */ - if (INTP (arg)) - return arg; + if (INTP (number)) + return number; - return Fround (wrong_type_argument (Qnumberp, arg)); + return Fround (wrong_type_argument (Qnumberp, number)); } DEFUN ("truncate", Ftruncate, 1, 1, 0, /* Truncate a floating point number to an integer. Rounds the value toward zero. */ - (arg)) + (number)) { #ifdef LISP_FLOAT_TYPE - if (FLOATP (arg)) - return float_to_int (XFLOAT_DATA (arg), "truncate", arg, Qunbound); + if (FLOATP (number)) + return float_to_int (XFLOAT_DATA (number), "truncate", number, Qunbound); #endif /* LISP_FLOAT_TYPE */ - if (INTP (arg)) - return arg; + if (INTP (number)) + return number; - return Ftruncate (wrong_type_argument (Qnumberp, arg)); + return Ftruncate (wrong_type_argument (Qnumberp, number)); } /* Float-rounding functions. */ @@ -868,34 +872,34 @@ Rounds the value toward zero. /* #if 1 It's not clear these are worth adding... */ DEFUN ("fceiling", Ffceiling, 1, 1, 0, /* -Return the smallest integer no less than ARG, as a float. +Return the smallest integer no less than NUMBER, as a float. \(Round toward +inf.\) */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = ceil (d), "fceiling", arg); + double d = extract_float (number); + IN_FLOAT (d = ceil (d), "fceiling", number); return make_float (d); } DEFUN ("ffloor", Fffloor, 1, 1, 0, /* -Return the largest integer no greater than ARG, as a float. +Return the largest integer no greater than NUMBER, as a float. \(Round towards -inf.\) */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = floor (d), "ffloor", arg); + double d = extract_float (number); + IN_FLOAT (d = floor (d), "ffloor", number); return make_float (d); } DEFUN ("fround", Ffround, 1, 1, 0, /* -Return the nearest integer to ARG, as a float. +Return the nearest integer to NUMBER, as a float. */ - (arg)) + (number)) { - double d = extract_float (arg); - IN_FLOAT (d = emacs_rint (d), "fround", arg); + double d = extract_float (number); + IN_FLOAT (d = emacs_rint (d), "fround", number); return make_float (d); } @@ -903,13 +907,13 @@ DEFUN ("ftruncate", Fftruncate, 1, 1, 0, /* Truncate a floating point number to an integral float value. Rounds the value toward zero. */ - (arg)) + (number)) { - double d = extract_float (arg); + double d = extract_float (number); if (d >= 0.0) - IN_FLOAT (d = floor (d), "ftruncate", arg); + IN_FLOAT (d = floor (d), "ftruncate", number); else - IN_FLOAT (d = ceil (d), "ftruncate", arg); + IN_FLOAT (d = ceil (d), "ftruncate", number); return make_float (d); } diff --git a/src/fns.c b/src/fns.c index 3162a1a..8cfab15 100644 --- a/src/fns.c +++ b/src/fns.c @@ -270,25 +270,25 @@ strings, but this is not the case under FSF Emacs 19. In FSF Emacs 20 `equal' is the same as in XEmacs, in that respect.) Symbols are also allowed; their print names are used instead. */ - (s1, s2)) + (string1, string2)) { Bytecount len; Lisp_String *p1, *p2; - if (SYMBOLP (s1)) - p1 = XSYMBOL (s1)->name; + if (SYMBOLP (string1)) + p1 = XSYMBOL (string1)->name; else { - CHECK_STRING (s1); - p1 = XSTRING (s1); + CHECK_STRING (string1); + p1 = XSTRING (string1); } - if (SYMBOLP (s2)) - p2 = XSYMBOL (s2)->name; + if (SYMBOLP (string2)) + p2 = XSYMBOL (string2)->name; else { - CHECK_STRING (s2); - p2 = XSTRING (s2); + CHECK_STRING (string2); + p2 = XSTRING (string2); } return (((len = string_length (p1)) == string_length (p2)) && @@ -318,26 +318,26 @@ it is quite likely that a collation table exists (or will exist) for Unicode. When Unicode support is added to XEmacs/Mule, this problem may be solved. */ - (s1, s2)) + (string1, string2)) { Lisp_String *p1, *p2; Charcount end, len2; int i; - if (SYMBOLP (s1)) - p1 = XSYMBOL (s1)->name; + if (SYMBOLP (string1)) + p1 = XSYMBOL (string1)->name; else { - CHECK_STRING (s1); - p1 = XSTRING (s1); + CHECK_STRING (string1); + p1 = XSTRING (string1); } - if (SYMBOLP (s2)) - p2 = XSYMBOL (s2)->name; + if (SYMBOLP (string2)) + p2 = XSYMBOL (string2)->name; else { - CHECK_STRING (s2); - p2 = XSTRING (s2); + CHECK_STRING (string2); + p2 = XSTRING (string2); } end = string_char_length (p1); @@ -435,40 +435,40 @@ static Lisp_Object concat (int nargs, Lisp_Object *args, int last_special); Lisp_Object -concat2 (Lisp_Object s1, Lisp_Object s2) +concat2 (Lisp_Object string1, Lisp_Object string2) { Lisp_Object args[2]; - args[0] = s1; - args[1] = s2; + args[0] = string1; + args[1] = string2; return concat (2, args, c_string, 0); } Lisp_Object -concat3 (Lisp_Object s1, Lisp_Object s2, Lisp_Object s3) +concat3 (Lisp_Object string1, Lisp_Object string2, Lisp_Object string3) { Lisp_Object args[3]; - args[0] = s1; - args[1] = s2; - args[2] = s3; + args[0] = string1; + args[1] = string2; + args[2] = string3; return concat (3, args, c_string, 0); } Lisp_Object -vconcat2 (Lisp_Object s1, Lisp_Object s2) +vconcat2 (Lisp_Object vec1, Lisp_Object vec2) { Lisp_Object args[2]; - args[0] = s1; - args[1] = s2; + args[0] = vec1; + args[1] = vec2; return concat (2, args, c_vector, 0); } Lisp_Object -vconcat3 (Lisp_Object s1, Lisp_Object s2, Lisp_Object s3) +vconcat3 (Lisp_Object vec1, Lisp_Object vec2, Lisp_Object vec3) { Lisp_Object args[3]; - args[0] = s1; - args[1] = s2; - args[2] = s3; + args[0] = vec1; + args[1] = vec2; + args[2] = vec3; return concat (3, args, c_vector, 0); } @@ -895,26 +895,26 @@ are not copied. } DEFUN ("substring", Fsubstring, 2, 3, 0, /* -Return a substring of STRING, starting at index FROM and ending before TO. -TO may be nil or omitted; then the substring runs to the end of STRING. -If FROM or TO is negative, it counts from the end. -Relevant parts of the string-extent-data are copied in the new string. +Return the substring of STRING starting at START and ending before END. +END may be nil or omitted; then the substring runs to the end of STRING. +If START or END is negative, it counts from the end. +Relevant parts of the string-extent-data are copied to the new string. */ - (string, from, to)) + (string, start, end)) { - Charcount ccfr, ccto; - Bytecount bfr, blen; + Charcount ccstart, ccend; + Bytecount bstart, blen; Lisp_Object val; CHECK_STRING (string); - CHECK_INT (from); - get_string_range_char (string, from, to, &ccfr, &ccto, + CHECK_INT (start); + get_string_range_char (string, start, end, &ccstart, &ccend, GB_HISTORICAL_STRING_BEHAVIOR); - bfr = charcount_to_bytecount (XSTRING_DATA (string), ccfr); - blen = charcount_to_bytecount (XSTRING_DATA (string) + bfr, ccto - ccfr); - val = make_string (XSTRING_DATA (string) + bfr, blen); - /* Copy any applicable extent information into the new string: */ - copy_string_extents (val, string, 0, bfr, blen); + bstart = charcount_to_bytecount (XSTRING_DATA (string), ccstart); + blen = charcount_to_bytecount (XSTRING_DATA (string) + bstart, ccend - ccstart); + val = make_string (XSTRING_DATA (string) + bstart, blen); + /* Copy any applicable extent information into the new string. */ + copy_string_extents (val, string, 0, bstart, blen); return val; } @@ -1185,7 +1185,7 @@ If LIST has N or fewer elements, nil is returned. */ (list, n)) { - int int_n; + EMACS_INT int_n; CHECK_LIST (list); @@ -1286,13 +1286,13 @@ memq_no_quit (Lisp_Object elt, Lisp_Object list) } DEFUN ("assoc", Fassoc, 2, 2, 0, /* -Return non-nil if KEY is `equal' to the car of an element of LIST. -The value is actually the element of LIST whose car equals KEY. +Return non-nil if KEY is `equal' to the car of an element of ALIST. +The value is actually the element of ALIST whose car equals KEY. */ - (key, list)) + (key, alist)) { /* This function can GC. */ - EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list) + EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist) { if (internal_equal (key, elt_car, 0)) return elt; @@ -1301,13 +1301,13 @@ The value is actually the element of LIST whose car equals KEY. } DEFUN ("old-assoc", Fold_assoc, 2, 2, 0, /* -Return non-nil if KEY is `old-equal' to the car of an element of LIST. -The value is actually the element of LIST whose car equals KEY. +Return non-nil if KEY is `old-equal' to the car of an element of ALIST. +The value is actually the element of ALIST whose car equals KEY. */ - (key, list)) + (key, alist)) { /* This function can GC. */ - EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list) + EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist) { if (internal_old_equal (key, elt_car, 0)) return elt; @@ -1316,21 +1316,21 @@ The value is actually the element of LIST whose car equals KEY. } Lisp_Object -assoc_no_quit (Lisp_Object key, Lisp_Object list) +assoc_no_quit (Lisp_Object key, Lisp_Object alist) { int speccount = specpdl_depth (); specbind (Qinhibit_quit, Qt); - return unbind_to (speccount, Fassoc (key, list)); + return unbind_to (speccount, Fassoc (key, alist)); } DEFUN ("assq", Fassq, 2, 2, 0, /* -Return non-nil if KEY is `eq' to the car of an element of LIST. -The value is actually the element of LIST whose car is KEY. -Elements of LIST that are not conses are ignored. +Return non-nil if KEY is `eq' to the car of an element of ALIST. +The value is actually the element of ALIST whose car is KEY. +Elements of ALIST that are not conses are ignored. */ - (key, list)) + (key, alist)) { - EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list) + EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist) { if (EQ_WITH_EBOLA_NOTICE (key, elt_car)) return elt; @@ -1339,15 +1339,15 @@ Elements of LIST that are not conses are ignored. } DEFUN ("old-assq", Fold_assq, 2, 2, 0, /* -Return non-nil if KEY is `old-eq' to the car of an element of LIST. -The value is actually the element of LIST whose car is KEY. -Elements of LIST that are not conses are ignored. +Return non-nil if KEY is `old-eq' to the car of an element of ALIST. +The value is actually the element of ALIST whose car is KEY. +Elements of ALIST that are not conses are ignored. This function is provided only for byte-code compatibility with v19. Do not use it. */ - (key, list)) + (key, alist)) { - EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list) + EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist) { if (HACKEQ_UNSAFE (key, elt_car)) return elt; @@ -1359,10 +1359,10 @@ Do not use it. Use only on lists known never to be circular. */ Lisp_Object -assq_no_quit (Lisp_Object key, Lisp_Object list) +assq_no_quit (Lisp_Object key, Lisp_Object alist) { /* This cannot GC. */ - LIST_LOOP_2 (elt, list) + LIST_LOOP_2 (elt, alist) { Lisp_Object elt_car = XCAR (elt); if (EQ_WITH_EBOLA_NOTICE (key, elt_car)) @@ -1372,70 +1372,70 @@ assq_no_quit (Lisp_Object key, Lisp_Object list) } DEFUN ("rassoc", Frassoc, 2, 2, 0, /* -Return non-nil if KEY is `equal' to the cdr of an element of LIST. -The value is actually the element of LIST whose cdr equals KEY. +Return non-nil if VALUE is `equal' to the cdr of an element of ALIST. +The value is actually the element of ALIST whose cdr equals VALUE. */ - (key, list)) + (value, alist)) { - EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list) + EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist) { - if (internal_equal (key, elt_cdr, 0)) + if (internal_equal (value, elt_cdr, 0)) return elt; } return Qnil; } DEFUN ("old-rassoc", Fold_rassoc, 2, 2, 0, /* -Return non-nil if KEY is `old-equal' to the cdr of an element of LIST. -The value is actually the element of LIST whose cdr equals KEY. +Return non-nil if VALUE is `old-equal' to the cdr of an element of ALIST. +The value is actually the element of ALIST whose cdr equals VALUE. */ - (key, list)) + (value, alist)) { - EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list) + EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist) { - if (internal_old_equal (key, elt_cdr, 0)) + if (internal_old_equal (value, elt_cdr, 0)) return elt; } return Qnil; } DEFUN ("rassq", Frassq, 2, 2, 0, /* -Return non-nil if KEY is `eq' to the cdr of an element of LIST. -The value is actually the element of LIST whose cdr is KEY. +Return non-nil if VALUE is `eq' to the cdr of an element of ALIST. +The value is actually the element of ALIST whose cdr is VALUE. */ - (key, list)) + (value, alist)) { - EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list) + EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist) { - if (EQ_WITH_EBOLA_NOTICE (key, elt_cdr)) + if (EQ_WITH_EBOLA_NOTICE (value, elt_cdr)) return elt; } return Qnil; } DEFUN ("old-rassq", Fold_rassq, 2, 2, 0, /* -Return non-nil if KEY is `old-eq' to the cdr of an element of LIST. -The value is actually the element of LIST whose cdr is KEY. +Return non-nil if VALUE is `old-eq' to the cdr of an element of ALIST. +The value is actually the element of ALIST whose cdr is VALUE. */ - (key, list)) + (value, alist)) { - EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, list) + EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist) { - if (HACKEQ_UNSAFE (key, elt_cdr)) + if (HACKEQ_UNSAFE (value, elt_cdr)) return elt; } return Qnil; } -/* Like Frassq, but caller must ensure that LIST is properly +/* Like Frassq, but caller must ensure that ALIST is properly nil-terminated and ebola-free. */ Lisp_Object -rassq_no_quit (Lisp_Object key, Lisp_Object list) +rassq_no_quit (Lisp_Object value, Lisp_Object alist) { - LIST_LOOP_2 (elt, list) + LIST_LOOP_2 (elt, alist) { Lisp_Object elt_cdr = XCDR (elt); - if (EQ_WITH_EBOLA_NOTICE (key, elt_cdr)) + if (EQ_WITH_EBOLA_NOTICE (value, elt_cdr)) return elt; } return Qnil; @@ -1546,92 +1546,92 @@ delq_no_quit_and_free_cons (Lisp_Object elt, Lisp_Object list) } DEFUN ("remassoc", Fremassoc, 2, 2, 0, /* -Delete by side effect any elements of LIST whose car is `equal' to KEY. -The modified LIST is returned. If the first member of LIST has a car +Delete by side effect any elements of ALIST whose car is `equal' to KEY. +The modified ALIST is returned. If the first member of ALIST has a car that is `equal' to KEY, there is no way to remove it by side effect; therefore, write `(setq foo (remassoc key foo))' to be sure of changing the value of `foo'. */ - (key, list)) + (key, alist)) { - EXTERNAL_LIST_LOOP_DELETE_IF (elt, list, + EXTERNAL_LIST_LOOP_DELETE_IF (elt, alist, (CONSP (elt) && internal_equal (key, XCAR (elt), 0))); - return list; + return alist; } Lisp_Object -remassoc_no_quit (Lisp_Object key, Lisp_Object list) +remassoc_no_quit (Lisp_Object key, Lisp_Object alist) { int speccount = specpdl_depth (); specbind (Qinhibit_quit, Qt); - return unbind_to (speccount, Fremassoc (key, list)); + return unbind_to (speccount, Fremassoc (key, alist)); } DEFUN ("remassq", Fremassq, 2, 2, 0, /* -Delete by side effect any elements of LIST whose car is `eq' to KEY. -The modified LIST is returned. If the first member of LIST has a car +Delete by side effect any elements of ALIST whose car is `eq' to KEY. +The modified ALIST is returned. If the first member of ALIST has a car that is `eq' to KEY, there is no way to remove it by side effect; therefore, write `(setq foo (remassq key foo))' to be sure of changing the value of `foo'. */ - (key, list)) + (key, alist)) { - EXTERNAL_LIST_LOOP_DELETE_IF (elt, list, + EXTERNAL_LIST_LOOP_DELETE_IF (elt, alist, (CONSP (elt) && EQ_WITH_EBOLA_NOTICE (key, XCAR (elt)))); - return list; + return alist; } /* no quit, no errors; be careful */ Lisp_Object -remassq_no_quit (Lisp_Object key, Lisp_Object list) +remassq_no_quit (Lisp_Object key, Lisp_Object alist) { - LIST_LOOP_DELETE_IF (elt, list, + LIST_LOOP_DELETE_IF (elt, alist, (CONSP (elt) && EQ_WITH_EBOLA_NOTICE (key, XCAR (elt)))); - return list; + return alist; } DEFUN ("remrassoc", Fremrassoc, 2, 2, 0, /* -Delete by side effect any elements of LIST whose cdr is `equal' to VALUE. -The modified LIST is returned. If the first member of LIST has a car +Delete by side effect any elements of ALIST whose cdr is `equal' to VALUE. +The modified ALIST is returned. If the first member of ALIST has a car that is `equal' to VALUE, there is no way to remove it by side effect; therefore, write `(setq foo (remrassoc value foo))' to be sure of changing the value of `foo'. */ - (value, list)) + (value, alist)) { - EXTERNAL_LIST_LOOP_DELETE_IF (elt, list, + EXTERNAL_LIST_LOOP_DELETE_IF (elt, alist, (CONSP (elt) && internal_equal (value, XCDR (elt), 0))); - return list; + return alist; } DEFUN ("remrassq", Fremrassq, 2, 2, 0, /* -Delete by side effect any elements of LIST whose cdr is `eq' to VALUE. -The modified LIST is returned. If the first member of LIST has a car +Delete by side effect any elements of ALIST whose cdr is `eq' to VALUE. +The modified ALIST is returned. If the first member of ALIST has a car that is `eq' to VALUE, there is no way to remove it by side effect; therefore, write `(setq foo (remrassq value foo))' to be sure of changing the value of `foo'. */ - (value, list)) + (value, alist)) { - EXTERNAL_LIST_LOOP_DELETE_IF (elt, list, + EXTERNAL_LIST_LOOP_DELETE_IF (elt, alist, (CONSP (elt) && EQ_WITH_EBOLA_NOTICE (value, XCDR (elt)))); - return list; + return alist; } /* Like Fremrassq, fast and unsafe; be careful */ Lisp_Object -remrassq_no_quit (Lisp_Object value, Lisp_Object list) +remrassq_no_quit (Lisp_Object value, Lisp_Object alist) { - LIST_LOOP_DELETE_IF (elt, list, + LIST_LOOP_DELETE_IF (elt, alist, (CONSP (elt) && EQ_WITH_EBOLA_NOTICE (value, XCDR (elt)))); - return list; + return alist; } DEFUN ("nreverse", Fnreverse, 1, 1, 0, /* @@ -1689,12 +1689,11 @@ list_sort (Lisp_Object list, Lisp_Object back, tem; Lisp_Object front = list; Lisp_Object len = Flength (list); - int length = XINT (len); - if (length < 2) + if (XINT (len) < 2) return list; - XSETINT (len, (length / 2) - 1); + len = make_int (XINT (len) / 2 - 1); tem = Fnthcdr (len, list); back = Fcdr (tem); Fsetcdr (tem, Qnil); @@ -1735,9 +1734,9 @@ Returns the sorted list. LIST is modified by side effects. PREDICATE is called with two elements of LIST, and should return T if the first element is "less" than the second. */ - (list, pred)) + (list, predicate)) { - return list_sort (list, pred, merge_pred_function); + return list_sort (list, predicate, merge_pred_function); } Lisp_Object @@ -2267,51 +2266,54 @@ external_remprop (Lisp_Object *plist, Lisp_Object property, DEFUN ("plist-get", Fplist_get, 2, 3, 0, /* Extract a value from a property list. PLIST is a property list, which is a list of the form -\(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value -corresponding to the given PROP, or DEFAULT if PROP is not -one of the properties on the list. +\(PROPERTY1 VALUE1 PROPERTY2 VALUE2...). +PROPERTY is usually a symbol. +This function returns the value corresponding to the PROPERTY, +or DEFAULT if PROPERTY is not one of the properties on the list. */ - (plist, prop, default_)) + (plist, property, default_)) { - Lisp_Object val = external_plist_get (&plist, prop, 0, ERROR_ME); - return UNBOUNDP (val) ? default_ : val; + Lisp_Object value = external_plist_get (&plist, property, 0, ERROR_ME); + return UNBOUNDP (value) ? default_ : value; } DEFUN ("plist-put", Fplist_put, 3, 3, 0, /* -Change value in PLIST of PROP to VAL. -PLIST is a property list, which is a list of the form \(PROP1 VALUE1 -PROP2 VALUE2 ...). PROP is usually a symbol and VAL is any object. -If PROP is already a property on the list, its value is set to VAL, -otherwise the new PROP VAL pair is added. The new plist is returned; -use `(setq x (plist-put x prop val))' to be sure to use the new value. -The PLIST is modified by side effects. +Change value in PLIST of PROPERTY to VALUE. +PLIST is a property list, which is a list of the form +\(PROPERTY1 VALUE1 PROPERTY2 VALUE2 ...). +PROPERTY is usually a symbol and VALUE is any object. +If PROPERTY is already a property on the list, its value is set to VALUE, +otherwise the new PROPERTY VALUE pair is added. +The new plist is returned; use `(setq x (plist-put x property value))' +to be sure to use the new value. PLIST is modified by side effect. */ - (plist, prop, val)) + (plist, property, value)) { - external_plist_put (&plist, prop, val, 0, ERROR_ME); + external_plist_put (&plist, property, value, 0, ERROR_ME); return plist; } DEFUN ("plist-remprop", Fplist_remprop, 2, 2, 0, /* -Remove from PLIST the property PROP and its value. -PLIST is a property list, which is a list of the form \(PROP1 VALUE1 -PROP2 VALUE2 ...). PROP is usually a symbol. The new plist is -returned; use `(setq x (plist-remprop x prop val))' to be sure to use -the new value. The PLIST is modified by side effects. +Remove from PLIST the property PROPERTY and its value. +PLIST is a property list, which is a list of the form +\(PROPERTY1 VALUE1 PROPERTY2 VALUE2 ...). +PROPERTY is usually a symbol. +The new plist is returned; use `(setq x (plist-remprop x property))' +to be sure to use the new value. PLIST is modified by side effect. */ - (plist, prop)) + (plist, property)) { - external_remprop (&plist, prop, 0, ERROR_ME); + external_remprop (&plist, property, 0, ERROR_ME); return plist; } DEFUN ("plist-member", Fplist_member, 2, 2, 0, /* -Return t if PROP has a value specified in PLIST. +Return t if PROPERTY has a value specified in PLIST. */ - (plist, prop)) + (plist, property)) { - Lisp_Object val = Fplist_get (plist, prop, Qunbound); - return UNBOUNDP (val) ? Qnil : Qt; + Lisp_Object value = Fplist_get (plist, property, Qunbound); + return UNBOUNDP (value) ? Qnil : Qt; } DEFUN ("check-valid-plist", Fcheck_valid_plist, 1, 1, 0, /* @@ -2409,58 +2411,60 @@ The new plist is returned. If NIL-MEANS-NOT-PRESENT is given, the DEFUN ("lax-plist-get", Flax_plist_get, 2, 3, 0, /* Extract a value from a lax property list. - -LAX-PLIST is a lax property list, which is a list of the form \(PROP1 -VALUE1 PROP2 VALUE2...), where comparisons between properties is done -using `equal' instead of `eq'. This function returns the value -corresponding to the given PROP, or DEFAULT if PROP is not one of the -properties on the list. +LAX-PLIST is a lax property list, which is a list of the form +\(PROPERTY1 VALUE1 PROPERTY2 VALUE2...), where comparisons between +properties is done using `equal' instead of `eq'. +PROPERTY is usually a symbol. +This function returns the value corresponding to PROPERTY, +or DEFAULT if PROPERTY is not one of the properties on the list. */ - (lax_plist, prop, default_)) + (lax_plist, property, default_)) { - Lisp_Object val = external_plist_get (&lax_plist, prop, 1, ERROR_ME); - return UNBOUNDP (val) ? default_ : val; + Lisp_Object value = external_plist_get (&lax_plist, property, 1, ERROR_ME); + return UNBOUNDP (value) ? default_ : value; } DEFUN ("lax-plist-put", Flax_plist_put, 3, 3, 0, /* -Change value in LAX-PLIST of PROP to VAL. -LAX-PLIST is a lax property list, which is a list of the form \(PROP1 -VALUE1 PROP2 VALUE2...), where comparisons between properties is done -using `equal' instead of `eq'. PROP is usually a symbol and VAL is -any object. If PROP is already a property on the list, its value is -set to VAL, otherwise the new PROP VAL pair is added. The new plist -is returned; use `(setq x (lax-plist-put x prop val))' to be sure to -use the new value. The LAX-PLIST is modified by side effects. -*/ - (lax_plist, prop, val)) -{ - external_plist_put (&lax_plist, prop, val, 1, ERROR_ME); +Change value in LAX-PLIST of PROPERTY to VALUE. +LAX-PLIST is a lax property list, which is a list of the form +\(PROPERTY1 VALUE1 PROPERTY2 VALUE2...), where comparisons between +properties is done using `equal' instead of `eq'. +PROPERTY is usually a symbol and VALUE is any object. +If PROPERTY is already a property on the list, its value is set to +VALUE, otherwise the new PROPERTY VALUE pair is added. +The new plist is returned; use `(setq x (lax-plist-put x property value))' +to be sure to use the new value. LAX-PLIST is modified by side effect. +*/ + (lax_plist, property, value)) +{ + external_plist_put (&lax_plist, property, value, 1, ERROR_ME); return lax_plist; } DEFUN ("lax-plist-remprop", Flax_plist_remprop, 2, 2, 0, /* -Remove from LAX-PLIST the property PROP and its value. -LAX-PLIST is a lax property list, which is a list of the form \(PROP1 -VALUE1 PROP2 VALUE2...), where comparisons between properties is done -using `equal' instead of `eq'. PROP is usually a symbol. The new -plist is returned; use `(setq x (lax-plist-remprop x prop val))' to be -sure to use the new value. The LAX-PLIST is modified by side effects. +Remove from LAX-PLIST the property PROPERTY and its value. +LAX-PLIST is a lax property list, which is a list of the form +\(PROPERTY1 VALUE1 PROPERTY2 VALUE2...), where comparisons between +properties is done using `equal' instead of `eq'. +PROPERTY is usually a symbol. +The new plist is returned; use `(setq x (lax-plist-remprop x property))' +to be sure to use the new value. LAX-PLIST is modified by side effect. */ - (lax_plist, prop)) + (lax_plist, property)) { - external_remprop (&lax_plist, prop, 1, ERROR_ME); + external_remprop (&lax_plist, property, 1, ERROR_ME); return lax_plist; } DEFUN ("lax-plist-member", Flax_plist_member, 2, 2, 0, /* -Return t if PROP has a value specified in LAX-PLIST. -LAX-PLIST is a lax property list, which is a list of the form \(PROP1 -VALUE1 PROP2 VALUE2...), where comparisons between properties is done -using `equal' instead of `eq'. +Return t if PROPERTY has a value specified in LAX-PLIST. +LAX-PLIST is a lax property list, which is a list of the form +\(PROPERTY1 VALUE1 PROPERTY2 VALUE2...), where comparisons between +properties is done using `equal' instead of `eq'. */ - (lax_plist, prop)) + (lax_plist, property)) { - return UNBOUNDP (Flax_plist_get (lax_plist, prop, Qunbound)) ? Qnil : Qt; + return UNBOUNDP (Flax_plist_get (lax_plist, property, Qunbound)) ? Qnil : Qt; } DEFUN ("canonicalize-lax-plist", Fcanonicalize_lax_plist, 1, 2, 0, /* @@ -2679,9 +2683,9 @@ Conses are compared by comparing the cars and the cdrs. Vectors and strings are compared element by element. Numbers are compared by value. Symbols must match exactly. */ - (obj1, obj2)) + (object1, object2)) { - return internal_equal (obj1, obj2, 0) ? Qt : Qnil; + return internal_equal (object1, object2, 0) ? Qt : Qnil; } DEFUN ("old-equal", Fold_equal, 2, 2, 0, /* @@ -2693,9 +2697,9 @@ this is known as the "char-int confoundance disease." See `eq' and This function is provided only for byte-code compatibility with v19. Do not use it. */ - (obj1, obj2)) + (object1, object2)) { - return internal_old_equal (obj1, obj2, 0) ? Qt : Qnil; + return internal_old_equal (object1, object2, 0) ? Qt : Qnil; } @@ -2735,7 +2739,7 @@ ARRAY is a vector, bit vector, or string. else if (VECTORP (array)) { Lisp_Object *p = XVECTOR_DATA (array); - int len = XVECTOR_LENGTH (array); + size_t len = XVECTOR_LENGTH (array); CHECK_LISP_WRITEABLE (array); while (len--) *p++ = item; @@ -2743,11 +2747,11 @@ ARRAY is a vector, bit vector, or string. else if (BIT_VECTORP (array)) { Lisp_Bit_Vector *v = XBIT_VECTOR (array); - int len = bit_vector_length (v); + size_t len = bit_vector_length (v); int bit; CHECK_BIT (item); - CHECK_LISP_WRITEABLE (array); bit = XINT (item); + CHECK_LISP_WRITEABLE (array); while (len--) set_bit_vector_bit (v, len, bit); } @@ -2782,7 +2786,7 @@ bytecode_nconc2 (Lisp_Object *args) { /* (setcdr (last args[0]) args[1]) */ Lisp_Object tortoise, hare; - int count; + size_t count; for (hare = tortoise = args[0], count = 0; CONSP (XCDR (hare)); @@ -2851,7 +2855,7 @@ changing the value of `foo'. if (CONSP (next) || argnum == nargs -1) { /* (setcdr (last val) next) */ - int count; + size_t count; for (count = 0; CONSP (XCDR (last_cons)); @@ -2905,7 +2909,6 @@ mapcar1 (size_t leni, Lisp_Object *vals, { Lisp_Object result; Lisp_Object args[2]; - int i; struct gcpro gcpro1; if (vals) @@ -2935,6 +2938,7 @@ mapcar1 (size_t leni, Lisp_Object *vals, if (vals) { Lisp_Object *val = vals; + size_t i; LIST_LOOP_2 (elt, sequence) *val++ = elt; @@ -2969,6 +2973,7 @@ mapcar1 (size_t leni, Lisp_Object *vals, else if (VECTORP (sequence)) { Lisp_Object *objs = XVECTOR_DATA (sequence); + size_t i; for (i = 0; i < leni; i++) { args[1] = *objs++; @@ -2996,6 +3001,7 @@ mapcar1 (size_t leni, Lisp_Object *vals, else if (BIT_VECTORP (sequence)) { Lisp_Bit_Vector *v = XBIT_VECTOR (sequence); + size_t i; for (i = 0; i < leni; i++) { args[1] = make_int (bit_vector_bit (v, i)); @@ -3018,10 +3024,10 @@ SEQUENCE may be a list, a vector, a bit vector, or a string. */ (function, sequence, separator)) { - size_t len = XINT (Flength (sequence)); + EMACS_INT len = XINT (Flength (sequence)); Lisp_Object *args; - int i; - int nargs = len + len - 1; + EMACS_INT i; + EMACS_INT nargs = len + len - 1; if (len == 0) return build_string (""); @@ -3312,7 +3318,7 @@ If FEATURE is not a member of the list `features', then the feature is not loaded; so load the file FILENAME. If FILENAME is omitted, the printname of FEATURE is used as the file name. */ - (feature, file_name)) + (feature, filename)) { Lisp_Object tem; CHECK_SYMBOL (feature); @@ -3328,7 +3334,7 @@ If FILENAME is omitted, the printname of FEATURE is used as the file name. record_unwind_protect (un_autoload, Vautoload_queue); Vautoload_queue = Qt; - call4 (Qload, NILP (file_name) ? Fsymbol_name (feature) : file_name, + call4 (Qload, NILP (filename) ? Fsymbol_name (feature) : filename, Qnil, Qt, Qnil); tem = Fmemq (feature, Vfeatures); @@ -3587,12 +3593,12 @@ free_malloced_ptr (Lisp_Object unwind_obj) } while (0) DEFUN ("base64-encode-region", Fbase64_encode_region, 2, 3, "r", /* -Base64-encode the region between BEG and END. +Base64-encode the region between START and END. Return the length of the encoded text. Optional third argument NO-LINE-BREAK means do not break long lines into shorter lines. */ - (beg, end, no_line_break)) + (start, end, no_line_break)) { Bufbyte *encoded; Bytind encoded_length; @@ -3602,7 +3608,7 @@ into shorter lines. Lisp_Object input; int speccount = specpdl_depth(); - get_buffer_range_char (buf, beg, end, &begv, &zv, 0); + get_buffer_range_char (buf, start, end, &begv, &zv, 0); barf_if_buffer_read_only (buf, begv, zv); /* We need to allocate enough room for encoding the text. @@ -3639,6 +3645,8 @@ into shorter lines. DEFUN ("base64-encode-string", Fbase64_encode_string, 1, 2, 0, /* Base64 encode STRING and return the result. +Optional argument NO-LINE-BREAK means do not break long lines +into shorter lines. */ (string, no_line_break)) { @@ -3667,12 +3675,12 @@ Base64 encode STRING and return the result. } DEFUN ("base64-decode-region", Fbase64_decode_region, 2, 2, "r", /* -Base64-decode the region between BEG and END. +Base64-decode the region between START and END. Return the length of the decoded text. If the region can't be decoded, return nil and don't modify the buffer. Characters out of the base64 alphabet are ignored. */ - (beg, end)) + (start, end)) { struct buffer *buf = current_buffer; Bufpos begv, zv, old_pt = BUF_PT (buf); @@ -3682,7 +3690,7 @@ Characters out of the base64 alphabet are ignored. Lisp_Object input; int speccount = specpdl_depth(); - get_buffer_range_char (buf, beg, end, &begv, &zv, 0); + get_buffer_range_char (buf, start, end, &begv, &zv, 0); barf_if_buffer_read_only (buf, begv, zv); length = zv - begv; diff --git a/src/frame.c b/src/frame.c index 092ee6f..422566b 100644 --- a/src/frame.c +++ b/src/frame.c @@ -972,7 +972,7 @@ is_surrogate_for_selected_frame (struct frame *f) } static int -frame_matches_frametype (Lisp_Object frame, Lisp_Object type) +frame_matches_frame_spec (Lisp_Object frame, Lisp_Object type) { struct frame *f = XFRAME (frame); @@ -1033,25 +1033,25 @@ frame_matches_frametype (Lisp_Object frame, Lisp_Object type) } int -device_matches_console_spec (Lisp_Object device, Lisp_Object console) +device_matches_device_spec (Lisp_Object device, Lisp_Object device_spec) { - if (EQ (console, Qwindow_system)) + if (EQ (device_spec, Qwindow_system)) return DEVICE_WIN_P (XDEVICE (device)); - if (DEVICEP (console)) - return EQ (device, console); - if (CONSOLEP (console)) - return EQ (DEVICE_CONSOLE (XDEVICE (device)), console); - if (valid_console_type_p (console)) - return EQ (DEVICE_TYPE (XDEVICE (device)), console); + if (DEVICEP (device_spec)) + return EQ (device, device_spec); + if (CONSOLEP (device_spec)) + return EQ (DEVICE_CONSOLE (XDEVICE (device)), device_spec); + if (valid_console_type_p (device_spec)) + return EQ (DEVICE_TYPE (XDEVICE (device)), device_spec); return 1; } /* Return the next frame in the frame list after FRAME. - FRAMETYPE and CONSOLE control which frames and devices + WHICH-FRAMES and WHICH-DEVICES control which frames and devices are considered; see `next-frame'. */ Lisp_Object -next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console) +next_frame (Lisp_Object frame, Lisp_Object which_frames, Lisp_Object which_devices) { Lisp_Object first = Qnil; Lisp_Object devcons, concons; @@ -1064,7 +1064,7 @@ next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console) Lisp_Object device = XCAR (devcons); Lisp_Object frmcons; - if (!device_matches_console_spec (device, console)) + if (!device_matches_device_spec (device, which_devices)) { if (EQ (device, FRAME_DEVICE (XFRAME (frame)))) passed = 1; @@ -1077,7 +1077,7 @@ next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console) if (passed) { - if (frame_matches_frametype (f, frametype)) + if (frame_matches_frame_spec (f, which_frames)) return f; } else @@ -1088,7 +1088,7 @@ next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console) } else { - if (NILP (first) && frame_matches_frametype (f, frametype)) + if (NILP (first) && frame_matches_frame_spec (f, which_frames)) first = f; } } @@ -1107,11 +1107,11 @@ next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console) } /* Return the previous frame in the frame list before FRAME. - FRAMETYPE and CONSOLE control which frames and devices + WHICH-FRAMES and WHICH-DEVICES control which frames and devices are considered; see `next-frame'. */ Lisp_Object -previous_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console) +previous_frame (Lisp_Object frame, Lisp_Object which_frames, Lisp_Object which_devices) { Lisp_Object devcons, concons; Lisp_Object last = Qnil; @@ -1123,7 +1123,7 @@ previous_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console) Lisp_Object device = XCAR (devcons); Lisp_Object frmcons; - if (!device_matches_console_spec (device, console)) + if (!device_matches_device_spec (device, which_devices)) { if (EQ (device, FRAME_DEVICE (XFRAME (frame))) && !NILP (last)) @@ -1142,7 +1142,7 @@ previous_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console) } else { - if (frame_matches_frametype (f, frametype)) + if (frame_matches_frame_spec (f, which_frames)) last = f; } } @@ -1161,13 +1161,13 @@ previous_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console) DEFUN ("next-frame", Fnext_frame, 0, 3, 0, /* Return the next frame of the right type in the frame list after FRAME. -FRAMETYPE controls which frames are eligible to be returned; all +WHICH-FRAMES controls which frames are eligible to be returned; all others will be skipped. Note that if there is only one eligible frame, then `next-frame' called repeatedly will always return the same frame, and if there is no eligible frame, then FRAME is returned. -Possible values for FRAMETYPE are +Possible values for WHICH-FRAMES are 'visible Consider only frames that are visible. 'iconic Consider only frames that are iconic. @@ -1185,43 +1185,44 @@ Possible values for FRAMETYPE are frames. any other value Consider all frames. -If FRAMETYPE is omitted, 'nomini is used. A FRAMETYPE of 0 (a number) -is treated like 'iconic, for backwards compatibility. +If WHICH-FRAMES is omitted, 'nomini is used. A value for WHICH-FRAMES +of 0 (a number) is treated like 'iconic, for backwards compatibility. -If FRAMETYPE is a window, include only its own frame and any frame now -using that window as the minibuffer. +If WHICH-FRAMES is a window, include only its own frame and any frame +now using that window as the minibuffer. -Optional third argument CONSOLE controls which consoles or devices the -returned frame may be on. If CONSOLE is a console, return frames only -on that console. If CONSOLE is a device, return frames only on that -device. If CONSOLE is a console type, return frames only on consoles -of that type. If CONSOLE is 'window-system, return any frames on any -window-system consoles. If CONSOLE is nil or omitted, return frames only -on the FRAME's console. Otherwise, all frames are considered. +The optional third argument WHICH-DEVICES further clarifies on which +devices to search for frames as specified by WHICH-FRAMES. +If nil or omitted, search all devices on FRAME's console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all window-system devices. +Any other non-nil value means search all devices. */ - (frame, frametype, console)) + (frame, which_frames, which_devices)) { XSETFRAME (frame, decode_frame (frame)); - return next_frame (frame, frametype, console); + return next_frame (frame, which_frames, which_devices); } DEFUN ("previous-frame", Fprevious_frame, 0, 3, 0, /* Return the next frame of the right type in the frame list after FRAME. -FRAMETYPE controls which frames are eligible to be returned; all +WHICH-FRAMES controls which frames are eligible to be returned; all others will be skipped. Note that if there is only one eligible frame, then `previous-frame' called repeatedly will always return the same frame, and if there is no eligible frame, then FRAME is returned. -See `next-frame' for an explanation of the FRAMETYPE and CONSOLE +See `next-frame' for an explanation of the WHICH-FRAMES and WHICH-DEVICES arguments. */ - (frame, frametype, console)) + (frame, which_frames, which_devices)) { XSETFRAME (frame, decode_frame (frame)); - return previous_frame (frame, frametype, console); + return previous_frame (frame, which_frames, which_devices); } /* Return any frame for which PREDICATE is non-zero, or return Qnil @@ -2405,6 +2406,7 @@ recognized for particular types of frames. DEFUN ("frame-property", Fframe_property, 2, 3, 0, /* Return FRAME's value for property PROPERTY. +Return DEFAULT if there is no such property. See `set-frame-properties' for the built-in property names. */ (frame, property, default_)) @@ -2600,21 +2602,21 @@ Specify that the frame FRAME has LINES lines. Optional third arg non-nil means that redisplay should use LINES lines but that the idea of the actual height of the frame should not be changed. */ - (frame, rows, pretend)) + (frame, lines, pretend)) { struct frame *f = decode_frame (frame); int height, width; XSETFRAME (frame, f); - CHECK_INT (rows); + CHECK_INT (lines); if (window_system_pixelated_geometry (frame)) { - char_to_real_pixel_size (f, 0, XINT (rows), 0, &height); + char_to_real_pixel_size (f, 0, XINT (lines), 0, &height); width = FRAME_PIXWIDTH (f); } else { - height = XINT (rows); + height = XINT (lines); width = FRAME_WIDTH (f); } @@ -2650,7 +2652,7 @@ but that the idea of the actual width of the frame should not be changed. } DEFUN ("set-frame-size", Fset_frame_size, 3, 4, 0, /* -Set the size of FRAME to COLS by ROWS. +Set the size of FRAME to COLS by ROWS, measured in characters. Optional fourth arg non-nil means that redisplay should use COLS by ROWS but that the idea of the actual size of the frame should not be changed. */ diff --git a/src/frame.h b/src/frame.h index 4ce3d15..9a80e8e 100644 --- a/src/frame.h +++ b/src/frame.h @@ -772,10 +772,8 @@ extern int frame_changed; DEVICE_FRAME_LOOP (frmcons, XDEVICE (XCAR (devcons))) void update_frame_title (struct frame *f); -Lisp_Object next_frame (Lisp_Object f, Lisp_Object frametype, - Lisp_Object console); -Lisp_Object previous_frame (Lisp_Object f, Lisp_Object frametype, - Lisp_Object console); +Lisp_Object next_frame (Lisp_Object, Lisp_Object, Lisp_Object); +Lisp_Object previous_frame (Lisp_Object, Lisp_Object, Lisp_Object); void pixel_to_char_size (struct frame *f, int pixel_width, int pixel_height, int *char_width, int *char_height); void char_to_pixel_size (struct frame *f, int char_width, int char_height, @@ -811,7 +809,7 @@ void delete_frame_internal (struct frame *f, int force, void io_error_delete_frame (Lisp_Object frame); Lisp_Object find_some_frame (int (*predicate) (Lisp_Object, void *), void *closure); -int device_matches_console_spec (Lisp_Object device, Lisp_Object console); +int device_matches_device_spec (Lisp_Object device, Lisp_Object device_spec); Lisp_Object frame_first_window (struct frame *f); int show_gc_cursor (struct frame *f, Lisp_Object cursor); void set_frame_selected_window (struct frame *f, Lisp_Object window); diff --git a/src/glyphs-msw.c b/src/glyphs-msw.c index 4d4a5f1..7bb3c31 100644 --- a/src/glyphs-msw.c +++ b/src/glyphs-msw.c @@ -2601,9 +2601,10 @@ mswindows_button_instantiate (Lisp_Object image_instance, Lisp_Object instantiat /* This function can call lisp */ Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); HWND wnd; - int flags = WS_TABSTOP;/* BS_NOTIFY #### is needed to get exotic feedback - only. Since we seem to want nothing beyond BN_CLICK, - the style is perhaps not necessary -- kkm */ + int flags = WS_TABSTOP | BS_NOTIFY; + /* BS_NOTIFY #### is needed to get exotic feedback only. Since we + seem to want nothing beyond BN_CLICK, the style is perhaps not + necessary -- kkm */ Lisp_Object style; Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii); Lisp_Gui_Item* pgui = XGUI_ITEM (gui); diff --git a/src/glyphs-x.c b/src/glyphs-x.c index 9ce627b..ed706f9 100644 --- a/src/glyphs-x.c +++ b/src/glyphs-x.c @@ -1000,12 +1000,13 @@ int read_bitmap_data_from_file (const char *filename, unsigned int *width, static Pixmap pixmap_from_xbm_inline (Lisp_Object device, int width, int height, /* Note that data is in ext-format! */ - const Extbyte *bits) + const char *bits) { - return XCreatePixmapFromBitmapData (DEVICE_X_DISPLAY (XDEVICE(device)), - XtWindow (DEVICE_XT_APP_SHELL (XDEVICE (device))), - (char *) bits, width, height, - 1, 0, 1); + return XCreatePixmapFromBitmapData + (DEVICE_X_DISPLAY (XDEVICE (device)), + XtWindow (DEVICE_XT_APP_SHELL (XDEVICE (device))), + (char *) bits, width, height, + 1, 0, 1); } /* Given inline data for a mono pixmap, initialize the given @@ -1168,7 +1169,7 @@ xbm_instantiate_1 (Lisp_Object image_instance, Lisp_Object instantiator, mask = pixmap_from_xbm_inline (IMAGE_INSTANCE_DEVICE (ii), XINT (XCAR (mask_data)), XINT (XCAR (XCDR (mask_data))), - (const unsigned char *) ext_data); + ext_data); } init_image_instance_from_xbm_inline (ii, width, height, bits, @@ -2209,8 +2210,8 @@ x_redisplay_widget (Lisp_Image_Instance *p) reference to the real values rather than a copy thus any changes we make to the values we get back will look like they have already been applied. If we rebuild the widget tree then - we may lose propertie. */ - wv = copy_widget_value_tree (lw_get_all_values + we may lose properties. */ + wv = copy_widget_value_tree (lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (p)), NO_CHANGE); } @@ -2980,7 +2981,7 @@ complex_vars_of_glyphs_x (void) vector3 (Qxbm, Q_data, \ list3 (make_int (name##_width), \ make_int (name##_height), \ - make_ext_string (name##_bits, \ + make_ext_string ((Extbyte *) name##_bits, \ sizeof (name##_bits), \ Qbinary))), \ Qglobal, Qx, Qnil) diff --git a/src/glyphs.c b/src/glyphs.c index df8dd2d..2f8b061 100644 --- a/src/glyphs.c +++ b/src/glyphs.c @@ -226,7 +226,7 @@ valid_image_instantiator_format_p (Lisp_Object format, Lisp_Object locale) DEFUN ("valid-image-instantiator-format-p", Fvalid_image_instantiator_format_p, 1, 2, 0, /* Given an IMAGE-INSTANTIATOR-FORMAT, return non-nil if it is valid. -If LOCALE is non-nil then the format is checked in that domain. +If LOCALE is non-nil then the format is checked in that locale. If LOCALE is nil the current console is used. Valid formats are some subset of 'nothing, 'string, 'formatted-string, @@ -283,7 +283,7 @@ get_image_conversion_list (Lisp_Object console_type) DEFUN ("set-console-type-image-conversion-list", Fset_console_type_image_conversion_list, 2, 2, 0, /* -Set the image-conversion-list for consoles of the given TYPE. +Set the image-conversion-list for consoles of the given CONSOLE-TYPE. The image-conversion-list specifies how image instantiators that are strings should be interpreted. Each element of the list should be a list of two elements (a regular expression string and a vector) or @@ -351,7 +351,7 @@ specifiers will not be affected. DEFUN ("console-type-image-conversion-list", Fconsole_type_image_conversion_list, 1, 1, 0, /* -Return the image-conversion-list for devices of the given TYPE. +Return the image-conversion-list for devices of the given CONSOLE-TYPE. The image-conversion-list specifies how to interpret image string instantiators for the specified console type. See `set-console-type-image-conversion-list' for a description of its syntax. @@ -473,11 +473,11 @@ find_instantiator_differences (Lisp_Object new, Lisp_Object old) DEFUN ("set-instantiator-property", Fset_instantiator_property, 3, 3, 0, /* -Destructively set the property KEYWORD of INSTANTIATOR to VAL. +Destructively set the property KEYWORD of INSTANTIATOR to VALUE. If the property is not set then it is added to a copy of the instantiator and the new instantiator returned. Use `set-glyph-image' on glyphs to register instantiator changes. */ - (instantiator, keyword, val)) + (instantiator, keyword, value)) { Lisp_Object *elt; int len; @@ -493,7 +493,7 @@ Use `set-glyph-image' on glyphs to register instantiator changes. */ { if (EQ (elt[len], keyword)) { - elt[len+1] = val; + elt[len+1] = value; break; } } @@ -506,7 +506,7 @@ Use `set-glyph-image' on glyphs to register instantiator changes. */ GCPRO1 (alist); alist = tagged_vector_to_alist (instantiator); - alist = Fcons (Fcons (keyword, val), alist); + alist = Fcons (Fcons (keyword, value), alist); result = alist_to_tagged_vector (elt[0], alist); free_alist (alist); RETURN_UNGCPRO (result); @@ -1413,11 +1413,11 @@ Return a list of valid image-instance types. } Error_behavior -decode_error_behavior_flag (Lisp_Object no_error) +decode_error_behavior_flag (Lisp_Object noerror) { - if (NILP (no_error)) return ERROR_ME; - else if (EQ (no_error, Qt)) return ERROR_ME_NOT; - else return ERROR_ME_WARN; + if (NILP (noerror)) return ERROR_ME; + else if (EQ (noerror, Qt)) return ERROR_ME_NOT; + else return ERROR_ME_WARN; } Lisp_Object @@ -1567,14 +1567,14 @@ but we currently disallow this. #### We should fix this.) If omitted, DOMAIN defaults to the selected window. -NO-ERROR controls what happens when the image cannot be generated. +NOERROR controls what happens when the image cannot be generated. If nil, an error message is generated. If t, no messages are generated and this function returns nil. If anything else, a warning message is generated and this function returns nil. */ - (data, domain, dest_types, no_error)) + (data, domain, dest_types, noerror)) { - Error_behavior errb = decode_error_behavior_flag (no_error); + Error_behavior errb = decode_error_behavior_flag (noerror); return call_with_suspended_errors ((lisp_fn_t) make_image_instance_1, Qnil, Qimage, errb, @@ -2583,7 +2583,7 @@ bitmap_to_lisp_data (Lisp_Object name, int *xhot, int *yhot, LISP_STRING_TO_EXTERNAL (name, filename_ext, Qfile_name); result = read_bitmap_data_from_file (filename_ext, &w, &h, - &data, xhot, yhot); + (unsigned char **) &data, xhot, yhot); if (result == BitmapSuccess) { @@ -2592,7 +2592,7 @@ bitmap_to_lisp_data (Lisp_Object name, int *xhot, int *yhot, retval = list3 (make_int (w), make_int (h), make_ext_string (data, len, Qbinary)); - XFree ((char *) data); + XFree (data); return retval; } @@ -5383,7 +5383,7 @@ are necessary to properly display Unicode characters. set_specifier_caching (Vcurrent_display_table, offsetof (struct window, display_table), some_window_value_changed, - 0, 0); + 0, 0, 0); } void diff --git a/src/glyphs.h b/src/glyphs.h index e1867af..056cc23 100644 --- a/src/glyphs.h +++ b/src/glyphs.h @@ -729,10 +729,11 @@ struct Lisp_Image_Instance #define IMAGE_INSTANCE_WIDGET_PENDING_ITEMS(i) \ ((i)->u.subwindow.pending_items) #define IMAGE_INSTANCE_WIDGET_ITEM(i) \ -(CONSP (IMAGE_INSTANCE_WIDGET_ITEMS (i)) ? \ -XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (i)) : \ - IMAGE_INSTANCE_WIDGET_ITEMS (i)) -#define IMAGE_INSTANCE_WIDGET_TEXT(i) XGUI_ITEM (IMAGE_INSTANCE_WIDGET_ITEM (i))->name + (CONSP (IMAGE_INSTANCE_WIDGET_ITEMS (i)) ? \ + XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (i)) : \ + IMAGE_INSTANCE_WIDGET_ITEMS (i)) +#define IMAGE_INSTANCE_WIDGET_TEXT(i) \ + XGUI_ITEM (IMAGE_INSTANCE_WIDGET_ITEM (i))->name /* Layout properties */ #define IMAGE_INSTANCE_LAYOUT_CHILDREN(i) ((i)->u.subwindow.children) diff --git a/src/gui-x.c b/src/gui-x.c index 7a0e382..d476906 100644 --- a/src/gui-x.c +++ b/src/gui-x.c @@ -289,7 +289,7 @@ popup_selection_callback (Widget widget, LWLIB_ID ignored_id, } /* This is the timestamp used for asserting focus so we need to get an - up-to-date value event if no events has been dispatched to emacs + up-to-date value event if no events have been dispatched to emacs */ #if defined(HAVE_MENUBARS) DEVICE_X_MOUSE_TIMESTAMP (d) = x_focus_timestamp_really_sucks_fix_me_better; @@ -489,11 +489,14 @@ button_item_to_widget_value (Lisp_Object gui_object_instance, if (NILP (pgui->style)) { Bufbyte *intname; + Bytecount intlen; /* If the callback is nil, treat this item like unselectable text. This way, dashes will show up as a separator. */ if (!wv->enabled) wv->type = BUTTON_TYPE; - EXTERNAL_TO_C_STRING (wv->name, intname, Qlwlib_encoding); + TO_INTERNAL_FORMAT (C_STRING, wv->name, + ALLOCA, (intname, intlen), + Qlwlib_encoding); if (separator_string_p (intname)) { wv->type = SEPARATOR_TYPE; diff --git a/src/gutter.c b/src/gutter.c index 3bde818..72fb052 100644 --- a/src/gutter.c +++ b/src/gutter.c @@ -249,6 +249,96 @@ static Lisp_Object construct_window_gutter_spec (struct window* w, return Fconcat (nargs, args); } +/* Sizing gutters is a pain so we try and help the user by determining + what height will accommodate all lines. This is useless on left and + right gutters as we always have a maximal number of lines. */ +static int +calculate_gutter_size_from_display_lines (enum gutter_pos pos, + display_line_dynarr* ddla) +{ + int size = 0; + struct display_line *dl; + + /* For top and bottom the calculation is easy. */ + if (pos == TOP_GUTTER || pos == BOTTOM_GUTTER) + { + /* grab coordinates of last line */ + if (Dynarr_length (ddla)) + { + dl = Dynarr_atp (ddla, Dynarr_length (ddla) - 1); + size = (dl->ypos + dl->descent - dl->clip) + - (Dynarr_atp (ddla, 0)->ypos - Dynarr_atp (ddla, 0)->ascent); + } + } + /* For left and right we have to do some maths. */ + else + { + int start_pos = 0, end_pos = 0, line; + for (line = 0; line < Dynarr_length (ddla); line++) + { + int block; + dl = Dynarr_atp (ddla, line); + + for (block = 0; block < Dynarr_largest (dl->display_blocks); block++) + { + struct display_block *db = Dynarr_atp (dl->display_blocks, block); + + if (db->type == TEXT) + { + start_pos = min (db->start_pos, start_pos); + end_pos = max (db->end_pos, end_pos); + } + } + } + size = end_pos - start_pos; + } + + return size; +} + +static Lisp_Object +calculate_gutter_size (struct window *w, enum gutter_pos pos) +{ + struct frame* f = XFRAME (WINDOW_FRAME (w)); + int count; + display_line_dynarr* ddla; + Lisp_Object ret = Qnil; + + /* degenerate case */ + if (NILP (RAW_WINDOW_GUTTER (w, pos)) + || + !FRAME_VISIBLE_P (f) + || + NILP (w->buffer)) + return Qnil; + + /* Redisplay code that we use relies on GC not happening. Make it + so. */ + count = specpdl_depth (); + record_unwind_protect (restore_gc_inhibit, + make_int (gc_currently_forbidden)); + gc_currently_forbidden = 1; + + ddla = Dynarr_new (display_line); + /* generate some display lines */ + generate_displayable_area (w, WINDOW_GUTTER (w, pos), + FRAME_LEFT_BORDER_END (f), + FRAME_TOP_BORDER_END (f), + FRAME_RIGHT_BORDER_START (f) + - FRAME_LEFT_BORDER_END (f), + FRAME_BOTTOM_BORDER_START (f) + - FRAME_TOP_BORDER_END (f), + ddla, 0, 0); + + /* Let GC happen again. */ + unbind_to (count, Qnil); + + ret = make_int (calculate_gutter_size_from_display_lines (pos, ddla)); + free_display_lines (ddla); + + return ret; +} + static void output_gutter (struct frame *f, enum gutter_pos pos, int force) { @@ -339,7 +429,10 @@ output_gutter (struct frame *f, enum gutter_pos pos, int force) room for, and we are allowed to resize the gutter, then make sure this happens before the next time we try and output. This can happen when face font sizes change. */ - if (dl && dl->clip > 0 && EQ (w->gutter_size[pos], Qautodetect)) + if (dl && EQ (w->gutter_size[pos], Qautodetect) + && (dl->clip > 0 || + calculate_gutter_size_from_display_lines (pos, ddla) > + WINDOW_GUTTER_SIZE_INTERNAL (w, pos))) { /* #### Ideally we would just mark the specifier as dirty and everything else would "just work". Unfortunately we have @@ -378,63 +471,6 @@ output_gutter (struct frame *f, enum gutter_pos pos, int force) w->gutter_extent_modiff [pos] = 0; } -/* Sizing gutters is a pain so we try and help the user by determining - what height will accommodate all lines. This is useless on left and - right gutters as we always have a maximal number of lines. */ -static Lisp_Object -calculate_gutter_size (struct window *w, enum gutter_pos pos) -{ - struct frame* f = XFRAME (WINDOW_FRAME (w)); - int ypos, count; - display_line_dynarr* ddla; - struct display_line *dl; - - /* we cannot autodetect gutter sizes for the left and right as there - is no reasonable metric to use */ - assert (pos == TOP_GUTTER || pos == BOTTOM_GUTTER); - /* degenerate case */ - if (NILP (RAW_WINDOW_GUTTER (w, pos)) - || - !FRAME_VISIBLE_P (f) - || - NILP (w->buffer)) - return Qnil; - - /* Redisplay code that we use relies on GC not happening. Make it - so. */ - count = specpdl_depth (); - record_unwind_protect (restore_gc_inhibit, - make_int (gc_currently_forbidden)); - gc_currently_forbidden = 1; - - ddla = Dynarr_new (display_line); - /* generate some display lines */ - generate_displayable_area (w, WINDOW_GUTTER (w, pos), - FRAME_LEFT_BORDER_END (f), - 0, - FRAME_RIGHT_BORDER_START (f) - - FRAME_LEFT_BORDER_END (f), - 200, - ddla, 0, 0); - - /* Let GC happen again. */ - unbind_to (count, Qnil); - - /* grab coordinates of last line */ - if (Dynarr_length (ddla)) - { - dl = Dynarr_atp (ddla, Dynarr_length (ddla) - 1); - ypos = dl->ypos + dl->descent - dl->clip; - free_display_lines (ddla); - return make_int (ypos); - } - else - { - free_display_lines (ddla); - return Qnil; - } -} - static void clear_gutter (struct frame *f, enum gutter_pos pos) { @@ -686,14 +722,8 @@ See `default-gutter-position'. list1 (Fcons (Qnil, Qzero))); set_specifier_fallback (Vgutter_border_width[new], Vdefault_gutter_border_width); - /* We don't really want the left and right gutters to default to - visible. */ - set_specifier_fallback (Vgutter_visible_p[cur], - cur == TOP_GUTTER || cur == BOTTOM_GUTTER ? - list1 (Fcons (Qnil, Qt)) - : list1 (Fcons (Qnil, Qnil))); - set_specifier_fallback (Vgutter_visible_p[new], - Vdefault_gutter_visible_p); + set_specifier_fallback (Vgutter_visible_p[cur], list1 (Fcons (Qnil, Qt))); + set_specifier_fallback (Vgutter_visible_p[new], Vdefault_gutter_visible_p); Vdefault_gutter_position = position; unhold_frame_size_changes (); @@ -1158,7 +1188,7 @@ before being displayed. */ ); set_specifier_caching (Vdefault_gutter, offsetof (struct window, default_gutter), default_gutter_specs_changed, - 0, 0); + 0, 0, 1); DEFVAR_SPECIFIER ("top-gutter", &Vgutter[TOP_GUTTER] /* @@ -1170,7 +1200,7 @@ See `default-gutter' for a description of a valid gutter instantiator. set_specifier_caching (Vgutter[TOP_GUTTER], offsetof (struct window, gutter[TOP_GUTTER]), top_gutter_specs_changed, - 0, 0); + 0, 0, 1); DEFVAR_SPECIFIER ("bottom-gutter", &Vgutter[BOTTOM_GUTTER] /* @@ -1187,7 +1217,7 @@ displayed even if you provide a value for `bottom-gutter'. set_specifier_caching (Vgutter[BOTTOM_GUTTER], offsetof (struct window, gutter[BOTTOM_GUTTER]), bottom_gutter_specs_changed, - 0, 0); + 0, 0, 1); DEFVAR_SPECIFIER ("left-gutter", &Vgutter[LEFT_GUTTER] /* @@ -1204,7 +1234,7 @@ displayed even if you provide a value for `left-gutter'. set_specifier_caching (Vgutter[LEFT_GUTTER], offsetof (struct window, gutter[LEFT_GUTTER]), left_gutter_specs_changed, - 0, 0); + 0, 0, 1); DEFVAR_SPECIFIER ("right-gutter", &Vgutter[RIGHT_GUTTER] /* @@ -1221,7 +1251,7 @@ displayed even if you provide a value for `right-gutter'. set_specifier_caching (Vgutter[RIGHT_GUTTER], offsetof (struct window, gutter[RIGHT_GUTTER]), right_gutter_specs_changed, - 0, 0); + 0, 0, 1); /* initially, top inherits from default; this can be changed with `set-default-gutter-position'. */ @@ -1261,7 +1291,7 @@ is the default. set_specifier_caching (Vdefault_gutter_height, offsetof (struct window, default_gutter_height), default_gutter_size_changed_in_window, - 0, 0); + 0, 0, 1); DEFVAR_SPECIFIER ("default-gutter-width", &Vdefault_gutter_width /* *Width of the default gutter, if it's oriented vertically. @@ -1269,11 +1299,11 @@ This is a specifier; use `set-specifier' to change it. See `default-gutter-height' for more information. */ ); - Vdefault_gutter_width = Fmake_specifier (Qnatnum); + Vdefault_gutter_width = Fmake_specifier (Qgutter_size); set_specifier_caching (Vdefault_gutter_width, offsetof (struct window, default_gutter_width), default_gutter_size_changed_in_window, - 0, 0); + 0, 0, 1); DEFVAR_SPECIFIER ("top-gutter-height", &Vgutter_size[TOP_GUTTER] /* @@ -1285,7 +1315,7 @@ See `default-gutter-height' for more information. Vgutter_size[TOP_GUTTER] = Fmake_specifier (Qgutter_size); set_specifier_caching (Vgutter_size[TOP_GUTTER], offsetof (struct window, gutter_size[TOP_GUTTER]), - gutter_geometry_changed_in_window, 0, 0); + gutter_geometry_changed_in_window, 0, 0, 1); DEFVAR_SPECIFIER ("bottom-gutter-height", &Vgutter_size[BOTTOM_GUTTER] /* @@ -1297,7 +1327,7 @@ See `default-gutter-height' for more information. Vgutter_size[BOTTOM_GUTTER] = Fmake_specifier (Qgutter_size); set_specifier_caching (Vgutter_size[BOTTOM_GUTTER], offsetof (struct window, gutter_size[BOTTOM_GUTTER]), - gutter_geometry_changed_in_window, 0, 0); + gutter_geometry_changed_in_window, 0, 0, 1); DEFVAR_SPECIFIER ("left-gutter-width", &Vgutter_size[LEFT_GUTTER] /* @@ -1306,10 +1336,10 @@ This is a specifier; use `set-specifier' to change it. See `default-gutter-height' for more information. */ ); - Vgutter_size[LEFT_GUTTER] = Fmake_specifier (Qnatnum); + Vgutter_size[LEFT_GUTTER] = Fmake_specifier (Qgutter_size); set_specifier_caching (Vgutter_size[LEFT_GUTTER], offsetof (struct window, gutter_size[LEFT_GUTTER]), - gutter_geometry_changed_in_window, 0, 0); + gutter_geometry_changed_in_window, 0, 0, 1); DEFVAR_SPECIFIER ("right-gutter-width", &Vgutter_size[RIGHT_GUTTER] /* @@ -1318,10 +1348,10 @@ This is a specifier; use `set-specifier' to change it. See `default-gutter-height' for more information. */ ); - Vgutter_size[RIGHT_GUTTER] = Fmake_specifier (Qnatnum); + Vgutter_size[RIGHT_GUTTER] = Fmake_specifier (Qgutter_size); set_specifier_caching (Vgutter_size[RIGHT_GUTTER], offsetof (struct window, gutter_size[RIGHT_GUTTER]), - gutter_geometry_changed_in_window, 0, 0); + gutter_geometry_changed_in_window, 0, 0, 1); fb = Qnil; #ifdef HAVE_TTY @@ -1339,15 +1369,14 @@ See `default-gutter-height' for more information. fb = Qnil; #ifdef HAVE_TTY - fb = Fcons (Fcons (list1 (Qtty), Qzero), fb); + fb = Fcons (Fcons (list1 (Qtty), Qautodetect), fb); #endif #ifdef HAVE_X_WINDOWS - fb = Fcons (Fcons (list1 (Qx), make_int (DEFAULT_GUTTER_WIDTH)), fb); + fb = Fcons (Fcons (list1 (Qx), Qautodetect), fb); #endif #ifdef HAVE_MS_WINDOWS - fb = Fcons (Fcons (list1 (Qmsprinter), Qzero), fb); - fb = Fcons (Fcons (list1 (Qmswindows), - make_int (DEFAULT_GUTTER_WIDTH)), fb); + fb = Fcons (Fcons (list1 (Qmsprinter), Qautodetect), fb); + fb = Fcons (Fcons (list1 (Qmswindows), Qautodetect), fb); #endif if (!NILP (fb)) set_specifier_fallback (Vdefault_gutter_width, fb); @@ -1376,7 +1405,7 @@ instead. set_specifier_caching (Vdefault_gutter_border_width, offsetof (struct window, default_gutter_border_width), default_gutter_border_width_changed_in_window, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("top-gutter-border-width", &Vgutter_border_width[TOP_GUTTER] /* @@ -1389,7 +1418,7 @@ See `default-gutter-height' for more information. set_specifier_caching (Vgutter_border_width[TOP_GUTTER], offsetof (struct window, gutter_border_width[TOP_GUTTER]), - gutter_geometry_changed_in_window, 0, 0); + gutter_geometry_changed_in_window, 0, 0, 0); DEFVAR_SPECIFIER ("bottom-gutter-border-width", &Vgutter_border_width[BOTTOM_GUTTER] /* @@ -1402,7 +1431,7 @@ See `default-gutter-height' for more information. set_specifier_caching (Vgutter_border_width[BOTTOM_GUTTER], offsetof (struct window, gutter_border_width[BOTTOM_GUTTER]), - gutter_geometry_changed_in_window, 0, 0); + gutter_geometry_changed_in_window, 0, 0, 0); DEFVAR_SPECIFIER ("left-gutter-border-width", &Vgutter_border_width[LEFT_GUTTER] /* @@ -1415,7 +1444,7 @@ See `default-gutter-height' for more information. set_specifier_caching (Vgutter_border_width[LEFT_GUTTER], offsetof (struct window, gutter_border_width[LEFT_GUTTER]), - gutter_geometry_changed_in_window, 0, 0); + gutter_geometry_changed_in_window, 0, 0, 0); DEFVAR_SPECIFIER ("right-gutter-border-width", &Vgutter_border_width[RIGHT_GUTTER] /* @@ -1428,7 +1457,7 @@ See `default-gutter-height' for more information. set_specifier_caching (Vgutter_border_width[RIGHT_GUTTER], offsetof (struct window, gutter_border_width[RIGHT_GUTTER]), - gutter_geometry_changed_in_window, 0, 0); + gutter_geometry_changed_in_window, 0, 0, 0); fb = Qnil; #ifdef HAVE_TTY @@ -1470,7 +1499,7 @@ visibility specifiers have a fallback value of true. offsetof (struct window, default_gutter_visible_p), default_gutter_visible_p_changed_in_window, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("top-gutter-visible-p", &Vgutter_visible_p[TOP_GUTTER] /* @@ -1483,7 +1512,7 @@ See `default-gutter-visible-p' for more information. set_specifier_caching (Vgutter_visible_p[TOP_GUTTER], offsetof (struct window, gutter_visible_p[TOP_GUTTER]), - top_gutter_specs_changed, 0, 0); + top_gutter_specs_changed, 0, 0, 0); DEFVAR_SPECIFIER ("bottom-gutter-visible-p", &Vgutter_visible_p[BOTTOM_GUTTER] /* @@ -1496,7 +1525,7 @@ See `default-gutter-visible-p' for more information. set_specifier_caching (Vgutter_visible_p[BOTTOM_GUTTER], offsetof (struct window, gutter_visible_p[BOTTOM_GUTTER]), - bottom_gutter_specs_changed, 0, 0); + bottom_gutter_specs_changed, 0, 0, 0); DEFVAR_SPECIFIER ("left-gutter-visible-p", &Vgutter_visible_p[LEFT_GUTTER] /* @@ -1509,7 +1538,7 @@ See `default-gutter-visible-p' for more information. set_specifier_caching (Vgutter_visible_p[LEFT_GUTTER], offsetof (struct window, gutter_visible_p[LEFT_GUTTER]), - left_gutter_specs_changed, 0, 0); + left_gutter_specs_changed, 0, 0, 0); DEFVAR_SPECIFIER ("right-gutter-visible-p", &Vgutter_visible_p[RIGHT_GUTTER] /* @@ -1522,7 +1551,7 @@ See `default-gutter-visible-p' for more information. set_specifier_caching (Vgutter_visible_p[RIGHT_GUTTER], offsetof (struct window, gutter_visible_p[RIGHT_GUTTER]), - right_gutter_specs_changed, 0, 0); + right_gutter_specs_changed, 0, 0, 0); /* initially, top inherits from default; this can be changed with `set-default-gutter-position'. */ diff --git a/src/hpplay.c b/src/hpplay.c index d0a1bce..9036452 100644 --- a/src/hpplay.c +++ b/src/hpplay.c @@ -27,7 +27,7 @@ Boston, MA 02111-1307, USA. */ Play .au sound files on hp9000s700 BUGS I have been unable to figure out how to use the volume feature, so no - attempts has been made to honor the volume arg of play_sound_* + attempt has been made to honor the volume arg of play_sound_* This means that all sounds are played at 100%. The gain parameter can be set by using the hp-play-gain variable. diff --git a/src/indent.c b/src/indent.c index e1e4039..9ecf75b 100644 --- a/src/indent.c +++ b/src/indent.c @@ -272,11 +272,11 @@ If BUFFER is nil, the current buffer is assumed. DEFUN ("indent-to", Findent_to, 1, 3, "NIndent to column: ", /* Indent from point with tabs and spaces until COLUMN is reached. -Optional second argument MIN says always do at least MIN spaces - even if that goes past COLUMN; by default, MIN is zero. +Optional second argument MINIMUM says always do at least MINIMUM spaces + even if that goes past COLUMN; by default, MINIMUM is zero. If BUFFER is nil, the current buffer is assumed. */ - (col, minimum, buffer)) + (column, minimum, buffer)) { /* This function can GC */ int mincol; @@ -285,7 +285,7 @@ If BUFFER is nil, the current buffer is assumed. int tab_width = XINT (buf->tab_width); Bufpos opoint = 0; - CHECK_INT (col); + CHECK_INT (column); if (NILP (minimum)) minimum = Qzero; else @@ -295,7 +295,7 @@ If BUFFER is nil, the current buffer is assumed. fromcol = current_column (buf); mincol = fromcol + XINT (minimum); - if (mincol < XINT (col)) mincol = XINT (col); + if (mincol < XINT (column)) mincol = XINT (column); if (fromcol == mincol) return make_int (mincol); diff --git a/src/input-method-xlib.c b/src/input-method-xlib.c index b0068fd..db564bb 100644 --- a/src/input-method-xlib.c +++ b/src/input-method-xlib.c @@ -34,9 +34,9 @@ Boston, MA 02111-1307, USA. */ The XIC is of each frame, by each frame, for each frame. The exceptions are: 1. Activate XICs on poor frames when the XIM is back. - 2. Deactivate all the XICs when the XIM go down. + 2. Deactivate all the XICs when the XIM goes down. - Methods: + Implementation: - Register a callback for an XIM when the X device is being initialized. XIM_init_device (d) { XRegisterIMInstantiateCallback (); } @@ -55,7 +55,7 @@ Boston, MA 02111-1307, USA. */ In IMDestroyCallback: DEVICE_FRAME_LOOP (...) { FRAME_X_XIC (f) = NULL; } - - Re-enable XIC for all the frames which doesn't have XIC when the XIM + - Re-enable XIC for all the frames which don't have XIC when the XIM is back. In IMInstantiateCallback: DEVICE_FRAME_LOOP (...) { XIM_init_frame (f); } @@ -71,6 +71,7 @@ Boston, MA 02111-1307, USA. */ #include #include "lisp.h" #include /* More portable than ? */ +#include #include "frame.h" #include "device.h" #include "window.h" @@ -79,10 +80,6 @@ Boston, MA 02111-1307, USA. */ #include "EmacsFrame.h" #include "events.h" -#ifdef THIS_IS_X11R6 -#include -#endif - #ifndef XIM_XLIB #error XIM_XLIB is not defined?? #endif @@ -122,13 +119,10 @@ static char DefaultXIMStyles[] = "XIMPreeditNone|XIMStatusNothing\n" "XIMPreeditNone|XIMStatusNone"; -static Boolean xim_initted = False; - static XIMStyle best_style (XIMStyles *user, XIMStyles *xim); -/* #### it appears this prototype is missing from the X11R6.4 includes, - at least the XFree86 version ... */ -char * XSetIMValues(XIM, ...); +/* This function is documented, but no prototype in the header files */ +EXTERN_C char * XSetIMValues(XIM, ...); void Initialize_Locale (void) @@ -181,7 +175,11 @@ Initialize_Locale (void) } } -#ifdef THIS_IS_X11R6 /* Callbacks for IM are supported from X11R6 or later. */ +/* Callbacks for IM are supported from X11R6 or later. */ +#ifdef HAVE_XREGISTERIMINSTANTIATECALLBACK + +static Boolean xim_initted = False; + /* Called from when XIM is destroying. Clear all the XIC when the XIM was destroying... */ static void @@ -224,7 +222,7 @@ IMInstantiateCallback (Display *dpy, XPointer client_data, XPointer call_data) DEVICE_X_XIM (d) = xim = XOpenIM (dpy, XtDatabase (dpy), name, class); /* destroy callback for im */ - ximcallback.callback = IMDestroyCallback; + ximcallback.callback = (XIMProc) IMDestroyCallback; ximcallback.client_data = (XPointer) d; XSetIMValues (xim, XNDestroyCallback, &ximcallback, NULL); } @@ -240,23 +238,29 @@ IMInstantiateCallback (Display *dpy, XPointer client_data, XPointer call_data) } return; } -#endif /* if THIS_IS_X11R6 */ +#endif /* HAVE_XREGISTERIMINSTANTIATECALLBACK */ /* Initialize XIM for X device. Register the use of XIM using XRegisterIMInstantiateCallback. */ void XIM_init_device (struct device *d) { -#ifdef THIS_IS_X11R6 +#ifdef HAVE_XREGISTERIMINSTANTIATECALLBACK /* X11R6+ */ DEVICE_X_XIM (d) = NULL; XRegisterIMInstantiateCallback (DEVICE_X_DISPLAY (d), NULL, NULL, NULL, - IMInstantiateCallback, +#ifdef XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE /* The sixth parameter is of type XPointer in XFree86 but (XPointer *) on most other X11's. */ - (void *) d); + (XIDProc) IMInstantiateCallback, + (XPointer) d +#else /* X Consortium prototype */ + (XIMProc) IMInstantiateCallback, + (XPointer *) d +#endif /* XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE */ + ); return; -#else +#else /* pre-X11R6 */ Display *dpy = DEVICE_X_DISPLAY (d); char *name, *class; XIM xim; @@ -273,7 +277,7 @@ XIM_init_device (struct device *d) XGetIMValues (xim, XNQueryInputStyle, &DEVICE_X_XIM_STYLES (d), NULL); return; } -#endif +#endif /* HAVE_XREGISTERIMINSTANTIATECALLBACK */ } @@ -407,7 +411,7 @@ XIM_init_frame (struct frame *f) XSetICFocus (xic); -#ifdef THIS_IS_X11R6 +#ifdef HAVE_XREGISTERIMINSTANTIATECALLBACK /* when frame is going to be destroyed (closed) */ XtAddCallback (FRAME_X_TEXT_WIDGET(f), XNDestroyCallback, XIM_delete_frame, (XtPointer)f); diff --git a/src/intl.c b/src/intl.c index a8a14d8..befca9b 100644 --- a/src/intl.c +++ b/src/intl.c @@ -168,16 +168,18 @@ x_get_composed_input (XKeyPressedEvent *x_key_event, XIC context, Lisp_Object Qdefer_gettext; DEFUN ("ignore-defer-gettext", Fignore_defer_gettext, 1, 1, 0, /* -If OBJ is of the form (defer-gettext "string"), return the string. +If OBJECT is of the form (defer-gettext "string"), return the string. The purpose of the defer-gettext symbol is to identify strings which are translated when they are referenced instead of when they are defined. */ - (obj)) + (object)) { - if (CONSP (obj) && SYMBOLP (Fcar (obj)) && EQ (Fcar (obj), Qdefer_gettext)) - return Fcar (Fcdr (obj)); + if (CONSP (object) + && SYMBOLP (Fcar (object)) + && EQ (Fcar (object), Qdefer_gettext)) + return Fcar (Fcdr (object)); else - return obj; + return object; } DEFUN ("gettext", Fgettext, 1, 1, 0, /* diff --git a/src/keymap.c b/src/keymap.c index 9cae3ab..1d6ef6e 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -795,9 +795,9 @@ it is not used except when printing the keymap. DEFUN ("make-sparse-keymap", Fmake_sparse_keymap, 0, 1, 0, /* Construct and return a new keymap object. All entries in it are nil, meaning "command undefined". The only -difference between this function and make-keymap is that this function +difference between this function and `make-keymap' is that this function returns a "smaller" keymap (one that is expected to contain fewer -entries). As keymaps dynamically resize, the distinction is not great. +entries). As keymaps dynamically resize, this distinction is not great. Optional argument NAME specifies a name to assign to the keymap, as in `set-keymap-name'. This name is only a debugging convenience; @@ -968,7 +968,7 @@ parents nor the current global map are searched for key bindings. } DEFUN ("keymapp", Fkeymapp, 1, 1, 0, /* -Return t if ARG is a keymap object. +Return t if OBJECT is a keymap object. The keymap may be autoloaded first if necessary. */ (object)) @@ -2181,8 +2181,8 @@ Nil is returned if KEYS is unbound. See documentation of `define-key' for valid key definitions and key-sequence specifications. A number is returned if KEYS is "too long"; that is, the leading characters fail to be a valid sequence of prefix characters in KEYMAP. -The number is how many characters at the front of KEYS -it takes to reach a non-prefix command. +The number is how many key strokes at the front of KEYS it takes to +reach a non-prefix command. */ (keymap, keys, accept_default)) { @@ -2535,7 +2535,7 @@ the documentation for `lookup-key' for more information. For key-presses, the order of keymaps searched is: - the `keymap' property of any extent(s) at point; - any applicable minor-mode maps; - - the current-local-map of the current-buffer; + - the current local map of the current-buffer; - the current global map. For mouse-clicks, the order of keymaps searched is: @@ -2545,9 +2545,9 @@ For mouse-clicks, the order of keymaps searched is: (this includes modeline extents); - the modeline-map of the buffer corresponding to the modeline under the mouse (if the click happened over a modeline); - - the value of toolbar-map in the current-buffer (if the click + - the value of `toolbar-map' in the current-buffer (if the click happened over a toolbar); - - the current-local-map of the buffer under the mouse (does not + - the current local map of the buffer under the mouse (does not apply to toolbar clicks); - any applicable minor-mode maps; - the current global map. diff --git a/src/lisp.h b/src/lisp.h index 9068b2a..a23c5bc 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -304,19 +304,14 @@ typedef UChar UBufbyte; typedef char SBufbyte; /* The data representing a string in "external" format (binary or any - external encoding) is logically a set of Extbytes, declared as follows. */ + external encoding) is logically a set of Extbytes, declared as + follows. Extbyte is guaranteed to be just a char, so for example + strlen (Extbyte *) is OK. Extbyte is only a documentation device + for referring to external text. */ -typedef UChar Extbyte; /* #### I REALLY think this should be a char. This - is more logical and will fix enough char-UChar - inconsistencies that maybe we'll be able to stop - turning off those warnings. --ben */ - -/* Explicitly signed or unsigned versions: */ -typedef UChar UExtbyte; -typedef char SExtbyte; +typedef char Extbyte; /* A byte in a string in binary format: */ - typedef char Char_Binary; typedef UChar UChar_Binary; @@ -808,24 +803,20 @@ PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len, tail, \ tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH) -#define PRIVATE_EXTERNAL_LIST_LOOP_6(elt, list, len, hare, \ - tortoise, suspicion_length) \ - for (tortoise = hare = list, len = 0; \ - \ - (CONSP (hare) ? ((elt = XCAR (hare)), 1) : \ - (NILP (hare) ? 0 : \ - (signal_malformed_list_error (list), 0))); \ - \ - hare = XCDR (hare), \ - ((++len < suspicion_length) ? \ - ((void) 0) : \ - (((len & 1) ? \ - ((void) (tortoise = XCDR (tortoise))) : \ - ((void) 0)) \ - , \ - (EQ (hare, tortoise) ? \ - ((void) signal_circular_list_error (list)) : \ - ((void) 0))))) +#define PRIVATE_EXTERNAL_LIST_LOOP_6(elt, list, len, hare, \ + tortoise, suspicion_length) \ + for (tortoise = hare = list, len = 0; \ + \ + (CONSP (hare) ? ((elt = XCAR (hare)), 1) : \ + (NILP (hare) ? 0 : \ + (signal_malformed_list_error (list), 0))); \ + \ + hare = XCDR (hare), \ + (void) \ + ((++len > suspicion_length) \ + && \ + ((((len & 1) != 0) && (tortoise = XCDR (tortoise), 0)), \ + (EQ (hare, tortoise) && (signal_circular_list_error (list), 0))))) /* GET_LIST_LENGTH and GET_EXTERNAL_LIST_LENGTH: diff --git a/src/lread.c b/src/lread.c index d6e22c8..c8fff59 100644 --- a/src/lread.c +++ b/src/lread.c @@ -258,12 +258,13 @@ readchar (Lisp_Object readcharfun) Emchar c = Lstream_get_emchar (XLSTREAM (readcharfun)); #ifdef DEBUG_XEMACS /* testing Mule */ static int testing_mule = 0; /* Change via debugger */ - if (testing_mule) { - if (c >= 0x20 && c <= 0x7E) stderr_out ("%c", c); - else if (c == '\n') stderr_out ("\\n\n"); - else stderr_out ("\\%o ", c); - } -#endif + if (testing_mule) + { + if (c >= 0x20 && c <= 0x7E) stderr_out ("%c", c); + else if (c == '\n') stderr_out ("\\n\n"); + else stderr_out ("\\%o ", c); + } +#endif /* testing Mule */ return c; } else if (MARKERP (readcharfun)) @@ -536,7 +537,7 @@ system that was used for the decoding is stored into it. It will in general be different from CODESYS if CODESYS specifies automatic encoding detection or end-of-line detection. */ - (file, no_error, nomessage, nosuffix, codesys, used_codesys)) + (file, noerror, nomessage, nosuffix, codesys, used_codesys)) { /* This function can GC */ int fd = -1; @@ -567,7 +568,7 @@ encoding detection or end-of-line detection. /* If file name is magic, call the handler. */ handler = Ffind_file_name_handler (file, Qload); if (!NILP (handler)) - RETURN_UNGCPRO (call5 (handler, Qload, file, no_error, + RETURN_UNGCPRO (call5 (handler, Qload, file, noerror, nomessage, nosuffix)); /* Do this after the handler to avoid @@ -596,7 +597,7 @@ encoding detection or end-of-line detection. if (fd < 0) { - if (NILP (no_error)) + if (NILP (noerror)) signal_file_error ("Cannot open load file", file); else { @@ -1470,22 +1471,21 @@ Execute BUFFER as Lisp code. Programs can pass two arguments, BUFFER and PRINTFLAG. BUFFER is the buffer to evaluate (nil means use current buffer). PRINTFLAG controls printing of output: -nil means discard it; anything else is stream for print. +nil means discard it; anything else is a stream for printing. If there is no error, point does not move. If there is an error, point remains at the end of the last character read from the buffer. -Execute BUFFER as Lisp code. */ - (bufname, printflag)) + (buffer, printflag)) { /* This function can GC */ int speccount = specpdl_depth (); Lisp_Object tem, buf; - if (NILP (bufname)) + if (NILP (buffer)) buf = Fcurrent_buffer (); else - buf = Fget_buffer (bufname); + buf = Fget_buffer (buffer); if (NILP (buf)) error ("No such buffer."); @@ -1519,10 +1519,10 @@ point remains at the end of the last character read from the buffer. DEFUN ("eval-region", Feval_region, 2, 3, "r", /* Execute the region as Lisp code. -When called from programs, expects two arguments, +When called from programs, expects two arguments START and END giving starting and ending indices in the current buffer of the text to be executed. -Programs can pass third argument PRINTFLAG which controls output: +Programs can pass third optional argument STREAM which controls output: nil means discard it; anything else is stream for printing it. If there is no error, point does not move. If there is an error, @@ -1532,28 +1532,28 @@ Note: Before evaling the region, this function narrows the buffer to it. If the code being eval'd should happen to trigger a redisplay you may see some text temporarily disappear because of this. */ - (b, e, printflag)) + (start, end, stream)) { /* This function can GC */ int speccount = specpdl_depth (); Lisp_Object tem; Lisp_Object cbuf = Fcurrent_buffer (); - if (NILP (printflag)) + if (NILP (stream)) tem = Qsymbolp; /* #### #@[]*&$#*[& SI:NULL-STREAM */ else - tem = printflag; + tem = stream; specbind (Qstandard_output, tem); - if (NILP (printflag)) + if (NILP (stream)) record_unwind_protect (save_excursion_restore, save_excursion_save ()); record_unwind_protect (save_restriction_restore, save_restriction_save ()); - /* This both uses b and checks its type. */ - Fgoto_char (b, cbuf); - Fnarrow_to_region (make_int (BUF_BEGV (current_buffer)), e, cbuf); + /* This both uses start and checks its type. */ + Fgoto_char (start, cbuf); + Fnarrow_to_region (make_int (BUF_BEGV (current_buffer)), end, cbuf); readevalloop (cbuf, XBUFFER (cbuf)->filename, Feval, - !NILP (printflag)); + !NILP (stream)); return unbind_to (speccount, Qnil); } @@ -2054,23 +2054,27 @@ static Lisp_Object read_bit_vector (Lisp_Object readcharfun) { unsigned_char_dynarr *dyn = Dynarr_new (unsigned_char); - Emchar c; Lisp_Object val; while (1) { - c = readchar (readcharfun); - if (c != '0' && c != '1') - break; - Dynarr_add (dyn, (unsigned char) (c - '0')); + unsigned char bit; + Emchar c = readchar (readcharfun); + if (c == '0') + bit = 0; + else if (c == '1') + bit = 1; + else + { + if (c >= 0) + unreadchar (readcharfun, c); + break; + } + Dynarr_add (dyn, bit); } - if (c >= 0) - unreadchar (readcharfun, c); - val = make_bit_vector_from_byte_vector (Dynarr_atp (dyn, 0), Dynarr_length (dyn)); - Dynarr_free (dyn); return val; diff --git a/src/lrecord.h b/src/lrecord.h index 77c6707..6ae8581 100644 --- a/src/lrecord.h +++ b/src/lrecord.h @@ -510,11 +510,11 @@ MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash #define MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,basic_p,structtype) \ DECLARE_ERROR_CHECK_TYPECHECK(c_name, structtype) \ -unsigned int lrecord_type_##c_name = lrecord_type_count++; \ -const struct lrecord_implementation lrecord_##c_name = \ +unsigned int lrecord_type_##c_name; \ +struct lrecord_implementation lrecord_##c_name = \ { name, marker, printer, nuker, equal, hash, desc, \ getprop, putprop, remprop, plist, size, sizer, \ - (enum lrecord_type)lrecord_type_##c_name, basic_p } + lrecord_type_last_built_in_type, basic_p } extern Lisp_Object (*lrecord_markers[]) (Lisp_Object); @@ -525,6 +525,12 @@ extern Lisp_Object (*lrecord_markers[]) (Lisp_Object); lrecord_implementations_table[lrecord_type_##type]->marker; \ } while (0) +#define INIT_EXTERNAL_LRECORD_IMPLEMENTATION(type) do { \ + lrecord_type_##type = lrecord_type_count++; \ + lrecord_##type.lrecord_type_index = lrecord_type_##type; \ + INIT_LRECORD_IMPLEMENTATION(type); \ +} while (0) + #define LRECORDP(a) (XTYPE (a) == Lisp_Type_Record) #define XRECORD_LHEADER(a) ((struct lrecord_header *) XPNTR (a)) @@ -679,7 +685,16 @@ extern Lisp_Object Q##c_name##p # define DECLARE_EXTERNAL_LRECORD(c_name, structtype) \ extern unsigned int lrecord_type_##c_name; \ -DECLARE_LRECORD(c_name, structtype) +extern struct lrecord_implementation lrecord_##c_name; \ +INLINE_HEADER structtype * \ +error_check_##c_name (Lisp_Object obj); \ +INLINE_HEADER structtype * \ +error_check_##c_name (Lisp_Object obj) \ +{ \ + assert (RECORD_TYPEP (obj, lrecord_type_##c_name)); \ + return (structtype *) XPNTR (obj); \ +} \ +extern Lisp_Object Q##c_name##p # define DECLARE_NONRECORD(c_name, type_enum, structtype) \ INLINE_HEADER structtype * \ @@ -709,7 +724,7 @@ extern const struct lrecord_implementation lrecord_##c_name # define DECLARE_EXTERNAL_LRECORD(c_name, structtype) \ extern Lisp_Object Q##c_name##p; \ extern unsigned int lrecord_type_##c_name; \ -extern const struct lrecord_implementation lrecord_##c_name +extern struct lrecord_implementation lrecord_##c_name # define DECLARE_NONRECORD(c_name, type_enum, structtype) \ extern Lisp_Object Q##c_name##p # define XRECORD(x, c_name, structtype) ((structtype *) XPNTR (x)) diff --git a/src/lstream.c b/src/lstream.c index 29427db..878449e 100644 --- a/src/lstream.c +++ b/src/lstream.c @@ -74,20 +74,21 @@ int Lstream_putc (Lstream *stream, int c) 0 on success, -1 on error. int Lstream_getc (Lstream *stream) - Read one byte from the stream. This is a macro and so it - is very efficient. The STREAM argument is evaluated more - than once. Return value is -1 for EOF or error. + Read one byte from the stream and returns it as an unsigned + char cast to an int, or EOF on end of file or error. + This is a macro and so it is very efficient. The STREAM + argument is evaluated more than once. void Lstream_ungetc (Lstream *stream, int c) - Push one byte back onto the input queue. This will be the - next byte read from the stream. Any number of bytes can be - pushed back and will be read in the reverse order they were - pushed back -- most recent first. (This is necessary for - consistency -- if there are a number of bytes that have been - unread and I read and unread a byte, it needs to be the first - to be read again.) This is a macro and so it is very - efficient. The C argument is only evaluated once but the - STREAM argument is evaluated more than once. + Push one byte back onto the input queue, cast to unsigned char. + This will be the next byte read from the stream. Any number + of bytes can be pushed back and will be read in the reverse + order they were pushed back -- most recent first. (This is + necessary for consistency -- if there are a number of bytes + that have been unread and I read and unread a byte, it needs + to be the first to be read again.) This is a macro and so it + is very efficient. The C argument is only evaluated once but + the STREAM argument is evaluated more than once. int Lstream_fputc (Lstream *stream, int c) int Lstream_fgetc (Lstream *stream) @@ -497,7 +498,7 @@ Lstream_was_blocked_p (Lstream *lstr) return lstr->imp->was_blocked_p ? lstr->imp->was_blocked_p (lstr) : 0; } -static int +static ssize_t Lstream_raw_read (Lstream *lstr, unsigned char *buffer, size_t size) { if (! (lstr->flags & LSTREAM_FL_IS_OPEN)) diff --git a/src/lstream.h b/src/lstream.h index c8cb39a..df46960 100644 --- a/src/lstream.h +++ b/src/lstream.h @@ -277,8 +277,9 @@ INLINE_HEADER Emchar Lstream_get_emchar (Lstream *stream) { int c = Lstream_getc (stream); - return BYTE_ASCII_P (c) ? (Emchar) c : - Lstream_get_emchar_1 (stream, c); + return (c < 0x80 /* c == EOF || BYTE_ASCII_P (c) */ + ? (Emchar) c + : Lstream_get_emchar_1 (stream, c)); } INLINE_HEADER int Lstream_put_emchar (Lstream *stream, Emchar ch); diff --git a/src/m/alpha.h b/src/m/alpha.h index c209390..b04dab5 100644 --- a/src/m/alpha.h +++ b/src/m/alpha.h @@ -19,10 +19,6 @@ the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef LINUX -# define SYSTEM_MALLOC -#endif - #ifdef OSF1 # define ORDINARY_LINK #endif diff --git a/src/macros.c b/src/macros.c index a163241..2995eb4 100644 --- a/src/macros.c +++ b/src/macros.c @@ -257,7 +257,7 @@ Execute MACRO as string of editor command characters. If MACRO is a symbol, its function definition is used. COUNT is a repeat count, or nil for once, or 0 for infinite loop. */ - (macro, prefixarg)) + (macro, count)) { /* This function can GC */ Lisp_Object final; @@ -267,10 +267,10 @@ COUNT is a repeat count, or nil for once, or 0 for infinite loop. struct gcpro gcpro1; struct console *con = XCONSOLE (Vselected_console); - if (!NILP (prefixarg)) + if (!NILP (count)) { - prefixarg = Fprefix_numeric_value (prefixarg); - repeat = XINT (prefixarg); + count = Fprefix_numeric_value (count); + repeat = XINT (count); } final = indirect_function (macro, 1); diff --git a/src/marker.c b/src/marker.c index 0811ac0..9e57b2e 100644 --- a/src/marker.c +++ b/src/marker.c @@ -168,8 +168,8 @@ check_marker_circularities (struct buffer *buf) #endif static Lisp_Object -set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer, - int restricted_p) +set_marker_internal (Lisp_Object marker, Lisp_Object position, + Lisp_Object buffer, int restricted_p) { Bufpos charno; struct buffer *b; @@ -182,8 +182,8 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer, /* If position is nil or a marker that points nowhere, make this marker point nowhere. */ - if (NILP (pos) || - (MARKERP (pos) && !XMARKER (pos)->buffer)) + if (NILP (position) || + (MARKERP (position) && !XMARKER (position)->buffer)) { if (point_p) signal_simple_error ("Can't make point-marker point nowhere", @@ -193,7 +193,7 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer, return marker; } - CHECK_INT_COERCE_MARKER (pos); + CHECK_INT_COERCE_MARKER (position); if (NILP (buffer)) b = current_buffer; else @@ -212,7 +212,7 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer, } } - charno = XINT (pos); + charno = XINT (position); m = XMARKER (marker); if (restricted_p) @@ -259,26 +259,32 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer, DEFUN ("set-marker", Fset_marker, 2, 3, 0, /* -Position MARKER before character number NUMBER in BUFFER. +Move MARKER to position POSITION in BUFFER. +POSITION can be a marker, an integer or nil. If POSITION is an +integer, make MARKER point before the POSITIONth character in BUFFER. +If POSITION is nil, makes MARKER point nowhere. Then it no longer +slows down editing in any buffer. If POSITION is less than 1, move +MARKER to the beginning of BUFFER. If POSITION is greater than the +size of BUFFER, move MARKER to the end of BUFFER. BUFFER defaults to the current buffer. -If NUMBER is nil, makes marker point nowhere. -Then it no longer slows down editing in any buffer. -If this marker was returned by (point-marker t), then changing its position -moves point. You cannot change its buffer or make it point nowhere. -Returns MARKER. +If this marker was returned by (point-marker t), then changing its +position moves point. You cannot change its buffer or make it point +nowhere. +The return value is MARKER. */ - (marker, number, buffer)) + (marker, position, buffer)) { - return set_marker_internal (marker, number, buffer, 0); + return set_marker_internal (marker, position, buffer, 0); } /* This version of Fset_marker won't let the position be outside the visible part. */ Lisp_Object -set_marker_restricted (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer) +set_marker_restricted (Lisp_Object marker, Lisp_Object position, + Lisp_Object buffer) { - return set_marker_internal (marker, pos, buffer, 1); + return set_marker_internal (marker, position, buffer, 1); } @@ -404,21 +410,21 @@ copy_marker_1 (Lisp_Object marker, Lisp_Object type, int noseeum) } DEFUN ("copy-marker", Fcopy_marker, 1, 2, 0, /* -Return a new marker pointing at the same place as MARKER. -If argument is a number, makes a new marker pointing +Return a new marker pointing at the same place as MARKER-OR-INTEGER. +If MARKER-OR-INTEGER is an integer, return a new marker pointing at that position in the current buffer. -The optional argument TYPE specifies the insertion type of the new marker; -see `marker-insertion-type'. +Optional argument MARKER-TYPE specifies the insertion type of the new +marker; see `marker-insertion-type'. */ - (marker, type)) + (marker_or_integer, marker_type)) { - return copy_marker_1 (marker, type, 0); + return copy_marker_1 (marker_or_integer, marker_type, 0); } Lisp_Object -noseeum_copy_marker (Lisp_Object marker, Lisp_Object type) +noseeum_copy_marker (Lisp_Object marker, Lisp_Object marker_type) { - return copy_marker_1 (marker, type, 1); + return copy_marker_1 (marker, marker_type, 1); } DEFUN ("marker-insertion-type", Fmarker_insertion_type, 1, 1, 0, /* diff --git a/src/menubar-x.c b/src/menubar-x.c index 84d147e..34932dd 100644 --- a/src/menubar-x.c +++ b/src/menubar-x.c @@ -251,7 +251,7 @@ menu_item_descriptor_to_widget_value_1 (Lisp_Object desc, title_wv->enabled = 1; title_wv->next = sep_wv; sep_wv->type = SEPARATOR_TYPE; - sep_wv->value = menu_separator_style_and_to_external ("=="); + sep_wv->value = menu_separator_style_and_to_external ((Bufbyte *) "=="); sep_wv->next = 0; wv->contents = title_wv; diff --git a/src/menubar.c b/src/menubar.c index 7641aae..d0d60d7 100644 --- a/src/menubar.c +++ b/src/menubar.c @@ -232,7 +232,7 @@ See also 'find-menu-item'. } DEFUN ("popup-menu", Fpopup_menu, 1, 2, 0, /* -Pop up the given menu. +Pop up the menu described by MENU-DESCRIPTION. A menu description is a list of menu items, strings, and submenus. The first element of a menu must be a string, which is the name of the menu. @@ -312,10 +312,10 @@ For example: See menubar.el for many more examples. */ - (menu_desc, event)) + (menu_description, event)) { - struct frame *f = decode_frame(Qnil); - MAYBE_FRAMEMETH (f, popup_menu, (menu_desc,event)); + struct frame *f = decode_frame (Qnil); + MAYBE_FRAMEMETH (f, popup_menu, (menu_description, event)); return Qnil; } @@ -739,7 +739,7 @@ This is a specifier; use `set-specifier' to change it. offsetof (struct window, menubar_visible_p), menubar_visible_p_changed, offsetof (struct frame, menubar_visible_p), - menubar_visible_p_changed_in_frame); + menubar_visible_p_changed_in_frame, 0); } void diff --git a/src/minibuf.c b/src/minibuf.c index 0c9d560..8b59cff 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -289,11 +289,11 @@ ignore_completion_p (Lisp_Object completion_string, } -/* #### Maybe we should allow ALIST to be a hash table. It is wrong - for the use of obarrays to be better-rewarded than the use of - hash tables. By better-rewarded I mean that you can pass an obarray - to all of the completion functions, whereas you can't do anything - like that with a hash table. +/* #### Maybe we should allow COLLECTION to be a hash table. + It is wrong for the use of obarrays to be better-rewarded than the + use of hash tables. By better-rewarded I mean that you can pass an + obarray to all of the completion functions, whereas you can't do + anything like that with a hash table. To do so, there should probably be a map_obarray_or_alist_or_hash_table function which would be used by @@ -301,26 +301,29 @@ ignore_completion_p (Lisp_Object completion_string, additional funcalls slow things down? */ DEFUN ("try-completion", Ftry_completion, 2, 3, 0, /* -Return common substring of all completions of STRING in ALIST. -Each car of each element of ALIST is tested to see if it begins with STRING. +Return common substring of all completions of STRING in COLLECTION. +COLLECTION must be an alist, an obarray, or a function. +Each string in COLLECTION is tested to see if it begins with STRING. All that match are compared together; the longest initial sequence -common to all matches is returned as a string. -If there is no match at all, nil is returned. -For an exact match, t is returned. +common to all matches is returned as a string. If there is no match +at all, nil is returned. For an exact match, t is returned. -ALIST can be an obarray instead of an alist. -Then the print names of all symbols in the obarray are the possible matches. +If COLLECTION is an alist, the cars of the elements of the alist +\(which must be strings) form the set of possible completions. -ALIST can also be a function to do the completion itself. -It receives three arguments: the values STRING, PREDICATE and nil. -Whatever it returns becomes the value of `try-completion'. +If COLLECTION is an obarray, the names of all symbols in the obarray +are the possible completions. -If optional third argument PREDICATE is non-nil, -it is used to test each possible match. -The match is a candidate only if PREDICATE returns non-nil. -The argument given to PREDICATE is the alist element or the symbol from the obarray. +If COLLECTION is a function, it is called with three arguments: the +values STRING, PREDICATE and nil. Whatever it returns becomes the +value of `try-completion'. + +If optional third argument PREDICATE is non-nil, it is used to test +each possible match. The match is a candidate only if PREDICATE +returns non-nil. The argument given to PREDICATE is the alist element +or the symbol from the obarray. */ - (string, alist, pred)) + (string, collection, predicate)) { /* This function can GC */ Lisp_Object bestmatch, tail; @@ -334,31 +337,31 @@ The argument given to PREDICATE is the alist element or the symbol from the obar CHECK_STRING (string); - if (CONSP (alist)) + if (CONSP (collection)) { - Lisp_Object tem = XCAR (alist); + Lisp_Object tem = XCAR (collection); if (SYMBOLP (tem)) /* lambda, autoload, etc. Emacs-lisp sucks */ - return call3 (alist, string, pred, Qnil); + return call3 (collection, string, predicate, Qnil); else list = 1; } - else if (VECTORP (alist)) + else if (VECTORP (collection)) list = 0; - else if (NILP (alist)) + else if (NILP (collection)) list = 1; else - return call3 (alist, string, pred, Qnil); + return call3 (collection, string, predicate, Qnil); bestmatch = Qnil; blength = 0; slength = XSTRING_CHAR_LENGTH (string); - /* If ALIST is not a list, set TAIL just for gc pro. */ - tail = alist; + /* If COLLECTION is not a list, set TAIL just for gc pro. */ + tail = collection; if (!list) { - obsize = XVECTOR_LENGTH (alist); - bucket = XVECTOR_DATA (alist)[indice]; + obsize = XVECTOR_LENGTH (collection); + bucket = XVECTOR_DATA (collection)[indice]; } else /* warning suppression */ { @@ -405,7 +408,7 @@ The argument given to PREDICATE is the alist element or the symbol from the obar break; else { - bucket = XVECTOR_DATA (alist)[indice]; + bucket = XVECTOR_DATA (collection)[indice]; continue; } } @@ -424,7 +427,7 @@ The argument given to PREDICATE is the alist element or the symbol from the obar struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; int loser; GCPRO4 (tail, string, eltstring, bestmatch); - loser = ignore_completion_p (eltstring, pred, elt); + loser = ignore_completion_p (eltstring, predicate, elt); UNGCPRO; if (loser) /* reject this one */ continue; @@ -509,23 +512,27 @@ The argument given to PREDICATE is the alist element or the symbol from the obar DEFUN ("all-completions", Fall_completions, 2, 3, 0, /* -Search for partial matches to STRING in ALIST. -Each car of each element of ALIST is tested to see if it begins with STRING. -The value is a list of all the strings from ALIST that match. -ALIST can be an obarray instead of an alist. -Then the print names of all symbols in the obarray are the possible matches. - -ALIST can also be a function to do the completion itself. -It receives three arguments: the values STRING, PREDICATE and t. -Whatever it returns becomes the value of `all-completions'. - -If optional third argument PREDICATE is non-nil, -it is used to test each possible match. -The match is a candidate only if PREDICATE returns non-nil. -The argument given to PREDICATE is the alist element or -the symbol from the obarray. +Search for partial matches to STRING in COLLECTION. +COLLECTION must be an alist, an obarray, or a function. +Each string in COLLECTION is tested to see if it begins with STRING. +The value is a list of all the strings from COLLECTION that match. + +If COLLECTION is an alist, the cars of the elements of the alist +\(which must be strings) form the set of possible completions. + +If COLLECTION is an obarray, the names of all symbols in the obarray +are the possible completions. + +If COLLECTION is a function, it is called with three arguments: the +values STRING, PREDICATE and t. Whatever it returns becomes the +value of `all-completions'. + +If optional third argument PREDICATE is non-nil, it is used to test +each possible match. The match is a candidate only if PREDICATE +returns non-nil. The argument given to PREDICATE is the alist element +or the symbol from the obarray. */ - (string, alist, pred)) + (string, collection, predicate)) { /* This function can GC */ Lisp_Object tail; @@ -538,30 +545,30 @@ the symbol from the obarray. CHECK_STRING (string); - if (CONSP (alist)) + if (CONSP (collection)) { - Lisp_Object tem = XCAR (alist); + Lisp_Object tem = XCAR (collection); if (SYMBOLP (tem)) /* lambda, autoload, etc. Emacs-lisp sucks */ - return call3 (alist, string, pred, Qt); + return call3 (collection, string, predicate, Qt); else list = 1; } - else if (VECTORP (alist)) + else if (VECTORP (collection)) list = 0; - else if (NILP (alist)) + else if (NILP (collection)) list = 1; else - return call3 (alist, string, pred, Qt); + return call3 (collection, string, predicate, Qt); allmatches = Qnil; slength = XSTRING_CHAR_LENGTH (string); - /* If ALIST is not a list, set TAIL just for gc pro. */ - tail = alist; + /* If COLLECTION is not a list, set TAIL just for gc pro. */ + tail = collection; if (!list) { - obsize = XVECTOR_LENGTH (alist); - bucket = XVECTOR_DATA (alist)[indice]; + obsize = XVECTOR_LENGTH (collection); + bucket = XVECTOR_DATA (collection)[indice]; } else /* warning suppression */ { @@ -602,7 +609,7 @@ the symbol from the obarray. break; else { - bucket = XVECTOR_DATA (alist)[indice]; + bucket = XVECTOR_DATA (collection)[indice]; continue; } } @@ -611,11 +618,6 @@ the symbol from the obarray. if (STRINGP (eltstring) && (slength <= XSTRING_CHAR_LENGTH (eltstring)) - /* Reject alternatives that start with space - unless the input starts with space. */ - && ((XSTRING_CHAR_LENGTH (string) > 0 && - string_char (XSTRING (string), 0) == ' ') - || string_char (XSTRING (eltstring), 0) != ' ') && (0 > scmp (XSTRING_DATA (eltstring), XSTRING_DATA (string), slength))) @@ -624,7 +626,7 @@ the symbol from the obarray. struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; int loser; GCPRO4 (tail, eltstring, allmatches, string); - loser = ignore_completion_p (eltstring, pred, elt); + loser = ignore_completion_p (eltstring, predicate, elt); UNGCPRO; if (!loser) /* Ok => put it on the list. */ diff --git a/src/miscplay.c b/src/miscplay.c index 723981d..e2366b7 100644 --- a/src/miscplay.c +++ b/src/miscplay.c @@ -381,8 +381,11 @@ size_t sndcnv8S_2mono(void **data,size_t *sz,void **outbuf) *outbuf = dest = miscplay_sndbuf; while (count--) - *dest++ = (unsigned char)(((int)*((signed char *)(src++)) + - (int)*((signed char *)(src++))) / 2); + { + *dest++ = (unsigned char)(((int)*((signed char *)(src)) + + (int)*((signed char *)(src+1))) / 2); + src += 2; + } *data = src; return(rc); } @@ -402,8 +405,11 @@ size_t sndcnv2monounsigned(void **data,size_t *sz,void **outbuf) *outbuf = dest = miscplay_sndbuf; while (count--) - *dest++ = (unsigned char)(((int)*((signed char *)(src++)) + - (int)*((signed char *)(src++))) / 2) ^ 0x80; + { + *dest++ = (unsigned char)(((int)*((signed char *)(src)) + + (int)*((signed char *)(src+1))) / 2) ^ 0x80; + src += 2; + } *data = src; return(rc); } @@ -493,7 +499,10 @@ size_t sndcnvULaw_2linear(void **data,size_t *sz,void **outbuf) *outbuf = *data; while ((*sz)--) - *p++ = ulaw_dsp[*p]; + { + *p = ulaw_dsp[*p]; + p++; + } *sz = 0; *data = p; return p - (unsigned char *)*outbuf; @@ -550,11 +559,14 @@ size_t sndcnvULaw_2mono(void **data,size_t *sz,void **outbuf) *outbuf = dest = miscplay_sndbuf; while (count--) - /* it is not possible to directly interpolate between two ulaw encoded - data bytes, thus we need to convert to linear format first and later - we convert back to ulaw format */ - *dest++ = int2ulaw(ulaw2int[*(src)++] + - ulaw2int[*(src)++]); + { + /* it is not possible to directly interpolate between two ulaw encoded + data bytes, thus we need to convert to linear format first and later + we convert back to ulaw format */ + *dest++ = int2ulaw(ulaw2int[*src] + + ulaw2int[*(src+1)]); + src += 2; + } *data = src; return(rc); } @@ -566,9 +578,11 @@ size_t sndcnv16swap(void **data,size_t *sz,void **outbuf) *outbuf = *data; p = (unsigned short *) *outbuf; - while (cnt--) { - *p++ = ((*p & 0x00ff) << 8) | (*p >> 8); - } + while (cnt--) + { + *p = ((*p & 0x00ff) << 8) | (*p >> 8); + p++; + } *data = p; cnt = *sz; *sz = 0; diff --git a/src/mule-ccl.c b/src/mule-ccl.c index d47c258..4a61e89 100644 --- a/src/mule-ccl.c +++ b/src/mule-ccl.c @@ -1,8 +1,8 @@ /* CCL (Code Conversion Language) interpreter. - Copyright (C) 1995, 1997, 1998, 1999 Electrotechnical Laboratory, JAPAN. + Copyright (C) 1995, 1997 Electrotechnical Laboratory, JAPAN. Licensed to the Free Software Foundation. -This file is part of XEmacs. +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 @@ -19,19 +19,16 @@ along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* Synched up with : FSF Emacs 20.3.10 without ExCCL - * (including {Read|Write}MultibyteChar) */ +/* Synched up with : FSF Emacs 21.0.90 except TranslateCharacter */ #ifdef emacs - #include - -#if 0 -#ifdef STDC_HEADERS -#include -#endif #endif +#include + +#ifdef emacs + #include "lisp.h" #include "buffer.h" #include "character.h" @@ -40,35 +37,34 @@ Boston, MA 02111-1307, USA. */ #else /* not emacs */ -#include #include "mulelib.h" #endif /* not emacs */ /* This contains all code conversion map available to CCL. */ -/* Lisp_Object Vcode_conversion_map_vector; -*/ /* Alist of fontname patterns vs corresponding CCL program. */ Lisp_Object Vfont_ccl_encoder_alist; -/* This symbol is a property which assocates with ccl program vector. +/* This symbol is a property which associates with ccl program vector. Ex: (get 'ccl-big5-encoder 'ccl-program) returns ccl program vector. */ Lisp_Object Qccl_program; /* These symbols are properties which associate with code conversion map and their ID respectively. */ -/* Lisp_Object Qcode_conversion_map; Lisp_Object Qcode_conversion_map_id; -*/ /* Symbols of ccl program have this property, a value of the property - is an index for Vccl_protram_table. */ + is an index for Vccl_program_table. */ Lisp_Object Qccl_program_idx; -/* Vector of CCL program names vs corresponding program data. */ +/* Table of registered CCL programs. Each element is a vector of + NAME, CCL_PROG, and RESOLVEDP where NAME (symbol) is the name of + the program, CCL_PROG (vector) is the compiled code of the program, + RESOLVEDP (t or nil) is the flag to tell if symbols in CCL_PROG is + already resolved to index numbers or not. */ Lisp_Object Vccl_program_table; /* CCL (Code Conversion Language) is a simple language which has @@ -181,18 +177,18 @@ Lisp_Object Vccl_program_table; #define CCL_WriteConstJump 0x08 /* Write constant and jump: 1:A--D--D--R--E--S--S-000XXXXX - 2:const + 2:CONST ------------------------------ - write (const); + write (CONST); IC += ADDRESS; */ #define CCL_WriteConstReadJump 0x09 /* Write constant, read, and jump: 1:A--D--D--R--E--S--S-rrrXXXXX - 2:const + 2:CONST 3:A--D--D--R--E--S--S-rrrYYYYY ----------------------------- - write (const); + write (CONST); IC += 2; read (reg[rrr]); IC += ADDRESS; @@ -300,10 +296,15 @@ Lisp_Object Vccl_program_table; */ #define CCL_Call 0x13 /* Call the CCL program whose ID is - (CC..C). - 1:CCCCCCCCCCCCCCCCCCCC000XXXXX + CC..C or cc..c. + 1:CCCCCCCCCCCCCCCCCCCCFFFXXXXX + [2:00000000cccccccccccccccccccc] ------------------------------ - call (CC..C) + if (FFF) + call (cc..c) + IC++; + else + call (CC..C) */ #define CCL_WriteConstString 0x14 /* Write a constant or a string: @@ -422,9 +423,9 @@ Lisp_Object Vccl_program_table; IC += 2; */ -#define CCL_Extension 0x1F /* Extended CCL code +#define CCL_Extention 0x1F /* Extended CCL code 1:ExtendedCOMMNDRrrRRRrrrXXXXX - 2:ARGUEMENT + 2:ARGUMENT 3:... ------------------------------ extended_command (rrr,RRR,Rrr,ARGS) @@ -450,7 +451,6 @@ Lisp_Object Vccl_program_table; #define CCL_WriteMultibyteChar2 0x01 /* Write Multibyte Character 1:ExtendedCOMMNDRrrRRRrrrXXXXX */ -#if 0 /* Translate a character whose code point is reg[rrr] and the charset ID is reg[RRR] by a translation table whose ID is reg[Rrr]. @@ -480,7 +480,7 @@ Lisp_Object Vccl_program_table; If the element is t or lambda, finish without changing reg[rrr]. If the element is a number, set reg[rrr] to the number and finish. - Detail of the map structure is descibed in the comment for + Detail of the map structure is described in the comment for CCL_MapMultiple below. */ #define CCL_IterateMultipleMap 0x10 /* Iterate multiple maps @@ -504,7 +504,7 @@ Lisp_Object Vccl_program_table; (MAP-ID21 (MAP-ID211 (MAP-ID2111) MAP-ID212) MAP-ID22)), - the compiled CCL codes has this sequence: + the compiled CCL code has this sequence: CCL_MapMultiple (CCL code of this command) 16 (total number of MAPs and SEPARATORs) -7 (1st SEPARATOR) @@ -540,19 +540,26 @@ Lisp_Object Vccl_program_table; At first, VAL0 is set to reg[rrr], and it is translated by the first map to VAL1. Then, VAL1 is translated by the next map to VAL2. This mapping is iterated until the last map is used. The - result of the mapping is the last value of VAL?. + result of the mapping is the last value of VAL?. When the mapping + process reached to the end of the map set, it moves to the next + map set. If the next does not exit, the mapping process terminates, + and regard the last value as a result. But, when VALm is mapped to VALn and VALn is not a number, the - mapping proceed as below: + mapping proceeds as follows: If VALn is nil, the lastest map is ignored and the mapping of VALm - proceed to the next map. + proceeds to the next map. In VALn is t, VALm is reverted to reg[rrr] and the mapping of VALm - proceed to the next map. + proceeds to the next map. + + If VALn is lambda, move to the next map set like reaching to the + end of the current map set. - If VALn is lambda, the whole mapping process terminates, and VALm - is the result of this mapping. + If VALn is a symbol, call the CCL program refered by it. + Then, use reg[rrr] as a mapped value except for -1, -2 and -3. + Such special values are regarded as nil, t, and lambda respectively. Each map is a Lisp vector of the following format (a) or (b): (a)......[STARTPOINT VAL1 VAL2 ...] @@ -580,7 +587,7 @@ Lisp_Object Vccl_program_table; N:SEPARATOR_z (< 0) */ -#define MAX_MAP_SET_LEVEL 20 +#define MAX_MAP_SET_LEVEL 30 typedef struct { @@ -590,21 +597,45 @@ typedef struct static tr_stack mapping_stack[MAX_MAP_SET_LEVEL]; static tr_stack *mapping_stack_pointer; -#endif -#define PUSH_MAPPING_STACK(restlen, orig) \ -{ \ - mapping_stack_pointer->rest_length = (restlen); \ - mapping_stack_pointer->orig_val = (orig); \ - mapping_stack_pointer++; \ -} +/* If this variable is non-zero, it indicates the stack_idx + of immediately called by CCL_MapMultiple. */ +static int stack_idx_of_map_multiple = 0; -#define POP_MAPPING_STACK(restlen, orig) \ -{ \ - mapping_stack_pointer--; \ - (restlen) = mapping_stack_pointer->rest_length; \ - (orig) = mapping_stack_pointer->orig_val; \ -} \ +#define PUSH_MAPPING_STACK(restlen, orig) \ + do { \ + mapping_stack_pointer->rest_length = (restlen); \ + mapping_stack_pointer->orig_val = (orig); \ + mapping_stack_pointer++; \ + } while (0) + +#define POP_MAPPING_STACK(restlen, orig) \ + do { \ + mapping_stack_pointer--; \ + (restlen) = mapping_stack_pointer->rest_length; \ + (orig) = mapping_stack_pointer->orig_val; \ + } while (0) + +#define CCL_CALL_FOR_MAP_INSTRUCTION(symbol, ret_ic) \ + do { \ + struct ccl_program called_ccl; \ + if (stack_idx >= 256 \ + || (setup_ccl_program (&called_ccl, (symbol)) != 0)) \ + { \ + if (stack_idx > 0) \ + { \ + ccl_prog = ccl_prog_stack_struct[0].ccl_prog; \ + ic = ccl_prog_stack_struct[0].ic; \ + } \ + CCL_INVALID_CMD; \ + } \ + ccl_prog_stack_struct[stack_idx].ccl_prog = ccl_prog; \ + ccl_prog_stack_struct[stack_idx].ic = (ret_ic); \ + stack_idx++; \ + ccl_prog = called_ccl.prog; \ + ic = CCL_HEADER_MAIN; \ + goto ccl_repeat; \ + } while (0) #define CCL_MapSingle 0x12 /* Map by single code conversion map 1:ExtendedCOMMNDXXXRRRrrrXXXXX @@ -643,100 +674,192 @@ static tr_stack *mapping_stack_pointer; #define CCL_ENCODE_SJIS 0x17 /* X = HIGHER_BYTE (SJIS (Y, Z)) r[7] = LOWER_BYTE (SJIS (Y, Z) */ +/* Terminate CCL program successfully. */ +#define CCL_SUCCESS \ + do { \ + ccl->status = CCL_STAT_SUCCESS; \ + goto ccl_finish; \ + } while (0) + /* Suspend CCL program because of reading from empty input buffer or writing to full output buffer. When this program is resumed, the - same I/O command is executed. The `if (1)' is for warning suppression. */ + same I/O command is executed. */ #define CCL_SUSPEND(stat) \ do { \ ic--; \ ccl->status = stat; \ - if (1) goto ccl_finish; \ + goto ccl_finish; \ } while (0) /* Terminate CCL program because of invalid command. Should not occur - in the normal case. The `if (1)' is for warning suppression. */ + in the normal case. */ #define CCL_INVALID_CMD \ do { \ ccl->status = CCL_STAT_INVALID_CMD; \ - if (1) goto ccl_error_handler; \ + goto ccl_error_handler; \ } while (0) /* Encode one character CH to multibyte form and write to the current - output buffer. If CH is less than 256, CH is written as is. */ -#define CCL_WRITE_CHAR(ch) do { \ - if (!destination) \ - { \ - ccl->status = CCL_STAT_INVALID_CMD; \ - goto ccl_error_handler; \ - } \ - else \ - { \ - Bufbyte work[MAX_EMCHAR_LEN]; \ - int len = ( ch < ( conversion_mode == CCL_MODE_ENCODING ? \ - 256 : 128 ) ) ? \ - simple_set_charptr_emchar (work, ch) : \ - non_ascii_set_charptr_emchar (work, ch); \ - Dynarr_add_many (destination, work, len); \ - } \ -} while (0) + output buffer. At encoding time, if CH is less than 256, CH is + written as is. At decoding time, if CH cannot be regarded as an + ASCII character, write it in multibyte form. */ +#define CCL_WRITE_CHAR(ch) \ + do { \ + if (!destination) \ + CCL_INVALID_CMD; \ + if (conversion_mode == CCL_MODE_ENCODING) \ + { \ + if (ch == '\n') \ + { \ + if (ccl->eol_type == CCL_CODING_EOL_CRLF) \ + { \ + Dynarr_add (destination, '\r'); \ + Dynarr_add (destination, '\n'); \ + } \ + else if (ccl->eol_type == CCL_CODING_EOL_CR) \ + Dynarr_add (destination, '\r'); \ + else \ + Dynarr_add (destination, '\n'); \ + } \ + else if (ch < 0x100) \ + { \ + Dynarr_add (destination, ch); \ + } \ + else \ + { \ + Bufbyte work[MAX_EMCHAR_LEN]; \ + int len; \ + len = non_ascii_set_charptr_emchar (work, ch); \ + Dynarr_add_many (destination, work, len); \ + } \ + } \ + else \ + { \ + if (!CHAR_MULTIBYTE_P(ch)) \ + { \ + Dynarr_add (destination, ch); \ + } \ + else \ + { \ + Bufbyte work[MAX_EMCHAR_LEN]; \ + int len; \ + len = non_ascii_set_charptr_emchar (work, ch); \ + Dynarr_add_many (destination, work, len); \ + } \ + } \ + } while (0) /* Write a string at ccl_prog[IC] of length LEN to the current output - buffer. */ -#define CCL_WRITE_STRING(len) do { \ - if (!destination) \ - { \ - ccl->status = CCL_STAT_INVALID_CMD; \ - goto ccl_error_handler; \ - } \ - else \ - { \ - Bufbyte work[MAX_EMCHAR_LEN]; \ - for (i = 0; i < len; i++) \ - { \ - int ch = (XINT (ccl_prog[ic + (i / 3)]) \ - >> ((2 - (i % 3)) * 8)) & 0xFF; \ - int bytes = \ - ( ch < ( conversion_mode == CCL_MODE_ENCODING ? \ - 256 : 128 ) ) ? \ - simple_set_charptr_emchar (work, ch) : \ - non_ascii_set_charptr_emchar (work, ch); \ - Dynarr_add_many (destination, work, bytes); \ - } \ - } \ -} while (0) + buffer. But this macro treat this string as a binary. Therefore, + cannot handle a multibyte string except for Control-1 characters. */ +#define CCL_WRITE_STRING(len) \ + do { \ + Bufbyte work[MAX_EMCHAR_LEN]; \ + int ch, bytes; \ + if (!destination) \ + CCL_INVALID_CMD; \ + else if (conversion_mode == CCL_MODE_ENCODING) \ + { \ + for (i = 0; i < len; i++) \ + { \ + ch = ((XINT (ccl_prog[ic + (i / 3)])) \ + >> ((2 - (i % 3)) * 8)) & 0xFF; \ + if (ch == '\n') \ + { \ + if (ccl->eol_type == CCL_CODING_EOL_CRLF) \ + { \ + Dynarr_add (destination, '\r'); \ + Dynarr_add (destination, '\n'); \ + } \ + else if (ccl->eol_type == CCL_CODING_EOL_CR) \ + Dynarr_add (destination, '\r'); \ + else \ + Dynarr_add (destination, '\n'); \ + } \ + if (ch < 0x100) \ + { \ + Dynarr_add (destination, ch); \ + } \ + else \ + { \ + bytes = non_ascii_set_charptr_emchar (work, ch); \ + Dynarr_add_many (destination, work, len); \ + } \ + } \ + } \ + else \ + { \ + for (i = 0; i < len; i++) \ + { \ + ch = ((XINT (ccl_prog[ic + (i / 3)])) \ + >> ((2 - (i % 3)) * 8)) & 0xFF; \ + if (!CHAR_MULTIBYTE_P(ch)) \ + { \ + Dynarr_add (destination, ch); \ + } \ + else \ + { \ + bytes = non_ascii_set_charptr_emchar (work, ch); \ + Dynarr_add_many (destination, work, len); \ + } \ + } \ + } \ + } while (0) /* Read one byte from the current input buffer into Rth register. */ -#define CCL_READ_CHAR(r) do { \ - if (!src && !ccl->last_block) \ - { \ - ccl->status = CCL_STAT_INVALID_CMD; \ - goto ccl_error_handler; \ - } \ - else if (src < src_end) \ - r = *src++; \ - else if (ccl->last_block) \ - { \ - ic = ccl->eof_ic; \ - goto ccl_repeat; \ - } \ - else \ - /* Suspend CCL program because of \ - reading from empty input buffer or \ - writing to full output buffer. \ - When this program is resumed, the \ - same I/O command is executed. */ \ - { \ - ic--; \ - ccl->status = CCL_STAT_SUSPEND_BY_SRC; \ - goto ccl_finish; \ - } \ -} while (0) +#define CCL_READ_CHAR(r) \ + do { \ + if (!src) \ + CCL_INVALID_CMD; \ + if (src < src_end) \ + r = *src++; \ + else \ + { \ + if (ccl->last_block) \ + { \ + ic = ccl->eof_ic; \ + goto ccl_repeat; \ + } \ + else \ + CCL_SUSPEND (CCL_STAT_SUSPEND_BY_SRC); \ + } \ + } while (0) + + +/* Set C to the character code made from CHARSET and CODE. This is + like MAKE_CHAR but check the validity of CHARSET and CODE. If they + are not valid, set C to (CODE & 0xFF) because that is usually the + case that CCL_ReadMultibyteChar2 read an invalid code and it set + CODE to that invalid byte. */ + +/* On XEmacs, TranslateCharacter is not supported. Thus, this + macro is not used. */ +#if 0 +#define CCL_MAKE_CHAR(charset, code, c) \ + do { \ + if (charset == CHARSET_ASCII) \ + c = code & 0xFF; \ + else if (CHARSET_DEFINED_P (charset) \ + && (code & 0x7F) >= 32 \ + && (code < 256 || ((code >> 7) & 0x7F) >= 32)) \ + { \ + int c1 = code & 0x7F, c2 = 0; \ + \ + if (code >= 256) \ + c2 = c1, c1 = (code >> 7) & 0x7F; \ + c = MAKE_CHAR (charset, c1, c2); \ + } \ + else \ + c = code & 0xFF; \ + } while (0) +#endif /* Execute CCL code on SRC_BYTES length text at SOURCE. The resulting - text goes to a place pointed by DESTINATION. The bytes actually - processed is returned as *CONSUMED. The return value is the length - of the resulting text. As a side effect, the contents of CCL registers + text goes to a place pointed by DESTINATION, the length of which + should not exceed DST_BYTES. The bytes actually processed is + returned as *CONSUMED. The return value is the length of the + resulting text. As a side effect, the contents of CCL registers are updated. If SOURCE or DESTINATION is NULL, only operations on registers are permitted. */ @@ -756,17 +879,20 @@ struct ccl_prog_stack static struct ccl_prog_stack ccl_prog_stack_struct[256]; int -ccl_driver (struct ccl_program *ccl, const unsigned char *source, - unsigned_char_dynarr *destination, int src_bytes, - int *consumed, int conversion_mode) +ccl_driver (struct ccl_program *ccl, + const unsigned char *source, + unsigned_char_dynarr *destination, + int src_bytes, + int *consumed, + int conversion_mode) { - int *reg = ccl->reg; - int ic = ccl->ic; - int code = -1; /* init to illegal value, */ - int field1, field2; - Lisp_Object *ccl_prog = ccl->prog; + register int *reg = ccl->reg; + register int ic = ccl->ic; + register int code = -1; + register int field1, field2; + register Lisp_Object *ccl_prog = ccl->prog; const unsigned char *src = source, *src_end = src + src_bytes; - int jump_address = 0; /* shut up the compiler */ + int jump_address; int i, j, op; int stack_idx = ccl->stack_idx; /* Instruction counter of the current CCL code. */ @@ -775,10 +901,11 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, if (ic >= ccl->eof_ic) ic = CCL_HEADER_MAIN; -#if 0 /* not for XEmacs ? */ if (ccl->buf_magnification ==0) /* We can't produce any bytes. */ - dst = NULL; -#endif + destination = NULL; + + /* Set mapping stack pointer. */ + mapping_stack_pointer = mapping_stack; #ifdef CCL_DEBUG ccl_backtrace_idx = 0; @@ -927,7 +1054,7 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, i = reg[RRR]; j = XINT (ccl_prog[ic]); op = field1 >> 6; - ic++; + jump_address = ic + 1; goto ccl_set_expr; case CCL_WriteRegister: /* CCCCCCCCCCCCCCCCCCCrrrXXXXX */ @@ -947,32 +1074,43 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, i = reg[RRR]; j = reg[Rrr]; op = field1 >> 6; + jump_address = ic; goto ccl_set_expr; - case CCL_Call: /* CCCCCCCCCCCCCCCCCCCC000XXXXX */ + case CCL_Call: /* 1:CCCCCCCCCCCCCCCCCCCCFFFXXXXX */ { Lisp_Object slot; + int prog_id; + + /* If FFF is nonzero, the CCL program ID is in the + following code. */ + if (rrr) + { + prog_id = XINT (ccl_prog[ic]); + ic++; + } + else + prog_id = field1; if (stack_idx >= 256 - || field1 < 0 - || field1 >= XVECTOR_LENGTH (Vccl_program_table) - || (slot = XVECTOR_DATA (Vccl_program_table)[field1], - !CONSP (slot)) - || !VECTORP (XCDR (slot))) + || prog_id < 0 + || prog_id >= XVECTOR (Vccl_program_table)->size + || (slot = XVECTOR (Vccl_program_table)->contents[prog_id], + !VECTORP (slot)) + || !VECTORP (XVECTOR (slot)->contents[1])) { if (stack_idx > 0) { ccl_prog = ccl_prog_stack_struct[0].ccl_prog; ic = ccl_prog_stack_struct[0].ic; } - ccl->status = CCL_STAT_INVALID_CMD; - goto ccl_error_handler; + CCL_INVALID_CMD; } ccl_prog_stack_struct[stack_idx].ccl_prog = ccl_prog; ccl_prog_stack_struct[stack_idx].ic = ic; stack_idx++; - ccl_prog = XVECTOR_DATA (XCDR (slot)); + ccl_prog = XVECTOR (XVECTOR (slot)->contents[1])->contents; ic = CCL_HEADER_MAIN; } break; @@ -998,8 +1136,9 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, break; case CCL_End: /* 0000000000000000000000XXXXX */ - if (stack_idx-- > 0) + if (stack_idx > 0) { + stack_idx--; ccl_prog = ccl_prog_stack_struct[stack_idx].ccl_prog; ic = ccl_prog_stack_struct[stack_idx].ic; break; @@ -1009,9 +1148,7 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, /* ccl->ic should points to this command code again to suppress further processing. */ ic--; - /* Terminate CCL program successfully. */ - ccl->status = CCL_STAT_SUCCESS; - goto ccl_finish; + CCL_SUCCESS; case CCL_ExprSelfConst: /* 00000OPERATION000000rrrXXXXX */ i = XINT (ccl_prog[ic]); @@ -1045,9 +1182,7 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, case CCL_LE: reg[rrr] = reg[rrr] <= i; break; case CCL_GE: reg[rrr] = reg[rrr] >= i; break; case CCL_NE: reg[rrr] = reg[rrr] != i; break; - default: - ccl->status = CCL_STAT_INVALID_CMD; - goto ccl_error_handler; + default: CCL_INVALID_CMD; } break; @@ -1096,7 +1231,7 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, case CCL_MOD: reg[rrr] = i % j; break; case CCL_AND: reg[rrr] = i & j; break; case CCL_OR: reg[rrr] = i | j; break; - case CCL_XOR: reg[rrr] = i ^ j; break; + case CCL_XOR: reg[rrr] = i ^ j;; break; case CCL_LSH: reg[rrr] = i << j; break; case CCL_RSH: reg[rrr] = i >> j; break; case CCL_LSH8: reg[rrr] = (i << 8) | j; break; @@ -1108,23 +1243,32 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, case CCL_LE: reg[rrr] = i <= j; break; case CCL_GE: reg[rrr] = i >= j; break; case CCL_NE: reg[rrr] = i != j; break; - case CCL_DECODE_SJIS: DECODE_SJIS (i, j, reg[rrr], reg[7]); break; - case CCL_ENCODE_SJIS: ENCODE_SJIS (i, j, reg[rrr], reg[7]); break; - default: - ccl->status = CCL_STAT_INVALID_CMD; - goto ccl_error_handler; + case CCL_DECODE_SJIS: + /* DECODE_SJIS set MSB for internal format + as opposed to Emacs. */ + DECODE_SJIS (i, j, reg[rrr], reg[7]); + reg[rrr] &= 0x7F; + reg[7] &= 0x7F; + break; + case CCL_ENCODE_SJIS: + /* ENCODE_SJIS assumes MSB of SJIS-char is set + as opposed to Emacs. */ + ENCODE_SJIS (i | 0x80, j | 0x80, reg[rrr], reg[7]); + break; + default: CCL_INVALID_CMD; } code &= 0x1F; if (code == CCL_WriteExprConst || code == CCL_WriteExprRegister) { i = reg[rrr]; CCL_WRITE_CHAR (i); + ic = jump_address; } else if (!reg[rrr]) ic = jump_address; break; - case CCL_Extension: + case CCL_Extention: switch (EXCMD) { #ifndef UTF2000 @@ -1140,48 +1284,6 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, } i = *src++; -#if 0 - if (i == LEADING_CODE_COMPOSITION) - { - if (src >= src_end) - goto ccl_read_multibyte_character_suspend; - if (*src == 0xFF) - { - ccl->private_state = COMPOSING_WITH_RULE_HEAD; - src++; - } - else - ccl->private_state = COMPOSING_NO_RULE_HEAD; - - continue; - } - if (ccl->private_state != COMPOSING_NO) - { - /* composite character */ - if (i < 0xA0) - ccl->private_state = COMPOSING_NO; - else - { - if (COMPOSING_WITH_RULE_RULE == ccl->private_state) - { - ccl->private_state = COMPOSING_WITH_RULE_HEAD; - continue; - } - else if (COMPOSING_WITH_RULE_HEAD == ccl->private_state) - ccl->private_state = COMPOSING_WITH_RULE_RULE; - - if (i == 0xA0) - { - if (src >= src_end) - goto ccl_read_multibyte_character_suspend; - i = *src++ & 0x7F; - } - else - i -= 0x20; - } - } -#endif - if (i < 0x80) { /* ASCII */ @@ -1248,14 +1350,10 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, i = reg[RRR]; /* charset */ if (i == LEADING_BYTE_ASCII) i = reg[rrr] & 0xFF; -#if 0 - else if (i == CHARSET_COMPOSITION) - i = MAKE_COMPOSITE_CHAR (reg[rrr]); -#endif else if (XCHARSET_DIMENSION (CHARSET_BY_LEADING_BYTE (i)) == 1) - i = ((i - FIELD2_TO_OFFICIAL_LEADING_BYTE) << 7) - | (reg[rrr] & 0x7F); - else if (i < MIN_LEADING_BYTE_OFFICIAL_2) + i = (((i - FIELD2_TO_OFFICIAL_LEADING_BYTE) << 7) + | (reg[rrr] & 0x7F)); + else if (i < MAX_LEADING_BYTE_OFFICIAL_2) i = ((i - FIELD1_TO_OFFICIAL_LEADING_BYTE) << 14) | reg[rrr]; else i = ((i - FIELD1_TO_PRIVATE_LEADING_BYTE) << 14) | reg[rrr]; @@ -1265,23 +1363,11 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, break; #endif -#if 0 case CCL_TranslateCharacter: - i = reg[RRR]; /* charset */ - if (i == LEADING_BYTE_ASCII) - i = reg[rrr]; - else if (i == CHARSET_COMPOSITION) - { - reg[RRR] = -1; - break; - } - else if (CHARSET_DIMENSION (i) == 1) - i = ((i - 0x70) << 7) | (reg[rrr] & 0x7F); - else if (i < MIN_LEADING_BYTE_OFFICIAL_2) - i = ((i - 0x8F) << 14) | (reg[rrr] & 0x3FFF); - else - i = ((i - 0xE0) << 14) | (reg[rrr] & 0x3FFF); - +#if 0 + /* XEmacs does not have translate_char, and its + equivalent nor. We do nothing on this operation. */ + CCL_MAKE_CHAR (reg[RRR], reg[rrr], i); op = translate_char (GET_TRANSLATION_TABLE (reg[Rrr]), i, -1, 0, 0); SPLIT_CHAR (op, reg[RRR], i, j); @@ -1289,32 +1375,23 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, i = (i << 7) | j; reg[rrr] = i; +#endif break; case CCL_TranslateCharacterConstTbl: +#if 0 + /* XEmacs does not have translate_char, and its + equivalent nor. We do nothing on this operation. */ op = XINT (ccl_prog[ic]); /* table */ ic++; - i = reg[RRR]; /* charset */ - if (i == LEADING_BYTE_ASCII) - i = reg[rrr]; - else if (i == CHARSET_COMPOSITION) - { - reg[RRR] = -1; - break; - } - else if (CHARSET_DIMENSION (i) == 1) - i = ((i - 0x70) << 7) | (reg[rrr] & 0x7F); - else if (i < MIN_LEADING_BYTE_OFFICIAL_2) - i = ((i - 0x8F) << 14) | (reg[rrr] & 0x3FFF); - else - i = ((i - 0xE0) << 14) | (reg[rrr] & 0x3FFF); - + CCL_MAKE_CHAR (reg[RRR], reg[rrr], i); op = translate_char (GET_TRANSLATION_TABLE (op), i, -1, 0, 0); SPLIT_CHAR (op, reg[RRR], i, j); if (j != -1) i = (i << 7) | j; reg[rrr] = i; +#endif break; case CCL_IterateMultipleMap: @@ -1346,9 +1423,9 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, map = XVECTOR (Vcode_conversion_map_vector)->contents[point]; - /* Check map varidity. */ + /* Check map validity. */ if (!CONSP (map)) continue; - map = XCONS(map)->cdr; + map = XCDR (map); if (!VECTORP (map)) continue; size = XVECTOR (map)->size; if (size <= 1) continue; @@ -1357,8 +1434,8 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, /* check map type, [STARTPOINT VAL1 VAL2 ...] or - [t ELELMENT STARTPOINT ENDPOINT] */ - if (NUMBERP (content)) + [t ELEMENT STARTPOINT ENDPOINT] */ + if (INTP (content)) { point = XUINT (content); point = op - point + 1; @@ -1379,7 +1456,7 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, if (NILP (content)) continue; - else if (NUMBERP (content)) + else if (INTP (content)) { reg[RRR] = i; reg[rrr] = XINT(content); @@ -1392,14 +1469,18 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, } else if (CONSP (content)) { - attrib = XCONS (content)->car; - value = XCONS (content)->cdr; - if (!NUMBERP (attrib) || !NUMBERP (value)) + attrib = XCAR (content); + value = XCDR (content); + if (!INTP (attrib) || !INTP (value)) continue; reg[RRR] = i; reg[rrr] = XUINT (value); break; } + else if (SYMBOLP (content)) + CCL_CALL_FOR_MAP_INSTRUCTION (content, fin_ic); + else + CCL_INVALID_CMD; } if (i == j) reg[RRR] = -1; @@ -1412,10 +1493,27 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, Lisp_Object map, content, attrib, value; int point, size, map_vector_size; int map_set_rest_length, fin_ic; + int current_ic = this_ic; + + /* inhibit recursive call on MapMultiple. */ + if (stack_idx_of_map_multiple > 0) + { + if (stack_idx_of_map_multiple <= stack_idx) + { + stack_idx_of_map_multiple = 0; + mapping_stack_pointer = mapping_stack; + CCL_INVALID_CMD; + } + } + else + mapping_stack_pointer = mapping_stack; + stack_idx_of_map_multiple = 0; map_set_rest_length = XINT (ccl_prog[ic++]); /* number of maps and separators. */ fin_ic = ic + map_set_rest_length; + op = reg[rrr]; + if ((map_set_rest_length > reg[RRR]) && (reg[RRR] >= 0)) { ic += reg[RRR]; @@ -1426,100 +1524,165 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, { ic = fin_ic; reg[RRR] = -1; + mapping_stack_pointer = mapping_stack; break; } - mapping_stack_pointer = mapping_stack; - op = reg[rrr]; - PUSH_MAPPING_STACK (0, op); - reg[RRR] = -1; - map_vector_size = XVECTOR (Vcode_conversion_map_vector)->size; - for (;map_set_rest_length > 0;i++, map_set_rest_length--) - { - point = XINT(ccl_prog[ic++]); - if (point < 0) - { - point = -point; - if (mapping_stack_pointer - >= &mapping_stack[MAX_MAP_SET_LEVEL]) - { - CCL_INVALID_CMD; - } - PUSH_MAPPING_STACK (map_set_rest_length - point, - reg[rrr]); - map_set_rest_length = point + 1; - reg[rrr] = op; - continue; - } - - if (point >= map_vector_size) continue; - map = (XVECTOR (Vcode_conversion_map_vector) - ->contents[point]); - /* Check map varidity. */ - if (!CONSP (map)) continue; - map = XCONS (map)->cdr; - if (!VECTORP (map)) continue; - size = XVECTOR (map)->size; - if (size <= 1) continue; - - content = XVECTOR (map)->contents[0]; - - /* check map type, - [STARTPOINT VAL1 VAL2 ...] or - [t ELEMENT STARTPOINT ENDPOINT] */ - if (NUMBERP (content)) - { - point = XUINT (content); - point = op - point + 1; - if (!((point >= 1) && (point < size))) continue; - content = XVECTOR (map)->contents[point]; - } - else if (EQ (content, Qt)) - { - if (size != 4) continue; - if ((op >= XUINT (XVECTOR (map)->contents[2])) && - (op < XUINT (XVECTOR (map)->contents[3]))) - content = XVECTOR (map)->contents[1]; - else - continue; - } - else - continue; + if (mapping_stack_pointer <= (mapping_stack + 1)) + { + /* Set up initial state. */ + mapping_stack_pointer = mapping_stack; + PUSH_MAPPING_STACK (0, op); + reg[RRR] = -1; + } + else + { + /* Recover after calling other ccl program. */ + int orig_op; - if (NILP (content)) - continue; - else if (NUMBERP (content)) - { - op = XINT (content); - reg[RRR] = i; - i += map_set_rest_length; - POP_MAPPING_STACK (map_set_rest_length, reg[rrr]); - } - else if (CONSP (content)) - { - attrib = XCONS (content)->car; - value = XCONS (content)->cdr; - if (!NUMBERP (attrib) || !NUMBERP (value)) - continue; - reg[RRR] = i; - op = XUINT (value); - i += map_set_rest_length; - POP_MAPPING_STACK (map_set_rest_length, reg[rrr]); - } - else if (EQ (content, Qt)) + POP_MAPPING_STACK (map_set_rest_length, orig_op); + POP_MAPPING_STACK (map_set_rest_length, reg[rrr]); + switch (op) { - reg[RRR] = i; + case -1: + /* Regard it as Qnil. */ + op = orig_op; + i++; + ic++; + map_set_rest_length--; + break; + case -2: + /* Regard it as Qt. */ op = reg[rrr]; + i++; + ic++; + map_set_rest_length--; + break; + case -3: + /* Regard it as Qlambda. */ + op = orig_op; i += map_set_rest_length; + ic += map_set_rest_length; + map_set_rest_length = 0; + break; + default: + /* Regard it as normal mapping. */ + i += map_set_rest_length; + ic += map_set_rest_length; POP_MAPPING_STACK (map_set_rest_length, reg[rrr]); - } - else if (EQ (content, Qlambda)) - { break; } - else - CCL_INVALID_CMD; } + map_vector_size = XVECTOR (Vcode_conversion_map_vector)->size; + + do { + for (;map_set_rest_length > 0;i++, ic++, map_set_rest_length--) + { + point = XINT(ccl_prog[ic]); + if (point < 0) + { + /* +1 is for including separator. */ + point = -point + 1; + if (mapping_stack_pointer + >= &mapping_stack[MAX_MAP_SET_LEVEL]) + CCL_INVALID_CMD; + PUSH_MAPPING_STACK (map_set_rest_length - point, + reg[rrr]); + map_set_rest_length = point; + reg[rrr] = op; + continue; + } + + if (point >= map_vector_size) continue; + map = (XVECTOR (Vcode_conversion_map_vector) + ->contents[point]); + + /* Check map validity. */ + if (!CONSP (map)) continue; + map = XCDR (map); + if (!VECTORP (map)) continue; + size = XVECTOR (map)->size; + if (size <= 1) continue; + + content = XVECTOR (map)->contents[0]; + + /* check map type, + [STARTPOINT VAL1 VAL2 ...] or + [t ELEMENT STARTPOINT ENDPOINT] */ + if (INTP (content)) + { + point = XUINT (content); + point = op - point + 1; + if (!((point >= 1) && (point < size))) continue; + content = XVECTOR (map)->contents[point]; + } + else if (EQ (content, Qt)) + { + if (size != 4) continue; + if ((op >= XUINT (XVECTOR (map)->contents[2])) && + (op < XUINT (XVECTOR (map)->contents[3]))) + content = XVECTOR (map)->contents[1]; + else + continue; + } + else + continue; + + if (NILP (content)) + continue; + + reg[RRR] = i; + if (INTP (content)) + { + op = XINT (content); + i += map_set_rest_length - 1; + ic += map_set_rest_length - 1; + POP_MAPPING_STACK (map_set_rest_length, reg[rrr]); + map_set_rest_length++; + } + else if (CONSP (content)) + { + attrib = XCAR (content); + value = XCDR (content); + if (!INTP (attrib) || !INTP (value)) + continue; + op = XUINT (value); + i += map_set_rest_length - 1; + ic += map_set_rest_length - 1; + POP_MAPPING_STACK (map_set_rest_length, reg[rrr]); + map_set_rest_length++; + } + else if (EQ (content, Qt)) + { + op = reg[rrr]; + } + else if (EQ (content, Qlambda)) + { + i += map_set_rest_length; + ic += map_set_rest_length; + break; + } + else if (SYMBOLP (content)) + { + if (mapping_stack_pointer + >= &mapping_stack[MAX_MAP_SET_LEVEL]) + CCL_INVALID_CMD; + PUSH_MAPPING_STACK (map_set_rest_length, reg[rrr]); + PUSH_MAPPING_STACK (map_set_rest_length, op); + stack_idx_of_map_multiple = stack_idx + 1; + CCL_CALL_FOR_MAP_INSTRUCTION (content, current_ic); + } + else + CCL_INVALID_CMD; + } + if (mapping_stack_pointer <= (mapping_stack + 1)) + break; + POP_MAPPING_STACK (map_set_rest_length, reg[rrr]); + i += map_set_rest_length; + ic += map_set_rest_length; + POP_MAPPING_STACK (map_set_rest_length, reg[rrr]); + } while (1); + ic = fin_ic; } reg[rrr] = op; @@ -1542,7 +1705,7 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, reg[RRR] = -1; break; } - map = XCONS(map)->cdr; + map = XCDR (map); if (!VECTORP (map)) { reg[RRR] = -1; @@ -1557,28 +1720,29 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, reg[RRR] = -1; else { + reg[RRR] = 0; content = XVECTOR (map)->contents[point]; if (NILP (content)) reg[RRR] = -1; - else if (NUMBERP (content)) + else if (INTP (content)) reg[rrr] = XINT (content); - else if (EQ (content, Qt)) - reg[RRR] = i; + else if (EQ (content, Qt)); else if (CONSP (content)) { - attrib = XCONS (content)->car; - value = XCONS (content)->cdr; - if (!NUMBERP (attrib) || !NUMBERP (value)) + attrib = XCAR (content); + value = XCDR (content); + if (!INTP (attrib) || !INTP (value)) continue; reg[rrr] = XUINT(value); break; } + else if (SYMBOLP (content)) + CCL_CALL_FOR_MAP_INSTRUCTION (content, ic); else reg[RRR] = -1; } } break; -#endif default: CCL_INVALID_CMD; @@ -1586,8 +1750,7 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, break; default: - ccl->status = CCL_STAT_INVALID_CMD; - goto ccl_error_handler; + CCL_INVALID_CMD; } } @@ -1599,15 +1762,8 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, there. */ char msg[256]; -#if 0 /* not for XEmacs ? */ - if (!dst) - dst = destination; -#endif - switch (ccl->status) { - /* Terminate CCL program because of invalid command. - Should not occur in the normal case. */ case CCL_STAT_INVALID_CMD: sprintf(msg, "\nCCL: Invalid command %x (ccl_code = %x) at %d.", code & 0x1F, code, this_ic); @@ -1632,7 +1788,7 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, break; case CCL_STAT_QUIT: - sprintf(msg, "\nCCL: Quited."); + sprintf(msg, "\nCCL: Exited."); break; default: @@ -1647,143 +1803,220 @@ ccl_driver (struct ccl_program *ccl, const unsigned char *source, ccl->stack_idx = stack_idx; ccl->prog = ccl_prog; if (consumed) *consumed = src - source; - if (destination) - return Dynarr_length (destination); - else + if (!destination) return 0; -} - -/* Setup fields of the structure pointed by CCL appropriately for the - execution of compiled CCL code in VEC (vector of integer). - If VEC is nil, we skip setting ups based on VEC. */ -void -setup_ccl_program (struct ccl_program *ccl, Lisp_Object vec) -{ - int i; - - if (VECTORP (vec)) - { - ccl->size = XVECTOR_LENGTH (vec); - ccl->prog = XVECTOR_DATA (vec); - ccl->eof_ic = XINT (XVECTOR_DATA (vec)[CCL_HEADER_EOF]); - ccl->buf_magnification = XINT (XVECTOR_DATA (vec)[CCL_HEADER_BUF_MAG]); - } - ccl->ic = CCL_HEADER_MAIN; - for (i = 0; i < 8; i++) - ccl->reg[i] = 0; - ccl->last_block = 0; - ccl->private_state = 0; - ccl->status = 0; - ccl->stack_idx = 0; + return Dynarr_length (destination); } /* Resolve symbols in the specified CCL code (Lisp vector). This function converts symbols of code conversion maps and character - translation tables embeded in the CCL code into their ID numbers. */ + translation tables embedded in the CCL code into their ID numbers. + + The return value is a vector (CCL itself or a new vector in which + all symbols are resolved), Qt if resolving of some symbol failed, + or nil if CCL contains invalid data. */ static Lisp_Object resolve_symbol_ccl_program (Lisp_Object ccl) { - int i, veclen; - Lisp_Object result, contents /*, prop */; + int i, veclen, unresolved = 0; + Lisp_Object result, contents, val; result = ccl; - veclen = XVECTOR_LENGTH (result); + veclen = XVECTOR (result)->size; - /* Set CCL program's table ID */ for (i = 0; i < veclen; i++) { - contents = XVECTOR_DATA (result)[i]; - if (SYMBOLP (contents)) + contents = XVECTOR (result)->contents[i]; + if (INTP (contents)) + continue; + else if (CONSP (contents) + && SYMBOLP (XCAR (contents)) + && SYMBOLP (XCDR (contents))) { - if (EQ(result, ccl)) + /* This is the new style for embedding symbols. The form is + (SYMBOL . PROPERTY). (get SYMBOL PROPERTY) should give + an index number. */ + + if (EQ (result, ccl)) + result = Fcopy_sequence (ccl); + + val = Fget (XCAR (contents), XCDR (contents), Qnil); + if (NATNUMP (val)) + XVECTOR (result)->contents[i] = val; + else + unresolved = 1; + continue; + } + else if (SYMBOLP (contents)) + { + /* This is the old style for embedding symbols. This style + may lead to a bug if, for instance, a translation table + and a code conversion map have the same name. */ + if (EQ (result, ccl)) result = Fcopy_sequence (ccl); -#if 0 - prop = Fget (contents, Qtranslation_table_id); - if (NUMBERP (prop)) - { - XVECTOR_DATA (result)[i] = prop; - continue; - } - prop = Fget (contents, Qcode_conversion_map_id); - if (NUMBERP (prop)) - { - XVECTOR_DATA (result)[i] = prop; - continue; - } - prop = Fget (contents, Qccl_program_idx); - if (NUMBERP (prop)) + val = Fget (contents, Qcode_conversion_map_id, Qnil); + if (NATNUMP (val)) + XVECTOR (result)->contents[i] = val; + else { - XVECTOR_DATA (result)[i] = prop; - continue; + val = Fget (contents, Qccl_program_idx, Qnil); + if (NATNUMP (val)) + XVECTOR (result)->contents[i] = val; + else + unresolved = 1; } -#endif + continue; } + return Qnil; } - return result; + return (unresolved ? Qt : result); } +/* Return the compiled code (vector) of CCL program CCL_PROG. + CCL_PROG is a name (symbol) of the program or already compiled + code. If necessary, resolve symbols in the compiled code to index + numbers. If we failed to get the compiled code or to resolve + symbols, return Qnil. */ + +static Lisp_Object +ccl_get_compiled_code (Lisp_Object ccl_prog) +{ + Lisp_Object val, slot; + + if (VECTORP (ccl_prog)) + { + val = resolve_symbol_ccl_program (ccl_prog); + return (VECTORP (val) ? val : Qnil); + } + if (!SYMBOLP (ccl_prog)) + return Qnil; + + val = Fget (ccl_prog, Qccl_program_idx, Qnil); + if (! NATNUMP (val) + || XINT (val) >= XVECTOR_LENGTH (Vccl_program_table)) + return Qnil; + slot = XVECTOR_DATA (Vccl_program_table)[XINT (val)]; + if (! VECTORP (slot) + || XVECTOR (slot)->size != 3 + || ! VECTORP (XVECTOR_DATA (slot)[1])) + return Qnil; + if (NILP (XVECTOR_DATA (slot)[2])) + { + val = resolve_symbol_ccl_program (XVECTOR_DATA (slot)[1]); + if (! VECTORP (val)) + return Qnil; + XVECTOR_DATA (slot)[1] = val; + XVECTOR_DATA (slot)[2] = Qt; + } + return XVECTOR_DATA (slot)[1]; +} + +/* Setup fields of the structure pointed by CCL appropriately for the + execution of CCL program CCL_PROG. CCL_PROG is the name (symbol) + of the CCL program or the already compiled code (vector). + Return 0 if we succeed this setup, else return -1. + + If CCL_PROG is nil, we just reset the structure pointed by CCL. */ +int +setup_ccl_program (struct ccl_program *ccl, Lisp_Object ccl_prog) +{ + int i; + + if (! NILP (ccl_prog)) + { + ccl_prog = ccl_get_compiled_code (ccl_prog); + if (! VECTORP (ccl_prog)) + return -1; + ccl->size = XVECTOR_LENGTH (ccl_prog); + ccl->prog = XVECTOR_DATA (ccl_prog); + ccl->eof_ic = XINT (XVECTOR_DATA (ccl_prog)[CCL_HEADER_EOF]); + ccl->buf_magnification = XINT (XVECTOR_DATA (ccl_prog)[CCL_HEADER_BUF_MAG]); + } + ccl->ic = CCL_HEADER_MAIN; + for (i = 0; i < 8; i++) + ccl->reg[i] = 0; + ccl->last_block = 0; + ccl->private_state = 0; + ccl->status = 0; + ccl->stack_idx = 0; + ccl->eol_type = CCL_CODING_EOL_LF; + return 0; +} #ifdef emacs +DEFUN ("ccl-program-p", Fccl_program_p, 1, 1, 0, /* +Return t if OBJECT is a CCL program name or a compiled CCL program code. +See the documentation of `define-ccl-program' for the detail of CCL program. +*/ + (object)) +{ + Lisp_Object val; + + if (VECTORP (object)) + { + val = resolve_symbol_ccl_program (object); + return (VECTORP (val) ? Qt : Qnil); + } + if (!SYMBOLP (object)) + return Qnil; + + val = Fget (object, Qccl_program_idx, Qnil); + return ((! NATNUMP (val) + || XINT (val) >= XVECTOR_LENGTH (Vccl_program_table)) + ? Qnil : Qt); +} + DEFUN ("ccl-execute", Fccl_execute, 2, 2, 0, /* Execute CCL-PROGRAM with registers initialized by REGISTERS. -CCL-PROGRAM is a symbol registered by register-ccl-program, +CCL-PROGRAM is a CCL program name (symbol) or a compiled code generated by `ccl-compile' (for backward compatibility, -in this case, the execution is slower). +in this case, the overhead of the execution is bigger than the former case). No I/O commands should appear in CCL-PROGRAM. REGISTERS is a vector of [R0 R1 ... R7] where RN is an initial value of Nth register. -As side effect, each element of REGISTER holds the value of +As side effect, each element of REGISTERS holds the value of corresponding register after the execution. + +See the documentation of `define-ccl-program' for the detail of CCL program. */ - (ccl_prog, reg)) + (ccl_prog, reg)) { struct ccl_program ccl; int i; - Lisp_Object ccl_id; - if (SYMBOLP (ccl_prog) && - !NILP (ccl_id = Fget (ccl_prog, Qccl_program_idx, Qnil))) - { - ccl_prog = XVECTOR_DATA (Vccl_program_table)[XUINT (ccl_id)]; - CHECK_LIST (ccl_prog); - ccl_prog = XCDR (ccl_prog); - CHECK_VECTOR (ccl_prog); - } - else - { - CHECK_VECTOR (ccl_prog); - ccl_prog = resolve_symbol_ccl_program (ccl_prog); - } + if (setup_ccl_program (&ccl, ccl_prog) < 0) + error ("Invalid CCL program"); CHECK_VECTOR (reg); if (XVECTOR_LENGTH (reg) != 8) - error ("Invalid length of vector REGISTERS"); + error ("Length of vector REGISTERS is not 8"); - setup_ccl_program (&ccl, ccl_prog); for (i = 0; i < 8; i++) ccl.reg[i] = (INTP (XVECTOR_DATA (reg)[i]) ? XINT (XVECTOR_DATA (reg)[i]) : 0); - ccl_driver (&ccl, (const unsigned char *)0, (unsigned_char_dynarr *)0, - 0, (int *)0, CCL_MODE_ENCODING); + ccl_driver (&ccl, (const unsigned char *)0, + (unsigned_char_dynarr *)0, 0, (int *)0, + CCL_MODE_ENCODING); QUIT; if (ccl.status != CCL_STAT_SUCCESS) error ("Error in CCL program at %dth code", ccl.ic); for (i = 0; i < 8; i++) - XSETINT (XVECTOR_DATA (reg)[i], ccl.reg[i]); + XSETINT (XVECTOR (reg)->contents[i], ccl.reg[i]); return Qnil; } -DEFUN ("ccl-execute-on-string", Fccl_execute_on_string, 3, 4, 0, /* +DEFUN ("ccl-execute-on-string", Fccl_execute_on_string, + 3, 4, 0, /* Execute CCL-PROGRAM with initial STATUS on STRING. CCL-PROGRAM is a symbol registered by register-ccl-program, @@ -1792,7 +2025,6 @@ in this case, the execution is slower). Read buffer is set to STRING, and write buffer is allocated automatically. -If IC is nil, it is initialized to head of the CCL program.\n\ STATUS is a vector of [R0 R1 ... R7 IC], where R0..R7 are initial values of corresponding registers, IC is the instruction counter specifying from where to start the program. @@ -1800,42 +2032,32 @@ If R0..R7 are nil, they are initialized to 0. If IC is nil, it is initialized to head of the CCL program. If optional 4th arg CONTINUE is non-nil, keep IC on read operation -when read buffer is exausted, else, IC is always set to the end of +when read buffer is exhausted, else, IC is always set to the end of CCL-PROGRAM on exit. It returns the contents of write buffer as a string, and as side effect, STATUS is updated. + +See the documentation of `define-ccl-program' for the detail of CCL program. */ - (ccl_prog, status, str, contin)) + (ccl_prog, status, string, continue_)) { Lisp_Object val; struct ccl_program ccl; int i, produced; unsigned_char_dynarr *outbuf; - struct gcpro gcpro1, gcpro2, gcpro3; - Lisp_Object ccl_id; + struct gcpro gcpro1, gcpro2; - if (SYMBOLP (ccl_prog) && - !NILP (ccl_id = Fget (ccl_prog, Qccl_program_idx, Qnil))) - { - ccl_prog = XVECTOR (Vccl_program_table)->contents[XUINT (ccl_id)]; - CHECK_LIST (ccl_prog); - ccl_prog = XCDR (ccl_prog); - CHECK_VECTOR (ccl_prog); - } - else - { - CHECK_VECTOR (ccl_prog); - ccl_prog = resolve_symbol_ccl_program (ccl_prog); - } + if (setup_ccl_program (&ccl, ccl_prog) < 0) + error ("Invalid CCL program"); CHECK_VECTOR (status); - if (XVECTOR_LENGTH (status) != 9) - signal_simple_error ("Vector should be of length 9", status); - CHECK_STRING (str); - GCPRO3 (ccl_prog, status, str); + if (XVECTOR (status)->size != 9) + error ("Length of vector STATUS is not 9"); + CHECK_STRING (string); + + GCPRO2 (status, string); - setup_ccl_program (&ccl, ccl_prog); for (i = 0; i < 8; i++) { if (NILP (XVECTOR_DATA (status)[i])) @@ -1843,80 +2065,106 @@ It returns the contents of write buffer as a string, if (INTP (XVECTOR_DATA (status)[i])) ccl.reg[i] = XINT (XVECTOR_DATA (status)[i]); } - if (INTP (XVECTOR_DATA (status)[8])) + if (INTP (XVECTOR (status)->contents[i])) { i = XINT (XVECTOR_DATA (status)[8]); if (ccl.ic < i && i < ccl.size) ccl.ic = i; } outbuf = Dynarr_new (unsigned_char); - ccl.last_block = NILP (contin); - produced = ccl_driver (&ccl, XSTRING_DATA (str), outbuf, - XSTRING_LENGTH (str), (int *)0, CCL_MODE_DECODING); + ccl.last_block = NILP (continue_); + produced = ccl_driver (&ccl, XSTRING_DATA (string), outbuf, + XSTRING_LENGTH (string), + (int *) 0, + CCL_MODE_DECODING); for (i = 0; i < 8; i++) - XVECTOR_DATA (status)[i] = make_int(ccl.reg[i]); + XSETINT (XVECTOR_DATA (status)[i], ccl.reg[i]); XSETINT (XVECTOR_DATA (status)[8], ccl.ic); UNGCPRO; val = make_string (Dynarr_atp (outbuf, 0), produced); Dynarr_free (outbuf); QUIT; + if (ccl.status == CCL_STAT_SUSPEND_BY_DST) + error ("Output buffer for the CCL programs overflow"); if (ccl.status != CCL_STAT_SUCCESS - && ccl.status != CCL_STAT_SUSPEND_BY_SRC - && ccl.status != CCL_STAT_SUSPEND_BY_DST) + && ccl.status != CCL_STAT_SUSPEND_BY_SRC) error ("Error in CCL program at %dth code", ccl.ic); return val; } -DEFUN ("register-ccl-program", Fregister_ccl_program, 2, 2, 0, /* -Register CCL program PROGRAM of NAME in `ccl-program-table'. -PROGRAM should be a compiled code of CCL program, or nil. +DEFUN ("register-ccl-program", Fregister_ccl_program, + 2, 2, 0, /* +Register CCL program CCL-PROG as NAME in `ccl-program-table'. +CCL-PROG should be a compiled CCL program (vector), or nil. +If it is nil, just reserve NAME as a CCL program name. Return index number of the registered CCL program. */ - (name, ccl_prog)) + (name, ccl_prog)) { int len = XVECTOR_LENGTH (Vccl_program_table); - int i; + int idx; + Lisp_Object resolved; CHECK_SYMBOL (name); + resolved = Qnil; if (!NILP (ccl_prog)) { CHECK_VECTOR (ccl_prog); - ccl_prog = resolve_symbol_ccl_program (ccl_prog); + resolved = resolve_symbol_ccl_program (ccl_prog); + if (! NILP (resolved)) + { + ccl_prog = resolved; + resolved = Qt; + } } - for (i = 0; i < len; i++) + for (idx = 0; idx < len; idx++) { - Lisp_Object slot = XVECTOR_DATA (Vccl_program_table)[i]; + Lisp_Object slot; - if (!CONSP (slot)) + slot = XVECTOR_DATA (Vccl_program_table)[idx]; + if (!VECTORP (slot)) + /* This is the first unused slot. Register NAME here. */ break; - if (EQ (name, XCAR (slot))) + if (EQ (name, XVECTOR_DATA (slot)[0])) { - XCDR (slot) = ccl_prog; - return make_int (i); + /* Update this slot. */ + XVECTOR_DATA (slot)[1] = ccl_prog; + XVECTOR_DATA (slot)[2] = resolved; + return make_int (idx); } } - if (i == len) + if (idx == len) { - Lisp_Object new_table = Fmake_vector (make_int (len * 2), Qnil); + /* Extend the table. */ + Lisp_Object new_table; int j; + new_table = Fmake_vector (make_int (len * 2), Qnil); for (j = 0; j < len; j++) XVECTOR_DATA (new_table)[j] = XVECTOR_DATA (Vccl_program_table)[j]; Vccl_program_table = new_table; } - XVECTOR_DATA (Vccl_program_table)[i] = Fcons (name, ccl_prog); - Fput (name, Qccl_program_idx, make_int (i)); - return make_int (i); + { + Lisp_Object elt; + + elt = Fmake_vector (make_int (3), Qnil); + XVECTOR_DATA (elt)[0] = name; + XVECTOR_DATA (elt)[1] = ccl_prog; + XVECTOR_DATA (elt)[2] = resolved; + XVECTOR_DATA (Vccl_program_table)[idx] = elt; + } + + Fput (name, Qccl_program_idx, make_int (idx)); + return make_int (idx); } -#if 0 /* Register code conversion map. A code conversion map consists of numbers, Qt, Qnil, and Qlambda. The first element is start code point. @@ -1927,34 +2175,33 @@ Return index number of the registered CCL program. */ DEFUN ("register-code-conversion-map", Fregister_code_conversion_map, - Sregister_code_conversion_map, - 2, 2, 0, - "Register SYMBOL as code conversion map MAP.\n\ -Return index number of the registered map.") - (symbol, map) - Lisp_Object symbol, map; + 2, 2, 0, /* +Register SYMBOL as code conversion map MAP. +Return index number of the registered map. +*/ + (symbol, map)) { - int len = XVECTOR (Vcode_conversion_map_vector)->size; + int len = XVECTOR_LENGTH (Vcode_conversion_map_vector); int i; - Lisp_Object index; + Lisp_Object idx; - CHECK_SYMBOL (symbol, 0); - CHECK_VECTOR (map, 1); + CHECK_SYMBOL (symbol); + CHECK_VECTOR (map); for (i = 0; i < len; i++) { - Lisp_Object slot = XVECTOR (Vcode_conversion_map_vector)->contents[i]; + Lisp_Object slot = XVECTOR_DATA (Vcode_conversion_map_vector)[i]; if (!CONSP (slot)) break; - if (EQ (symbol, XCONS (slot)->car)) + if (EQ (symbol, XCAR (slot))) { - index = make_int (i); - XCONS (slot)->cdr = map; + idx = make_int (i); + XCDR (slot) = map; Fput (symbol, Qcode_conversion_map, map); - Fput (symbol, Qcode_conversion_map_id, index); - return index; + Fput (symbol, Qcode_conversion_map_id, idx); + return idx; } } @@ -1964,29 +2211,27 @@ Return index number of the registered map.") int j; for (j = 0; j < len; j++) - XVECTOR (new_vector)->contents[j] - = XVECTOR (Vcode_conversion_map_vector)->contents[j]; + XVECTOR_DATA (new_vector)[j] + = XVECTOR_DATA (Vcode_conversion_map_vector)[j]; Vcode_conversion_map_vector = new_vector; } - index = make_int (i); + idx = make_int (i); Fput (symbol, Qcode_conversion_map, map); - Fput (symbol, Qcode_conversion_map_id, index); - XVECTOR (Vcode_conversion_map_vector)->contents[i] = Fcons (symbol, map); - return index; + Fput (symbol, Qcode_conversion_map_id, idx); + XVECTOR_DATA (Vcode_conversion_map_vector)[i] = Fcons (symbol, map); + return idx; } -#endif void syms_of_mule_ccl (void) { + DEFSUBR (Fccl_program_p); DEFSUBR (Fccl_execute); DEFSUBR (Fccl_execute_on_string); DEFSUBR (Fregister_ccl_program); -#if 0 - DEFSUBR (&Fregister_code_conversion_map); -#endif + DEFSUBR (Fregister_code_conversion_map); } void @@ -1995,23 +2240,15 @@ vars_of_mule_ccl (void) staticpro (&Vccl_program_table); Vccl_program_table = Fmake_vector (make_int (32), Qnil); - Qccl_program = intern ("ccl-program"); - staticpro (&Qccl_program); - - Qccl_program_idx = intern ("ccl-program-idx"); - staticpro (&Qccl_program_idx); - -#if 0 - Qcode_conversion_map = intern ("code-conversion-map"); - staticpro (&Qcode_conversion_map); - - Qcode_conversion_map_id = intern ("code-conversion-map-id"); - staticpro (&Qcode_conversion_map_id); + defsymbol (&Qccl_program, "ccl-program"); + defsymbol (&Qccl_program_idx, "ccl-program-idx"); + defsymbol (&Qcode_conversion_map, "code-conversion-map"); + defsymbol (&Qcode_conversion_map_id, "code-conversion-map-id"); DEFVAR_LISP ("code-conversion-map-vector", &Vcode_conversion_map_vector /* -Vector of code conversion maps.*/ ); +Vector of code conversion maps. +*/ ); Vcode_conversion_map_vector = Fmake_vector (make_int (16), Qnil); -#endif DEFVAR_LISP ("font-ccl-encoder-alist", &Vfont_ccl_encoder_alist /* Alist of fontname patterns vs corresponding CCL program. diff --git a/src/mule-ccl.h b/src/mule-ccl.h index 6aac558..e7c5a40 100644 --- a/src/mule-ccl.h +++ b/src/mule-ccl.h @@ -1,5 +1,5 @@ /* Header for CCL (Code Conversion Language) interpreter. - Copyright (C) 1995,1999 Electrotechnical Laboratory, JAPAN. + Copyright (C) 1995 Electrotechnical Laboratory, JAPAN. Licensed to the Free Software Foundation. This file is part of XEmacs. @@ -19,8 +19,6 @@ along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* Synched up with: FSF Emacs 20.3.10 */ - #ifndef INCLUDED_mule_ccl_h_ #define INCLUDED_mule_ccl_h_ @@ -44,8 +42,8 @@ struct ccl_program { condition flag of relational operations. */ int private_state; /* CCL instruction may use this - for private use, mainly for preservation - internal states for suspending. + for private use, mainly for saving + internal states on suspending. This variable is set to 0 when ccl is set up. */ int last_block; /* Set to 1 while processing the last @@ -55,19 +53,41 @@ struct ccl_program { many times bigger the output buffer should be than the input buffer. */ int stack_idx; /* How deep the call of CCL_Call is nested. */ + int eol_type; /* When the CCL program is used for + encoding by a coding system, set to + the eol_type of the coding + system. */ + int multibyte; /* 1 if the source text is multibyte. */ }; - #define CCL_MODE_ENCODING 0 #define CCL_MODE_DECODING 1 -int ccl_driver (struct ccl_program *ccl, const unsigned char *source, - unsigned_char_dynarr *destination, int src_bytes, - int *consumed, int conversion_mode); -void setup_ccl_program (struct ccl_program *ccl, Lisp_Object val); +#define CCL_CODING_EOL_LF 0 /* Line-feed only, same as Emacs' + internal format. */ +#define CCL_CODING_EOL_CRLF 1 /* Sequence of carriage-return and + line-feed. */ +#define CCL_CODING_EOL_CR 2 /* Carriage-return only. */ /* Alist of fontname patterns vs corresponding CCL program. */ extern Lisp_Object Vfont_ccl_encoder_alist; + +/* Setup fields of the structure pointed by CCL appropriately for the + execution of ccl program CCL_PROG (symbol or vector). */ +extern int setup_ccl_program (struct ccl_program *, Lisp_Object); + +extern int ccl_driver (struct ccl_program *, const unsigned char *, + unsigned_char_dynarr *, int, int *, int); + +EXFUN (Fregister_ccl_program, 2); + extern Lisp_Object Qccl_program; +/* Vector of CCL program names vs corresponding program data. */ +extern Lisp_Object Vccl_program_table; + +/* Symbols of ccl program have this property, a value of the property + is an index for Vccl_program_table. */ +extern Lisp_Object Qccl_program_idx; + #endif /* INCLUDED_mule_ccl_h_ */ diff --git a/src/mule-charset.c b/src/mule-charset.c index aa5c427..7dc68f2 100644 --- a/src/mule-charset.c +++ b/src/mule-charset.c @@ -1909,30 +1909,18 @@ non_ascii_valid_char_p (Emchar ch) /* Basic string functions */ /************************************************************************/ -/* Copy the character pointed to by PTR into STR, assuming it's - non-ASCII. Do not call this directly. Use the macro - charptr_copy_char() instead. */ +/* Copy the character pointed to by SRC into DST. Do not call this + directly. Use the macro charptr_copy_char() instead. + Return the number of bytes copied. */ Bytecount -non_ascii_charptr_copy_char (const Bufbyte *ptr, Bufbyte *str) +non_ascii_charptr_copy_char (const Bufbyte *src, Bufbyte *dst) { - Bufbyte *strptr = str; - *strptr = *ptr++; - switch (REP_BYTES_BY_FIRST_BYTE (*strptr)) - { - /* Notice fallthrough. */ -#ifdef UTF2000 - case 6: *++strptr = *ptr++; - case 5: *++strptr = *ptr++; -#endif - case 4: *++strptr = *ptr++; - case 3: *++strptr = *ptr++; - case 2: *++strptr = *ptr; - break; - default: - abort (); - } - return strptr + 1 - str; + unsigned int bytes = REP_BYTES_BY_FIRST_BYTE (*src); + unsigned int i; + for (i = bytes; i; i--, dst++, src++) + *dst = *src; + return bytes; } @@ -1949,36 +1937,15 @@ Lstream_get_emchar_1 (Lstream *stream, int ch) { Bufbyte str[MAX_EMCHAR_LEN]; Bufbyte *strptr = str; + unsigned int bytes; str[0] = (Bufbyte) ch; - switch (REP_BYTES_BY_FIRST_BYTE (ch)) + + for (bytes = REP_BYTES_BY_FIRST_BYTE (ch) - 1; bytes; bytes--) { - /* Notice fallthrough. */ -#ifdef UTF2000 - case 6: - ch = Lstream_getc (stream); - assert (ch >= 0); - *++strptr = (Bufbyte) ch; - case 5: - ch = Lstream_getc (stream); - assert (ch >= 0); - *++strptr = (Bufbyte) ch; -#endif - case 4: - ch = Lstream_getc (stream); - assert (ch >= 0); - *++strptr = (Bufbyte) ch; - case 3: - ch = Lstream_getc (stream); - assert (ch >= 0); - *++strptr = (Bufbyte) ch; - case 2: - ch = Lstream_getc (stream); - assert (ch >= 0); - *++strptr = (Bufbyte) ch; - break; - default: - abort (); + int c = Lstream_getc (stream); + bufpos_checking_assert (c >= 0); + *++strptr = (Bufbyte) c; } return charptr_emchar (str); } @@ -2586,7 +2553,7 @@ Return a list of the names of all defined charsets. } DEFUN ("charset-name", Fcharset_name, 1, 1, 0, /* -Return the name of the given charset. +Return the name of charset CHARSET. */ (charset)) { @@ -2735,7 +2702,10 @@ character set. Recognized properties are: else if (EQ (keyword, Qccl_program)) { - CHECK_VECTOR (value); + struct ccl_program test_ccl; + + if (setup_ccl_program (&test_ccl, value) < 0) + signal_simple_error ("Invalid value for 'ccl-program", value); ccl_program = value; } @@ -3015,8 +2985,11 @@ Set the 'ccl-program property of CHARSET to CCL-PROGRAM. */ (charset, ccl_program)) { + struct ccl_program test_ccl; + charset = Fget_charset (charset); - CHECK_VECTOR (ccl_program); + if (setup_ccl_program (&test_ccl, ccl_program) < 0) + signal_simple_error ("Invalid ccl-program", ccl_program); XCHARSET_CCL_PROGRAM (charset) = ccl_program; return Qnil; } @@ -3296,27 +3269,27 @@ character s with caron. } DEFUN ("char-charset", Fchar_charset, 1, 1, 0, /* -Return the character set of char CH. +Return the character set of CHARACTER. */ - (ch)) + (character)) { - CHECK_CHAR_COERCE_INT (ch); + CHECK_CHAR_COERCE_INT (character); - return XCHARSET_NAME (CHAR_CHARSET (XCHAR (ch))); + return XCHARSET_NAME (CHAR_CHARSET (XCHAR (character))); } DEFUN ("char-octet", Fchar_octet, 1, 2, 0, /* -Return the octet numbered N (should be 0 or 1) of char CH. +Return the octet numbered N (should be 0 or 1) of CHARACTER. N defaults to 0 if omitted. */ - (ch, n)) + (character, n)) { Lisp_Object charset; int octet0, octet1; - CHECK_CHAR_COERCE_INT (ch); + CHECK_CHAR_COERCE_INT (character); - BREAKUP_CHAR (XCHAR (ch), charset, octet0, octet1); + BREAKUP_CHAR (XCHAR (character), charset, octet0, octet1); if (NILP (n) || EQ (n, Qzero)) return make_int (octet0); @@ -3327,7 +3300,7 @@ N defaults to 0 if omitted. } DEFUN ("split-char", Fsplit_char, 1, 1, 0, /* -Return list of charset and one or two position-codes of CHAR. +Return list of charset and one or two position-codes of CHARACTER. */ (character)) { diff --git a/src/mule-charset.h b/src/mule-charset.h index 9bc8264..95ee6f2 100644 --- a/src/mule-charset.h +++ b/src/mule-charset.h @@ -403,19 +403,19 @@ enum LEADING_BYTE_OFFICIAL_2 /* Is this a prefix for a private leading byte? */ -INLINE_HEADER int LEADING_BYTE_PREFIX_P (unsigned char lb); +INLINE_HEADER int LEADING_BYTE_PREFIX_P (Bufbyte lb); INLINE_HEADER int -LEADING_BYTE_PREFIX_P (unsigned char lb) +LEADING_BYTE_PREFIX_P (Bufbyte lb) { return (lb == PRE_LEADING_BYTE_PRIVATE_1 || lb == PRE_LEADING_BYTE_PRIVATE_2); } /* Given a private leading byte, return the leading byte prefix stored - in a string */ + in a string. */ #define PRIVATE_LEADING_BYTE_PREFIX(lb) \ - ((lb) < MIN_LEADING_BYTE_PRIVATE_2 ? \ + ((unsigned int) (lb) < MIN_LEADING_BYTE_PRIVATE_2 ? \ PRE_LEADING_BYTE_PRIVATE_1 : \ PRE_LEADING_BYTE_PRIVATE_2) @@ -425,13 +425,12 @@ LEADING_BYTE_PREFIX_P (unsigned char lb) /* of any format */ /************************************************************************/ -/* Argument `c' should be (unsigned int) or (unsigned char). */ -/* Note that SP and DEL are not included. */ +/* These are carefully designed to work if BYTE is signed or unsigned. */ +/* Note that SPC and DEL are considered ASCII, not control. */ -#define BYTE_ASCII_P(c) ((c) < 0x80) -#define BYTE_C0_P(c) ((c) < 0x20) -/* Do some forced casting just to make *sure* things are gotten right. */ -#define BYTE_C1_P(c) ((unsigned int) ((unsigned int) (c) - 0x80) < 0x20) +#define BYTE_ASCII_P(byte) (((byte) & ~0x7f) == 0) +#define BYTE_C0_P(byte) (((byte) & ~0x1f) == 0) +#define BYTE_C1_P(byte) (((byte) & ~0x1f) == 0x80) /************************************************************************/ @@ -439,13 +438,13 @@ LEADING_BYTE_PREFIX_P (unsigned char lb) /* in a Mule-formatted string */ /************************************************************************/ -/* Does this byte represent the first byte of a character? */ +/* Does BYTE represent the first byte of a character? */ -#define BUFBYTE_FIRST_BYTE_P(c) ((c) < 0xA0) +#define BUFBYTE_FIRST_BYTE_P(byte) ((byte) < 0xA0) -/* Does this byte represent the first byte of a multi-byte character? */ +/* Does BYTE represent the first byte of a multi-byte character? */ -#define BUFBYTE_LEADING_BYTE_P(c) BYTE_C1_P (c) +#define BUFBYTE_LEADING_BYTE_P(byte) BYTE_C1_P (byte) /************************************************************************/ @@ -564,35 +563,33 @@ struct charset_lookup { Charset_ID next_allocated_2_byte_leading_byte; }; -extern struct charset_lookup *chlook; - -#ifdef ERROR_CHECK_TYPECHECK -/* int not Bufbyte even though that is the actual type of a leading byte. - This way, out-of-range values will get caught rather than automatically - truncated. */ -INLINE_HEADER Lisp_Object CHARSET_BY_LEADING_BYTE (int lb); +INLINE_HEADER Lisp_Object CHARSET_BY_LEADING_BYTE (Bufbyte lb); INLINE_HEADER Lisp_Object -CHARSET_BY_LEADING_BYTE (int lb) +CHARSET_BY_LEADING_BYTE (Bufbyte lb) { - assert (lb >= MIN_LEADING_BYTE && - lb < (MIN_LEADING_BYTE + NUM_LEADING_BYTES)); - return chlook->charset_by_leading_byte[lb - MIN_LEADING_BYTE]; -} - -#else - -#define CHARSET_BY_LEADING_BYTE(lb) \ - (chlook->charset_by_leading_byte[(lb) - MIN_LEADING_BYTE]) + extern struct charset_lookup *chlook; +#ifdef ERROR_CHECK_TYPECHECK + /* When error-checking is on, x86 GCC 2.95.2 -O3 miscompiles the + following unless we introduce `tem'. */ + int tem = lb; + type_checking_assert (tem >= MIN_LEADING_BYTE && + tem < (MIN_LEADING_BYTE + NUM_LEADING_BYTES)); #endif + return chlook->charset_by_leading_byte[lb - MIN_LEADING_BYTE]; +} INLINE_HEADER Lisp_Object -CHARSET_BY_ATTRIBUTES (int chars, int multi, int final, int dir); +CHARSET_BY_ATTRIBUTES (unsigned int type, unsigned char final, int dir); INLINE_HEADER Lisp_Object -CHARSET_BY_ATTRIBUTES (int chars, int dimension, int final, int dir) +CHARSET_BY_ATTRIBUTES (unsigned int type, unsigned char final, int dir) { - return chlook->charset_by_attributes[(dimension == 1 ? 0 : 2) - + (chars == 94 ? 0 : 1)][final][dir]; + extern struct charset_lookup *chlook; + + type_checking_assert (type < countof (chlook->charset_by_attributes) && + final < countof (chlook->charset_by_attributes[0]) && + dir < countof (chlook->charset_by_attributes[0][0])); + return chlook->charset_by_attributes[type][final][dir]; } /* Table of number of bytes in the string representation of a character @@ -604,13 +601,11 @@ CHARSET_BY_ATTRIBUTES (int chars, int dimension, int final, int dir) extern const Bytecount rep_bytes_by_first_byte[0xA0]; /* Number of bytes in the string representation of a character. */ -INLINE_HEADER int REP_BYTES_BY_FIRST_BYTE (int fb); +INLINE_HEADER int REP_BYTES_BY_FIRST_BYTE (Bufbyte fb); INLINE_HEADER int -REP_BYTES_BY_FIRST_BYTE (int fb) +REP_BYTES_BY_FIRST_BYTE (Bufbyte fb) { -#ifdef ERROR_CHECK_TYPECHECK - assert (0 <= fb && fb < 0xA0); -#endif + type_checking_assert (fb < 0xA0); return rep_bytes_by_first_byte[fb]; } diff --git a/src/mule-wnnfns.c b/src/mule-wnnfns.c index d5465a3..08c6b9f 100644 --- a/src/mule-wnnfns.c +++ b/src/mule-wnnfns.c @@ -328,7 +328,7 @@ int lb_sisheng; DEFUN ("wnn-server-open", Fwnn_open, 2, 2, 0, /* Connect to jserver of host HNAME, make an environment with login name LNAME in the server. -Return nil if error occurs +Return nil if error occurs. */ (hname, lname)) { @@ -528,7 +528,7 @@ Return information of dictionaries. DEFUN ("wnn-server-dict-comment", Fwnn_dict_comment, 2, 2, 0, /* Set comment to dictionary specified by DIC-NUMBER. -Comment string COMMENT +Comment string COMMENT. */ (dicno, comment)) { @@ -771,7 +771,7 @@ Get bunsetsu information specified by BUN-NUMBER. DEFUN ("wnn-server-henkan-quit", Fwnn_quit_henkan, 0, 0, 0, /* -do nothing +do nothing. */ ()) { @@ -862,7 +862,7 @@ Update frequency of bunsetsu specified by NUM-NUMBER. DEFUN ("wnn-server-word-add", Fwnn_word_toroku, 5, 5, 0, /* Add a word to dictionary. Arguments are -DIC-NUMBER, KANJI, YOMI, COMMENT, HINSI-NUMBER +DIC-NUMBER, KANJI, YOMI, COMMENT, HINSI-NUMBER. */ (dicno, kanji, yomi, comment, hinsi)) { @@ -888,7 +888,7 @@ DIC-NUMBER, KANJI, YOMI, COMMENT, HINSI-NUMBER DEFUN ("wnn-server-word-delete", Fwnn_word_sakujo, 2, 2, 0, /* -Delete a word from dictionary, specified by DIC-NUMBER, SERIAL-NUMBER +Delete a word from dictionary, specified by DIC-NUMBER, SERIAL-NUMBER. */ (no, serial)) { @@ -904,7 +904,7 @@ Delete a word from dictionary, specified by DIC-NUMBER, SERIAL-NUMBER DEFUN ("wnn-server-word-use", Fwnn_word_use, 2, 2, 0, /* -Toggle on/off word, specified by DIC-NUMBER and SERIAL-NUMBER +Toggle on/off word, specified by DIC-NUMBER and SERIAL-NUMBER. */ (no, serial)) { @@ -955,7 +955,7 @@ Return list of yomi, kanji, comment, hindo, hinshi. DEFUN ("wnn-server-word-hindo-set", Fwnn_hindo_set, 3, 3, 0, /* Set frequency to arbitrary value. Specified by DIC-NUMBER, -SERIAL-NUMBER, FREQUENCY +SERIAL-NUMBER, FREQUENCY. */ (no, serial, hindo)) { diff --git a/src/multibyte.h b/src/multibyte.h index 8c5770a..4468a3b 100644 --- a/src/multibyte.h +++ b/src/multibyte.h @@ -147,7 +147,7 @@ Boston, MA 02111-1307, USA. */ #define REAL_INC_CHARPTR(ptr) \ ((void) ((ptr) += REP_BYTES_BY_FIRST_BYTE (* (unsigned char *) (ptr)))) -#define REAL_INC_CHARBYTIND(ptr,pos) \ +#define REAL_INC_CHARBYTIND(ptr, pos) \ (pos += REP_BYTES_BY_FIRST_BYTE (* (unsigned char *) (ptr))) #define REAL_DEC_CHARPTR(ptr) do { \ @@ -160,9 +160,9 @@ Boston, MA 02111-1307, USA. */ REAL_INC_CHARPTR (ptr); \ } while (0) -#define INC_CHARBYTIND(ptr,pos) do { \ - ASSERT_VALID_CHARPTR (ptr); \ - REAL_INC_CHARBYTIND (ptr,pos); \ +#define INC_CHARBYTIND(ptr, pos) do { \ + ASSERT_VALID_CHARPTR (ptr); \ + REAL_INC_CHARBYTIND (ptr, pos); \ } while (0) #define DEC_CHARPTR(ptr) do { \ @@ -171,11 +171,11 @@ Boston, MA 02111-1307, USA. */ REAL_DEC_CHARPTR (dc_ptr2); \ assert (dc_ptr1 - dc_ptr2 == \ REP_BYTES_BY_FIRST_BYTE (*dc_ptr2)); \ - (ptr) = dc_ptr2; \ + (ptr) = (Bufbyte *) dc_ptr2; \ } while (0) #else /* ! ERROR_CHECK_BUFPOS */ -#define INC_CHARBYTIND(ptr,pos) REAL_INC_CHARBYTIND (ptr,pos) +#define INC_CHARBYTIND(ptr, pos) REAL_INC_CHARBYTIND (ptr, pos) #define INC_CHARPTR(ptr) REAL_INC_CHARPTR (ptr) #define DEC_CHARPTR(ptr) REAL_DEC_CHARPTR (ptr) #endif /* ! ERROR_CHECK_BUFPOS */ diff --git a/src/objects-x.c b/src/objects-x.c index c0d87cd..2868f94 100644 --- a/src/objects-x.c +++ b/src/objects-x.c @@ -284,7 +284,7 @@ x_print_color_instance (Lisp_Color_Instance *c, Lisp_Object printcharfun, int escapeflag) { - Bufbyte buf[100]; + char buf[100]; XColor color = COLOR_INSTANCE_X_COLOR (c); sprintf (buf, " %ld=(%X,%X,%X)", color.pixel, color.red, color.green, color.blue); @@ -466,7 +466,7 @@ x_print_font_instance (Lisp_Font_Instance *f, Lisp_Object printcharfun, int escapeflag) { - Bufbyte buf[200]; + char buf[200]; sprintf (buf, " 0x%lx", (unsigned long) FONT_INSTANCE_X_FONT (f)->fid); write_c_string (buf, printcharfun); } @@ -577,7 +577,7 @@ valid_x_font_name_p (Display *dpy, Extbyte *name) might be more correct. */ int nnames = 0; - SExtbyte **names = 0; + Extbyte **names = 0; if (! name) return 0; names = XListFonts (dpy, name, 1, &nnames); @@ -687,7 +687,7 @@ static Extbyte * truename_via_XListFonts (Display *dpy, Extbyte *font_name) { Extbyte *result = 0; - SExtbyte **names; + Extbyte **names; int count = 0; #ifndef XOPENFONT_SORTS @@ -799,7 +799,7 @@ x_font_instance_truename (Lisp_Font_Instance *f, Error_behavior errb) return f->name; } } - return (FONT_INSTANCE_X_TRUENAME (f)); + return FONT_INSTANCE_X_TRUENAME (f); } static Lisp_Object @@ -808,22 +808,23 @@ x_font_instance_properties (Lisp_Font_Instance *f) struct device *d = XDEVICE (f->device); int i; Lisp_Object result = Qnil; - XFontProp *props; - Display *dpy; + Display *dpy = DEVICE_X_DISPLAY (d); + XFontProp *props = FONT_INSTANCE_X_FONT (f)->properties; - dpy = DEVICE_X_DISPLAY (d); - props = FONT_INSTANCE_X_FONT (f)->properties; for (i = FONT_INSTANCE_X_FONT (f)->n_properties - 1; i >= 0; i--) { Lisp_Object name, value; Atom atom = props [i].name; Bufbyte *name_str = 0; + size_t name_len; Extbyte *namestrext = XGetAtomName (dpy, atom); if (namestrext) - EXTERNAL_TO_C_STRING (namestrext, name_str, Qx_atom_name_encoding); + TO_INTERNAL_FORMAT (C_STRING, namestrext, + ALLOCA, (name_str, name_len), + Qx_atom_name_encoding); - name = (name_str ? intern (name_str) : Qnil); + name = (name_str ? intern ((char *) name_str) : Qnil); if (name_str && (atom == XA_FONT || atom == DEVICE_XATOM_FOUNDRY (d) || @@ -835,17 +836,17 @@ x_font_instance_properties (Lisp_Font_Instance *f) atom == DEVICE_XATOM_SPACING (d) || atom == DEVICE_XATOM_CHARSET_REGISTRY (d) || atom == DEVICE_XATOM_CHARSET_ENCODING (d) || - !strcmp (name_str, "CHARSET_COLLECTIONS") || - !strcmp (name_str, "FONTNAME_REGISTRY") || - !strcmp (name_str, "CLASSIFICATION") || - !strcmp (name_str, "COPYRIGHT") || - !strcmp (name_str, "DEVICE_FONT_NAME") || - !strcmp (name_str, "FULL_NAME") || - !strcmp (name_str, "MONOSPACED") || - !strcmp (name_str, "QUALITY") || - !strcmp (name_str, "RELATIVE_SET") || - !strcmp (name_str, "RELATIVE_WEIGHT") || - !strcmp (name_str, "STYLE"))) + !bufbyte_strcmp (name_str, "CHARSET_COLLECTIONS") || + !bufbyte_strcmp (name_str, "FONTNAME_REGISTRY") || + !bufbyte_strcmp (name_str, "CLASSIFICATION") || + !bufbyte_strcmp (name_str, "COPYRIGHT") || + !bufbyte_strcmp (name_str, "DEVICE_FONT_NAME") || + !bufbyte_strcmp (name_str, "FULL_NAME") || + !bufbyte_strcmp (name_str, "MONOSPACED") || + !bufbyte_strcmp (name_str, "QUALITY") || + !bufbyte_strcmp (name_str, "RELATIVE_SET") || + !bufbyte_strcmp (name_str, "RELATIVE_WEIGHT") || + !bufbyte_strcmp (name_str, "STYLE"))) { Extbyte *val_str = XGetAtomName (dpy, props [i].card32); @@ -863,7 +864,7 @@ x_font_instance_properties (Lisp_Font_Instance *f) static Lisp_Object x_list_fonts (Lisp_Object pattern, Lisp_Object device) { - SExtbyte **names; + Extbyte **names; int count = 0; Lisp_Object result = Qnil; const Extbyte *patternext; @@ -936,7 +937,7 @@ x_font_spec_matches_charset (struct device *d, Lisp_Object charset, static Lisp_Object x_find_charset_font (Lisp_Object device, Lisp_Object font, Lisp_Object charset) { - SExtbyte **names; + Extbyte **names; int count = 0; Lisp_Object result = Qnil; const Extbyte *patternext; @@ -950,12 +951,15 @@ x_find_charset_font (Lisp_Object device, Lisp_Object font, Lisp_Object charset) for (i = 0; i < count; i ++) { const Bufbyte *intname; + Bytecount intlen; - EXTERNAL_TO_C_STRING (names[i], intname, Qx_font_name_encoding); + TO_INTERNAL_FORMAT (C_STRING, names[i], + ALLOCA, (intname, intlen), + Qx_font_name_encoding); if (x_font_spec_matches_charset (XDEVICE (device), charset, intname, Qnil, 0, -1)) { - result = build_string (intname); + result = make_string (intname, intlen); break; } } diff --git a/src/objects.c b/src/objects.c index baccaad..2597b61 100644 --- a/src/objects.c +++ b/src/objects.c @@ -137,8 +137,8 @@ Optional argument DEVICE specifies the device this object applies to and defaults to the selected device. An error is signaled if the color is unknown or cannot be allocated; -however, if optional argument NO-ERROR is non-nil, nil is simply -returned in this case. (And if NO-ERROR is other than t, a warning may +however, if optional argument NOERROR is non-nil, nil is simply +returned in this case. (And if NOERROR is other than t, a warning may be issued.) The returned object is a normal, first-class lisp object. The way you @@ -147,7 +147,7 @@ you drop all pointers to it and allow it to be garbage collected. When these objects are GCed, the underlying window-system data (e.g. X object) is deallocated as well. */ - (name, device, no_error)) + (name, device, noerror)) { Lisp_Color_Instance *c; Lisp_Object val; @@ -163,7 +163,7 @@ is deallocated as well. retval = MAYBE_INT_DEVMETH (XDEVICE (device), initialize_color_instance, (c, name, device, - decode_error_behavior_flag (no_error))); + decode_error_behavior_flag (noerror))); if (!retval) return Qnil; @@ -315,12 +315,12 @@ The returned object is a normal, first-class lisp object. The way you you drop all pointers to it and allow it to be garbage collected. When these objects are GCed, the underlying X data is deallocated as well. */ - (name, device, no_error)) + (name, device, noerror)) { Lisp_Font_Instance *f; Lisp_Object val; int retval = 0; - Error_behavior errb = decode_error_behavior_flag (no_error); + Error_behavior errb = decode_error_behavior_flag (noerror); if (ERRB_EQ (errb, ERROR_ME)) CHECK_STRING (name); diff --git a/src/print.c b/src/print.c index afbbf0d..73f0960 100644 --- a/src/print.c +++ b/src/print.c @@ -509,19 +509,19 @@ write_c_string (const char *str, Lisp_Object stream) DEFUN ("write-char", Fwrite_char, 1, 2, 0, /* -Output character CH to stream STREAM. +Output character CHARACTER to stream STREAM. STREAM defaults to the value of `standard-output' (which see). */ - (ch, stream)) + (character, stream)) { /* This function can GC */ Bufbyte str[MAX_EMCHAR_LEN]; Bytecount len; - CHECK_CHAR_COERCE_INT (ch); - len = set_charptr_emchar (str, XCHAR (ch)); + CHECK_CHAR_COERCE_INT (character); + len = set_charptr_emchar (str, XCHAR (character)); output_string (canonicalize_printcharfun (stream), str, Qnil, 0, len); - return ch; + return character; } void @@ -673,7 +673,7 @@ DEFUN ("princ", Fprinc, 1, 2, 0, /* Output the printed representation of OBJECT, any Lisp object. No quoting characters are used; no delimiters are printed around the contents of strings. -Output stream is STREAM, or value of standard-output (which see). +Output stream is STREAM, or value of `standard-output' (which see). */ (object, stream)) { @@ -1604,22 +1604,24 @@ the output also will be logged to this file. } DEFUN ("open-termscript", Fopen_termscript, 1, 1, "FOpen termscript file: ", /* -Start writing all terminal output to FILE as well as the terminal. -FILE = nil means just close any termscript file currently open. +Start writing all terminal output to FILENAME as well as the terminal. +FILENAME = nil means just close any termscript file currently open. */ - (file)) + (filename)) { /* This function can GC */ if (termscript != 0) - fclose (termscript); - termscript = 0; + { + fclose (termscript); + termscript = 0; + } - if (! NILP (file)) + if (! NILP (filename)) { - file = Fexpand_file_name (file, Qnil); - termscript = fopen ((char *) XSTRING_DATA (file), "w"); + filename = Fexpand_file_name (filename, Qnil); + termscript = fopen ((char *) XSTRING_DATA (filename), "w"); if (termscript == NULL) - report_file_error ("Opening termscript", list1 (file)); + report_file_error ("Opening termscript", list1 (filename)); } return Qnil; } diff --git a/src/process-unix.c b/src/process-unix.c index 3523f6c..0063a6e 100644 --- a/src/process-unix.c +++ b/src/process-unix.c @@ -1407,9 +1407,9 @@ static void try_to_initialize_subtty (struct unix_process_data *upd) { if (upd->pty_flag - && (upd->subtty = -1 || ! isatty (upd->subtty)) + && (upd->subtty == -1 || ! isatty (upd->subtty)) && STRINGP (upd->tty_name)) - upd->subtty = open (XSTRING_DATA (upd->tty_name), O_RDWR, 0); + upd->subtty = open ((char *) XSTRING_DATA (upd->tty_name), O_RDWR, 0); } /* Send signal number SIGNO to PROCESS. @@ -1475,9 +1475,21 @@ unix_kill_child_process (Lisp_Object proc, int signo, ioctl TIOCGPGRP it is supposed to obsolete. Sometimes we have to use TIOCGPGRP on the master end, sometimes the slave end (probably an AIX bug). So we better get a fd for the slave if we - haven't got it yet. On some systems none of these work, so then - we just fall back to the non-current_group behavior and kill the - process group of the child. */ + haven't got it yet. + + Anal operating systems like SGI Irix and Compaq Tru64 adhere + strictly to the letter of the law, so our hack doesn't work. + The following fragment from an Irix header file is suggestive: + + #ifdef __notdef__ + // this is not currently supported + #define TIOCSIGNAL (tIOC|31) // pty: send signal to slave + #endif + + On those systems where none of our tricks work, we just fall back + to the non-current_group behavior and kill the process group of + the child. + */ if (current_group) { try_to_initialize_subtty (d); diff --git a/src/process.c b/src/process.c index 5812151..405dc90 100644 --- a/src/process.c +++ b/src/process.c @@ -112,50 +112,50 @@ Lisp_Object Vnull_device; static Lisp_Object -mark_process (Lisp_Object obj) -{ - Lisp_Process *proc = XPROCESS (obj); - MAYBE_PROCMETH (mark_process_data, (proc)); - mark_object (proc->name); - mark_object (proc->command); - mark_object (proc->filter); - mark_object (proc->sentinel); - mark_object (proc->buffer); - mark_object (proc->mark); - mark_object (proc->pid); - mark_object (proc->pipe_instream); - mark_object (proc->pipe_outstream); +mark_process (Lisp_Object object) +{ + Lisp_Process *process = XPROCESS (object); + MAYBE_PROCMETH (mark_process_data, (process)); + mark_object (process->name); + mark_object (process->command); + mark_object (process->filter); + mark_object (process->sentinel); + mark_object (process->buffer); + mark_object (process->mark); + mark_object (process->pid); + mark_object (process->pipe_instream); + mark_object (process->pipe_outstream); #ifdef FILE_CODING - mark_object (proc->coding_instream); - mark_object (proc->coding_outstream); + mark_object (process->coding_instream); + mark_object (process->coding_outstream); #endif - return proc->status_symbol; + return process->status_symbol; } static void -print_process (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) +print_process (Lisp_Object object, Lisp_Object printcharfun, int escapeflag) { - Lisp_Process *proc = XPROCESS (obj); + Lisp_Process *process = XPROCESS (object); if (print_readably) error ("printing unreadable object #", - XSTRING_DATA (proc->name)); + XSTRING_DATA (process->name)); if (!escapeflag) { - print_internal (proc->name, printcharfun, 0); + print_internal (process->name, printcharfun, 0); } else { - int netp = network_connection_p (obj); + int netp = network_connection_p (object); write_c_string ((netp ? GETTEXT ("#name, printcharfun, 1); + print_internal (process->name, printcharfun, 1); write_c_string ((netp ? " " : " pid "), printcharfun); - print_internal (proc->pid, printcharfun, 1); + print_internal (process->pid, printcharfun, 1); write_c_string (" state:", printcharfun); - print_internal (proc->status_symbol, printcharfun, 1); - MAYBE_PROCMETH (print_process_data, (proc, printcharfun)); + print_internal (process->status_symbol, printcharfun, 1); + MAYBE_PROCMETH (print_process_data, (process, printcharfun)); write_c_string (">", printcharfun); } } @@ -215,9 +215,9 @@ get_process_from_usid (USID usid) if (gethash ((const void*)usid, usid_to_process, &vval)) { - Lisp_Object proc; - CVOID_TO_LISP (proc, vval); - return XPROCESS (proc); + Lisp_Object process; + CVOID_TO_LISP (process, vval); + return XPROCESS (process); } else return 0; @@ -252,17 +252,18 @@ network_connection_p (Lisp_Object process) DEFUN ("processp", Fprocessp, 1, 1, 0, /* Return t if OBJECT is a process. */ - (obj)) + (object)) { - return PROCESSP (obj) ? Qt : Qnil; + return PROCESSP (object) ? Qt : Qnil; } DEFUN ("process-live-p", Fprocess_live_p, 1, 1, 0, /* Return t if OBJECT is a process that is alive. */ - (obj)) + (object)) { - return PROCESSP (obj) && PROCESS_LIVE_P (XPROCESS (obj)) ? Qt : Qnil; + return PROCESSP (object) && PROCESS_LIVE_P (XPROCESS (object)) + ? Qt : Qnil; } DEFUN ("process-list", Fprocess_list, 0, 0, 0, /* @@ -274,27 +275,24 @@ Return a list of all processes. } DEFUN ("get-process", Fget_process, 1, 1, 0, /* -Return the process named NAME, or nil if there is none. +Return the process named PROCESS-NAME (a string), or nil if there is none. +PROCESS-NAME may also be a process; if so, the value is that process. */ - (name)) + (process_name)) { - Lisp_Object tail; - - if (PROCESSP (name)) - return name; + if (PROCESSP (process_name)) + return process_name; if (!gc_in_progress) /* this only gets called during GC when emacs is going away as a result of a signal or crash. */ - CHECK_STRING (name); + CHECK_STRING (process_name); - for (tail = Vprocess_list; CONSP (tail); tail = XCDR (tail)) - { - Lisp_Object proc = XCAR (tail); - QUIT; - if (internal_equal (name, XPROCESS (proc)->name, 0)) - return XCAR (tail); - } + { + LIST_LOOP_2 (process, Vprocess_list) + if (internal_equal (process_name, XPROCESS (process)->name, 0)) + return process; + } return Qnil; } @@ -302,24 +300,17 @@ DEFUN ("get-buffer-process", Fget_buffer_process, 1, 1, 0, /* Return the (or, a) process associated with BUFFER. BUFFER may be a buffer or the name of one. */ - (name)) + (buffer)) { - Lisp_Object buf, tail, proc; + if (NILP (buffer)) return Qnil; + buffer = Fget_buffer (buffer); + if (NILP (buffer)) return Qnil; - if (NILP (name)) return Qnil; - buf = Fget_buffer (name); - if (NILP (buf)) return Qnil; - - for (tail = Vprocess_list; CONSP (tail); tail = XCDR (tail)) - { - /* jwz: do not quit here - it isn't necessary, as there is no way for - Vprocess_list to get circular or overwhelmingly long, and this - function is called from layout_mode_element under redisplay. */ - /* QUIT; */ - proc = XCAR (tail); - if (PROCESSP (proc) && EQ (XPROCESS (proc)->buffer, buf)) - return proc; - } + { + LIST_LOOP_2 (process, Vprocess_list) + if (EQ (XPROCESS (process)->buffer, buffer)) + return process; + } return Qnil; } @@ -331,7 +322,7 @@ BUFFER may be a buffer or the name of one. static Lisp_Object get_process (Lisp_Object name) { - Lisp_Object proc, obj; + Lisp_Object buffer; #ifdef I18N3 /* #### Look more closely into translating process names. */ @@ -341,36 +332,40 @@ get_process (Lisp_Object name) kill_buffer_processes() if emacs decides to abort(). */ if (PROCESSP (name)) return name; - - if (STRINGP (name)) + else if (STRINGP (name)) { - obj = Fget_process (name); - if (NILP (obj)) - obj = Fget_buffer (name); - if (NILP (obj)) - error ("Process %s does not exist", XSTRING_DATA (name)); + Lisp_Object object = Fget_process (name); + if (PROCESSP (object)) + return object; + + buffer = Fget_buffer (name); + if (BUFFERP (buffer)) + goto have_buffer_object; + + error ("Process %s does not exist", XSTRING_DATA (name)); } else if (NILP (name)) - obj = Fcurrent_buffer (); - else - obj = name; - - /* Now obj should be either a buffer object or a process object. - */ - if (BUFFERP (obj)) { - proc = Fget_buffer_process (obj); - if (NILP (proc)) - error ("Buffer %s has no process", XSTRING_DATA (XBUFFER(obj)->name)); + buffer = Fcurrent_buffer (); + goto have_buffer_object; } - else + else if (BUFFERP (name)) { - /* #### This was commented out. Although, simple - (kill-process 7 "qqq") resulted in a fatal error. - kkm */ - CHECK_PROCESS (obj); - proc = obj; + Lisp_Object process; + buffer = name; + + have_buffer_object: + process = Fget_buffer_process (buffer); + if (PROCESSP (process)) + return process; + + error ("Buffer %s has no process", + XSTRING_DATA (XBUFFER (buffer)->name)); } - return proc; + else + return get_process (Fsignal (Qwrong_type_argument, + (list2 (build_string ("process or buffer or nil"), + name)))); } DEFUN ("process-id", Fprocess_id, 1, 1, 0, /* @@ -379,13 +374,13 @@ This is the pid of the Unix process which PROCESS uses or talks to. For a network connection, this value is a cons of (foreign-network-port . foreign-host-name). */ - (proc)) + (process)) { Lisp_Object pid; - CHECK_PROCESS (proc); + CHECK_PROCESS (process); - pid = XPROCESS (proc)->pid; - if (network_connection_p (proc)) + pid = XPROCESS (process)->pid; + if (network_connection_p (process)) /* return Qnil; */ return Fcons (Fcar (pid), Fcdr (pid)); else @@ -397,10 +392,10 @@ Return the name of PROCESS, as a string. This is the name of the program invoked in PROCESS, possibly modified to make it unique among process names. */ - (proc)) + (process)) { - CHECK_PROCESS (proc); - return XPROCESS (proc)->name; + CHECK_PROCESS (process); + return XPROCESS (process)->name; } DEFUN ("process-command", Fprocess_command, 1, 1, 0, /* @@ -408,10 +403,10 @@ Return the command that was executed to start PROCESS. This is a list of strings, the first string being the program executed and the rest of the strings being the arguments given to it. */ - (proc)) + (process)) { - CHECK_PROCESS (proc); - return XPROCESS (proc)->command; + CHECK_PROCESS (process); + return XPROCESS (process)->command; } @@ -482,9 +477,9 @@ init_process_io_handles (Lisp_Process *p, void* in, void* out, int flags) if (usid != USID_DONTHASH) { - Lisp_Object proc = Qnil; - XSETPROCESS (proc, p); - puthash ((const void*)usid, LISP_TO_VOID (proc), usid_to_process); + Lisp_Object process = Qnil; + XSETPROCESS (process, p); + puthash ((const void*)usid, LISP_TO_VOID (process), usid_to_process); } MAYBE_PROCMETH (init_process_io_handles, (p, in, out, flags)); @@ -522,16 +517,16 @@ create_process (Lisp_Object process, Lisp_Object *argv, int nargv, } /* This function is the unwind_protect form for Fstart_process_internal. If - PROC doesn't have its pid set, then we know someone has signalled + PROCESS doesn't have its pid set, then we know someone has signalled an error and the process wasn't started successfully, so we should remove it from the process list. */ -static void remove_process (Lisp_Object proc); +static void remove_process (Lisp_Object process); static Lisp_Object -start_process_unwind (Lisp_Object proc) +start_process_unwind (Lisp_Object process) { - /* Was PROC started successfully? */ - if (EQ (XPROCESS (proc)->pid, Qnil)) - remove_process (proc); + /* Was PROCESS started successfully? */ + if (EQ (XPROCESS (process)->pid, Qnil)) + remove_process (process); return Qnil; } @@ -553,7 +548,7 @@ INCODE and OUTCODE specify the coding-system objects used in input/output { /* This function can call lisp */ /* !!#### This function has not been Mule-ized */ - Lisp_Object buffer, name, program, proc, current_dir; + Lisp_Object buffer, name, program, process, current_dir; Lisp_Object tem; int speccount = specpdl_depth (); struct gcpro gcpro1, gcpro2, gcpro3; @@ -626,27 +621,27 @@ INCODE and OUTCODE specify the coding-system objects used in input/output invalid_operation ("Specified program for new process is a directory", program); - proc = make_process_internal (name); + process = make_process_internal (name); - XPROCESS (proc)->buffer = buffer; - XPROCESS (proc)->command = Flist (nargs - 2, + XPROCESS (process)->buffer = buffer; + XPROCESS (process)->command = Flist (nargs - 2, args + 2); /* Make the process marker point into the process buffer (if any). */ if (!NILP (buffer)) - Fset_marker (XPROCESS (proc)->mark, + Fset_marker (XPROCESS (process)->mark, make_int (BUF_ZV (XBUFFER (buffer))), buffer); /* If an error occurs and we can't start the process, we want to remove it from the process list. This means that each error check in create_process doesn't need to call remove_process itself; it's all taken care of here. */ - record_unwind_protect (start_process_unwind, proc); + record_unwind_protect (start_process_unwind, process); - create_process (proc, args + 3, nargs - 3, program, current_dir); + create_process (process, args + 3, nargs - 3, program, current_dir); UNGCPRO; - return unbind_to (speccount, proc); + return unbind_to (speccount, process); } @@ -681,7 +676,7 @@ INCODE and OUTCODE specify the coding-system objects used in input/output DEFUN ("open-network-stream-internal", Fopen_network_stream_internal, 4, 5, 0, /* Open a TCP connection for a service to a host. -Return a subprocess-object to represent the connection. +Return a process object to represent the connection. Input and output work as for subprocesses; `delete-process' closes it. NAME is name for process. It is modified if necessary to make it unique. @@ -690,10 +685,11 @@ BUFFER is the buffer (or buffer-name) to associate with the process. an output stream or filter function to handle the output. BUFFER may also be nil, meaning that this process is not associated with any buffer. -Third arg is name of the host to connect to, or its IP address. -Fourth arg SERVICE is name of the service desired, or an integer - specifying a port number to connect to. -Fifth argument PROTOCOL is a network protocol. Currently 'tcp +Third arg HOST (a string) is the name of the host to connect to, + or its IP address. +Fourth arg SERVICE is the name of the service desired (a string), + or an integer specifying a port number to connect to. +Optional fifth arg PROTOCOL is a network protocol. Currently only 'tcp (Transmission Control Protocol) and 'udp (User Datagram Protocol) are supported. When omitted, 'tcp is assumed. @@ -701,14 +697,14 @@ Output via `process-send-string' and input via buffer or filter (see `set-process-filter') are stream-oriented. That means UDP datagrams are not guaranteed to be sent and received in discrete packets. (But small datagrams around 500 bytes that are not truncated by `process-send-string' -are usually fine.) Note further that UDP protocol does not guard against -lost packets. +are usually fine.) Note further that the UDP protocol does not guard +against lost packets. */ (name, buffer, host, service, protocol)) { /* !!#### This function has not been Mule-ized */ /* This function can GC */ - Lisp_Object proc = Qnil; + Lisp_Object process = Qnil; struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, ngcpro1; void *inch, *outch; @@ -727,26 +723,26 @@ lost packets. if (!NILP (buffer)) buffer = Fget_buffer_create (buffer); - proc = make_process_internal (name); - NGCPRO1 (proc); + process = make_process_internal (name); + NGCPRO1 (process); - XPROCESS (proc)->pid = Fcons (service, host); - XPROCESS (proc)->buffer = buffer; - init_process_io_handles (XPROCESS (proc), (void*)inch, (void*)outch, + XPROCESS (process)->pid = Fcons (service, host); + XPROCESS (process)->buffer = buffer; + init_process_io_handles (XPROCESS (process), (void*)inch, (void*)outch, STREAM_NETWORK_CONNECTION); - event_stream_select_process (XPROCESS (proc)); + event_stream_select_process (XPROCESS (process)); UNGCPRO; NUNGCPRO; - return proc; + return process; } #ifdef HAVE_MULTICAST DEFUN ("open-multicast-group-internal", Fopen_multicast_group_internal, 5, 5, 0, /* Open a multicast connection on the specified dest/port/ttl. -Return a subprocess-object to represent the connection. +Return a process object to represent the connection. Input and output work as for subprocesses; `delete-process' closes it. NAME is name for process. It is modified if necessary to make it unique. @@ -764,7 +760,7 @@ Third, fourth and fifth args are the multicast destination group, port and ttl. { /* !!#### This function has not been Mule-ized */ /* This function can GC */ - Lisp_Object proc = Qnil; + Lisp_Object process = Qnil; struct gcpro gcpro1; void *inch, *outch; @@ -778,18 +774,18 @@ Third, fourth and fifth args are the multicast destination group, port and ttl. if (!NILP (buffer)) buffer = Fget_buffer_create (buffer); - proc = make_process_internal (name); - GCPRO1 (proc); + process = make_process_internal (name); + GCPRO1 (process); - XPROCESS (proc)->pid = Fcons (port, dest); - XPROCESS (proc)->buffer = buffer; - init_process_io_handles (XPROCESS (proc), (void*)inch, (void*)outch, + XPROCESS (process)->pid = Fcons (port, dest); + XPROCESS (process)->buffer = buffer; + init_process_io_handles (XPROCESS (process), (void*)inch, (void*)outch, STREAM_NETWORK_CONNECTION); - event_stream_select_process (XPROCESS (proc)); + event_stream_select_process (XPROCESS (process)); UNGCPRO; - return proc; + return process; } #endif /* HAVE_MULTICAST */ @@ -805,13 +801,14 @@ canonicalize_host_name (Lisp_Object host) DEFUN ("set-process-window-size", Fset_process_window_size, 3, 3, 0, /* Tell PROCESS that it has logical window size HEIGHT and WIDTH. */ - (proc, height, width)) + (process, height, width)) { - CHECK_PROCESS (proc); + CHECK_PROCESS (process); CHECK_NATNUM (height); CHECK_NATNUM (width); return - MAYBE_INT_PROCMETH (set_window_size, (XPROCESS (proc), XINT (height), XINT (width))) <= 0 + MAYBE_INT_PROCMETH (set_window_size, + (XPROCESS (process), XINT (height), XINT (width))) <= 0 ? Qnil : Qt; } @@ -829,13 +826,13 @@ Tell PROCESS that it has logical window size HEIGHT and WIDTH. you must call it repeatedly until it returns zero. */ Charcount -read_process_output (Lisp_Object proc) +read_process_output (Lisp_Object process) { /* This function can GC */ Bytecount nbytes, nchars; Bufbyte chars[1024]; Lisp_Object outstream; - Lisp_Process *p = XPROCESS (proc); + Lisp_Process *p = XPROCESS (process); /* If there is a lot of output from the subprocess, the loop in execute_internal_event() might call read_process_output() more @@ -856,7 +853,7 @@ read_process_output (Lisp_Object proc) Vdeactivate_mark and current_buffer->keymap */ running_asynch_code = 1; filter_result = call2_trapping_errors ("Error in process filter", - p->filter, proc, Qnil); + p->filter, process, Qnil); running_asynch_code = 0; restore_match_data (); CHECK_INT (filter_result); @@ -874,7 +871,7 @@ read_process_output (Lisp_Object proc) call2_trapping_errors() does that for us. */ running_asynch_code = 1; call2_trapping_errors ("Error in process filter", - outstream, proc, make_string (chars, nbytes)); + outstream, process, make_string (chars, nbytes)); running_asynch_code = 0; restore_match_data (); return nchars; @@ -891,7 +888,7 @@ read_process_output (Lisp_Object proc) struct gcpro gcpro1, gcpro2; struct buffer *buf = XBUFFER (p->buffer); - GCPRO2 (proc, old_read_only); + GCPRO2 (process, old_read_only); old_point = BUF_PT (buf); old_begv = BUF_BEGV (buf); @@ -970,7 +967,7 @@ read_process_output (Lisp_Object proc) /* Sending data to subprocess */ -/* send some data to process PROC. If NONRELOCATABLE is non-NULL, it +/* send some data to process PROCESS. If NONRELOCATABLE is non-NULL, it specifies the address of the data. Otherwise, the data comes from the object RELOCATABLE (either a string or a buffer). START and LEN specify the offset and length of the data to send. @@ -979,7 +976,7 @@ read_process_output (Lisp_Object proc) and in Bytecounts otherwise. */ void -send_process (Lisp_Object proc, +send_process (Lisp_Object process, Lisp_Object relocatable, const Bufbyte *nonrelocatable, int start, int len) { @@ -987,10 +984,10 @@ send_process (Lisp_Object proc, struct gcpro gcpro1, gcpro2; Lisp_Object lstream = Qnil; - GCPRO2 (proc, lstream); + GCPRO2 (process, lstream); - if (NILP (DATA_OUTSTREAM (XPROCESS (proc)))) - signal_simple_error ("Process not open for writing", proc); + if (NILP (DATA_OUTSTREAM (XPROCESS (process)))) + signal_simple_error ("Process not open for writing", process); if (nonrelocatable) lstream = @@ -1001,7 +998,7 @@ send_process (Lisp_Object proc, else lstream = make_lisp_string_input_stream (relocatable, start, len); - PROCMETH (send_process, (proc, XLSTREAM (lstream))); + PROCMETH (send_process, (process, XLSTREAM (lstream))); UNGCPRO; Lstream_delete (XLSTREAM (lstream)); @@ -1012,21 +1009,21 @@ Return the name of the terminal PROCESS uses, or nil if none. This is the terminal that the process itself reads and writes on, not the name of the pty that Emacs uses to talk with that terminal. */ - (proc)) + (process)) { - CHECK_PROCESS (proc); - return MAYBE_LISP_PROCMETH (get_tty_name, (XPROCESS (proc))); + CHECK_PROCESS (process); + return MAYBE_LISP_PROCMETH (get_tty_name, (XPROCESS (process))); } DEFUN ("set-process-buffer", Fset_process_buffer, 2, 2, 0, /* Set buffer associated with PROCESS to BUFFER (a buffer, or nil). */ - (proc, buffer)) + (process, buffer)) { - CHECK_PROCESS (proc); + CHECK_PROCESS (process); if (!NILP (buffer)) CHECK_BUFFER (buffer); - XPROCESS (proc)->buffer = buffer; + XPROCESS (process)->buffer = buffer; return buffer; } @@ -1035,34 +1032,34 @@ Return the buffer PROCESS is associated with. Output from PROCESS is inserted in this buffer unless PROCESS has a filter. */ - (proc)) + (process)) { - CHECK_PROCESS (proc); - return XPROCESS (proc)->buffer; + CHECK_PROCESS (process); + return XPROCESS (process)->buffer; } DEFUN ("process-mark", Fprocess_mark, 1, 1, 0, /* Return the marker for the end of the last output from PROCESS. */ - (proc)) + (process)) { - CHECK_PROCESS (proc); - return XPROCESS (proc)->mark; + CHECK_PROCESS (process); + return XPROCESS (process)->mark; } void -set_process_filter (Lisp_Object proc, Lisp_Object filter, int filter_does_read) +set_process_filter (Lisp_Object process, Lisp_Object filter, int filter_does_read) { - CHECK_PROCESS (proc); - if (PROCESS_LIVE_P (XPROCESS (proc))) { + CHECK_PROCESS (process); + if (PROCESS_LIVE_P (XPROCESS (process))) { if (EQ (filter, Qt)) - event_stream_unselect_process (XPROCESS (proc)); + event_stream_unselect_process (XPROCESS (process)); else - event_stream_select_process (XPROCESS (proc)); + event_stream_select_process (XPROCESS (process)); } - XPROCESS (proc)->filter = filter; - XPROCESS (proc)->filter_does_read = filter_does_read; + XPROCESS (process)->filter = filter; + XPROCESS (process)->filter_does_read = filter_does_read; } DEFUN ("set-process-filter", Fset_process_filter, 2, 2, 0, /* @@ -1073,9 +1070,9 @@ the entire string of output is passed to the filter. The filter gets two arguments: the process and the string of output. If the process has a filter, its buffer is not used for output. */ - (proc, filter)) + (process, filter)) { - set_process_filter (proc, filter, 0); + set_process_filter (process, filter, 0); return filter; } @@ -1083,56 +1080,57 @@ DEFUN ("process-filter", Fprocess_filter, 1, 1, 0, /* Return the filter function of PROCESS; nil if none. See `set-process-filter' for more info on filter functions. */ - (proc)) + (process)) { - CHECK_PROCESS (proc); - return XPROCESS (proc)->filter; + CHECK_PROCESS (process); + return XPROCESS (process)->filter; } DEFUN ("process-send-region", Fprocess_send_region, 3, 4, 0, /* Send current contents of the region between START and END as input to PROCESS. -PROCESS may be a process name or an actual process. +PROCESS may be a process or the name of a process, or a buffer or the +name of a buffer, in which case the buffer's process is used. If it +is nil, the current buffer's process is used. BUFFER specifies the buffer to look in; if nil, the current buffer is used. -If the region is more than 500 or so characters long, -it is sent in several bunches. This may happen even for shorter regions. -Output from processes can arrive in between bunches. +If STRING is more than 100 or so characters long, it may be sent in +several chunks. This may happen even for shorter strings. Output +from processes can arrive in between chunks. */ (process, start, end, buffer)) { /* This function can GC */ - Lisp_Object proc = get_process (process); - Bufpos st, en; + Bufpos bstart, bend; struct buffer *buf = decode_buffer (buffer, 0); XSETBUFFER (buffer, buf); - get_buffer_range_char (buf, start, end, &st, &en, 0); + process = get_process (process); + get_buffer_range_char (buf, start, end, &bstart, &bend, 0); - send_process (proc, buffer, 0, st, en - st); + send_process (process, buffer, 0, bstart, bend - bstart); return Qnil; } DEFUN ("process-send-string", Fprocess_send_string, 2, 4, 0, /* Send PROCESS the contents of STRING as input. -PROCESS may be a process name or an actual process. -Optional arguments FROM and TO specify part of STRING, see `substring'. -If STRING is more than 500 or so characters long, -it is sent in several bunches. This may happen even for shorter strings. -Output from processes can arrive in between bunches. +PROCESS may be a process or the name of a process, or a buffer or the +name of a buffer, in which case the buffer's process is used. If it +is nil, the current buffer's process is used. +Optional arguments START and END specify part of STRING; see `substring'. +If STRING is more than 100 or so characters long, it may be sent in +several chunks. This may happen even for shorter strings. Output +from processes can arrive in between chunks. */ - (process, string, from, to)) + (process, string, start, end)) { /* This function can GC */ - Lisp_Object proc; - Bytecount len; - Bytecount bfr, bto; + Bytecount bstart, bend; - proc = get_process (process); + process = get_process (process); CHECK_STRING (string); - get_string_range_byte (string, from, to, &bfr, &bto, + get_string_range_byte (string, start, end, &bstart, &bend, GB_HISTORICAL_STRING_BEHAVIOR); - len = bto - bfr; - send_process (proc, string, 0, bfr, len); + send_process (process, string, 0, bstart, bend - bstart); return Qnil; } @@ -1234,11 +1232,11 @@ exec_sentinel_unwind (Lisp_Object datum) } static void -exec_sentinel (Lisp_Object proc, Lisp_Object reason) +exec_sentinel (Lisp_Object process, Lisp_Object reason) { /* This function can GC */ int speccount = specpdl_depth (); - Lisp_Process *p = XPROCESS (proc); + Lisp_Process *p = XPROCESS (process); Lisp_Object sentinel = p->sentinel; if (NILP (sentinel)) @@ -1250,11 +1248,11 @@ exec_sentinel (Lisp_Object proc, Lisp_Object reason) /* Zilch the sentinel while it's running, to avoid recursive invocations; assure that it gets restored no matter how the sentinel exits. */ p->sentinel = Qnil; - record_unwind_protect (exec_sentinel_unwind, noseeum_cons (proc, sentinel)); + record_unwind_protect (exec_sentinel_unwind, noseeum_cons (process, sentinel)); /* We used to bind inhibit-quit to t here, but call2_trapping_errors() does that for us. */ running_asynch_code = 1; - call2_trapping_errors ("Error in process sentinel", sentinel, proc, reason); + call2_trapping_errors ("Error in process sentinel", sentinel, process, reason); running_asynch_code = 0; restore_match_data (); unbind_to (speccount, Qnil); @@ -1265,10 +1263,10 @@ Give PROCESS the sentinel SENTINEL; nil for none. The sentinel is called as a function when the process changes state. It gets two arguments: the process, and a string describing the change. */ - (proc, sentinel)) + (process, sentinel)) { - CHECK_PROCESS (proc); - XPROCESS (proc)->sentinel = sentinel; + CHECK_PROCESS (process); + XPROCESS (process)->sentinel = sentinel; return sentinel; } @@ -1276,10 +1274,10 @@ DEFUN ("process-sentinel", Fprocess_sentinel, 1, 1, 0, /* Return the sentinel of PROCESS; nil if none. See `set-process-sentinel' for more info on sentinels. */ - (proc)) + (process)) { - CHECK_PROCESS (proc); - return XPROCESS (proc)->sentinel; + CHECK_PROCESS (process); + return XPROCESS (process)->sentinel; } @@ -1367,7 +1365,7 @@ status_notify (void) Lisp_Object msg = Qnil; struct gcpro gcpro1, gcpro2, gcpro3; /* process_tick is volatile, so we have to remember it now. - Otherwise, we get a race condition is SIGCHLD happens during + Otherwise, we get a race condition if SIGCHLD happens during this function. (Actually, this is not the case anymore. The code to @@ -1391,8 +1389,8 @@ status_notify (void) for (tail = Vprocess_list; CONSP (tail); tail = XCDR (tail)) { - Lisp_Object proc = XCAR (tail); - Lisp_Process *p = XPROCESS (proc); + Lisp_Object process = XCAR (tail); + Lisp_Process *p = XPROCESS (process); /* p->tick is also volatile. Same thing as above applies. */ int this_process_tick; @@ -1409,7 +1407,7 @@ status_notify (void) /* If process is still active, read any output that remains. */ while (!EQ (p->filter, Qt) - && read_process_output (proc) > 0) + && read_process_output (process) > 0) ; /* Get the text to use for the message. */ @@ -1422,14 +1420,14 @@ status_notify (void) || EQ (symbol, Qexit)) { if (delete_exited_processes) - remove_process (proc); + remove_process (process); else - deactivate_process (proc); + deactivate_process (process); } /* Now output the message suitably. */ if (!NILP (p->sentinel)) - exec_sentinel (proc, msg); + exec_sentinel (process, msg); /* Don't bother with a message in the buffer when a process becomes runnable. */ else if (!EQ (symbol, Qrun) && !NILP (p->buffer)) @@ -1503,20 +1501,20 @@ nil -- if arg is a process name and no such process exists. PROCESS may be a process, a buffer, the name of a process or buffer, or nil, indicating the current buffer's process. */ - (proc)) + (process)) { Lisp_Object status_symbol; - if (STRINGP (proc)) - proc = Fget_process (proc); + if (STRINGP (process)) + process = Fget_process (process); else - proc = get_process (proc); + process = get_process (process); - if (NILP (proc)) + if (NILP (process)) return Qnil; - status_symbol = XPROCESS (proc)->status_symbol; - if (network_connection_p (proc)) + status_symbol = XPROCESS (process)->status_symbol; + if (network_connection_p (process)) { if (EQ (status_symbol, Qrun)) status_symbol = Qopen; @@ -1530,10 +1528,10 @@ DEFUN ("process-exit-status", Fprocess_exit_status, 1, 1, 0, /* Return the exit status of PROCESS or the signal number that killed it. If PROCESS has not yet exited or died, return 0. */ - (proc)) + (process)) { - CHECK_PROCESS (proc); - return make_int (XPROCESS (proc)->exit_code); + CHECK_PROCESS (process); + return make_int (XPROCESS (process)->exit_code); } @@ -1714,14 +1712,14 @@ process_send_signal (Lisp_Object process, int signo, int current_group, int nomsg) { /* This function can GC */ - Lisp_Object proc = get_process (process); + process = get_process (process); - if (network_connection_p (proc)) + if (network_connection_p (process)) error ("Network connection %s is not a subprocess", - XSTRING_DATA (XPROCESS(proc)->name)); - CHECK_LIVE_PROCESS (proc); + XSTRING_DATA (XPROCESS(process)->name)); + CHECK_LIVE_PROCESS (process); - MAYBE_PROCMETH (kill_child_process, (proc, signo, current_group, nomsg)); + MAYBE_PROCMETH (kill_child_process, (process, signo, current_group, nomsg)); } DEFUN ("process-send-signal", Fprocess_send_signal, 1, 3, 0, /* @@ -1840,21 +1838,21 @@ text to PROCESS after you call this function. (process)) { /* This function can GC */ - Lisp_Object proc = get_process (process); + process = get_process (process); /* Make sure the process is really alive. */ - if (! EQ (XPROCESS (proc)->status_symbol, Qrun)) - error ("Process %s not running", XSTRING_DATA (XPROCESS (proc)->name)); + if (! EQ (XPROCESS (process)->status_symbol, Qrun)) + error ("Process %s not running", XSTRING_DATA (XPROCESS (process)->name)); - if (!MAYBE_INT_PROCMETH (process_send_eof, (proc))) + if (!MAYBE_INT_PROCMETH (process_send_eof, (process))) { - if (!NILP (DATA_OUTSTREAM (XPROCESS (proc)))) + if (!NILP (DATA_OUTSTREAM (XPROCESS (process)))) { - Lstream_close (XLSTREAM (DATA_OUTSTREAM (XPROCESS (proc)))); - event_stream_delete_stream_pair (Qnil, XPROCESS (proc)->pipe_outstream); - XPROCESS (proc)->pipe_outstream = Qnil; + Lstream_close (XLSTREAM (DATA_OUTSTREAM (XPROCESS (process)))); + event_stream_delete_stream_pair (Qnil, XPROCESS (process)->pipe_outstream); + XPROCESS (process)->pipe_outstream = Qnil; #ifdef FILE_CODING - XPROCESS (proc)->coding_outstream = Qnil; + XPROCESS (process)->coding_outstream = Qnil; #endif } } @@ -1868,9 +1866,9 @@ text to PROCESS after you call this function. /************************************************************************/ void -deactivate_process (Lisp_Object proc) +deactivate_process (Lisp_Object process) { - Lisp_Process *p = XPROCESS (proc); + Lisp_Process *p = XPROCESS (process); USID usid; /* It's possible that we got as far in the process-creation @@ -1908,25 +1906,25 @@ deactivate_process (Lisp_Object proc) } static void -remove_process (Lisp_Object proc) +remove_process (Lisp_Object process) { - Vprocess_list = delq_no_quit (proc, Vprocess_list); - Fset_marker (XPROCESS (proc)->mark, Qnil, Qnil); + Vprocess_list = delq_no_quit (process, Vprocess_list); + Fset_marker (XPROCESS (process)->mark, Qnil, Qnil); - deactivate_process (proc); + deactivate_process (process); } DEFUN ("delete-process", Fdelete_process, 1, 1, 0, /* Delete PROCESS: kill it and forget about it immediately. PROCESS may be a process or the name of one, or a buffer name. */ - (proc)) + (process)) { /* This function can GC */ Lisp_Process *p; - proc = get_process (proc); - p = XPROCESS (proc); - if (network_connection_p (proc)) + process = get_process (process); + p = XPROCESS (process); + if (network_connection_p (process)) { p->status_symbol = Qexit; p->exit_code = 0; @@ -1936,7 +1934,7 @@ PROCESS may be a process or the name of one, or a buffer name. } else if (PROCESS_LIVE_P (p)) { - Fkill_process (proc, Qnil); + Fkill_process (process, Qnil); /* Do this now, since remove_process will make sigchld_handler do nothing. */ p->status_symbol = Qsignal; p->exit_code = SIGKILL; @@ -1945,7 +1943,7 @@ PROCESS may be a process or the name of one, or a buffer name. process_tick++; status_notify (); } - remove_process (proc); + remove_process (process); return Qnil; } @@ -1955,21 +1953,14 @@ PROCESS may be a process or the name of one, or a buffer name. void kill_buffer_processes (Lisp_Object buffer) { - Lisp_Object tail; - - for (tail = Vprocess_list; CONSP (tail); - tail = XCDR (tail)) - { - Lisp_Object proc = XCAR (tail); - if (PROCESSP (proc) - && (NILP (buffer) || EQ (XPROCESS (proc)->buffer, buffer))) - { - if (network_connection_p (proc)) - Fdelete_process (proc); - else if (PROCESS_LIVE_P (XPROCESS (proc))) - process_send_signal (proc, SIGHUP, 0, 1); - } - } + LIST_LOOP_2 (process, Vprocess_list) + if ((NILP (buffer) || EQ (XPROCESS (process)->buffer, buffer))) + { + if (network_connection_p (process)) + Fdelete_process (process); + else if (PROCESS_LIVE_P (XPROCESS (process))) + process_send_signal (process, SIGHUP, 0, 1); + } } DEFUN ("process-kill-without-query", Fprocess_kill_without_query, 1, 2, 0, /* @@ -1977,24 +1968,24 @@ Say no query needed if PROCESS is running when Emacs is exited. Optional second argument if non-nil says to require a query. Value is t if a query was formerly required. */ - (proc, require_query_p)) + (process, require_query_p)) { int tem; - CHECK_PROCESS (proc); - tem = XPROCESS (proc)->kill_without_query; - XPROCESS (proc)->kill_without_query = NILP (require_query_p); + CHECK_PROCESS (process); + tem = XPROCESS (process)->kill_without_query; + XPROCESS (process)->kill_without_query = NILP (require_query_p); return tem ? Qnil : Qt; } DEFUN ("process-kill-without-query-p", Fprocess_kill_without_query_p, 1, 1, 0, /* -Whether PROC will be killed without query if running when emacs is exited. +Return t if PROCESS will be killed without query when emacs is exited. */ - (proc)) + (process)) { - CHECK_PROCESS (proc); - return XPROCESS (proc)->kill_without_query ? Qt : Qnil; + CHECK_PROCESS (process); + return XPROCESS (process)->kill_without_query ? Qt : Qnil; } diff --git a/src/rangetab.c b/src/rangetab.c index afc1cc1..50a8735 100644 --- a/src/rangetab.c +++ b/src/rangetab.c @@ -241,16 +241,17 @@ You can manipulate it using `put-range-table', `get-range-table', } DEFUN ("copy-range-table", Fcopy_range_table, 1, 1, 0, /* -Make a new range table which contains the same values for the same -ranges as the given table. The values will not themselves be copied. +Return a new range table which is a copy of RANGE-TABLE. +It will contain the same values for the same ranges as RANGE-TABLE. +The values will not themselves be copied. */ - (old_table)) + (range_table)) { Lisp_Range_Table *rt, *rtnew; Lisp_Object obj; - CHECK_RANGE_TABLE (old_table); - rt = XRANGE_TABLE (old_table); + CHECK_RANGE_TABLE (range_table); + rt = XRANGE_TABLE (range_table); rtnew = alloc_lcrecord_type (Lisp_Range_Table, &lrecord_range_table); rtnew->entries = Dynarr_new (range_table_entry); @@ -262,15 +263,15 @@ ranges as the given table. The values will not themselves be copied. } DEFUN ("get-range-table", Fget_range_table, 2, 3, 0, /* -Find value for position POS in TABLE. +Find value for position POS in RANGE-TABLE. If there is no corresponding value, return DEFAULT (defaults to nil). */ - (pos, table, default_)) + (pos, range_table, default_)) { Lisp_Range_Table *rt; - CHECK_RANGE_TABLE (table); - rt = XRANGE_TABLE (table); + CHECK_RANGE_TABLE (range_table); + rt = XRANGE_TABLE (range_table); CHECK_INT_COERCE_CHAR (pos); @@ -403,13 +404,13 @@ put_range_table (Lisp_Object table, EMACS_INT first, } DEFUN ("put-range-table", Fput_range_table, 4, 4, 0, /* -Set the value for range (START, END) to be VAL in TABLE. +Set the value for range (START, END) to be VALUE in RANGE-TABLE. */ - (start, end, val, table)) + (start, end, value, range_table)) { EMACS_INT first, last; - CHECK_RANGE_TABLE (table); + CHECK_RANGE_TABLE (range_table); CHECK_INT_COERCE_CHAR (start); first = XINT (start); CHECK_INT_COERCE_CHAR (end); @@ -417,47 +418,47 @@ Set the value for range (START, END) to be VAL in TABLE. if (first > last) signal_simple_error_2 ("start must be <= end", start, end); - put_range_table (table, first, last, val); - verify_range_table (XRANGE_TABLE (table)); + put_range_table (range_table, first, last, value); + verify_range_table (XRANGE_TABLE (range_table)); return Qnil; } DEFUN ("remove-range-table", Fremove_range_table, 3, 3, 0, /* -Remove the value for range (START, END) in TABLE. +Remove the value for range (START, END) in RANGE-TABLE. */ - (start, end, table)) + (start, end, range_table)) { - return Fput_range_table (start, end, Qunbound, table); + return Fput_range_table (start, end, Qunbound, range_table); } DEFUN ("clear-range-table", Fclear_range_table, 1, 1, 0, /* -Flush TABLE. +Flush RANGE-TABLE. */ - (table)) + (range_table)) { - CHECK_RANGE_TABLE (table); - Dynarr_reset (XRANGE_TABLE (table)->entries); + CHECK_RANGE_TABLE (range_table); + Dynarr_reset (XRANGE_TABLE (range_table)->entries); return Qnil; } DEFUN ("map-range-table", Fmap_range_table, 2, 2, 0, /* -Map FUNCTION over entries in TABLE, calling it with three args, +Map FUNCTION over entries in RANGE-TABLE, calling it with three args, the beginning and end of the range and the corresponding value. Results are guaranteed to be correct (i.e. each entry processed exactly once) if FUNCTION modifies or deletes the current entry -(i.e. passes the current range to `put-range-table' or +\(i.e. passes the current range to `put-range-table' or `remove-range-table'), but not otherwise. */ - (function, table)) + (function, range_table)) { Lisp_Range_Table *rt; int i; - CHECK_RANGE_TABLE (table); + CHECK_RANGE_TABLE (range_table); CHECK_FUNCTION (function); - rt = XRANGE_TABLE (table); + rt = XRANGE_TABLE (range_table); /* Do not "optimize" by pulling out the length computation below! FUNCTION may have changed the table. */ diff --git a/src/redisplay-msw.c b/src/redisplay-msw.c index 24001fe..fac58f6 100644 --- a/src/redisplay-msw.c +++ b/src/redisplay-msw.c @@ -134,9 +134,9 @@ separate_textual_runs (unsigned char *text_storage, #ifdef MULE { Lisp_Object ccl_prog = XCHARSET_CCL_PROGRAM (charset); - need_ccl_conversion = !NILP (ccl_prog); - if (need_ccl_conversion) - setup_ccl_program (&char_converter, ccl_prog); + if ((!NILP (ccl_prog)) + && (setup_ccl_program (&char_converter, ccl_prog) >= 0)) + need_ccl_conversion = 1; } #endif } diff --git a/src/redisplay-tty.c b/src/redisplay-tty.c index d7460d3..80bdcc4 100644 --- a/src/redisplay-tty.c +++ b/src/redisplay-tty.c @@ -923,6 +923,7 @@ tty_redisplay_shutdown (struct console *c) up or removed. */ +#ifdef NOT_YET /* FLAGS - these don't need to be console local since only one console can be being updated at a time. */ static int insert_mode_on; /* nonzero if in insert mode */ @@ -931,7 +932,6 @@ static int underline_mode_on; /* nonzero if in underline mode */ static int alternate_mode_on; /* nonzero if in alternate char set */ static int attributes_on; /* nonzero if any attributes on */ -#ifdef NOT_YET static void turn_on_insert (struct frame *f) { @@ -1217,6 +1217,7 @@ init_tty_for_redisplay (struct device *d, char *terminal_type) */ cm_cost_init (c); +#ifdef NOT_YET /* * Initialize local flags. */ @@ -1225,6 +1226,7 @@ init_tty_for_redisplay (struct device *d, char *terminal_type) underline_mode_on = 0; alternate_mode_on = 0; attributes_on = 0; +#endif /* * Attempt to initialize the function_key_map to diff --git a/src/redisplay-x.c b/src/redisplay-x.c index 2385b20..68ceb56 100644 --- a/src/redisplay-x.c +++ b/src/redisplay-x.c @@ -174,9 +174,9 @@ separate_textual_runs (unsigned char *text_storage, #ifdef MULE { Lisp_Object ccl_prog = XCHARSET_CCL_PROGRAM (charset); - need_ccl_conversion = !NILP (ccl_prog); - if (need_ccl_conversion) - setup_ccl_program (&char_converter, ccl_prog); + if ((!NILP (ccl_prog)) + && (setup_ccl_program (&char_converter, ccl_prog) >= 0)) + need_ccl_conversion = 1; } #endif } diff --git a/src/redisplay.c b/src/redisplay.c index a69cb6e..7436b62 100644 --- a/src/redisplay.c +++ b/src/redisplay.c @@ -464,8 +464,7 @@ int column_number_start_at_one; Lisp_Object Qtop_bottom; -#define WINDOW_SCROLLED(w) \ -(w->hscroll > 0 || w->left_xoffset) +#define WINDOW_SCROLLED(w) ((w)->hscroll > 0 || (w)->left_xoffset) /***************************************************************************/ @@ -9293,7 +9292,7 @@ See also `overlay-arrow-string'. DEFVAR_LISP_MAGIC ("overlay-arrow-string", &Voverlay_arrow_string /* String or glyph to display as an arrow. See also `overlay-arrow-position'. -(Note that despite the name of this variable, it can be set to a glyph as +\(Note that despite the name of this variable, it can be set to a glyph as well as a string.) */ , redisplay_variable_changed); @@ -9458,7 +9457,7 @@ This is a specifier; use `set-specifier' to change it. offsetof (struct window, left_margin_width), some_window_value_changed, offsetof (struct frame, left_margin_width), - margin_width_changed_in_frame); + margin_width_changed_in_frame, 0); DEFVAR_SPECIFIER ("right-margin-width", &Vright_margin_width /* *Width of right margin. @@ -9470,7 +9469,7 @@ This is a specifier; use `set-specifier' to change it. offsetof (struct window, right_margin_width), some_window_value_changed, offsetof (struct frame, right_margin_width), - margin_width_changed_in_frame); + margin_width_changed_in_frame, 0); DEFVAR_SPECIFIER ("minimum-line-ascent", &Vminimum_line_ascent /* *Minimum ascent height of lines. @@ -9481,7 +9480,7 @@ This is a specifier; use `set-specifier' to change it. set_specifier_caching (Vminimum_line_ascent, offsetof (struct window, minimum_line_ascent), some_window_value_changed, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("minimum-line-descent", &Vminimum_line_descent /* *Minimum descent height of lines. @@ -9492,7 +9491,7 @@ This is a specifier; use `set-specifier' to change it. set_specifier_caching (Vminimum_line_descent, offsetof (struct window, minimum_line_descent), some_window_value_changed, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("use-left-overflow", &Vuse_left_overflow /* *Non-nil means use the left outside margin as extra whitespace when @@ -9504,7 +9503,7 @@ This is a specifier; use `set-specifier' to change it. set_specifier_caching (Vuse_left_overflow, offsetof (struct window, use_left_overflow), some_window_value_changed, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("use-right-overflow", &Vuse_right_overflow /* *Non-nil means use the right outside margin as extra whitespace when @@ -9516,7 +9515,7 @@ This is a specifier; use `set-specifier' to change it. set_specifier_caching (Vuse_right_overflow, offsetof (struct window, use_right_overflow), some_window_value_changed, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("text-cursor-visible-p", &Vtext_cursor_visible_p /* *Non-nil means the text cursor is visible (this is usually the case). @@ -9527,6 +9526,6 @@ This is a specifier; use `set-specifier' to change it. set_specifier_caching (Vtext_cursor_visible_p, offsetof (struct window, text_cursor_visible_p), text_cursor_visible_p_changed, - 0, 0); + 0, 0, 0); } diff --git a/src/regex.c b/src/regex.c index e3e7268..9b7877e 100644 --- a/src/regex.c +++ b/src/regex.c @@ -286,7 +286,7 @@ init_syntax_once (void) #include #else /* not __GNUC__ or HAVE_ALLOCA_H */ #ifndef _AIX /* Already did AIX, up at the top. */ -char *alloca (); +void *alloca (); #endif /* not _AIX */ #endif /* not HAVE_ALLOCA_H */ #endif /* not __GNUC__ */ diff --git a/src/s/decosf1-3.h b/src/s/decosf1-3.h index 94b6615..d54562e 100644 --- a/src/s/decosf1-3.h +++ b/src/s/decosf1-3.h @@ -1,10 +1,6 @@ /* Synched up with: Not in FSF. */ #include "decosf1-2.h" -/* XEmacs change: Kim Nyberg says this is needed. */ -#ifdef emacs -#include -#endif /* Supposedly gmalloc and rel_alloc will work now (grunwald@foobar.cs.colorado.edu) */ diff --git a/src/s/ptx.h b/src/s/ptx.h index daef324..c0ebe2d 100644 --- a/src/s/ptx.h +++ b/src/s/ptx.h @@ -68,7 +68,6 @@ Boston, MA 02111-1307, USA. */ #endif #ifdef emacs -#include /* Support for pty's */ #include /*#define BROKEN_SIGIO*/ /* SIGIO is already undef'd elsewhere. PTX diff --git a/src/s/usg5-4.h b/src/s/usg5-4.h index bc789cd..e16dfeb 100644 --- a/src/s/usg5-4.h +++ b/src/s/usg5-4.h @@ -81,7 +81,6 @@ Boston, MA 02111-1307, USA. */ #include #include #include -#include #include #endif diff --git a/src/scrollbar.c b/src/scrollbar.c index 37092a5..1baa76f 100644 --- a/src/scrollbar.c +++ b/src/scrollbar.c @@ -409,7 +409,7 @@ update_scrollbar_instance (struct window *w, int vertical, int new_minimum = -1, new_maximum = -1; int new_slider_size = -1, new_slider_position = -1; int new_width = -1, new_height = -1, new_x = -1, new_y = -1; - struct window *new_window = 0; /* kludge city */ + struct window *new_window = 0; /* #### currently unused */ end_pos = BUF_Z (b) - w->window_end_pos[CURRENT_DISP]; sb_pos = scrollbar_point (w, 0); @@ -953,7 +953,7 @@ This is a specifier; use `set-specifier' to change it. offsetof (struct window, scrollbar_width), vertical_scrollbar_changed_in_window, offsetof (struct frame, scrollbar_width), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("scrollbar-height", &Vscrollbar_height /* *Height of horizontal scrollbars. @@ -967,7 +967,7 @@ This is a specifier; use `set-specifier' to change it. offsetof (struct window, scrollbar_height), some_window_value_changed, offsetof (struct frame, scrollbar_height), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("horizontal-scrollbar-visible-p", &Vhorizontal_scrollbar_visible_p /* *Whether the horizontal scrollbar is visible. @@ -982,7 +982,7 @@ This is a specifier; use `set-specifier' to change it. some_window_value_changed, offsetof (struct frame, horizontal_scrollbar_visible_p), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("vertical-scrollbar-visible-p", &Vvertical_scrollbar_visible_p /* *Whether the vertical scrollbar is visible. @@ -997,7 +997,7 @@ This is a specifier; use `set-specifier' to change it. vertical_scrollbar_changed_in_window, offsetof (struct frame, vertical_scrollbar_visible_p), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("scrollbar-on-left-p", &Vscrollbar_on_left_p /* *Whether the vertical scrollbar is on the left side of window or frame. @@ -1023,7 +1023,7 @@ This is a specifier; use `set-specifier' to change it. offsetof (struct window, scrollbar_on_left_p), vertical_scrollbar_changed_in_window, offsetof (struct frame, scrollbar_on_left_p), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("scrollbar-on-top-p", &Vscrollbar_on_top_p /* *Whether the horizontal scrollbar is on the top side of window or frame. @@ -1036,7 +1036,7 @@ This is a specifier; use `set-specifier' to change it. offsetof (struct window, scrollbar_on_top_p), some_window_value_changed, offsetof (struct frame, scrollbar_on_top_p), - frame_size_slipped); + frame_size_slipped, 0); } void @@ -1047,5 +1047,5 @@ complex_vars_of_scrollbar (void) set_specifier_caching (XGLYPH (Vscrollbar_pointer_glyph)->image, offsetof (struct window, scrollbar_pointer), scrollbar_pointer_changed_in_window, - 0, 0); + 0, 0, 0); } diff --git a/src/search.c b/src/search.c index 7f92765..7738cde 100644 --- a/src/search.c +++ b/src/search.c @@ -932,7 +932,7 @@ skip_chars (struct buffer *buf, int forwardp, int syntaxp, } DEFUN ("skip-chars-forward", Fskip_chars_forward, 1, 3, 0, /* -Move point forward, stopping before a char not in STRING, or at pos LIM. +Move point forward, stopping before a char not in STRING, or at pos LIMIT. STRING is like the inside of a `[...]' in a regular expression except that `]' is never special and `\\' quotes `^', `-' or `\\'. Thus, with arg "a-zA-Z", this skips letters stopping before first nonletter. @@ -941,57 +941,57 @@ Returns the distance traveled, either zero or positive. Optional argument BUFFER defaults to the current buffer. */ - (string, lim, buffer)) + (string, limit, buffer)) { - return skip_chars (decode_buffer (buffer, 0), 1, 0, string, lim); + return skip_chars (decode_buffer (buffer, 0), 1, 0, string, limit); } DEFUN ("skip-chars-backward", Fskip_chars_backward, 1, 3, 0, /* -Move point backward, stopping after a char not in STRING, or at pos LIM. +Move point backward, stopping after a char not in STRING, or at pos LIMIT. See `skip-chars-forward' for details. Returns the distance traveled, either zero or negative. Optional argument BUFFER defaults to the current buffer. */ - (string, lim, buffer)) + (string, limit, buffer)) { - return skip_chars (decode_buffer (buffer, 0), 0, 0, string, lim); + return skip_chars (decode_buffer (buffer, 0), 0, 0, string, limit); } DEFUN ("skip-syntax-forward", Fskip_syntax_forward, 1, 3, 0, /* Move point forward across chars in specified syntax classes. SYNTAX is a string of syntax code characters. -Stop before a char whose syntax is not in SYNTAX, or at position LIM. +Stop before a char whose syntax is not in SYNTAX, or at position LIMIT. If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX. This function returns the distance traveled, either zero or positive. Optional argument BUFFER defaults to the current buffer. */ - (syntax, lim, buffer)) + (syntax, limit, buffer)) { - return skip_chars (decode_buffer (buffer, 0), 1, 1, syntax, lim); + return skip_chars (decode_buffer (buffer, 0), 1, 1, syntax, limit); } DEFUN ("skip-syntax-backward", Fskip_syntax_backward, 1, 3, 0, /* Move point backward across chars in specified syntax classes. SYNTAX is a string of syntax code characters. -Stop on reaching a char whose syntax is not in SYNTAX, or at position LIM. +Stop on reaching a char whose syntax is not in SYNTAX, or at position LIMIT. If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX. This function returns the distance traveled, either zero or negative. Optional argument BUFFER defaults to the current buffer. */ - (syntax, lim, buffer)) + (syntax, limit, buffer)) { - return skip_chars (decode_buffer (buffer, 0), 0, 1, syntax, lim); + return skip_chars (decode_buffer (buffer, 0), 0, 1, syntax, limit); } /* Subroutines of Lisp buffer search functions. */ static Lisp_Object -search_command (Lisp_Object string, Lisp_Object bound, Lisp_Object no_error, +search_command (Lisp_Object string, Lisp_Object limit, Lisp_Object noerror, Lisp_Object count, Lisp_Object buffer, int direction, int RE, int posix) { @@ -1009,14 +1009,14 @@ search_command (Lisp_Object string, Lisp_Object bound, Lisp_Object no_error, buf = decode_buffer (buffer, 0); CHECK_STRING (string); - if (NILP (bound)) + if (NILP (limit)) lim = n > 0 ? BUF_ZV (buf) : BUF_BEGV (buf); else { - CHECK_INT_COERCE_MARKER (bound); - lim = XINT (bound); + CHECK_INT_COERCE_MARKER (limit); + lim = XINT (limit); if (n > 0 ? lim < BUF_PT (buf) : lim > BUF_PT (buf)) - error ("Invalid search bound (wrong side of point)"); + error ("Invalid search limit (wrong side of point)"); if (lim > BUF_ZV (buf)) lim = BUF_ZV (buf); if (lim < BUF_BEGV (buf)) @@ -1033,9 +1033,9 @@ search_command (Lisp_Object string, Lisp_Object bound, Lisp_Object no_error, if (np <= 0) { - if (NILP (no_error)) + if (NILP (noerror)) return signal_failure (string); - if (!EQ (no_error, Qt)) + if (!EQ (noerror, Qt)) { if (lim < BUF_BEGV (buf) || lim > BUF_ZV (buf)) abort (); @@ -1645,70 +1645,103 @@ wordify (Lisp_Object buffer, Lisp_Object string) DEFUN ("search-backward", Fsearch_backward, 1, 5, "sSearch backward: ", /* Search backward from point for STRING. Set point to the beginning of the occurrence found, and return point. -An optional second argument bounds the search; it is a buffer position. -The match found must not extend before that position. -Optional third argument, if t, means if fail just return nil (no error). - If not nil and not t, position at limit of search and return nil. -Optional fourth argument is repeat count--search for successive occurrences. + +Optional second argument LIMIT bounds the search; it is a buffer +position. The match found must not extend before that position. +The value nil is equivalent to (point-min). + +Optional third argument NOERROR, if t, means just return nil (no +error) if the search fails. If neither nil nor t, set point to LIMIT +and return nil. + +Optional fourth argument COUNT is a repeat count--search for +successive occurrences. + Optional fifth argument BUFFER specifies the buffer to search in and - defaults to the current buffer. +defaults to the current buffer. + See also the functions `match-beginning', `match-end' and `replace-match'. */ - (string, bound, no_error, count, buffer)) + (string, limit, noerror, count, buffer)) { - return search_command (string, bound, no_error, count, buffer, -1, 0, 0); + return search_command (string, limit, noerror, count, buffer, -1, 0, 0); } DEFUN ("search-forward", Fsearch_forward, 1, 5, "sSearch: ", /* Search forward from point for STRING. Set point to the end of the occurrence found, and return point. -An optional second argument bounds the search; it is a buffer position. -The match found must not extend after that position. nil is equivalent - to (point-max). -Optional third argument, if t, means if fail just return nil (no error). - If not nil and not t, move to limit of search and return nil. -Optional fourth argument is repeat count--search for successive occurrences. + +Optional second argument LIMIT bounds the search; it is a buffer +position. The match found must not extend after that position. The +value nil is equivalent to (point-max). + +Optional third argument NOERROR, if t, means just return nil (no +error) if the search fails. If neither nil nor t, set point to LIMIT +and return nil. + +Optional fourth argument COUNT is a repeat count--search for +successive occurrences. + Optional fifth argument BUFFER specifies the buffer to search in and - defaults to the current buffer. +defaults to the current buffer. + See also the functions `match-beginning', `match-end' and `replace-match'. */ - (string, bound, no_error, count, buffer)) + (string, limit, noerror, count, buffer)) { - return search_command (string, bound, no_error, count, buffer, 1, 0, 0); + return search_command (string, limit, noerror, count, buffer, 1, 0, 0); } DEFUN ("word-search-backward", Fword_search_backward, 1, 5, "sWord search backward: ", /* Search backward from point for STRING, ignoring differences in punctuation. Set point to the beginning of the occurrence found, and return point. -An optional second argument bounds the search; it is a buffer position. -The match found must not extend before that position. -Optional third argument, if t, means if fail just return nil (no error). - If not nil and not t, move to limit of search and return nil. -Optional fourth argument is repeat count--search for successive occurrences. + +Optional second argument LIMIT bounds the search; it is a buffer +position. The match found must not extend before that position. +The value nil is equivalent to (point-min). + +Optional third argument NOERROR, if t, means just return nil (no +error) if the search fails. If neither nil nor t, set point to LIMIT +and return nil. + +Optional fourth argument COUNT is a repeat count--search for +successive occurrences. + Optional fifth argument BUFFER specifies the buffer to search in and - defaults to the current buffer. +defaults to the current buffer. + +See also the functions `match-beginning', `match-end' and `replace-match'. */ - (string, bound, no_error, count, buffer)) + (string, limit, noerror, count, buffer)) { - return search_command (wordify (buffer, string), bound, no_error, count, + return search_command (wordify (buffer, string), limit, noerror, count, buffer, -1, 1, 0); } DEFUN ("word-search-forward", Fword_search_forward, 1, 5, "sWord search: ", /* Search forward from point for STRING, ignoring differences in punctuation. Set point to the end of the occurrence found, and return point. -An optional second argument bounds the search; it is a buffer position. -The match found must not extend after that position. -Optional third argument, if t, means if fail just return nil (no error). - If not nil and not t, move to limit of search and return nil. -Optional fourth argument is repeat count--search for successive occurrences. + +Optional second argument LIMIT bounds the search; it is a buffer +position. The match found must not extend after that position. The +value nil is equivalent to (point-max). + +Optional third argument NOERROR, if t, means just return nil (no +error) if the search fails. If neither nil nor t, set point to LIMIT +and return nil. + +Optional fourth argument COUNT is a repeat count--search for +successive occurrences. + Optional fifth argument BUFFER specifies the buffer to search in and - defaults to the current buffer. +defaults to the current buffer. + +See also the functions `match-beginning', `match-end' and `replace-match'. */ - (string, bound, no_error, count, buffer)) + (string, limit, noerror, count, buffer)) { - return search_command (wordify (buffer, string), bound, no_error, count, + return search_command (wordify (buffer, string), limit, noerror, count, buffer, 1, 1, 0); } @@ -1718,35 +1751,51 @@ Search backward from point for match for regular expression REGEXP. Set point to the beginning of the match, and return point. The match found is the one starting last in the buffer and yet ending before the origin of the search. -An optional second argument bounds the search; it is a buffer position. -The match found must start at or after that position. -Optional third argument, if t, means if fail just return nil (no error). - If not nil and not t, move to limit of search and return nil. -Optional fourth argument is repeat count--search for successive occurrences. + +Optional second argument LIMIT bounds the search; it is a buffer +position. The match found must not extend before that position. +The value nil is equivalent to (point-min). + +Optional third argument NOERROR, if t, means just return nil (no +error) if the search fails. If neither nil nor t, set point to LIMIT +and return nil. + +Optional fourth argument COUNT is a repeat count--search for +successive occurrences. + Optional fifth argument BUFFER specifies the buffer to search in and - defaults to the current buffer. +defaults to the current buffer. + See also the functions `match-beginning', `match-end' and `replace-match'. */ - (regexp, bound, no_error, count, buffer)) + (regexp, limit, noerror, count, buffer)) { - return search_command (regexp, bound, no_error, count, buffer, -1, 1, 0); + return search_command (regexp, limit, noerror, count, buffer, -1, 1, 0); } DEFUN ("re-search-forward", Fre_search_forward, 1, 5, "sRE search: ", /* Search forward from point for regular expression REGEXP. Set point to the end of the occurrence found, and return point. -An optional second argument bounds the search; it is a buffer position. -The match found must not extend after that position. -Optional third argument, if t, means if fail just return nil (no error). - If not nil and not t, move to limit of search and return nil. -Optional fourth argument is repeat count--search for successive occurrences. + +Optional second argument LIMIT bounds the search; it is a buffer +position. The match found must not extend after that position. The +value nil is equivalent to (point-max). + +Optional third argument NOERROR, if t, means just return nil (no +error) if the search fails. If neither nil nor t, set point to LIMIT +and return nil. + +Optional fourth argument COUNT is a repeat count--search for +successive occurrences. + Optional fifth argument BUFFER specifies the buffer to search in and - defaults to the current buffer. +defaults to the current buffer. + See also the functions `match-beginning', `match-end' and `replace-match'. */ - (regexp, bound, no_error, count, buffer)) + (regexp, limit, noerror, count, buffer)) { - return search_command (regexp, bound, no_error, count, buffer, 1, 1, 0); + return search_command (regexp, limit, noerror, count, buffer, 1, 1, 0); } DEFUN ("posix-search-backward", Fposix_search_backward, 1, 5, @@ -1756,36 +1805,52 @@ Find the longest match in accord with Posix regular expression rules. Set point to the beginning of the match, and return point. The match found is the one starting last in the buffer and yet ending before the origin of the search. -An optional second argument bounds the search; it is a buffer position. -The match found must start at or after that position. -Optional third argument, if t, means if fail just return nil (no error). - If not nil and not t, move to limit of search and return nil. -Optional fourth argument is repeat count--search for successive occurrences. + +Optional second argument LIMIT bounds the search; it is a buffer +position. The match found must not extend before that position. +The value nil is equivalent to (point-min). + +Optional third argument NOERROR, if t, means just return nil (no +error) if the search fails. If neither nil nor t, set point to LIMIT +and return nil. + +Optional fourth argument COUNT is a repeat count--search for +successive occurrences. + Optional fifth argument BUFFER specifies the buffer to search in and - defaults to the current buffer. +defaults to the current buffer. + See also the functions `match-beginning', `match-end' and `replace-match'. */ - (regexp, bound, no_error, count, buffer)) + (regexp, limit, noerror, count, buffer)) { - return search_command (regexp, bound, no_error, count, buffer, -1, 1, 1); + return search_command (regexp, limit, noerror, count, buffer, -1, 1, 1); } DEFUN ("posix-search-forward", Fposix_search_forward, 1, 5, "sPosix search: ", /* Search forward from point for regular expression REGEXP. Find the longest match in accord with Posix regular expression rules. Set point to the end of the occurrence found, and return point. -An optional second argument bounds the search; it is a buffer position. -The match found must not extend after that position. -Optional third argument, if t, means if fail just return nil (no error). - If not nil and not t, move to limit of search and return nil. -Optional fourth argument is repeat count--search for successive occurrences. + +Optional second argument LIMIT bounds the search; it is a buffer +position. The match found must not extend after that position. The +value nil is equivalent to (point-max). + +Optional third argument NOERROR, if t, means just return nil (no +error) if the search fails. If neither nil nor t, set point to LIMIT +and return nil. + +Optional fourth argument COUNT is a repeat count--search for +successive occurrences. + Optional fifth argument BUFFER specifies the buffer to search in and - defaults to the current buffer. +defaults to the current buffer. + See also the functions `match-beginning', `match-end' and `replace-match'. */ - (regexp, bound, no_error, count, buffer)) + (regexp, limit, noerror, count, buffer)) { - return search_command (regexp, bound, no_error, count, buffer, 1, 1, 1); + return search_command (regexp, limit, noerror, count, buffer, 1, 1, 1); } @@ -1801,18 +1866,18 @@ free_created_dynarrs (Lisp_Object cons) } DEFUN ("replace-match", Freplace_match, 1, 5, 0, /* -Replace text matched by last search with NEWTEXT. +Replace text matched by last search with REPLACEMENT. If second arg FIXEDCASE is non-nil, do not alter case of replacement text. Otherwise maybe capitalize the whole text, or maybe just word initials, based on the replaced text. If the replaced text has only capital letters -and has at least one multiletter word, convert NEWTEXT to all caps. +and has at least one multiletter word, convert REPLACEMENT to all caps. If the replaced text has at least one word starting with a capital letter, -then capitalize each word in NEWTEXT. +then capitalize each word in REPLACEMENT. -If third arg LITERAL is non-nil, insert NEWTEXT literally. +If third arg LITERAL is non-nil, insert REPLACEMENT literally. Otherwise treat `\\' as special: - `\\&' in NEWTEXT means substitute original matched text. + `\\&' in REPLACEMENT means substitute original matched text. `\\N' means substitute what matched the Nth `\\(...\\)'. If Nth parens didn't match, substitute nothing. `\\\\' means insert one `\\'. @@ -1831,11 +1896,11 @@ In that case, this function creates and returns a new string which is made by replacing the part of STRING that was matched. When fourth argument is a string, fifth argument STRBUFFER specifies the buffer to be used for syntax-table and case-table lookup and -defaults to the current buffer. (When fourth argument is not a string, +defaults to the current buffer. When fourth argument is not a string, the buffer that the match occurred in has automatically been remembered -and you do not need to specify it.) +and you do not need to specify it. */ - (newtext, fixedcase, literal, string, strbuffer)) + (replacement, fixedcase, literal, string, strbuffer)) { /* This function has been Mule-ized. */ /* This function can GC */ @@ -1855,7 +1920,7 @@ and you do not need to specify it.) int_dynarr *ul_pos_dynarr = 0; int speccount; - CHECK_STRING (newtext); + CHECK_STRING (replacement); if (! NILP (string)) { @@ -1979,10 +2044,10 @@ and you do not need to specify it.) before = Fsubstring (string, Qzero, make_int (search_regs.start[0])); after = Fsubstring (string, make_int (search_regs.end[0]), Qnil); - /* Do case substitution into NEWTEXT if desired. */ + /* Do case substitution into REPLACEMENT if desired. */ if (NILP (literal)) { - Charcount stlen = XSTRING_CHAR_LENGTH (newtext); + Charcount stlen = XSTRING_CHAR_LENGTH (replacement); Charcount strpos; /* XEmacs change: rewrote this loop somewhat to make it cleaner. Also added \U, \E, etc. */ @@ -2009,10 +2074,10 @@ and you do not need to specify it.) Charcount substart = -1; Charcount subend = -1; - c = string_char (XSTRING (newtext), strpos); + c = string_char (XSTRING (replacement), strpos); if (c == '\\' && strpos < stlen - 1) { - c = string_char (XSTRING (newtext), ++strpos); + c = string_char (XSTRING (replacement), ++strpos); if (c == '&') { literal_end = strpos - 1; @@ -2061,7 +2126,7 @@ and you do not need to specify it.) Lisp_Object literal_text = Qnil; Lisp_Object substring = Qnil; if (literal_end != literal_start) - literal_text = Fsubstring (newtext, + literal_text = Fsubstring (replacement, make_int (literal_start), make_int (literal_end)); if (substart >= 0 && subend != substart) @@ -2076,29 +2141,33 @@ and you do not need to specify it.) if (strpos != literal_start) /* some literal text at end to be inserted */ - newtext = concat2 (accum, Fsubstring (newtext, - make_int (literal_start), - make_int (strpos))); + replacement = concat2 (accum, Fsubstring (replacement, + make_int (literal_start), + make_int (strpos))); else - newtext = accum; + replacement = accum; } + /* replacement can be nil. */ + if (NILP (replacement)) + replacement = build_string (""); + if (case_action == all_caps) - newtext = Fupcase (newtext, buffer); + replacement = Fupcase (replacement, buffer); else if (case_action == cap_initial) - newtext = Fupcase_initials (newtext, buffer); + replacement = Fupcase_initials (replacement, buffer); /* Now finally, we need to process the \U's, \E's, etc. */ if (ul_pos_dynarr) { int i = 0; int cur_action = 'E'; - Charcount stlen = XSTRING_CHAR_LENGTH (newtext); + Charcount stlen = XSTRING_CHAR_LENGTH (replacement); Charcount strpos; for (strpos = 0; strpos < stlen; strpos++) { - Emchar curchar = string_char (XSTRING (newtext), strpos); + Emchar curchar = string_char (XSTRING (replacement), strpos); Emchar newchar = -1; if (i < Dynarr_length (ul_pos_dynarr) && strpos == Dynarr_at (ul_pos_dynarr, i)) @@ -2122,13 +2191,13 @@ and you do not need to specify it.) newchar = curchar; } if (newchar != curchar) - set_string_char (XSTRING (newtext), strpos, newchar); + set_string_char (XSTRING (replacement), strpos, newchar); } } /* frees the Dynarrs if necessary. */ unbind_to (speccount, Qnil); - return concat3 (before, newtext, after); + return concat3 (before, replacement, after); } mc_count = begin_multiple_change (buf, search_regs.start[0], @@ -2144,21 +2213,21 @@ and you do not need to specify it.) position in the replacement. */ BUF_SET_PT (buf, search_regs.start[0]); if (!NILP (literal)) - Finsert (1, &newtext); + Finsert (1, &replacement); else { - Charcount stlen = XSTRING_CHAR_LENGTH (newtext); + Charcount stlen = XSTRING_CHAR_LENGTH (replacement); Charcount strpos; struct gcpro gcpro1; - GCPRO1 (newtext); + GCPRO1 (replacement); for (strpos = 0; strpos < stlen; strpos++) { Charcount offset = BUF_PT (buf) - search_regs.start[0]; - c = string_char (XSTRING (newtext), strpos); + c = string_char (XSTRING (replacement), strpos); if (c == '\\' && strpos < stlen - 1) { - c = string_char (XSTRING (newtext), ++strpos); + c = string_char (XSTRING (replacement), ++strpos); if (c == '&') Finsert_buffer_substring (buffer, @@ -2498,19 +2567,19 @@ restore_match_data (void) DEFUN ("regexp-quote", Fregexp_quote, 1, 1, 0, /* Return a regexp string which matches exactly STRING and nothing else. */ - (str)) + (string)) { REGISTER Bufbyte *in, *out, *end; REGISTER Bufbyte *temp; - CHECK_STRING (str); + CHECK_STRING (string); - temp = (Bufbyte *) alloca (XSTRING_LENGTH (str) * 2); + temp = (Bufbyte *) alloca (XSTRING_LENGTH (string) * 2); /* Now copy the data into the new string, inserting escapes. */ - in = XSTRING_DATA (str); - end = in + XSTRING_LENGTH (str); + in = XSTRING_DATA (string); + end = in + XSTRING_LENGTH (string); out = temp; while (in < end) diff --git a/src/select-x.c b/src/select-x.c index 24c33fb..aea4aa4 100644 --- a/src/select-x.c +++ b/src/select-x.c @@ -84,7 +84,7 @@ static void lisp_data_to_selection_data (struct device *, unsigned int *size_ret, int *format_ret); static Lisp_Object selection_data_to_lisp_data (struct device *, - unsigned char *data, + Extbyte *data, size_t size, Atom type, int format); @@ -284,8 +284,8 @@ hack_motif_clipboard_selection (Atom selection_atom, #endif XmString fmh; String encoding = "STRING"; - const Extbyte *data = XSTRING_DATA (selection_value); - Extcount bytes = XSTRING_LENGTH (selection_value); + const Bufbyte *data = XSTRING_DATA (selection_value); + Bytecount bytes = XSTRING_LENGTH (selection_value); #ifdef MULE { @@ -948,11 +948,11 @@ x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type) static void x_get_window_property (Display *display, Window window, Atom property, - unsigned char **data_ret, int *bytes_ret, + Extbyte **data_ret, int *bytes_ret, Atom *actual_type_ret, int *actual_format_ret, unsigned long *actual_size_ret, int delete_p) { - int total_size; + size_t total_size; unsigned long bytes_remaining; int offset = 0; unsigned char *tmp_data = 0; @@ -983,7 +983,7 @@ x_get_window_property (Display *display, Window window, Atom property, } total_size = bytes_remaining + 1; - *data_ret = (unsigned char *) xmalloc (total_size); + *data_ret = (Extbyte *) xmalloc (total_size); /* Now read, until we've gotten it all. */ while (bytes_remaining) @@ -1020,7 +1020,7 @@ receive_incremental_selection (Display *display, Window window, Atom property, /* this one is for error messages only */ Lisp_Object target_type, unsigned int min_size_bytes, - unsigned char **data_ret, int *size_bytes_ret, + Extbyte **data_ret, int *size_bytes_ret, Atom *type_ret, int *format_ret, unsigned long *size_ret) { @@ -1028,7 +1028,7 @@ receive_incremental_selection (Display *display, Window window, Atom property, int offset = 0; int prop_id; *size_bytes_ret = min_size_bytes; - *data_ret = (unsigned char *) xmalloc (*size_bytes_ret); + *data_ret = (Extbyte *) xmalloc (*size_bytes_ret); #if 0 stderr_out ("\nread INCR %d\n", min_size_bytes); #endif @@ -1044,7 +1044,7 @@ receive_incremental_selection (Display *display, Window window, Atom property, PropertyNewValue); while (1) { - unsigned char *tmp_data; + Extbyte *tmp_data; int tmp_size_bytes; wait_for_property_change (prop_id); /* expect it again immediately, because x_get_window_property may @@ -1076,7 +1076,7 @@ receive_incremental_selection (Display *display, Window window, Atom property, *size_bytes_ret, offset + tmp_size_bytes); #endif *size_bytes_ret = offset + tmp_size_bytes; - *data_ret = (unsigned char *) xrealloc (*data_ret, *size_bytes_ret); + *data_ret = (Extbyte *) xrealloc (*data_ret, *size_bytes_ret); } memcpy ((*data_ret) + offset, tmp_data, tmp_size_bytes); offset += tmp_size_bytes; @@ -1097,7 +1097,7 @@ x_get_window_property_as_lisp_data (Display *display, Atom actual_type; int actual_format; unsigned long actual_size; - unsigned char *data = NULL; + Extbyte *data = NULL; int bytes = 0; Lisp_Object val; struct device *d = get_device_from_display (display); @@ -1179,7 +1179,7 @@ x_get_window_property_as_lisp_data (Display *display, static Lisp_Object selection_data_to_lisp_data (struct device *d, - unsigned char *data, + Extbyte *data, size_t size, Atom type, int format) @@ -1544,7 +1544,7 @@ Return the value of the named CUTBUFFER (typically CUT_BUFFER0). Display *display = DEVICE_X_DISPLAY (d); Window window = RootWindow (display, 0); /* Cutbuffers are on frame 0 */ Atom cut_buffer_atom; - unsigned char *data; + Extbyte *data; int bytes; Atom type; int format; @@ -1586,9 +1586,9 @@ Set the value of the named CUTBUFFER (typically CUT_BUFFER0) to STRING. Display *display = DEVICE_X_DISPLAY (d); Window window = RootWindow (display, 0); /* Cutbuffers are on frame 0 */ Atom cut_buffer_atom; - const Extbyte *data = XSTRING_DATA (string); - Extcount bytes = XSTRING_LENGTH (string); - Extcount bytes_remaining; + const Bufbyte *data = XSTRING_DATA (string); + Bytecount bytes = XSTRING_LENGTH (string); + Bytecount bytes_remaining; int max_bytes = SELECTION_QUANTUM (display); #ifdef MULE const Bufbyte *ptr, *end; diff --git a/src/select.c b/src/select.c index 6c1076d..add109b 100644 --- a/src/select.c +++ b/src/select.c @@ -134,13 +134,16 @@ get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type) #endif DEFUN ("own-selection-internal", Fown_selection_internal, 2, 5, 0, /* -Assert a selection of the given NAME with the given VALUE, and -optional window-system DATA-TYPE. HOW-TO-ADD specifies how the -selection will be combined with any existing selection(s) - see -`own-selection' for more information. -NAME is a symbol, typically PRIMARY, SECONDARY, or CLIPBOARD. -VALUE is typically a string, or a cons of two markers, but may be +Give the selection SELECTION-NAME the value SELECTION-VALUE. +SELECTION-NAME is a symbol, typically PRIMARY, SECONDARY, or CLIPBOARD. +SELECTION-VALUE is typically a string, or a cons of two markers, but may be anything that the functions on selection-converter-out-alist know about. +Optional arg HOW-TO-ADD specifies how the selection will be combined +with any existing selection(s) - see `own-selection' for more +information. +Optional arg DATA-TYPE is a window-system-specific type. +Optional arg DEVICE specifies the device on which to assert the selection. +It defaults to the selected device. */ (selection_name, selection_value, how_to_add, data_type, device)) { @@ -441,8 +444,8 @@ If we own the named selection, then disown it (make there be no selection). } DEFUN ("selection-owner-p", Fselection_owner_p, 0, 1, 0, /* -Return t if current emacs process owns the given Selection. -The arg should be the name of the selection in question, typically one of +Return t if the current emacs process owns SELECTION. +SELECTION should be the name of the selection in question, typically one of the symbols PRIMARY, SECONDARY, or CLIPBOARD. (For convenience, the symbol nil is the same as PRIMARY, and t is the same as SECONDARY.) */ @@ -456,11 +459,11 @@ nil is the same as PRIMARY, and t is the same as SECONDARY.) } DEFUN ("selection-exists-p", Fselection_exists_p, 0, 3, 0, /* -Whether there is an owner for the given Selection. -The arg should be the name of the selection in question, typically one of +Whether there is currently an owner for SELECTION. +SELECTION should be the name of the selection in question, typically one of the symbols PRIMARY, SECONDARY, or CLIPBOARD. (For convenience, the symbol nil is the same as PRIMARY, and t is the same as SECONDARY.) -Optionally the DEVICE and the window-system DATA-TYPE may be specified. +Optionally, the window-system DATA-TYPE and the DEVICE may be specified. */ (selection, data_type, device)) { @@ -499,18 +502,18 @@ visible from Lisp. */ DEFUN ("get-selection-internal", Fget_selection_internal, 2, 3, 0, /* Return text selected from some window-system window. -SELECTION_SYMBOL is a symbol, typically PRIMARY, SECONDARY, or CLIPBOARD. -TARGET_TYPE is the type of data desired, typically STRING or COMPOUND_TEXT. +SELECTION is a symbol, typically PRIMARY, SECONDARY, or CLIPBOARD. +TARGET-TYPE is the type of data desired, typically STRING or COMPOUND_TEXT. Under Mule, if the resultant data comes back as 8-bit data in type TEXT or COMPOUND_TEXT, it will be decoded as Compound Text. */ - (selection_symbol, target_type, device)) + (selection, target_type, device)) { /* This function can GC */ Lisp_Object val = Qnil; struct gcpro gcpro1, gcpro2; GCPRO2 (target_type, val); - CHECK_SYMBOL (selection_symbol); + CHECK_SYMBOL (selection); if (NILP (device)) device = Fselected_device (Qnil); @@ -538,19 +541,19 @@ TEXT or COMPOUND_TEXT, it will be decoded as Compound Text. the device (in which case target_type would be a device-specific identifier - probably an integer) - ajh */ - val = get_local_selection (selection_symbol, target_type); + val = get_local_selection (selection, target_type); if (!NILP (val)) { /* If we get something from the local cache, we may need to convert it slightly - to do this, we call select-coerce */ - val = call3 (Qselect_coerce, selection_symbol, target_type, val); + val = call3 (Qselect_coerce, selection, target_type, val); } else if (HAS_DEVMETH_P (XDEVICE (device), get_foreign_selection)) { /* Nothing in the local cache; try the window system */ val = DEVMETH (XDEVICE (device), get_foreign_selection, - (selection_symbol, target_type)); + (selection, target_type)); } if (NILP (val)) @@ -562,12 +565,12 @@ TEXT or COMPOUND_TEXT, it will be decoded as Compound Text. the first for which a conversion succeeds gets returned. */ EXTERNAL_LIST_LOOP_2 (element, Vselection_coercible_types) { - val = get_local_selection (selection_symbol, element); + val = get_local_selection (selection, element); if (NILP (val)) continue; - val = call3 (Qselect_coerce, selection_symbol, target_type, val); + val = call3 (Qselect_coerce, selection, target_type, val); if (!NILP (val)) break; diff --git a/src/sgiplay.c b/src/sgiplay.c index e3ca2fa..3650ca4 100644 --- a/src/sgiplay.c +++ b/src/sgiplay.c @@ -328,7 +328,7 @@ play_internal (unsigned char *data, int length, AudioContext ac) if (ac == (AudioContext) 0) return; - data = ac->ac_data; + data = (unsigned char *) ac->ac_data; limit = data + ac->ac_size; while (data < limit) { diff --git a/src/sound.c b/src/sound.c index 1f1acc9..fe31b7b 100644 --- a/src/sound.c +++ b/src/sound.c @@ -334,7 +334,7 @@ See the variable `sound-alist'. /* #### ESD uses alarm(). But why should we also stop SIGIO? */ stop_interrupts (); - succes = esd_play_sound_data (soundext, soundextlen, vol); + succes = esd_play_sound_data ((unsigned char *) soundext, soundextlen, vol); start_interrupts (); QUIT; if(succes) diff --git a/src/specifier.c b/src/specifier.c index 7fa2e3a..9bdf57e 100644 --- a/src/specifier.c +++ b/src/specifier.c @@ -549,7 +549,7 @@ device, global), and then the instance (i.e. actual value) is retrieved in a specific domain (window, frame, device) by looking through the possible instantiators (i.e. settings). This process is called \"instantiation\". - + To put settings into a specifier, use `set-specifier', or the lower-level functions `add-spec-to-specifier' and `add-spec-list-to-specifier'. You can also temporarily bind a setting @@ -1986,8 +1986,8 @@ with the function `specifier-spec-list' or `specifier-specs'. } DEFUN ("add-spec-list-to-specifier", Fadd_spec_list_to_specifier, 2, 3, 0, /* -Add a spec-list (a list of specifications) to SPECIFIER. -The format of a spec-list is +Add SPEC-LIST (a list of specifications) to SPECIFIER. +The format of SPEC-LIST is ((LOCALE (TAG-SET . INSTANTIATOR) ...) ...) @@ -2556,11 +2556,8 @@ specifier_instance (Lisp_Object specifier, Lisp_Object matchspec, Lisp_Object window = Qnil; Lisp_Object frame = Qnil; Lisp_Object device = Qnil; - Lisp_Object tag = Qnil; - struct device *d; - Lisp_Specifier *sp; - - sp = XSPECIFIER (specifier); + Lisp_Object tag = Qnil; /* #### currently unused */ + Lisp_Specifier *sp = XSPECIFIER (specifier); /* Attempt to determine buffer, window, frame, and device from the domain. */ @@ -2582,17 +2579,16 @@ specifier_instance (Lisp_Object specifier, Lisp_Object matchspec, abort (); if (NILP (buffer) && !NILP (window)) - buffer = XWINDOW (window)->buffer; + buffer = WINDOW_BUFFER (XWINDOW (window)); if (NILP (frame) && !NILP (window)) frame = XWINDOW (window)->frame; if (NILP (device)) /* frame had better exist; if device is undeterminable, something really went wrong. */ - device = XFRAME (frame)->device; + device = FRAME_DEVICE (XFRAME (frame)); /* device had better be determined by now; abort if not. */ - d = XDEVICE (device); - tag = DEVICE_CLASS (d); + tag = DEVICE_CLASS (XDEVICE (device)); depth = make_int (1 + XINT (depth)); if (XINT (depth) > 20) @@ -2836,7 +2832,8 @@ set_specifier_caching (Lisp_Object specifier, int struct_window_offset, int struct_frame_offset, void (*value_changed_in_frame) (Lisp_Object specifier, struct frame *f, - Lisp_Object oldval)) + Lisp_Object oldval), + int always_recompute) { Lisp_Specifier *sp = XSPECIFIER (specifier); assert (!GHOST_SPECIFIER_P (sp)); @@ -2847,6 +2844,7 @@ set_specifier_caching (Lisp_Object specifier, int struct_window_offset, sp->caching->value_changed_in_window = value_changed_in_window; sp->caching->offset_into_struct_frame = struct_frame_offset; sp->caching->value_changed_in_frame = value_changed_in_frame; + sp->caching->always_recompute = always_recompute; Vcached_specifiers = Fcons (specifier, Vcached_specifiers); if (BODILY_SPECIFIER_P (sp)) GHOST_SPECIFIER(sp)->caching = sp->caching; @@ -2858,7 +2856,7 @@ recompute_one_cached_specifier_in_window (Lisp_Object specifier, struct window *w) { Lisp_Object window; - Lisp_Object newval, *location; + Lisp_Object newval, *location, oldval; assert (!GHOST_SPECIFIER_P (XSPECIFIER (specifier))); @@ -2879,9 +2877,9 @@ recompute_one_cached_specifier_in_window (Lisp_Object specifier, calling equal is no good either as this doesn't take into account things attached to the specifier - for instance strings on extents. --andyp */ - if (!EQ (newval, *location)) + if (!EQ (newval, *location) || XSPECIFIER (specifier)->caching->always_recompute) { - Lisp_Object oldval = *location; + oldval = *location; *location = newval; (XSPECIFIER (specifier)->caching->value_changed_in_window) (specifier, w, oldval); @@ -2893,7 +2891,7 @@ recompute_one_cached_specifier_in_frame (Lisp_Object specifier, struct frame *f) { Lisp_Object frame; - Lisp_Object newval, *location; + Lisp_Object newval, *location, oldval; assert (!GHOST_SPECIFIER_P (XSPECIFIER (specifier))); @@ -2907,9 +2905,9 @@ recompute_one_cached_specifier_in_frame (Lisp_Object specifier, method. */ location = (Lisp_Object *) ((char *) f + XSPECIFIER (specifier)->caching->offset_into_struct_frame); - if (!EQ (newval, *location)) + if (!EQ (newval, *location) || XSPECIFIER (specifier)->caching->always_recompute) { - Lisp_Object oldval = *location; + oldval = *location; *location = newval; (XSPECIFIER (specifier)->caching->value_changed_in_frame) (specifier, f, oldval); diff --git a/src/specifier.h b/src/specifier.h index c925a57..8c82331 100644 --- a/src/specifier.h +++ b/src/specifier.h @@ -411,6 +411,7 @@ struct specifier_caching int offset_into_struct_frame; void (*value_changed_in_frame) (Lisp_Object specifier, struct frame *f, Lisp_Object oldval); + int always_recompute; }; /* #### get image instances out of domains! */ @@ -480,7 +481,8 @@ void set_specifier_caching (Lisp_Object specifier, int struct_frame_offset, void (*value_changed_in_frame) (Lisp_Object specifier, struct frame *f, - Lisp_Object oldval)); + Lisp_Object oldval), + int always_recompute); void set_specifier_fallback (Lisp_Object specifier, Lisp_Object fallback); void recompute_all_cached_specifiers_in_window (struct window *w); diff --git a/src/symbols.c b/src/symbols.c index 32e56dd..7599d00 100644 --- a/src/symbols.c +++ b/src/symbols.c @@ -198,8 +198,8 @@ intern (const char *str) DEFUN ("intern", Fintern, 1, 2, 0, /* Return the canonical symbol whose name is STRING. If there is none, one is created by this function and returned. -A second optional argument specifies the obarray to use; -it defaults to the value of `obarray'. +Optional second argument OBARRAY specifies the obarray to use; +it defaults to the value of the variable `obarray'. */ (string, obarray)) { @@ -245,8 +245,8 @@ DEFUN ("intern-soft", Fintern_soft, 1, 2, 0, /* Return the canonical symbol named NAME, or nil if none exists. NAME may be a string or a symbol. If it is a symbol, that exact symbol is searched for. -A second optional argument specifies the obarray to use; -it defaults to the value of `obarray'. +Optional second argument OBARRAY specifies the obarray to use; +it defaults to the value of the variable `obarray'. */ (name, obarray)) { @@ -278,7 +278,7 @@ Delete the symbol named NAME, if any, from OBARRAY. The value is t if a symbol was found and deleted, nil otherwise. NAME may be a string or a symbol. If it is a symbol, that symbol is deleted, if it belongs to OBARRAY--no other symbol is deleted. -OBARRAY defaults to the value of the variable `obarray' +OBARRAY defaults to the value of the variable `obarray'. */ (name, obarray)) { @@ -490,11 +490,9 @@ apropos_mapper (Lisp_Object symbol, void *arg) } DEFUN ("apropos-internal", Fapropos_internal, 1, 2, 0, /* -Show all symbols whose names contain match for REGEXP. -If optional 2nd arg PREDICATE is non-nil, (funcall PREDICATE SYMBOL) - is done for each symbol and a symbol is mentioned only if that - returns non-nil. -Return list of symbols found. +Return a list of all symbols whose names contain match for REGEXP. +If optional 2nd arg PREDICATE is non-nil, only symbols for which +\(funcall PREDICATE SYMBOL) returns non-nil are returned. */ (regexp, predicate)) { @@ -1931,7 +1929,7 @@ local bindings in certain buffers. } DEFUN ("set-default", Fset_default, 2, 2, 0, /* -Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated. +Set SYMBOL's default value to VALUE. SYMBOL and VALUE are evaluated. The default value is seen in buffers that do not have their own values for this variable. */ @@ -2597,7 +2595,7 @@ The returned info will be a symbol, one of DEFUN ("local-variable-p", Flocal_variable_p, 2, 3, 0, /* Return t if SYMBOL's value is local to BUFFER. -If optional third arg AFTER-SET is true, return t if SYMBOL would be +If optional third arg AFTER-SET is non-nil, return t if SYMBOL would be buffer-local after it is set, regardless of whether it is so presently. A nil value for BUFFER is *not* the same as (current-buffer), but means "no buffer". Specifically: @@ -3191,7 +3189,7 @@ init_symbols_once_early (void) XSYMBOL (Qnil)->function = Qunbound; defsymbol (&Qt, "t"); - XSYMBOL (Qt)->value = Qt; /* Veritas aetera */ + XSYMBOL (Qt)->value = Qt; /* Veritas aeterna */ Vquit_flag = Qnil; pdump_wire (&Qnil); diff --git a/src/syntax.c b/src/syntax.c index 8daf22c..eae9c11 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -156,12 +156,13 @@ find_defun_start (struct buffer *buf, Bufpos pos) } DEFUN ("syntax-table-p", Fsyntax_table_p, 1, 1, 0, /* -Return t if ARG is a syntax table. +Return t if OBJECT is a syntax table. Any vector of 256 elements will do. */ - (obj)) + (object)) { - return CHAR_TABLEP (obj) && XCHAR_TABLE_TYPE (obj) == CHAR_TABLE_TYPE_SYNTAX + return (CHAR_TABLEP (object) + && XCHAR_TABLE_TYPE (object) == CHAR_TABLE_TYPE_SYNTAX) ? Qt : Qnil; } @@ -195,32 +196,31 @@ This is the one used for new buffers. } DEFUN ("copy-syntax-table", Fcopy_syntax_table, 0, 1, 0, /* -Construct a new syntax table and return it. -It is a copy of the TABLE, which defaults to the standard syntax table. +Return a new syntax table which is a copy of SYNTAX-TABLE. +SYNTAX-TABLE defaults to the standard syntax table. */ - (table)) + (syntax_table)) { if (NILP (Vstandard_syntax_table)) return Fmake_char_table (Qsyntax); - table = check_syntax_table (table, Vstandard_syntax_table); - return Fcopy_char_table (table); + syntax_table = check_syntax_table (syntax_table, Vstandard_syntax_table); + return Fcopy_char_table (syntax_table); } DEFUN ("set-syntax-table", Fset_syntax_table, 1, 2, 0, /* -Select a new syntax table for BUFFER. -One argument, a syntax table. +Select SYNTAX-TABLE as the new syntax table for BUFFER. BUFFER defaults to the current buffer if omitted. */ - (table, buffer)) + (syntax_table, buffer)) { struct buffer *buf = decode_buffer (buffer, 0); - table = check_syntax_table (table, Qnil); - buf->syntax_table = table; - buf->mirror_syntax_table = XCHAR_TABLE (table)->mirror_table; + syntax_table = check_syntax_table (syntax_table, Qnil); + buf->syntax_table = syntax_table; + buf->mirror_syntax_table = XCHAR_TABLE (syntax_table)->mirror_table; /* Indicate that this buffer now has a specified syntax table. */ buf->local_var_flags |= XINT (buffer_local_flags.syntax_table); - return table; + return syntax_table; } /* Convert a letter which signifies a syntax code @@ -262,25 +262,26 @@ numbered starting at 0. } DEFUN ("char-syntax", Fchar_syntax, 1, 2, 0, /* -Return the syntax code of CHAR, described by a character. -For example, if CHAR is a word constituent, the character `?w' is returned. +Return the syntax code of CHARACTER, described by a character. +For example, if CHARACTER is a word constituent, +the character `?w' is returned. The characters that correspond to various syntax codes are listed in the documentation of `modify-syntax-entry'. -Optional second argument TABLE defaults to the current buffer's +Optional second argument SYNTAX-TABLE defaults to the current buffer's syntax table. */ - (ch, table)) + (character, syntax_table)) { Lisp_Char_Table *mirrortab; - if (NILP(ch)) + if (NILP (character)) { - ch = make_char('\000'); + character = make_char ('\000'); } - CHECK_CHAR_COERCE_INT (ch); - table = check_syntax_table (table, current_buffer->syntax_table); - mirrortab = XCHAR_TABLE (XCHAR_TABLE (table)->mirror_table); - return make_char (syntax_code_spec[(int) SYNTAX (mirrortab, XCHAR (ch))]); + CHECK_CHAR_COERCE_INT (character); + syntax_table = check_syntax_table (syntax_table, current_buffer->syntax_table); + mirrortab = XCHAR_TABLE (XCHAR_TABLE (syntax_table)->mirror_table); + return make_char (syntax_code_spec[(int) SYNTAX (mirrortab, XCHAR (character))]); } #ifdef MULE @@ -296,9 +297,9 @@ charset_syntax (struct buffer *buf, Lisp_Object charset, int *multi_p_out) #endif Lisp_Object -syntax_match (Lisp_Object table, Emchar ch) +syntax_match (Lisp_Object syntax_table, Emchar ch) { - Lisp_Object code = XCHAR_TABLE_VALUE_UNSAFE (table, ch); + Lisp_Object code = XCHAR_TABLE_VALUE_UNSAFE (syntax_table, ch); Lisp_Object code2 = code; if (CONSP (code)) @@ -310,21 +311,21 @@ syntax_match (Lisp_Object table, Emchar ch) } DEFUN ("matching-paren", Fmatching_paren, 1, 2, 0, /* -Return the matching parenthesis of CHAR, or nil if none. -Optional second argument TABLE defaults to the current buffer's +Return the matching parenthesis of CHARACTER, or nil if none. +Optional second argument SYNTAX-TABLE defaults to the current buffer's syntax table. */ - (ch, table)) + (character, syntax_table)) { Lisp_Char_Table *mirrortab; int code; - CHECK_CHAR_COERCE_INT (ch); - table = check_syntax_table (table, current_buffer->syntax_table); - mirrortab = XCHAR_TABLE (XCHAR_TABLE (table)->mirror_table); - code = SYNTAX (mirrortab, XCHAR (ch)); + CHECK_CHAR_COERCE_INT (character); + syntax_table = check_syntax_table (syntax_table, current_buffer->syntax_table); + mirrortab = XCHAR_TABLE (XCHAR_TABLE (syntax_table)->mirror_table); + code = SYNTAX (mirrortab, XCHAR (character)); if (code == Sopen || code == Sclose || code == Sstring) - return syntax_match (table, XCHAR (ch)); + return syntax_match (syntax_table, XCHAR (character)); return Qnil; } @@ -648,30 +649,30 @@ find_end_of_comment (struct buffer *buf, Bufpos from, Bufpos stop, int mask) at those changes. --ben */ DEFUN ("forward-comment", Fforward_comment, 1, 2, 0, /* -Move forward across up to N comments. If N is negative, move backward. +Move forward across up to COUNT comments, or backwards if COUNT is negative. Stop scanning if we find something other than a comment or whitespace. Set point to where scanning stops. -If N comments are found as expected, with nothing except whitespace +If COUNT comments are found as expected, with nothing except whitespace between them, return t; otherwise return nil. Point is set in either case. Optional argument BUFFER defaults to the current buffer. */ - (n, buffer)) + (count, buffer)) { Bufpos from; Bufpos stop; Emchar c; enum syntaxcode code; - EMACS_INT count; + EMACS_INT n; struct buffer *buf = decode_buffer (buffer, 0); Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table); - CHECK_INT (n); - count = XINT (n); + CHECK_INT (count); + n = XINT (count); from = BUF_PT (buf); - while (count > 0) + while (n > 0) { QUIT; @@ -740,10 +741,10 @@ Optional argument BUFFER defaults to the current buffer. } /* End of comment reached */ - count--; + n--; } - while (count < 0) + while (n < 0) { QUIT; @@ -799,7 +800,7 @@ Optional argument BUFFER defaults to the current buffer. } } - count++; + n++; } BUF_SET_PT (buf, from); @@ -809,7 +810,7 @@ Optional argument BUFFER defaults to the current buffer. Lisp_Object scan_lists (struct buffer *buf, Bufpos from, int count, int depth, - int sexpflag, int no_error) + int sexpflag, int noerror) { Bufpos stop; Emchar c; @@ -929,7 +930,7 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth, if (!--depth) goto done; if (depth < min_depth) { - if (no_error) + if (noerror) return Qnil; error ("Containing expression ends prematurely"); } @@ -1074,7 +1075,7 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth, if (!--depth) goto done2; if (depth < min_depth) { - if (no_error) + if (noerror) return Qnil; error ("Containing expression ends prematurely"); } @@ -1126,7 +1127,7 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth, return (make_int (from)); lose: - if (!no_error) + if (!noerror) error ("Unbalanced parentheses"); return Qnil; } @@ -1168,7 +1169,7 @@ of in the current buffer. If optional arg NOERROR is non-nil, scan-lists will return nil instead of signalling an error. */ - (from, count, depth, buffer, no_error)) + (from, count, depth, buffer, noerror)) { struct buffer *buf; @@ -1178,7 +1179,7 @@ signalling an error. buf = decode_buffer (buffer, 0); return scan_lists (buf, XINT (from), XINT (count), XINT (depth), 0, - !NILP (no_error)); + !NILP (noerror)); } DEFUN ("scan-sexps", Fscan_sexps, 2, 4, 0, /* @@ -1199,13 +1200,13 @@ of in the current buffer. If optional arg NOERROR is non-nil, scan-sexps will return nil instead of signalling an error. */ - (from, count, buffer, no_error)) + (from, count, buffer, noerror)) { struct buffer *buf = decode_buffer (buffer, 0); CHECK_INT (from); CHECK_INT (count); - return scan_lists (buf, XINT (from), XINT (count), 0, 1, !NILP (no_error)); + return scan_lists (buf, XINT (from), XINT (count), 0, 1, !NILP (noerror)); } DEFUN ("backward-prefix-chars", Fbackward_prefix_chars, 0, 1, 0, /* @@ -1508,7 +1509,7 @@ DEFUN ("parse-partial-sexp", Fparse_partial_sexp, 2, 7, 0, /* Parse Lisp syntax starting at FROM until TO; return status of parse at TO. Parsing stops at TO or when certain criteria are met; point is set to where parsing stops. -If fifth arg STATE is omitted or nil, +If fifth arg OLDSTATE is omitted or nil, parsing assumes that FROM is the beginning of a function. Value is a list of eight elements describing final state of parsing: 0. depth in parens. @@ -1524,7 +1525,7 @@ If third arg TARGETDEPTH is non-nil, parsing stops if the depth in parentheses becomes equal to TARGETDEPTH. Fourth arg STOPBEFORE non-nil means stop when come to any character that starts a sexp. -Fifth arg STATE is an eight-element list like what this function returns. +Fifth arg OLDSTATE is an eight-element list like what this function returns. It is used to initialize the state of the parse. Its second and third elements are ignored. Sixth arg COMMENTSTOP non-nil means stop at the start of a comment. diff --git a/src/sysdep.c b/src/sysdep.c index afd72cf..1ac4834 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -3031,7 +3031,7 @@ sys_readdir (DIR *dirp) Qfile_name); Dynarr_add_many (internal_DIRENTRY, internal_name, internal_len); - Dynarr_add (internal_DIRENTRY, 0); /* zero-terminate */ + Dynarr_add (internal_DIRENTRY, '\0'); /* NUL-terminate */ return (DIRENTRY *) Dynarr_atp (internal_DIRENTRY, 0); } } diff --git a/src/sysproc.h b/src/sysproc.h index ebb4e78..fc23d27 100644 --- a/src/sysproc.h +++ b/src/sysproc.h @@ -118,12 +118,12 @@ Boston, MA 02111-1307, USA. */ #include #endif -#ifdef HAVE_SYS_STROPTS_H -#include /* isastream(), I_PUSH */ +#ifdef HAVE_STROPTS_H +#include /* isastream(), I_PUSH */ #endif -#ifdef HAVE_SYS_STRTIO_H -#include /* TIOCSIGNAL */ +#ifdef HAVE_STRTIO_H +#include /* TIOCSIGNAL */ #endif #ifdef HAVE_PTY_H diff --git a/src/toolbar.c b/src/toolbar.c index 573241a..9d20a82 100644 --- a/src/toolbar.c +++ b/src/toolbar.c @@ -990,11 +990,11 @@ Verify the syntax of entry BUTTON in a toolbar description list. If you want to verify the syntax of a toolbar description list as a whole, use `check-valid-instantiator' with a specifier type of 'toolbar. */ - (button, no_error)) + (button, noerror)) { Lisp_Object *elt, glyphs, value; int len; - Error_behavior errb = decode_error_behavior_flag (no_error); + Error_behavior errb = decode_error_behavior_flag (noerror); if (!VECTORP (button)) CTB_ERROR ("toolbar button descriptors must be vectors"); @@ -1417,7 +1417,7 @@ For the other vector formats (specifying blank areas of the toolbar): set_specifier_caching (Vdefault_toolbar, offsetof (struct window, default_toolbar), default_toolbar_specs_changed, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("top-toolbar", &Vtoolbar[TOP_TOOLBAR] /* @@ -1429,7 +1429,7 @@ See `default-toolbar' for a description of a valid toolbar instantiator. set_specifier_caching (Vtoolbar[TOP_TOOLBAR], offsetof (struct window, toolbar[TOP_TOOLBAR]), toolbar_specs_changed, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("bottom-toolbar", &Vtoolbar[BOTTOM_TOOLBAR] /* @@ -1446,7 +1446,7 @@ displayed even if you provide a value for `bottom-toolbar'. set_specifier_caching (Vtoolbar[BOTTOM_TOOLBAR], offsetof (struct window, toolbar[BOTTOM_TOOLBAR]), toolbar_specs_changed, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("left-toolbar", &Vtoolbar[LEFT_TOOLBAR] /* @@ -1463,7 +1463,7 @@ displayed even if you provide a value for `left-toolbar'. set_specifier_caching (Vtoolbar[LEFT_TOOLBAR], offsetof (struct window, toolbar[LEFT_TOOLBAR]), toolbar_specs_changed, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("right-toolbar", &Vtoolbar[RIGHT_TOOLBAR] /* @@ -1480,7 +1480,7 @@ displayed even if you provide a value for `right-toolbar'. set_specifier_caching (Vtoolbar[RIGHT_TOOLBAR], offsetof (struct window, toolbar[RIGHT_TOOLBAR]), toolbar_specs_changed, - 0, 0); + 0, 0, 0); /* initially, top inherits from default; this can be changed with `set-default-toolbar-position'. */ @@ -1535,7 +1535,7 @@ is not visible, so it is expanded to take up the slack. offsetof (struct window, default_toolbar_height), default_toolbar_size_changed_in_window, offsetof (struct frame, default_toolbar_height), - default_toolbar_size_changed_in_frame); + default_toolbar_size_changed_in_frame, 0); DEFVAR_SPECIFIER ("default-toolbar-width", &Vdefault_toolbar_width /* *Width of the default toolbar, if it's oriented vertically. @@ -1548,7 +1548,7 @@ See `default-toolbar-height' for more information. offsetof (struct window, default_toolbar_width), default_toolbar_size_changed_in_window, offsetof (struct frame, default_toolbar_width), - default_toolbar_size_changed_in_frame); + default_toolbar_size_changed_in_frame, 0); DEFVAR_SPECIFIER ("top-toolbar-height", &Vtoolbar_size[TOP_TOOLBAR] /* @@ -1562,7 +1562,7 @@ See `default-toolbar-height' for more information. offsetof (struct window, toolbar_size[TOP_TOOLBAR]), toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_size[TOP_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("bottom-toolbar-height", &Vtoolbar_size[BOTTOM_TOOLBAR] /* @@ -1576,7 +1576,7 @@ See `default-toolbar-height' for more information. offsetof (struct window, toolbar_size[BOTTOM_TOOLBAR]), toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_size[BOTTOM_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("left-toolbar-width", &Vtoolbar_size[LEFT_TOOLBAR] /* @@ -1590,7 +1590,7 @@ See `default-toolbar-height' for more information. offsetof (struct window, toolbar_size[LEFT_TOOLBAR]), toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_size[LEFT_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("right-toolbar-width", &Vtoolbar_size[RIGHT_TOOLBAR] /* @@ -1604,7 +1604,7 @@ See `default-toolbar-height' for more information. offsetof (struct window, toolbar_size[RIGHT_TOOLBAR]), toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_size[RIGHT_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); fb = Qnil; #ifdef HAVE_TTY @@ -1667,7 +1667,7 @@ the value in a window domain will not. offsetof (struct window, default_toolbar_border_width), default_toolbar_border_width_changed_in_window, offsetof (struct frame, default_toolbar_border_width), - default_toolbar_border_width_changed_in_frame); + default_toolbar_border_width_changed_in_frame, 0); DEFVAR_SPECIFIER ("top-toolbar-border-width", &Vtoolbar_border_width[TOP_TOOLBAR] /* @@ -1683,7 +1683,7 @@ See `default-toolbar-height' for more information. toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_border_width[TOP_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("bottom-toolbar-border-width", &Vtoolbar_border_width[BOTTOM_TOOLBAR] /* @@ -1699,7 +1699,7 @@ See `default-toolbar-height' for more information. toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_border_width[BOTTOM_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("left-toolbar-border-width", &Vtoolbar_border_width[LEFT_TOOLBAR] /* @@ -1715,7 +1715,7 @@ See `default-toolbar-height' for more information. toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_border_width[LEFT_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("right-toolbar-border-width", &Vtoolbar_border_width[RIGHT_TOOLBAR] /* @@ -1731,7 +1731,7 @@ See `default-toolbar-height' for more information. toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_border_width[RIGHT_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); fb = Qnil; #ifdef HAVE_TTY @@ -1777,7 +1777,7 @@ visibility specifiers have a fallback value of true. offsetof (struct window, default_toolbar_visible_p), default_toolbar_visible_p_changed_in_window, offsetof (struct frame, default_toolbar_visible_p), - default_toolbar_visible_p_changed_in_frame); + default_toolbar_visible_p_changed_in_frame, 0); DEFVAR_SPECIFIER ("top-toolbar-visible-p", &Vtoolbar_visible_p[TOP_TOOLBAR] /* @@ -1793,7 +1793,7 @@ See `default-toolbar-visible-p' for more information. toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_visible_p[TOP_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("bottom-toolbar-visible-p", &Vtoolbar_visible_p[BOTTOM_TOOLBAR] /* @@ -1809,7 +1809,7 @@ See `default-toolbar-visible-p' for more information. toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_visible_p[BOTTOM_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("left-toolbar-visible-p", &Vtoolbar_visible_p[LEFT_TOOLBAR] /* @@ -1825,7 +1825,7 @@ See `default-toolbar-visible-p' for more information. toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_visible_p[LEFT_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); DEFVAR_SPECIFIER ("right-toolbar-visible-p", &Vtoolbar_visible_p[RIGHT_TOOLBAR] /* @@ -1841,7 +1841,7 @@ See `default-toolbar-visible-p' for more information. toolbar_geometry_changed_in_window, offsetof (struct frame, toolbar_visible_p[RIGHT_TOOLBAR]), - frame_size_slipped); + frame_size_slipped, 0); /* initially, top inherits from default; this can be changed with `set-default-toolbar-position'. */ @@ -1864,7 +1864,7 @@ This is a specifier; use `set-specifier' to change it. set_specifier_caching (Vtoolbar_buttons_captioned_p, offsetof (struct window, toolbar_buttons_captioned_p), toolbar_buttons_captioned_p_changed, - 0, 0); + 0, 0, 0); set_specifier_fallback (Vtoolbar_buttons_captioned_p, list1 (Fcons (Qnil, Qt))); } diff --git a/src/tooltalk.c b/src/tooltalk.c index 308f438..0261b5f 100644 --- a/src/tooltalk.c +++ b/src/tooltalk.c @@ -763,7 +763,7 @@ New arguments can be added to a message with add-tooltalk-message-arg. TO_EXTERNAL_FORMAT (LISP_STRING, value, ALLOCA, (value_ext, value_ext_len), Qnative); - tt_message_arg_bval_set (m, n, value_ext, value_ext_len); + tt_message_arg_bval_set (m, n, (unsigned char *) value_ext, value_ext_len); } else if (EQ (attribute, Qtt_arg_ival)) { diff --git a/src/tooltalk.doc b/src/tooltalk.doc index 247bb8d..d752e66 100644 --- a/src/tooltalk.doc +++ b/src/tooltalk.doc @@ -275,7 +275,7 @@ Emacs will stop receiving messages that match this pattern. Add one value to the indicated pattern attribute. The names of attributes are the same as the Tooltalk accessors used to set them less the "tooltalk_pattern_" prefix and the "_add" suffix). For example -the name of the attribute for tt_pattern_dispostion_add attribute +the name of the attribute for tt_pattern_disposition_add attribute is 'disposition. The 'category attribute is handled specially, since a pattern can only be a member of one category (TT_OBSERVE or TT_HANDLE. diff --git a/src/unexcw.c b/src/unexcw.c index 7f9b551..a39fbc2 100644 --- a/src/unexcw.c +++ b/src/unexcw.c @@ -51,6 +51,9 @@ unexec (char *, char *, void *, void *, void *) #define ALLOC_MASK ~((unsigned long)(ALLOC_UNIT)) #define ALIGN_ALLOC(addr) \ ((((unsigned long)addr) + ALLOC_UNIT) & ALLOC_MASK) +/* Note that all sections must be aligned on a 0x1000 boundary so + this is the minimum size that our dummy bss can be. */ +#define BSS_PAD_SIZE 0x1000 /* To prevent zero-initialized variables from being placed into the bss section, use non-zero values to represent an uninitialized state. */ @@ -252,13 +255,19 @@ copy_executable_and_dump_data_section (int a_out, int a_new) void* empty_space; extern int static_heap_dumped; SCNHDR section; - /* calculate new sizes f_ohdr.dsize is the total initialized data - size on disk which is f_data.s_size + f_idata.s_size. - f_ohdr.data_start is the base addres of all data and so should - not be changed. *.s_vaddr is the virtual address of the start - of the section normalzed from f_ohdr.ImageBase. *.s_paddr - appears to be the number of bytes in the section actually used - (whereas *.s_size is aligned). + /* calculate new sizes: + + f_ohdr.dsize is the total initialized data size on disk which is + f_data.s_size + f_idata.s_size. + + f_ohdr.data_start is the base addres of all data and so should + not be changed. + + *.s_vaddr is the virtual address of the start of the section + *normalized from f_ohdr.ImageBase. + + *.s_paddr appears to be the number of bytes in the section + *actually used (whereas *.s_size is aligned). bsize is now 0 since subsumed into .data dsize is dsize + (f_data.s_vaddr - f_bss.s_vaddr) @@ -278,7 +287,7 @@ copy_executable_and_dump_data_section (int a_out, int a_new) data_padding = (f_bss.s_vaddr - f_data.s_vaddr) - f_data.s_size; } - file_sz_change=new_bss_size + data_padding; + file_sz_change=(new_bss_size + data_padding) - BSS_PAD_SIZE; new_data_size=f_ohdr.dsize + file_sz_change; if (!sections_reversed) @@ -297,7 +306,7 @@ copy_executable_and_dump_data_section (int a_out, int a_new) lseek (a_new, 0, SEEK_SET); /* write file header */ f_hdr.f_symptr += file_sz_change; - f_hdr.f_nscns--; + printf("writing file header\n"); if (write(a_new, &f_hdr, sizeof(f_hdr)) != sizeof(f_hdr)) { @@ -312,7 +321,7 @@ copy_executable_and_dump_data_section (int a_out, int a_new) PERROR("new data size is < approx"); } f_ohdr.dsize=new_data_size; - f_ohdr.bsize=0; + f_ohdr.bsize=BSS_PAD_SIZE; if (write(a_new, &f_ohdr, sizeof(f_ohdr)) != sizeof(f_ohdr)) { PERROR("failed to write optional header"); @@ -325,6 +334,18 @@ copy_executable_and_dump_data_section (int a_out, int a_new) PERROR("failed to write text header"); } + /* Write small bss section. */ + if (!sections_reversed) + { + f_bss.s_size = BSS_PAD_SIZE; + f_bss.s_paddr = BSS_PAD_SIZE; + f_bss.s_vaddr = f_data.s_vaddr - BSS_PAD_SIZE; + if (write(a_new, &f_bss, sizeof(f_bss)) != sizeof(f_bss)) + { + PERROR("failed to write bss header"); + } + } + /* write new data header */ printf("writing .data header\n"); @@ -333,6 +354,18 @@ copy_executable_and_dump_data_section (int a_out, int a_new) PERROR("failed to write data header"); } + /* Write small bss section. */ + if (sections_reversed) + { + f_bss.s_size = BSS_PAD_SIZE; + f_bss.s_paddr = BSS_PAD_SIZE; + f_bss.s_vaddr = f_nextdata.s_vaddr - BSS_PAD_SIZE; + if (write(a_new, &f_bss, sizeof(f_bss)) != sizeof(f_bss)) + { + PERROR("failed to write bss header"); + } + } + printf("writing following data header\n"); f_nextdata.s_scnptr += file_sz_change; if (f_nextdata.s_lnnoptr != 0) f_nextdata.s_lnnoptr += file_sz_change; @@ -360,13 +393,6 @@ copy_executable_and_dump_data_section (int a_out, int a_new) } } - /* dump bss to maintain offsets */ - memset(&f_bss, 0, sizeof(f_bss)); - if (write(a_new, &f_bss, sizeof(f_bss)) != sizeof(f_bss)) - { - PERROR("failed to write bss header"); - } - size=lseek(a_new, 0, SEEK_CUR); CHECK_AOUT_POS(size); @@ -381,7 +407,7 @@ copy_executable_and_dump_data_section (int a_out, int a_new) if (!sections_reversed) { - /* dump bss + padding between sections */ + /* dump bss + padding between sections, sans small bss pad */ printf ("dumping .bss into executable... %lx bytes\n", bss_size); if (write(a_new, bss_start, bss_size) != (int)bss_size) { @@ -389,7 +415,11 @@ copy_executable_and_dump_data_section (int a_out, int a_new) } /* pad, needs to be zero */ - bss_padding = new_bss_size - bss_size; + bss_padding = (new_bss_size - bss_size) - BSS_PAD_SIZE; + if (bss_padding < 0) + { + PERROR("padded .bss too small"); + } printf ("padding .bss ... %lx bytes\n", bss_padding); empty_space = malloc(bss_padding); memset(empty_space, 0, bss_padding); @@ -420,7 +450,7 @@ copy_executable_and_dump_data_section (int a_out, int a_new) } else { - /* need to bad to bss with data in file */ + /* need to pad to bss with data in file */ printf ("padding .data ... %lx bytes\n", data_padding); size = (f_bss_s_vaddr - f_data_s_vaddr) - data_size; dup_file_area(a_out, a_new, size); @@ -433,7 +463,11 @@ copy_executable_and_dump_data_section (int a_out, int a_new) } /* pad, needs to be zero */ - bss_padding = new_bss_size - bss_size; + bss_padding = (new_bss_size - bss_size) - BSS_PAD_SIZE; + if (bss_padding < 0) + { + PERROR("padded .bss too small"); + } printf ("padding .bss ... %lx bytes\n", bss_padding); empty_space = malloc(bss_padding); memset(empty_space, 0, bss_padding); diff --git a/src/unexelfsgi.c b/src/unexelfsgi.c index 6c36431..ad54ccf 100644 --- a/src/unexelfsgi.c +++ b/src/unexelfsgi.c @@ -1,25 +1,38 @@ -/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992 +/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992, 1999, 2000 Free Software Foundation, Inc. This file is part of XEmacs. -XEmacs 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. +XEmacs 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. -XEmacs is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with XEmacs; see the file COPYING. If not, write to +along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +Boston, MA 02111-1307, USA. -/* Synched up with: FSF 19.31. */ +In other words, you are welcome to use, share and improve this program. +You are forbidden to forbid anyone else to use, share and improve +what you give them. Help stamp out software-hoarding! */ +/* 2000-10-31: Martin Buchholz + + I noticed that xemacs on Irix 6.5 could not write to stderr, e.g. + (external-debugging-output "\n") + would produce NO output. + temacs worked fine, so this was clearly a dumping problem. + + So I copied over the latest available unexelf.c from FSF Emacs, + and installed it as unexelfsgi.c in XEmacs. + In addition, I converted it to "Clean C", resulting in this file. +*/ /* * unexec.c - Convert a running program into an a.out file. @@ -31,14 +44,14 @@ Boston, MA 02111-1307, USA. */ * Modified heavily since then. * * Synopsis: - * unexec (new_name, a_name, data_start, bss_start, entry_address) - * char *new_name, *a_name; + * unexec (new_name, old_name, data_start, bss_start, entry_address) + * char *new_name, *old_name; * unsigned data_start, bss_start, entry_address; * * Takes a snapshot of the program and makes an a.out format file in the * file named by the string argument new_name. - * If a_name is non-NULL, the symbol table will be taken from the given file. - * On some machines, an existing a_name file is required. + * If old_name is non-NULL, the symbol table will be taken from the given file. + * On some machines, an existing old_name file is required. * * The boundaries within the a.out file may be adjusted with the data_start * and bss_start arguments. Either or both may be given as 0 for defaults. @@ -50,11 +63,6 @@ Boston, MA 02111-1307, USA. */ * The value you specify may be rounded down to a suitable boundary * as required by the machine you are using. * - * Specifying zero for data_start means the boundary between text and data - * should not be the same as when the program was loaded. - * If NO_REMAP is defined, the argument data_start is ignored and the - * segment boundaries are never changed. - * * Bss_start indicates how much of the data segment is to be saved in the * a.out file and restored when the program is executed. It gives the lowest * unsaved address, and is rounded up to a page boundary. The default when 0 @@ -64,9 +72,6 @@ Boston, MA 02111-1307, USA. */ * * The new file is set up to start at entry_address. * - * If you make improvements I'd like to get them too. - * harpo!utah-cs!thomas, thomas@Utah-20 - * */ /* Even more heavily modified by james@bigtex.cactus.org of Dell Computer Co. @@ -99,64 +104,64 @@ temacs: Link Info Adralgn Entsize [1] 1 2 0x80480d4 0xd4 0x13 .interp - 0 0 0x1 0 + 0 0 0x1 0 [2] 5 2 0x80480e8 0xe8 0x388 .hash - 3 0 0x4 0x4 + 3 0 0x4 0x4 [3] 11 2 0x8048470 0x470 0x7f0 .dynsym - 4 1 0x4 0x10 + 4 1 0x4 0x10 [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr - 0 0 0x1 0 + 0 0 0x1 0 [5] 9 2 0x8049010 0x1010 0x338 .rel.plt - 3 7 0x4 0x8 + 3 7 0x4 0x8 [6] 1 6 0x8049348 0x1348 0x3 .init - 0 0 0x4 0 + 0 0 0x4 0 [7] 1 6 0x804934c 0x134c 0x680 .plt - 0 0 0x4 0x4 + 0 0 0x4 0x4 [8] 1 6 0x80499cc 0x19cc 0x3c56f .text - 0 0 0x4 0 + 0 0 0x4 0 [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini - 0 0 0x4 0 + 0 0 0x4 0 [10] 1 2 0x8085f40 0x3df40 0x69c .rodata - 0 0 0x4 0 + 0 0 0x4 0 [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1 - 0 0 0x4 0 + 0 0 0x4 0 [12] 1 3 0x8088330 0x3f330 0x20afc .data - 0 0 0x4 0 + 0 0 0x4 0 [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1 - 0 0 0x4 0 + 0 0 0x4 0 [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got - 0 0 0x4 0x4 + 0 0 0x4 0x4 [15] 6 3 0x80a9874 0x60874 0x80 .dynamic - 4 0 0x4 0x8 + 4 0 0x4 0x8 [16] 8 3 0x80a98f4 0x608f4 0x449c .bss - 0 0 0x4 0 + 0 0 0x4 0 [17] 2 0 0 0x608f4 0x9b90 .symtab - 18 371 0x4 0x10 + 18 371 0x4 0x10 [18] 3 0 0 0x6a484 0x8526 .strtab - 0 0 0x1 0 + 0 0 0x1 0 [19] 3 0 0 0x729aa 0x93 .shstrtab - 0 0 0x1 0 + 0 0 0x1 0 [20] 1 0 0 0x72a3d 0x68b7 .comment - 0 0 0x1 0 + 0 0 0x1 0 raid:/nfs/raid/src/dist-18.56/src> dump -h xemacs @@ -167,67 +172,67 @@ xemacs: Link Info Adralgn Entsize [1] 1 2 0x80480d4 0xd4 0x13 .interp - 0 0 0x1 0 + 0 0 0x1 0 [2] 5 2 0x80480e8 0xe8 0x388 .hash - 3 0 0x4 0x4 + 3 0 0x4 0x4 [3] 11 2 0x8048470 0x470 0x7f0 .dynsym - 4 1 0x4 0x10 + 4 1 0x4 0x10 [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr - 0 0 0x1 0 + 0 0 0x1 0 [5] 9 2 0x8049010 0x1010 0x338 .rel.plt - 3 7 0x4 0x8 + 3 7 0x4 0x8 [6] 1 6 0x8049348 0x1348 0x3 .init - 0 0 0x4 0 + 0 0 0x4 0 [7] 1 6 0x804934c 0x134c 0x680 .plt - 0 0 0x4 0x4 + 0 0 0x4 0x4 [8] 1 6 0x80499cc 0x19cc 0x3c56f .text - 0 0 0x4 0 + 0 0 0x4 0 [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini - 0 0 0x4 0 + 0 0 0x4 0 [10] 1 2 0x8085f40 0x3df40 0x69c .rodata - 0 0 0x4 0 + 0 0 0x4 0 [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1 - 0 0 0x4 0 + 0 0 0x4 0 [12] 1 3 0x8088330 0x3f330 0x20afc .data - 0 0 0x4 0 + 0 0 0x4 0 [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1 - 0 0 0x4 0 + 0 0 0x4 0 [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got - 0 0 0x4 0x4 + 0 0 0x4 0x4 [15] 6 3 0x80a9874 0x60874 0x80 .dynamic - 4 0 0x4 0x8 + 4 0 0x4 0x8 [16] 8 3 0x80c6800 0x7d800 0 .bss - 0 0 0x4 0 + 0 0 0x4 0 [17] 2 0 0 0x7d800 0x9b90 .symtab - 18 371 0x4 0x10 + 18 371 0x4 0x10 [18] 3 0 0 0x87390 0x8526 .strtab - 0 0 0x1 0 + 0 0 0x1 0 [19] 3 0 0 0x8f8b6 0x93 .shstrtab - 0 0 0x1 0 + 0 0 0x1 0 [20] 1 0 0 0x8f949 0x68b7 .comment - 0 0 0x1 0 + 0 0 0x1 0 [21] 1 3 0x80a98f4 0x608f4 0x1cf0c .data - 0 0 0x4 0 + 0 0 0x4 0 * This is an example of how the file header is changed. "Shoff" is * the section header offset within the file. Since that table is @@ -277,20 +282,20 @@ temacs: Type Offset Vaddr Paddr Filesz Memsz Flags Align -6 0x34 0x8048034 0 -0xa0 0xa0 5 0 +6 0x34 0x8048034 0 +0xa0 0xa0 5 0 -3 0xd4 0 0 -0x13 0 4 0 +3 0xd4 0 0 +0x13 0 4 0 -1 0x34 0x8048034 0 -0x3f2f9 0x3f2f9 5 0x1000 +1 0x34 0x8048034 0 +0x3f2f9 0x3f2f9 5 0x1000 -1 0x3f330 0x8088330 0 -0x215c4 0x25a60 7 0x1000 +1 0x3f330 0x8088330 0 +0x215c4 0x25a60 7 0x1000 -2 0x60874 0x80a9874 0 -0x80 0 7 0 +2 0x60874 0x80a9874 0 +0x80 0 7 0 raid:/nfs/raid/src/dist-18.56/src> dump -o xemacs @@ -299,42 +304,42 @@ xemacs: Type Offset Vaddr Paddr Filesz Memsz Flags Align -6 0x34 0x8048034 0 -0xa0 0xa0 5 0 +6 0x34 0x8048034 0 +0xa0 0xa0 5 0 -3 0xd4 0 0 -0x13 0 4 0 +3 0xd4 0 0 +0x13 0 4 0 -1 0x34 0x8048034 0 -0x3f2f9 0x3f2f9 5 0x1000 +1 0x34 0x8048034 0 +0x3f2f9 0x3f2f9 5 0x1000 -1 0x3f330 0x8088330 0 -0x3e4d0 0x3e4d0 7 0x1000 +1 0x3f330 0x8088330 0 +0x3e4d0 0x3e4d0 7 0x1000 -2 0x60874 0x80a9874 0 -0x80 0 7 0 +2 0x60874 0x80a9874 0 +0x80 0 7 0 */ -/* Modified by wtien@urbana.mcd.mot.com of Motorola Inc. - * +/* Modified by wtien@urbana.mcd.mot.com of Motorola Inc. + * * The above mechanism does not work if the unexeced ELF file is being - * re-layout by other applications (such as `strip'). All the applications + * re-layout by other applications (such as `strip'). All the applications * that re-layout the internal of ELF will layout all sections in ascending - * order of their file offsets. After the re-layout, the data2 section will - * still be the LAST section in the section header vector, but its file offset + * order of their file offsets. After the re-layout, the data2 section will + * still be the LAST section in the section header vector, but its file offset * is now being pushed far away down, and causes part of it not to be mapped - * in (ie. not covered by the load segment entry in PHDR vector), therefore + * in (ie. not covered by the load segment entry in PHDR vector), therefore * causes the new binary to fail. * * The solution is to modify the unexec algorithm to insert the new data2 * section header right before the new bss section header, so their file - * offsets will be in the ascending order. Since some of the section's (all - * sections AFTER the bss section) indexes are now changed, we also need to - * modify some fields to make them point to the right sections. This is done + * offsets will be in the ascending order. Since some of the section's (all + * sections AFTER the bss section) indexes are now changed, we also need to + * modify some fields to make them point to the right sections. This is done * by macro PATCH_INDEX. All the fields that need to be patched are: - * + * * 1. ELF header e_shstrndx field. * 2. section header sh_link and sh_info field. * 3. symbol table entry st_shndx field. @@ -346,203 +351,246 @@ Filesz Memsz Flags Align Link Info Adralgn Entsize [1] 1 2 0x80480d4 0xd4 0x13 .interp - 0 0 0x1 0 + 0 0 0x1 0 [2] 5 2 0x80480e8 0xe8 0x388 .hash - 3 0 0x4 0x4 + 3 0 0x4 0x4 [3] 11 2 0x8048470 0x470 0x7f0 .dynsym - 4 1 0x4 0x10 + 4 1 0x4 0x10 [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr - 0 0 0x1 0 + 0 0 0x1 0 [5] 9 2 0x8049010 0x1010 0x338 .rel.plt - 3 7 0x4 0x8 + 3 7 0x4 0x8 [6] 1 6 0x8049348 0x1348 0x3 .init - 0 0 0x4 0 + 0 0 0x4 0 [7] 1 6 0x804934c 0x134c 0x680 .plt - 0 0 0x4 0x4 + 0 0 0x4 0x4 [8] 1 6 0x80499cc 0x19cc 0x3c56f .text - 0 0 0x4 0 + 0 0 0x4 0 [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini - 0 0 0x4 0 + 0 0 0x4 0 [10] 1 2 0x8085f40 0x3df40 0x69c .rodata - 0 0 0x4 0 + 0 0 0x4 0 [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1 - 0 0 0x4 0 + 0 0 0x4 0 [12] 1 3 0x8088330 0x3f330 0x20afc .data - 0 0 0x4 0 + 0 0 0x4 0 [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1 - 0 0 0x4 0 + 0 0 0x4 0 [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got - 0 0 0x4 0x4 + 0 0 0x4 0x4 [15] 6 3 0x80a9874 0x60874 0x80 .dynamic - 4 0 0x4 0x8 + 4 0 0x4 0x8 [16] 1 3 0x80a98f4 0x608f4 0x1cf0c .data - 0 0 0x4 0 + 0 0 0x4 0 [17] 8 3 0x80c6800 0x7d800 0 .bss - 0 0 0x4 0 + 0 0 0x4 0 [18] 2 0 0 0x7d800 0x9b90 .symtab - 19 371 0x4 0x10 + 19 371 0x4 0x10 [19] 3 0 0 0x87390 0x8526 .strtab - 0 0 0x1 0 + 0 0 0x1 0 [20] 3 0 0 0x8f8b6 0x93 .shstrtab - 0 0 0x1 0 + 0 0 0x1 0 [21] 1 0 0 0x8f949 0x68b7 .comment - 0 0 0x1 0 + 0 0 0x1 0 */ - - /* More mods, by Jack Repenning , Fri Aug 11 15:45:52 1995 - - Same algorithm as immediately above. However, the detailed - calculations of the various locations needed significant - overhaul. - - At the point of the old .bss, the file offsets and the memory - addresses do distinct, slightly snaky things: - - offset of .bss is meaningless and unpredictable - addr of .bss is meaningful - alignment of .bss is important to addr, so there may be a small - gap in address range before start of bss - offset of next section is rounded up modulo 0x1000 - the hole so-introduced is zero-filled, so it can be mapped in as - the first partial-page of bss (the rest of the bss is mapped from - /dev/zero) - I suppose you could view this not as a hole, but as the beginning - of the bss, actually present in the file. But you should not - push that worldview too far, as the linker still knows that the - "offset" claimed for the bss is unused, and seems not always - careful about setting it. - - We are doing all our tricks at this same rather complicated - location (isn't life fun?): - - insert a new data section to contain now-initialized old bss and - heap - define a zero-length bss just so there is one - - The offset of the new data section is dictated by its current - address (which, of course, we want also to be its addr): the - loader maps in the whole file region containing old data, rodata, - got, and new data as a single mapped segment, starting at the - address of the first chunk; the rest have to be laid out in the - file such that the map into the right spots. That is: - - offset(newdata) == - addrInRunningMemory(newdata)-aIRM(olddata) - + offset(oldData) - - This would not necessarily match the oldbss offset, even if it - were carefully calculated! We must compute this. - - The linker that built temacs has also already arranged that - olddata is properly page-aligned (not necessarily beginning on a - page, but rather that a page's worth of the low bits of addr and - offset match). We preserve this. - - addr(bss) is alignment-constrained from the end of the new data. - Since we base endof(newdata) on sbrk(), we have a page boundary - (in both offset and addr) and meet any alignment constraint, - needing no alignment adjustment of this location and no - mini-hole. Or, if you like, we've allowed sbrk() to "compute" - the mini-hole size for us. - - That puts newbss beginning on a page boundary, both in offset and - addr. (offset(bss) is still meaningless, but what the heck, - we'll fix it up.) - - Since newbss has zero length, and its offset (however - meaningless) is page aligned, we place the next section exactly - there, with no hole needed to restore page alignment. - - So, the shift for all sections beyond the playing field is: - - new_bss_addr - roundup(old_bss_addr,0x1000) - - */ - /* Still more mods... Olivier Galibert 19971705 - - support for .sbss section (automagically changed to data without - name change) - - support for 64bits ABI (will need a bunch of fixes in the rest - of the code before it works - */ +#ifndef emacs +#define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1) +#include +#else +#include +extern void fatal (const char *, ...); +#endif + #include #include #include #include -#include #include #include #include +#if !defined (__NetBSD__) && !defined (__OpenBSD__) #include -#include /* for HDRR declaration */ +#endif #include -#include -#include "lisp.h" - -/* in 64bits mode, use 64bits elf */ -#ifdef _ABI64 -typedef Elf64_Shdr l_Elf_Shdr; -typedef Elf64_Phdr l_Elf_Phdr; -typedef Elf64_Ehdr l_Elf_Ehdr; -typedef Elf64_Addr l_Elf_Addr; -typedef Elf64_Word l_Elf_Word; -typedef Elf64_Off l_Elf_Off; -typedef Elf64_Sym l_Elf_Sym; -#else -typedef Elf32_Shdr l_Elf_Shdr; -typedef Elf32_Phdr l_Elf_Phdr; -typedef Elf32_Ehdr l_Elf_Ehdr; -typedef Elf32_Addr l_Elf_Addr; -typedef Elf32_Word l_Elf_Word; -typedef Elf32_Off l_Elf_Off; -typedef Elf32_Sym l_Elf_Sym; +#if defined (__sony_news) && defined (_SYSTYPE_SYSV) +#include +#include +#endif /* __sony_news && _SYSTYPE_SYSV */ +#if __sgi +#include /* for HDRR declaration */ +#endif /* __sgi */ + +#if defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__) +/* Declare COFF debugging symbol table. This used to be in + /usr/include/sym.h, but this file is no longer included in Red Hat + 5.0 and presumably in any other glibc 2.x based distribution. */ +typedef struct { + short magic; + short vstamp; + int ilineMax; + int idnMax; + int ipdMax; + int isymMax; + int ioptMax; + int iauxMax; + int issMax; + int issExtMax; + int ifdMax; + int crfd; + int iextMax; + long cbLine; + long cbLineOffset; + long cbDnOffset; + long cbPdOffset; + long cbSymOffset; + long cbOptOffset; + long cbAuxOffset; + long cbSsOffset; + long cbSsExtOffset; + long cbFdOffset; + long cbRfdOffset; + long cbExtOffset; +} HDRR, *pHDRR; +#define cbHDRR sizeof(HDRR) +#define hdrNil ((pHDRR)0) +#endif + +#ifdef __NetBSD__ +/* + * NetBSD does not have normal-looking user-land ELF support. + */ +# if defined __alpha__ || defined __sparc_v9__ +# define ELFSIZE 64 +# else +# define ELFSIZE 32 +# endif +# include + +# ifndef PT_LOAD +# define PT_LOAD Elf_pt_load +# if 0 /* was in pkgsrc patches for 20.7 */ +# define SHT_PROGBITS Elf_sht_progbits +# endif +# define SHT_SYMTAB Elf_sht_symtab +# define SHT_DYNSYM Elf_sht_dynsym +# define SHT_NULL Elf_sht_null +# define SHT_NOBITS Elf_sht_nobits +# define SHT_REL Elf_sht_rel +# define SHT_RELA Elf_sht_rela + +# define SHN_UNDEF Elf_eshn_undefined +# define SHN_ABS Elf_eshn_absolute +# define SHN_COMMON Elf_eshn_common +# endif /* !PT_LOAD */ + +# ifdef __alpha__ +# include +# define HDRR struct ecoff_symhdr +# define pHDRR HDRR * +# endif /* __alpha__ */ + +#ifdef __mips__ /* was in pkgsrc patches for 20.7 */ +# define SHT_MIPS_DEBUG DT_MIPS_FLAGS +# define HDRR struct Elf_Shdr +#endif /* __mips__ */ +#endif /* __NetBSD__ */ + +#ifdef __OpenBSD__ +# include +#endif + +#if __GNU_LIBRARY__ - 0 >= 6 +# include /* get ElfW etc */ +#endif + +#ifndef ElfW +# ifdef __STDC__ +# define ElfBitsW(bits, type) Elf##bits##_##type +# else +# define ElfBitsW(bits, type) Elf/**/bits/**/_/**/type +# endif +# ifdef _LP64 +# define ELFSIZE 64 +# else +# define ELFSIZE 32 +# endif + /* This macro expands `bits' before invoking ElfBitsW. */ +# define ElfExpandBitsW(bits, type) ElfBitsW (bits, type) +# define ElfW(type) ElfExpandBitsW (ELFSIZE, type) #endif +#ifndef ELF_BSS_SECTION_NAME +#define ELF_BSS_SECTION_NAME ".bss" +#endif /* Get the address of a particular section or program header entry, * accounting for the size of the entries. */ +/* + On PPC Reference Platform running Solaris 2.5.1 + the plt section is also of type NOBI like the bss section. + (not really stored) and therefore sections after the bss + section start at the plt offset. The plt section is always + the one just before the bss section. + Thus, we modify the test from + if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset) + to + if (NEW_SECTION_H (nn).sh_offset >= + OLD_SECTION_H (old_bss_index-1).sh_offset) + This is just a hack. We should put the new data section + before the .plt section. + And we should not have this routine at all but use + the libelf library to read the old file and create the new + file. + The changed code is minimal and depends on prep set in m/prep.h + Erik Deumens + Quantum Theory Project + University of Florida + deumens@qtp.ufl.edu + Apr 23, 1996 + */ #define OLD_SECTION_H(n) \ - (*(l_Elf_Shdr *) ((byte *) old_section_h + old_file_h->e_shentsize * (n))) + (*(ElfW(Shdr) *) ((byte *) old_section_h + old_file_h->e_shentsize * (n))) #define NEW_SECTION_H(n) \ - (*(l_Elf_Shdr *) ((byte *) new_section_h + new_file_h->e_shentsize * (n))) + (*(ElfW(Shdr) *) ((byte *) new_section_h + new_file_h->e_shentsize * (n))) #define OLD_PROGRAM_H(n) \ - (*(l_Elf_Phdr *) ((byte *) old_program_h + old_file_h->e_phentsize * (n))) + (*(ElfW(Phdr) *) ((byte *) old_program_h + old_file_h->e_phentsize * (n))) #define NEW_PROGRAM_H(n) \ - (*(l_Elf_Phdr *) ((byte *) new_program_h + new_file_h->e_phentsize * (n))) + (*(ElfW(Phdr) *) ((byte *) new_program_h + new_file_h->e_phentsize * (n))) #define PATCH_INDEX(n) \ do { \ - if ((n) >= old_bss_index) \ + if ((int) (n) >= old_bss_index) \ (n)++; } while (0) typedef unsigned char byte; /* Round X up to a multiple of Y. */ -static int -round_up (int x, int y) +static ElfW(Addr) +round_up (ElfW(Addr) x, ElfW(Addr) y) { int rem = x % y; if (rem == 0) @@ -561,8 +609,8 @@ static int find_section (char *name, char *section_names, char *file_name, - l_Elf_Ehdr *old_file_h, - l_Elf_Shdr *old_section_h, + ElfW(Ehdr) *old_file_h, + ElfW(Shdr) *old_section_h, int noerror) { int idx; @@ -582,7 +630,7 @@ find_section (char *name, if (noerror) return -1; else - fatal ("Can't find .bss in %s.\n", file_name); + fatal ("Can't find %s in %s.\n", name, file_name); } return idx; @@ -597,41 +645,40 @@ find_section (char *name, * .data section, and inserting an empty .bss immediately afterwards. * */ -int +void unexec (char *new_name, char *old_name, uintptr_t data_start, uintptr_t bss_start, uintptr_t entry_address) { - extern uintptr_t bss_end; int new_file, old_file, new_file_size; - /* Pointers to the base of the image of the two files. */ + /* Pointers to the base of the image of the two files. */ caddr_t old_base, new_base; /* Pointers to the file, program and section headers for the old and new - files. */ - l_Elf_Ehdr *old_file_h, *new_file_h; - l_Elf_Phdr *old_program_h, *new_program_h; - l_Elf_Shdr *old_section_h, *new_section_h; - l_Elf_Shdr *oldbss; + * files. + */ + ElfW(Ehdr) *old_file_h, *new_file_h; + ElfW(Phdr) *old_program_h, *new_program_h; + ElfW(Shdr) *old_section_h, *new_section_h; - /* Point to the section name table in the old file. */ + /* Point to the section name table in the old file */ char *old_section_names; - l_Elf_Addr old_bss_addr, new_bss_addr; - l_Elf_Addr old_base_addr; - l_Elf_Word old_bss_size, new_data2_size; - l_Elf_Off new_data2_offset, new_base_offset; - l_Elf_Addr new_data2_addr; - l_Elf_Addr new_offsets_shift; + ElfW(Addr) old_bss_addr, new_bss_addr; + ElfW(Word) old_bss_size, new_data2_size; + ElfW(Off) new_data2_offset; + ElfW(Addr) new_data2_addr; - int n, nn, old_bss_index, old_data_index; - int old_mdebug_index, old_sbss_index; + int n, nn; + int old_bss_index, old_sbss_index; + int old_data_index, new_data2_index; + int old_mdebug_index; struct stat stat_buf; - /* Open the old file & map it into the address space. */ + /* Open the old file & map it into the address space. */ old_file = open (old_name, O_RDONLY); @@ -639,43 +686,58 @@ unexec (char *new_name, fatal ("Can't open %s for reading: errno %d\n", old_name, errno); if (fstat (old_file, &stat_buf) == -1) - fatal ("Can't fstat(%s): errno %d\n", old_name, errno); + fatal ("Can't fstat (%s): errno %d\n", old_name, errno); - old_base = mmap (0, stat_buf.st_size, PROT_READ, MAP_SHARED, old_file, 0); + old_base = (caddr_t) mmap ((caddr_t) 0, stat_buf.st_size, + PROT_READ, MAP_SHARED, old_file, 0); if (old_base == (caddr_t) -1) - fatal ("Can't mmap(%s): errno %d\n", old_name, errno); + fatal ("Can't mmap (%s): errno %d\n", old_name, errno); #ifdef DEBUG - fprintf (stderr, "mmap(%s, %x) -> %x\n", old_name, stat_buf.st_size, + fprintf (stderr, "mmap (%s, %x) -> %x\n", old_name, stat_buf.st_size, old_base); #endif - /* Get pointers to headers & section names. */ + /* Get pointers to headers & section names */ - old_file_h = (l_Elf_Ehdr *) old_base; - old_program_h = (l_Elf_Phdr *) ((byte *) old_base + old_file_h->e_phoff); - old_section_h = (l_Elf_Shdr *) ((byte *) old_base + old_file_h->e_shoff); - old_section_names - = (char *) old_base + OLD_SECTION_H (old_file_h->e_shstrndx).sh_offset; + old_file_h = (ElfW(Ehdr) *) old_base; + old_program_h = (ElfW(Phdr) *) ((byte *) old_base + old_file_h->e_phoff); + old_section_h = (ElfW(Shdr) *) ((byte *) old_base + old_file_h->e_shoff); + old_section_names = (char *) old_base + + OLD_SECTION_H (old_file_h->e_shstrndx).sh_offset; /* Find the mdebug section, if any. */ old_mdebug_index = find_section (".mdebug", old_section_names, old_name, old_file_h, old_section_h, 1); - /* Find the .sbss section, if any. */ + /* Find the old .bss section. Figure out parameters of the new + * data2 and bss sections. + */ + + old_bss_index = find_section (".bss", old_section_names, + old_name, old_file_h, old_section_h, 0); old_sbss_index = find_section (".sbss", old_section_names, old_name, old_file_h, old_section_h, 1); + if (old_sbss_index != -1) + if (OLD_SECTION_H (old_sbss_index).sh_type == SHT_PROGBITS) + old_sbss_index = -1; - if (old_sbss_index != -1 && (OLD_SECTION_H (old_sbss_index).sh_type == SHT_PROGBITS)) - old_sbss_index = -1; - - /* Find the old .bss section. */ - - old_bss_index = find_section (".bss", old_section_names, - old_name, old_file_h, old_section_h, 0); + if (old_sbss_index == -1) + { + old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr; + old_bss_size = OLD_SECTION_H (old_bss_index).sh_size; + new_data2_index = old_bss_index; + } + else + { + old_bss_addr = OLD_SECTION_H (old_sbss_index).sh_addr; + old_bss_size = OLD_SECTION_H (old_bss_index).sh_size + + OLD_SECTION_H (old_sbss_index).sh_size; + new_data2_index = old_sbss_index; + } /* Find the old .data section. Figure out parameters of the new data2 and bss sections. */ @@ -683,68 +745,64 @@ unexec (char *new_name, old_data_index = find_section (".data", old_section_names, old_name, old_file_h, old_section_h, 0); - old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr; - old_bss_size = OLD_SECTION_H (old_bss_index).sh_size; - old_base_addr = old_sbss_index == -1 ? old_bss_addr : OLD_SECTION_H (old_sbss_index).sh_addr; -#if defined(emacs) || !defined(DEBUG) - bss_end = (uintptr_t) sbrk (0); - new_bss_addr = (l_Elf_Addr) bss_end; +#if defined (emacs) || !defined (DEBUG) + new_bss_addr = (ElfW(Addr)) sbrk (0); #else - new_bss_addr = old_bss_addr + old_bss_size + 0x1234; + new_bss_addr = old_bss_addr + old_bss_size + 0x1234; #endif - new_data2_addr = old_bss_addr; - new_data2_size = new_bss_addr - old_bss_addr; + new_data2_addr = old_bss_addr; + new_data2_size = new_bss_addr - old_bss_addr; new_data2_offset = OLD_SECTION_H (old_data_index).sh_offset + (new_data2_addr - OLD_SECTION_H (old_data_index).sh_addr); - new_base_offset = OLD_SECTION_H (old_data_index).sh_offset + - (old_base_addr - OLD_SECTION_H (old_data_index).sh_addr); - new_offsets_shift = new_bss_addr - (old_base_addr & ~0xfff) + - ((old_base_addr & 0xfff) ? 0x1000 : 0); #ifdef DEBUG fprintf (stderr, "old_bss_index %d\n", old_bss_index); fprintf (stderr, "old_bss_addr %x\n", old_bss_addr); fprintf (stderr, "old_bss_size %x\n", old_bss_size); - fprintf (stderr, "old_base_addr %x\n", old_base_addr); fprintf (stderr, "new_bss_addr %x\n", new_bss_addr); fprintf (stderr, "new_data2_addr %x\n", new_data2_addr); fprintf (stderr, "new_data2_size %x\n", new_data2_size); fprintf (stderr, "new_data2_offset %x\n", new_data2_offset); - fprintf (stderr, "new_offsets_shift %x\n", new_offsets_shift); #endif if ((unsigned) new_bss_addr < (unsigned) old_bss_addr + old_bss_size) - fatal (".bss shrank when undumping???\n"); + fatal (".bss shrank when undumping???\n", 0, 0); /* Set the output file to the right size and mmap it. Set - pointers to various interesting objects. stat_buf still has - old_file data. */ + * pointers to various interesting objects. stat_buf still has + * old_file data. + */ new_file = open (new_name, O_RDWR | O_CREAT, 0666); if (new_file < 0) fatal ("Can't creat (%s): errno %d\n", new_name, errno); - new_file_size = stat_buf.st_size /* old file size */ - + old_file_h->e_shentsize /* one new section header */ - + new_offsets_shift; /* trailing section shift */ + new_file_size = stat_buf.st_size + old_file_h->e_shentsize + new_data2_size; if (ftruncate (new_file, new_file_size)) fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno); - new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_SHARED, - new_file, 0); +#ifdef UNEXEC_USE_MAP_PRIVATE + new_base = (caddr_t) mmap ((caddr_t) 0, new_file_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE, new_file, 0); +#else + new_base = (caddr_t) mmap ((caddr_t) 0, new_file_size, + PROT_READ | PROT_WRITE, + MAP_SHARED, new_file, 0); +#endif if (new_base == (caddr_t) -1) fatal ("Can't mmap (%s): errno %d\n", new_name, errno); - new_file_h = (l_Elf_Ehdr *) new_base; - new_program_h = (l_Elf_Phdr *) ((byte *) new_base + old_file_h->e_phoff); - new_section_h - = (l_Elf_Shdr *) ((byte *) new_base + old_file_h->e_shoff - + new_offsets_shift); + new_file_h = (ElfW(Ehdr) *) new_base; + new_program_h = (ElfW(Phdr) *) ((byte *) new_base + old_file_h->e_phoff); + new_section_h = (ElfW(Shdr) *) + ((byte *) new_base + old_file_h->e_shoff + new_data2_size); /* Make our new file, program and section headers as copies of the - originals. */ + * originals. + */ memcpy (new_file_h, old_file_h, old_file_h->e_ehsize); memcpy (new_program_h, old_program_h, @@ -754,12 +812,12 @@ unexec (char *new_name, PATCH_INDEX (new_file_h->e_shstrndx); /* Fix up file header. We'll add one section. Section header is - further away now. */ + * further away now. + */ - new_file_h->e_shoff += new_offsets_shift; + new_file_h->e_shoff += new_data2_size; new_file_h->e_shnum += 1; - #ifdef DEBUG fprintf (stderr, "Old section offset %x\n", old_file_h->e_shoff); fprintf (stderr, "Old section count %d\n", old_file_h->e_shnum); @@ -768,164 +826,248 @@ unexec (char *new_name, #endif /* Fix up a new program header. Extend the writable data segment so - that the bss area is covered too. Find that segment by looking - for one that starts before and ends after the .bss and it PT_LOADable. - Put a loop at the end to adjust the offset and address of any segment - that is above data2, just in case we decide to allow this later. */ + * that the bss area is covered too. Find that segment by looking + * for a segment that ends just before the .bss area. Make sure + * that no segments are above the new .data2. Put a loop at the end + * to adjust the offset and address of any segment that is above + * data2, just in case we decide to allow this later. + */ - oldbss = &OLD_SECTION_H(old_bss_index); for (n = new_file_h->e_phnum - 1; n >= 0; n--) { /* Compute maximum of all requirements for alignment of section. */ - l_Elf_Phdr * ph = (l_Elf_Phdr *)((byte *) new_program_h + - new_file_h->e_phentsize*(n)); -#ifdef DEBUG - printf ("%d @ %0x + %0x against %0x + %0x", - n, ph->p_vaddr, ph->p_memsz, - oldbss->sh_addr, oldbss->sh_size); -#endif - if ((ph->p_type == PT_LOAD) && - (ph->p_vaddr <= oldbss->sh_addr) && - ((ph->p_vaddr + ph->p_memsz)>=(oldbss->sh_addr + oldbss->sh_size))) { - ph->p_filesz += new_offsets_shift; - ph->p_memsz = ph->p_filesz; -#ifdef DEBUG - puts (" That's the one!"); - fflush (stdout); -#endif - break; - } -#ifdef DEBUG - putchar ('\n'); - fflush (stdout); -#endif + ElfW(Word) alignment = (NEW_PROGRAM_H (n)).p_align; + if ((OLD_SECTION_H (old_bss_index)).sh_addralign > alignment) + alignment = OLD_SECTION_H (old_bss_index).sh_addralign; + +#ifdef __sgi + /* According to r02kar@x4u2.desy.de (Karsten Kuenne) + and oliva@gnu.org (Alexandre Oliva), on IRIX 5.2, we + always get "Program segment above .bss" when dumping + when the executable doesn't have an sbss section. */ + if (old_sbss_index != -1) +#endif /* __sgi */ + if (NEW_PROGRAM_H (n).p_vaddr + NEW_PROGRAM_H (n).p_filesz + > (old_sbss_index == -1 + ? old_bss_addr + : round_up (old_bss_addr, alignment))) + fatal ("Program segment above .bss in %s\n", old_name, 0); + + if (NEW_PROGRAM_H (n).p_type == PT_LOAD + && (round_up ((NEW_PROGRAM_H (n)).p_vaddr + + (NEW_PROGRAM_H (n)).p_filesz, + alignment) + == round_up (old_bss_addr, alignment))) + break; } if (n < 0) - fatal ("Couldn't find segment next to %s in %s\n", - old_sbss_index == -1 ? ".sbss" : ".bss", old_name); + fatal ("Couldn't find segment next to .bss in %s\n", old_name, 0); + /* Make sure that the size includes any padding before the old .bss + section. */ + NEW_PROGRAM_H (n).p_filesz = new_bss_addr - NEW_PROGRAM_H (n).p_vaddr; + NEW_PROGRAM_H (n).p_memsz = NEW_PROGRAM_H (n).p_filesz; -#if 1 /* Maybe allow section after data2 - does this ever happen? */ +#if 0 /* Maybe allow section after data2 - does this ever happen? */ for (n = new_file_h->e_phnum - 1; n >= 0; n--) { if (NEW_PROGRAM_H (n).p_vaddr && NEW_PROGRAM_H (n).p_vaddr >= new_data2_addr) - NEW_PROGRAM_H (n).p_vaddr += new_offsets_shift - old_bss_size; + NEW_PROGRAM_H (n).p_vaddr += new_data2_size - old_bss_size; if (NEW_PROGRAM_H (n).p_offset >= new_data2_offset) - NEW_PROGRAM_H (n).p_offset += new_offsets_shift; + NEW_PROGRAM_H (n).p_offset += new_data2_size; } #endif /* Fix up section headers based on new .data2 section. Any section - whose offset or virtual address is after the new .data2 section - gets its value adjusted. .bss size becomes zero and new address - is set. data2 section header gets added by copying the existing - .data header and modifying the offset, address and size. */ - for (old_data_index = 1; old_data_index < old_file_h->e_shnum; + * whose offset or virtual address is after the new .data2 section + * gets its value adjusted. .bss size becomes zero and new address + * is set. data2 section header gets added by copying the existing + * .data header and modifying the offset, address and size. + */ + for (old_data_index = 1; old_data_index < (int) old_file_h->e_shnum; old_data_index++) if (!strcmp (old_section_names + OLD_SECTION_H (old_data_index).sh_name, ".data")) break; if (old_data_index == old_file_h->e_shnum) - fatal ("Can't find .data in %s.\n", old_name); + fatal ("Can't find .data in %s.\n", old_name, 0); - /* Walk through all section headers, insert the new data2 section right - before the new bss section. */ - for (n = 1, nn = 1; n < old_file_h->e_shnum; n++, nn++) + /* Walk through all section headers, insert the new data2 section right + before the new bss section. */ + for (n = 1, nn = 1; n < (int) old_file_h->e_shnum; n++, nn++) { caddr_t src; - - /* XEmacs change: */ - if (n < old_bss_index) - { - memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n), - old_file_h->e_shentsize); - - } - else if (n == old_bss_index) + /* If it is (s)bss section, insert the new data2 section before it. */ + /* new_data2_index is the index of either old_sbss or old_bss, that was + chosen as a section for new_data2. */ + if (n == new_data2_index) { - - /* If it is bss section, insert the new data2 section before it. */ - /* Steal the data section header for this data2 section. */ + /* Steal the data section header for this data2 section. */ memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (old_data_index), new_file_h->e_shentsize); - + NEW_SECTION_H (nn).sh_addr = new_data2_addr; NEW_SECTION_H (nn).sh_offset = new_data2_offset; NEW_SECTION_H (nn).sh_size = new_data2_size; /* Use the bss section's alignment. This will assure that the new data2 section always be placed in the same spot as the old - bss section by any other application. */ + bss section by any other application. */ NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (n).sh_addralign; - /* Now copy over what we have in the memory now. */ - memcpy (NEW_SECTION_H (nn).sh_offset + new_base, - (caddr_t) OLD_SECTION_H (n).sh_addr, + /* Now copy over what we have in the memory now. */ + memcpy (NEW_SECTION_H (nn).sh_offset + new_base, + (caddr_t) OLD_SECTION_H (n).sh_addr, new_data2_size); nn++; - memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n), - old_file_h->e_shentsize); - - /* The new bss section's size is zero, and its file offset and virtual - address should be off by NEW_OFFSETS_SHIFT. */ - NEW_SECTION_H (nn).sh_offset += new_offsets_shift; - NEW_SECTION_H (nn).sh_addr = new_bss_addr; + } + + memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n), + old_file_h->e_shentsize); + + if (n == old_bss_index + /* The new bss and sbss section's size is zero, and its file offset + and virtual address should be off by NEW_DATA2_SIZE. */ + || n == old_sbss_index + ) + { + /* NN should be `old_s?bss_index + 1' at this point. */ + NEW_SECTION_H (nn).sh_offset = + NEW_SECTION_H (new_data2_index).sh_offset + new_data2_size; + NEW_SECTION_H (nn).sh_addr = + NEW_SECTION_H (new_data2_index).sh_addr + new_data2_size; /* Let the new bss section address alignment be the same as the - section address alignment followed the old bss section, so - this section will be placed in exactly the same place. */ - NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (n).sh_addralign; + section address alignment followed the old bss section, so + this section will be placed in exactly the same place. */ + NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (nn).sh_addralign; NEW_SECTION_H (nn).sh_size = 0; } - else /* n > old_bss_index */ - memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n), - old_file_h->e_shentsize); - - /* Any section that was original placed AFTER the bss - section must now be adjusted by NEW_OFFSETS_SHIFT. */ - - if (NEW_SECTION_H (nn).sh_offset >= new_base_offset) - NEW_SECTION_H (nn).sh_offset += new_offsets_shift; - + else + { + /* Any section that was original placed AFTER the bss + section should now be off by NEW_DATA2_SIZE. */ +#ifdef SOLARIS_POWERPC + /* On PPC Reference Platform running Solaris 2.5.1 + the plt section is also of type NOBI like the bss section. + (not really stored) and therefore sections after the bss + section start at the plt offset. The plt section is always + the one just before the bss section. + It would be better to put the new data section before + the .plt section, or use libelf instead. + Erik Deumens, deumens@qtp.ufl.edu. */ + if (NEW_SECTION_H (nn).sh_offset + >= OLD_SECTION_H (old_bss_index-1).sh_offset) + NEW_SECTION_H (nn).sh_offset += new_data2_size; +#else + if (round_up (NEW_SECTION_H (nn).sh_offset, + OLD_SECTION_H (old_bss_index).sh_addralign) + >= new_data2_offset) + NEW_SECTION_H (nn).sh_offset += new_data2_size; +#endif + /* Any section that was originally placed after the section + header table should now be off by the size of one section + header table entry. */ + if (NEW_SECTION_H (nn).sh_offset > new_file_h->e_shoff) + NEW_SECTION_H (nn).sh_offset += new_file_h->e_shentsize; + } + /* If any section hdr refers to the section after the new .data - section, make it refer to next one because we have inserted + section, make it refer to next one because we have inserted a new section in between. */ - + PATCH_INDEX (NEW_SECTION_H (nn).sh_link); /* For symbol tables, info is a symbol table index, so don't change it. */ if (NEW_SECTION_H (nn).sh_type != SHT_SYMTAB && NEW_SECTION_H (nn).sh_type != SHT_DYNSYM) PATCH_INDEX (NEW_SECTION_H (nn).sh_info); - - /* Fix the type and alignment for the .sbss section */ - if ((old_sbss_index != -1) && !strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".sbss")) - { - NEW_SECTION_H (nn).sh_type = SHT_PROGBITS; - NEW_SECTION_H (nn).sh_offset = round_up (NEW_SECTION_H (nn).sh_offset, - NEW_SECTION_H (nn).sh_addralign); - } - /* Now, start to copy the content of sections. */ + if (old_sbss_index != -1) + if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".sbss")) + { + NEW_SECTION_H (nn).sh_offset = + round_up (NEW_SECTION_H (nn).sh_offset, + NEW_SECTION_H (nn).sh_addralign); + NEW_SECTION_H (nn).sh_type = SHT_PROGBITS; + } + + /* Now, start to copy the content of sections. */ if (NEW_SECTION_H (nn).sh_type == SHT_NULL || NEW_SECTION_H (nn).sh_type == SHT_NOBITS) continue; - - /* Write out the sections. .data, .data1 and .sbss (and data2, called + + /* Write out the sections. .data and .data1 (and data2, called ".data" in the strings table) get copied from the current process instead of the old file. */ - if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data") - || !strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data1") - || !strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".got") - || !strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".sbss")) + if (!strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".data") + || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), + ".sdata") + || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), + ".lit4") + || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), + ".lit8") + || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), + ".sdata1") + || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), + ".data1") + || !strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, + ".sbss")) src = (caddr_t) OLD_SECTION_H (n).sh_addr; else src = old_base + OLD_SECTION_H (n).sh_offset; - + memcpy (NEW_SECTION_H (nn).sh_offset + new_base, src, NEW_SECTION_H (nn).sh_size); - /* Adjust the HDRR offsets in .mdebug and copy the +#ifdef __alpha__ + /* Update Alpha COFF symbol table: */ + if (strcmp (old_section_names + OLD_SECTION_H (n).sh_name, ".mdebug") + == 0) + { + pHDRR symhdr = (pHDRR) (NEW_SECTION_H (nn).sh_offset + new_base); + + symhdr->cbLineOffset += new_data2_size; + symhdr->cbDnOffset += new_data2_size; + symhdr->cbPdOffset += new_data2_size; + symhdr->cbSymOffset += new_data2_size; + symhdr->cbOptOffset += new_data2_size; + symhdr->cbAuxOffset += new_data2_size; + symhdr->cbSsOffset += new_data2_size; + symhdr->cbSsExtOffset += new_data2_size; + symhdr->cbFdOffset += new_data2_size; + symhdr->cbRfdOffset += new_data2_size; + symhdr->cbExtOffset += new_data2_size; + } +#endif /* __alpha__ */ + +#if defined (__sony_news) && defined (_SYSTYPE_SYSV) + if (NEW_SECTION_H (nn).sh_type == SHT_MIPS_DEBUG + && old_mdebug_index != -1) + { + int diff = NEW_SECTION_H(nn).sh_offset + - OLD_SECTION_H(old_mdebug_index).sh_offset; + HDRR *phdr = (HDRR *)(NEW_SECTION_H (nn).sh_offset + new_base); + + if (diff) + { + phdr->cbLineOffset += diff; + phdr->cbDnOffset += diff; + phdr->cbPdOffset += diff; + phdr->cbSymOffset += diff; + phdr->cbOptOffset += diff; + phdr->cbAuxOffset += diff; + phdr->cbSsOffset += diff; + phdr->cbSsExtOffset += diff; + phdr->cbFdOffset += diff; + phdr->cbRfdOffset += diff; + phdr->cbExtOffset += diff; + } + } +#endif /* __sony_news && _SYSTYPE_SYSV */ + +#if __sgi + /* Adjust the HDRR offsets in .mdebug and copy the line data if it's in its usual 'hole' in the object. Makes the new file debuggable with dbx. patches up two problems: the absolute file offsets @@ -943,7 +1085,7 @@ unexec (char *new_name, HDRR * o_phdrr = (HDRR *)((byte *)old_base + OLD_SECTION_H (n).sh_offset); HDRR * n_phdrr = (HDRR *)((byte *)new_base + NEW_SECTION_H (nn).sh_offset); - unsigned movement = new_offsets_shift; + unsigned movement = new_data2_size; MDEBUGADJUST (idnMax, cbDnOffset); MDEBUGADJUST (ipdMax, cbPdOffset); @@ -977,27 +1119,106 @@ unexec (char *new_name, } } } +#endif /* __sgi */ - /* If it is the symbol table, its st_shndx field needs to be patched. */ + /* If it is the symbol table, its st_shndx field needs to be patched. */ if (NEW_SECTION_H (nn).sh_type == SHT_SYMTAB || NEW_SECTION_H (nn).sh_type == SHT_DYNSYM) { - l_Elf_Shdr *spt = &NEW_SECTION_H (nn); + ElfW(Shdr) *spt = &NEW_SECTION_H (nn); unsigned int num = spt->sh_size / spt->sh_entsize; - l_Elf_Sym * sym = (l_Elf_Sym *) (NEW_SECTION_H (nn).sh_offset - + new_base); + ElfW(Sym) * sym = (ElfW(Sym) *) (NEW_SECTION_H (nn).sh_offset + + new_base); for (; num--; sym++) { - if (sym->st_shndx == SHN_UNDEF - || sym->st_shndx == SHN_ABS - || sym->st_shndx == SHN_COMMON) + if ((sym->st_shndx == SHN_UNDEF) + || (sym->st_shndx == SHN_ABS) + || (sym->st_shndx == SHN_COMMON)) continue; - + PATCH_INDEX (sym->st_shndx); } } } + /* Update the symbol values of _edata and _end. */ + for (n = new_file_h->e_shnum - 1; n; n--) + { + byte *symnames; + ElfW(Sym) *symp, *symendp; + + if (NEW_SECTION_H (n).sh_type != SHT_DYNSYM + && NEW_SECTION_H (n).sh_type != SHT_SYMTAB) + continue; + + symnames = ((byte *) new_base + + NEW_SECTION_H (NEW_SECTION_H (n).sh_link).sh_offset); + symp = (ElfW(Sym) *) (NEW_SECTION_H (n).sh_offset + new_base); + symendp = (ElfW(Sym) *) ((byte *)symp + NEW_SECTION_H (n).sh_size); + + for (; symp < symendp; symp ++) + if (strcmp ((char *) (symnames + symp->st_name), "_end") == 0 + || strcmp ((char *) (symnames + symp->st_name), "end") == 0 + || strcmp ((char *) (symnames + symp->st_name), "_edata") == 0 + || strcmp ((char *) (symnames + symp->st_name), "edata") == 0) + memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr)); + } + + /* This loop seeks out relocation sections for the data section, so + that it can undo relocations performed by the runtime linker. */ + for (n = new_file_h->e_shnum - 1; n; n--) + { + ElfW(Shdr) section = NEW_SECTION_H (n); + switch (section.sh_type) { + default: + break; + case SHT_REL: + case SHT_RELA: + /* This code handles two different size structs, but there should + be no harm in that provided that r_offset is always the first + member. */ + nn = section.sh_info; + if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data") + || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name), + ".sdata") + || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name), + ".lit4") + || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name), + ".lit8") + || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name), + ".sdata1") + || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name), + ".data1")) + { + ElfW(Addr) offset = NEW_SECTION_H (nn).sh_addr - + NEW_SECTION_H (nn).sh_offset; + caddr_t reloc = old_base + section.sh_offset, end; + for (end = reloc + section.sh_size; reloc < end; + reloc += section.sh_entsize) + { + ElfW(Addr) addr = ((ElfW(Rel) *) reloc)->r_offset - offset; +#ifdef __alpha__ + /* The Alpha ELF binutils currently have a bug that + sometimes results in relocs that contain all + zeroes. Work around this for now... */ + if (((ElfW(Rel) *) reloc)->r_offset == 0) + continue; +#endif + memcpy (new_base + addr, old_base + addr, sizeof(ElfW(Addr))); + } + } + break; + } + } + +#ifdef UNEXEC_USE_MAP_PRIVATE + if (lseek (new_file, 0, SEEK_SET) == -1) + fatal ("Can't rewind (%s): errno %d\n", new_name, errno); + + if (write (new_file, new_base, new_file_size) != new_file_size) + fatal ("Can't write (%s): errno %d\n", new_name, errno); +#endif + /* Close the files and make the new file executable. */ if (close (old_file)) @@ -1014,6 +1235,4 @@ unexec (char *new_name, stat_buf.st_mode |= 0111 & ~n; if (chmod (new_name, stat_buf.st_mode) == -1) fatal ("Can't chmod (%s): errno %d\n", new_name, errno); - - return 0; } diff --git a/src/window.c b/src/window.c index cfa89b4..18ee8e4 100644 --- a/src/window.c +++ b/src/window.c @@ -64,8 +64,8 @@ static int window_pixel_height_to_char_height (struct window *w, static int window_char_height_to_pixel_height (struct window *w, int char_height, int include_gutters_p); -static void change_window_height (struct window *w, int delta, int widthflag, - int inpixels); +static void change_window_height (Lisp_Object window, int delta, + Lisp_Object horizontalp, int inpixels); /* Thickness of shadow border around 3d modelines. */ Lisp_Object Vmodeline_shadow_thickness; @@ -1112,19 +1112,20 @@ window_pixel_height (struct window* w) DEFUN ("windowp", Fwindowp, 1, 1, 0, /* -Return t if OBJ is a window. +Return t if OBJECT is a window. */ - (obj)) + (object)) { - return WINDOWP (obj) ? Qt : Qnil; + return WINDOWP (object) ? Qt : Qnil; } DEFUN ("window-live-p", Fwindow_live_p, 1, 1, 0, /* -Return t if OBJ is a window which is currently visible. +Return t if OBJECT is a window which is currently visible. */ - (obj)) + (object)) { - return WINDOWP (obj) && WINDOW_LIVE_P (XWINDOW (obj)) ? Qt : Qnil; + return WINDOWP (object) && WINDOW_LIVE_P (XWINDOW (object)) + ? Qt : Qnil; } DEFUN ("selected-window", Fselected_window, 0, 1, 0, /* @@ -1597,8 +1598,10 @@ Afterwards the end-trigger value is reset to nil. DEFUN ("window-pixel-edges", Fwindow_pixel_edges, 0, 1, 0, /* Return a list of the pixel edge coordinates of WINDOW. -\(LEFT TOP RIGHT BOTTOM), all relative to 0, 0 at top left corner of frame. -The frame toolbars, menubars and gutters are considered to be outside of this area. +The returned list is of the form (LEFT TOP RIGHT BOTTOM), +all relative to 0, 0 at the top left corner of WINDOW's frame. +The frame toolbars, menubars and gutters are considered to be outside +of this area, while the scrollbars are considered to be inside. */ (window)) { @@ -1619,8 +1622,9 @@ The frame toolbars, menubars and gutters are considered to be outside of this ar DEFUN ("window-text-area-pixel-edges", Fwindow_text_area_pixel_edges, 0, 1, 0, /* Return a list of the pixel edge coordinates of the text area of WINDOW. -Returns the list \(LEFT TOP RIGHT BOTTOM), all relative to 0, 0 at the -top left corner of the window. +The returned list is of the form (LEFT TOP RIGHT BOTTOM), +all relative to 0, 0 at the top left corner of the total area allocated +to the window, which includes the scrollbars. */ (window)) { @@ -1646,7 +1650,7 @@ Note that, when WINDOW is the selected window and its buffer is also currently selected, the value returned is the same as (point). It would be more strictly correct to return the `top-level' value of point, outside of any save-excursion forms. -But that is hard to define. +But that value is hard to find. */ (window)) { @@ -1672,12 +1676,13 @@ This is updated by redisplay or by calling `set-window-start'. DEFUN ("window-end", Fwindow_end, 0, 2, 0, /* Return position at which display currently ends in WINDOW. This is updated by redisplay, when it runs to completion. -Simply changing the buffer text or setting `window-start' -does not update this value. -If GUARANTEE is non-nil, then the return value is guaranteed to be -the value of window-end at the end of the next full redisplay assuming -nothing else changes in the meantime. This function is potentially much -slower with this flag set. +Simply changing the buffer text or setting `window-start' does not +update this value. WINDOW defaults to the selected window. + +If optional arg GUARANTEE is non-nil, the return value is guaranteed +to be the same value as this function would return at the end of the +next full redisplay assuming nothing else changes in the meantime. +This function is potentially much slower with this flag set. */ (window, guarantee)) { @@ -1930,7 +1935,7 @@ mark_window_as_deleted (struct window *w) DEFUN ("delete-window", Fdelete_window, 0, 2, "", /* Remove WINDOW from the display. Default is selected window. -If window is the only one on the frame, the frame is destroyed. +If window is the only one on its frame, the frame is deleted as well. Normally, you cannot delete the last non-minibuffer-only frame (you must use `save-buffers-kill-emacs' or `kill-emacs'). However, if optional second argument FORCE is non-nil, you can delete the last frame. (This @@ -2124,27 +2129,30 @@ too. Therefore, `next-window' can be used to iterate through the set of windows even when the minibuffer is on another frame. If the minibuffer does not count, only windows from WINDOW's frame count. -Optional third arg ALL-FRAMES t means include windows on all frames. -ALL-FRAMES nil or omitted means cycle within the frames as specified -above. ALL-FRAMES = `visible' means include windows on all visible frames. -ALL-FRAMES = 0 means include windows on all visible and iconified frames. -If ALL-FRAMES is a frame, restrict search to windows on that frame. -Anything else means restrict to WINDOW's frame. - -Optional fourth arg CONSOLE controls which consoles or devices the -returned window may be on. If CONSOLE is a console, return windows only -on that console. If CONSOLE is a device, return windows only on that -device. If CONSOLE is a console type, return windows only on consoles -of that type. If CONSOLE is 'window-system, return any windows on any -window-system consoles. If CONSOLE is nil or omitted, return windows only -on WINDOW's console. Otherwise, all windows are considered. - -If you use consistent values for MINIBUF, ALL-FRAMES, and CONSOLE, you -can use `next-window' to iterate through the entire cycle of acceptable -windows, eventually ending up back at the window you started with. +By default, only the windows in the selected frame are considered. +The optional argument WHICH-FRAMES changes this behavior: +WHICH-FRAMES = `visible' means search windows on all visible frames. +WHICH-FRAMES = 0 means search windows on all visible and iconified frames. +WHICH-FRAMES = t means search windows on all frames including invisible frames. +WHICH-FRAMES = a frame means search only windows on that frame. +Anything else means restrict to the selected frame. + +The optional fourth argument WHICH-DEVICES further clarifies on which +devices to search for frames as specified by WHICH-FRAMES. This value +is only meaningful if WHICH-FRAMES is non-nil. +If nil or omitted, search all devices on the selected console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all window-system devices. +Any other non-nil value means search all devices. + +If you use consistent values for MINIBUF, WHICH-FRAMES, and WHICH-DEVICES, +you can use `next-window' to iterate through the entire cycle of +acceptable windows, eventually ending up back at the window you started with. `previous-window' traverses the same cycle, in the reverse order. */ - (window, minibuf, all_frames, console)) + (window, minibuf, which_frames, which_devices)) { Lisp_Object tem; Lisp_Object start_window; @@ -2167,25 +2175,25 @@ windows, eventually ending up back at the window you started with. lambda => count none of them or a specific minibuffer window (the active one) to count. */ - /* all_frames == nil doesn't specify which frames to include. */ - if (NILP (all_frames)) - all_frames = (! EQ (minibuf, Qlambda) + /* which_frames == nil doesn't specify which frames to include. */ + if (NILP (which_frames)) + which_frames = (! EQ (minibuf, Qlambda) ? (FRAME_MINIBUF_WINDOW (XFRAME (WINDOW_FRAME (XWINDOW (window))))) : Qnil); - else if (EQ (all_frames, Qvisible)) + else if (EQ (which_frames, Qvisible)) ; - else if (ZEROP (all_frames)) + else if (ZEROP (which_frames)) ; - else if (FRAMEP (all_frames) && ! EQ (all_frames, Fwindow_frame (window))) - /* If all_frames is a frame and window arg isn't on that frame, just + else if (FRAMEP (which_frames) && ! EQ (which_frames, Fwindow_frame (window))) + /* If which_frames is a frame and window arg isn't on that frame, just return the first window on the frame. */ - return frame_first_window (XFRAME (all_frames)); - else if (! EQ (all_frames, Qt)) - all_frames = Qnil; - /* Now `all_frames' is one of: + return frame_first_window (XFRAME (which_frames)); + else if (! EQ (which_frames, Qt)) + which_frames = Qnil; + /* Now `which_frames' is one of: t => search all frames nil => search just the current frame visible => search just visible frames @@ -2207,10 +2215,10 @@ windows, eventually ending up back at the window you started with. Which other frames are acceptable? */ tem = WINDOW_FRAME (XWINDOW (window)); - if (! NILP (all_frames)) + if (! NILP (which_frames)) { Lisp_Object tem1 = tem; - tem = next_frame (tem, all_frames, console); + tem = next_frame (tem, which_frames, which_devices); /* In the case where the minibuffer is active, and we include its frame as well as the selected one, @@ -2267,27 +2275,30 @@ too. Therefore, `previous-window' can be used to iterate through the set of windows even when the minibuffer is on another frame. If the minibuffer does not count, only windows from WINDOW's frame count. -Optional third arg ALL-FRAMES t means include windows on all frames. -ALL-FRAMES nil or omitted means cycle within the frames as specified -above. ALL-FRAMES = `visible' means include windows on all visible frames. -ALL-FRAMES = 0 means include windows on all visible and iconified frames. -If ALL-FRAMES is a frame, restrict search to windows on that frame. -Anything else means restrict to WINDOW's frame. - -Optional fourth arg CONSOLE controls which consoles or devices the -returned window may be on. If CONSOLE is a console, return windows only -on that console. If CONSOLE is a device, return windows only on that -device. If CONSOLE is a console type, return windows only on consoles -of that type. If CONSOLE is 'window-system, return any windows on any -window-system consoles. If CONSOLE is nil or omitted, return windows only -on WINDOW's console. Otherwise, all windows are considered. - -If you use consistent values for MINIBUF, ALL-FRAMES, and CONSOLE, you -can use `previous-window' to iterate through the entire cycle of acceptable -windows, eventually ending up back at the window you started with. +By default, only the windows in the selected frame are considered. +The optional argument WHICH-FRAMES changes this behavior: +WHICH-FRAMES = `visible' means search windows on all visible frames. +WHICH-FRAMES = 0 means search windows on all visible and iconified frames. +WHICH-FRAMES = t means search windows on all frames including invisible frames. +WHICH-FRAMES = a frame means search only windows on that frame. +Anything else means restrict to the selected frame. + +The optional fourth argument WHICH-DEVICES further clarifies on which +devices to search for frames as specified by WHICH-FRAMES. This value +is only meaningful if WHICH-FRAMES is non-nil. +If nil or omitted, search all devices on the selected console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all window-system devices. +Any other non-nil value means search all devices. + +If you use consistent values for MINIBUF, WHICH-FRAMES, and WHICH-DEVICES, +you can use `previous-window' to iterate through the entire cycle of +acceptable windows, eventually ending up back at the window you started with. `next-window' traverses the same cycle, in the reverse order. */ - (window, minibuf, all_frames, console)) + (window, minibuf, which_frames, devices)) { Lisp_Object tem; Lisp_Object start_window; @@ -2310,26 +2321,26 @@ windows, eventually ending up back at the window you started with. lambda => count none of them or a specific minibuffer window (the active one) to count. */ - /* all_frames == nil doesn't specify which frames to include. + /* which_frames == nil doesn't specify which frames to include. Decide which frames it includes. */ - if (NILP (all_frames)) - all_frames = (! EQ (minibuf, Qlambda) + if (NILP (which_frames)) + which_frames = (! EQ (minibuf, Qlambda) ? (FRAME_MINIBUF_WINDOW (XFRAME (WINDOW_FRAME (XWINDOW (window))))) : Qnil); - else if (EQ (all_frames, Qvisible)) + else if (EQ (which_frames, Qvisible)) ; - else if (ZEROP (all_frames)) + else if (ZEROP (which_frames)) ; - else if (FRAMEP (all_frames) && ! EQ (all_frames, Fwindow_frame (window))) - /* If all_frames is a frame and window arg isn't on that frame, just + else if (FRAMEP (which_frames) && ! EQ (which_frames, Fwindow_frame (window))) + /* If which_frames is a frame and window arg isn't on that frame, just return the first window on the frame. */ - return frame_first_window (XFRAME (all_frames)); - else if (! EQ (all_frames, Qt)) - all_frames = Qnil; - /* Now `all_frames' is one of: + return frame_first_window (XFRAME (which_frames)); + else if (! EQ (which_frames, Qt)) + which_frames = Qnil; + /* Now `which_frames' is one of: t => search all frames nil => search just the current frame visible => search just visible frames @@ -2351,7 +2362,7 @@ windows, eventually ending up back at the window you started with. Which frames are acceptable? */ tem = WINDOW_FRAME (XWINDOW (window)); - if (! NILP (all_frames)) + if (! NILP (which_frames)) /* It's actually important that we use previous_frame here, rather than next_frame. All the windows acceptable according to the given parameters should form a ring; @@ -2363,7 +2374,7 @@ windows, eventually ending up back at the window you started with. met. */ { Lisp_Object tem1 = tem; - tem = previous_frame (tem, all_frames, console); + tem = previous_frame (tem, which_frames, devices); /* In the case where the minibuffer is active, and we include its frame as well as the selected one, next_frame may get stuck in that frame. @@ -2462,43 +2473,46 @@ Return the next window which is vertically after WINDOW. } DEFUN ("other-window", Fother_window, 1, 3, "p", /* -Select the N'th different window on this frame. +Select the COUNT'th different window on this frame. All windows on current frame are arranged in a cyclic order. -This command selects the window N steps away in that order. -A negative N moves in the opposite order. - -If optional argument FRAME is `visible', search all visible frames. -If FRAME is 0, search all visible and iconified frames. -If FRAME is t, search all frames. -If FRAME is nil, search only the selected frame. -If FRAME is a frame, search only that frame. - -Optional third argument CONSOLE controls which consoles or devices the -returned window may be on. If CONSOLE is a console, return windows only -on that console. If CONSOLE is a device, return windows only on that -device. If CONSOLE is a console type, return windows only on consoles -of that type. If CONSOLE is 'window-system, return any windows on any -window-system consoles. If CONSOLE is nil or omitted, return windows only -on FRAME'S console, or on the selected console if FRAME is not a frame. -Otherwise, all windows are considered. +This command selects the window COUNT steps away in that order. +A negative COUNT moves in the opposite order. + +By default, only the windows in the selected frame are considered. +The optional argument WHICH-FRAMES changes this behavior: +WHICH-FRAMES = `visible' means search windows on all visible frames. +WHICH-FRAMES = 0 means search windows on all visible and iconified frames. +WHICH-FRAMES = t means search windows on all frames including invisible frames. +WHICH-FRAMES = a frame means search only windows on that frame. +Anything else means restrict to the selected frame. + +The optional argument WHICH-DEVICES further clarifies on which devices +to search for frames as specified by WHICH-FRAMES. This value is only +meaningful if WHICH-FRAMES is non-nil. +If nil or omitted, search all devices on the selected console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all window-system devices. +Any other non-nil value means search all devices. */ - (n, frame, console)) + (count, which_frames, which_devices)) { int i; Lisp_Object w; - CHECK_INT (n); + CHECK_INT (count); w = Fselected_window (Qnil); - i = XINT (n); + i = XINT (count); while (i > 0) { - w = Fnext_window (w, Qnil, frame, console); + w = Fnext_window (w, Qnil, which_frames, which_devices); i--; } while (i < 0) { - w = Fprevious_window (w, Qnil, frame, console); + w = Fprevious_window (w, Qnil, which_frames, which_devices); i++; } Fselect_window (w, Qnil); @@ -2531,9 +2545,9 @@ static Lisp_Object window_loop (enum window_loop type, Lisp_Object obj, int mini, - Lisp_Object frames, + Lisp_Object which_frames, int dedicated_too, - Lisp_Object console) + Lisp_Object which_devices) { /* This function can GC if type == DELETE_BUFFER_WINDOWS or UNSHOW_BUFFER */ Lisp_Object w; @@ -2552,9 +2566,9 @@ window_loop (enum window_loop type, /* If we're only looping through windows on a particular frame, FRAME points to that frame. If we're looping through windows on all frames, FRAME is 0. */ - if (FRAMEP (frames)) - frame = XFRAME (frames); - else if (NILP (frames)) + if (FRAMEP (which_frames)) + frame = XFRAME (which_frames); + else if (NILP (which_frames)) frame = selected_frame (); else frame = 0; @@ -2564,10 +2578,10 @@ window_loop (enum window_loop type, or Qt otherwise. */ if (frame) frame_arg = Qlambda; - else if (ZEROP (frames)) - frame_arg = frames; - else if (EQ (frames, Qvisible)) - frame_arg = frames; + else if (ZEROP (which_frames)) + frame_arg = which_frames; + else if (EQ (which_frames, Qvisible)) + frame_arg = which_frames; DEVICE_LOOP_NO_BREAK (devcons, concons) { @@ -2582,10 +2596,10 @@ window_loop (enum window_loop type, if (NILP (the_frame)) continue; - if (!device_matches_console_spec (device, - NILP (console) ? - FRAME_CONSOLE (XFRAME (the_frame)) : - console)) + if (!device_matches_device_spec (device, + NILP (which_devices) ? + FRAME_CONSOLE (XFRAME (the_frame)) : + which_devices)) continue; /* Pick a window to start with. */ @@ -2855,31 +2869,35 @@ buffer_window_mru (struct window *w) DEFUN ("get-lru-window", Fget_lru_window, 0, 2, 0, /* Return the window least recently selected or used for display. -If optional argument FRAME is `visible', search all visible frames. -If FRAME is 0, search all visible and iconified frames. -If FRAME is t, search all frames. -If FRAME is nil, search only the selected frame. -If FRAME is a frame, search only that frame. - -Optional second argument CONSOLE controls which consoles or devices the -returned window may be on. If CONSOLE is a console, return windows only -on that console. If CONSOLE is a device, return windows only on that -device. If CONSOLE is a console type, return windows only on consoles -of that type. If CONSOLE is 'window-system, return any windows on any -window-system consoles. If CONSOLE is nil or omitted, return windows only -on FRAME'S console, or on the selected console if FRAME is not a frame. -Otherwise, all windows are considered. + +By default, only the windows in the selected frame are considered. +The optional argument WHICH-FRAMES changes this behavior: +If optional argument WHICH-FRAMES is `visible', search all visible frames. +If WHICH-FRAMES is 0, search all visible and iconified frames. +If WHICH-FRAMES is t, search all frames. +If WHICH-FRAMES is nil, search only the selected frame. +If WHICH-FRAMES is a frame, search only that frame. + +The optional argument WHICH-DEVICES further clarifies on which devices +to search for frames as specified by WHICH-FRAMES. This value is only +meaningful if WHICH-FRAMES is non-nil. +If nil or omitted, search all devices on the selected console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all devices on window-system consoles. +Any other non-nil value means search all devices. */ - (frame, console)) + (which_frames, which_devices)) { Lisp_Object w; /* First try for a non-dedicated window that is full-width */ - w = window_loop (GET_LRU_WINDOW, Qt, 0, frame, 0, console); + w = window_loop (GET_LRU_WINDOW, Qt, 0, which_frames, 0, which_devices); if (!NILP (w) && !EQ (w, Fselected_window (Qnil))) return w; /* Then try for any non-dedicated window */ - w = window_loop (GET_LRU_WINDOW, Qnil, 0, frame, 0, console); + w = window_loop (GET_LRU_WINDOW, Qnil, 0, which_frames, 0, which_devices); if (!NILP (w) && !EQ (w, Fselected_window (Qnil))) return w; @@ -2889,12 +2907,12 @@ Otherwise, all windows are considered. shit is so disgusting and awful that it needs to be rethought from scratch. */ /* then try for a dedicated window that is full-width */ - w = window_loop (GET_LRU_WINDOW, Qt, 0, frame, 1, console); + w = window_loop (GET_LRU_WINDOW, Qt, 0, which_frames, 1, which_devices); if (!NILP (w) && !EQ (w, Fselected_window (Qnil))) return w; /* If none of them, then all windows, dedicated or not. */ - w = window_loop (GET_LRU_WINDOW, Qnil, 0, frame, 1, console); + w = window_loop (GET_LRU_WINDOW, Qnil, 0, which_frames, 1, which_devices); /* At this point we damn well better have found something. */ if (NILP (w)) abort (); @@ -2905,52 +2923,62 @@ Otherwise, all windows are considered. DEFUN ("get-largest-window", Fget_largest_window, 0, 2, 0, /* Return the window largest in area. -If optional argument FRAME is `visible', search all visible frames. -If FRAME is 0, search all visible and iconified frames. -If FRAME is t, search all frames. -If FRAME is nil, search only the selected frame. -If FRAME is a frame, search only that frame. - -Optional second argument CONSOLE controls which consoles or devices the -returned window may be on. If CONSOLE is a console, return windows only -on that console. If CONSOLE is a device, return windows only on that -device. If CONSOLE is a console type, return windows only on consoles -of that type. If CONSOLE is 'window-system, return any windows on any -window-system consoles. If CONSOLE is nil or omitted, return windows only -on FRAME'S console, or on the selected console if FRAME is not a frame. -Otherwise, all windows are considered. + +By default, only the windows in the selected frame are considered. +The optional argument WHICH-FRAMES changes this behavior: +If optional argument WHICH-FRAMES is `visible', search all visible frames. +If WHICH-FRAMES is 0, search all visible and iconified frames. +If WHICH-FRAMES is t, search all frames. +If WHICH-FRAMES is nil, search only the selected frame. +If WHICH-FRAMES is a frame, search only that frame. + +The optional argument WHICH-DEVICES further clarifies on which devices +to search for frames as specified by WHICH-FRAMES. This value is only +meaningful if WHICH-FRAMES is non-nil. +If nil or omitted, search all devices on the selected console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all devices on window-system consoles. +Any other non-nil value means search all devices. */ - (frame, console)) + (which_frames, which_devices)) { /* Don't search dedicated windows because FSFmacs doesn't. This stuff is all black magic so don't try to apply common sense to it. */ - return window_loop (GET_LARGEST_WINDOW, Qnil, 0, frame, 0, console); + return window_loop (GET_LARGEST_WINDOW, Qnil, 0, + which_frames, 0, which_devices); } DEFUN ("get-buffer-window", Fget_buffer_window, 1, 3, 0, /* Return a window currently displaying BUFFER, or nil if none. -If optional argument FRAME is `visible', search all visible frames. -If optional argument FRAME is 0, search all visible and iconified frames. -If FRAME is t, search all frames. -If FRAME is nil, search only the selected frame. -If FRAME is a frame, search only that frame. - -Optional third argument CONSOLE controls which consoles or devices the -returned window may be on. If CONSOLE is a console, return windows only -on that console. If CONSOLE is a device, return windows only on that -device. If CONSOLE is a console type, return windows only on consoles -of that type. If CONSOLE is 'window-system, return any windows on any -window-system consoles. If CONSOLE is nil or omitted, return windows only -on FRAME'S console, or on the selected console if FRAME is not a frame. -Otherwise, all windows are considered. + +By default, only the windows in the selected frame are considered. +The optional argument WHICH-FRAMES changes this behavior: +If optional argument WHICH-FRAMES is `visible', search all visible frames. +If WHICH-FRAMES is 0, search all visible and iconified frames. +If WHICH-FRAMES is t, search all frames. +If WHICH-FRAMES is nil, search only the selected frame. +If WHICH-FRAMES is a frame, search only that frame. + +The optional argument WHICH-DEVICES further clarifies on which devices +to search for frames as specified by WHICH-FRAMES. This value is only +meaningful if WHICH-FRAMES is non-nil. +If nil or omitted, search all devices on the selected console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all devices on window-system consoles. +Any other non-nil value means search all devices. */ - (buffer, frame, console)) + (buffer, which_frames, which_devices)) { buffer = Fget_buffer (buffer); if (BUFFERP (buffer)) /* Search dedicated windows too. (Doesn't matter here anyway.) */ - return window_loop (GET_BUFFER_WINDOW, buffer, 1, frame, 1, console); + return window_loop (GET_BUFFER_WINDOW, buffer, 1, + which_frames, 1, which_devices); else return Qnil; } @@ -3033,53 +3061,81 @@ value is reasonable when this function is called. DEFUN ("delete-windows-on", Fdelete_windows_on, 1, 3, "bDelete windows on (buffer): ", /* Delete all windows showing BUFFER. -Optional second argument FRAME controls which frames are affected. + +Optional second argument WHICH-FRAMES controls which frames are affected. If nil or omitted, delete all windows showing BUFFER in any frame. If t, delete only windows showing BUFFER in the selected frame. If `visible', delete all windows showing BUFFER in any visible frame. If a frame, delete only windows showing BUFFER in that frame. - -Optional third argument CONSOLE controls which consoles or devices the -returned window may be on. If CONSOLE is a console, return windows only -on that console. If CONSOLE is a device, return windows only on that -device. If CONSOLE is a console type, return windows only on consoles -of that type. If CONSOLE is 'window-system, return any windows on any -window-system consoles. If CONSOLE is nil or omitted, return windows only -on FRAME'S console, or on the selected console if FRAME is not a frame. -Otherwise, all windows are considered. +Warning: WHICH-FRAMES has the same meaning as with `next-window', +except that the meanings of nil and t are reversed. + +The optional third argument WHICH-DEVICES further clarifies on which +devices to search for frames as specified by WHICH-FRAMES. This value +is only meaningful if WHICH-FRAMES is not t. +If nil or omitted, search only the selected console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all devices on a window system. +Any other non-nil value means search all devices. */ - (buffer, frame, console)) + (buffer, which_frames, which_devices)) { /* This function can GC */ - /* FRAME uses t and nil to mean the opposite of what window_loop - expects. */ - if (!FRAMEP (frame)) - frame = NILP (frame) ? Qt : Qnil; + buffer = Fget_buffer (buffer); + CHECK_BUFFER (buffer); - if (!NILP (buffer)) - { - buffer = Fget_buffer (buffer); - CHECK_BUFFER (buffer); - /* Ignore dedicated windows. */ - window_loop (DELETE_BUFFER_WINDOWS, buffer, 0, frame, 0, console); - } + /* WHICH-FRAMES values t and nil mean the opposite of what + window_loop expects. */ + if (EQ (which_frames, Qnil)) + which_frames = Qt; + else if (EQ (which_frames, Qt)) + which_frames = Qnil; + + /* Ignore dedicated windows. */ + window_loop (DELETE_BUFFER_WINDOWS, buffer, 0, + which_frames, 0, which_devices); return Qnil; } -DEFUN ("replace-buffer-in-windows", Freplace_buffer_in_windows, 1, 1, +DEFUN ("replace-buffer-in-windows", Freplace_buffer_in_windows, 1, 3, "bReplace buffer in windows: ", /* Replace BUFFER with some other buffer in all windows showing it. + +Optional second argument WHICH-FRAMES controls which frames are affected. +If nil or omitted, all frames are affected. +If t, only the selected frame is affected. +If `visible', all visible frames are affected. +If a frame, only that frame is affected. +Warning: WHICH-FRAMES has the same meaning as with `next-window', +except that the meanings of nil and t are reversed. + +The optional third argument WHICH-DEVICES further clarifies on which +devices to search for frames as specified by WHICH-FRAMES. This value +is only meaningful if WHICH-FRAMES is not t. +If nil or omitted, search only the selected console. +If a device, only search that device. +If a console, search all devices on that console. +If a device type, search all devices of that type. +If `window-system', search all devices on a window system. +Any other non-nil value means search all devices. */ - (buffer)) + (buffer, which_frames, which_devices)) { /* This function can GC */ - if (!NILP (buffer)) - { - buffer = Fget_buffer (buffer); - CHECK_BUFFER (buffer); - /* Ignore dedicated windows. */ - window_loop (UNSHOW_BUFFER, buffer, 0, Qt, 0, Qnil); - } + buffer = Fget_buffer (buffer); + CHECK_BUFFER (buffer); + + /* WHICH-FRAMES values t and nil mean the opposite of what + window_loop expects. */ + if (EQ (which_frames, Qnil)) + which_frames = Qt; + else if (EQ (which_frames, Qt)) + which_frames = Qnil; + + /* Ignore dedicated windows. */ + window_loop (UNSHOW_BUFFER, buffer, 0, which_frames, 0, which_devices); return Qnil; } @@ -3530,16 +3586,16 @@ make_dummy_parent (Lisp_Object window) DEFUN ("split-window", Fsplit_window, 0, 3, "", /* Split WINDOW, putting SIZE lines in the first of the pair. -WINDOW defaults to selected one and SIZE to half its size. +WINDOW defaults to the selected one and SIZE to half its size. If optional third arg HORFLAG is non-nil, split side by side and put SIZE columns in the first of the pair. */ - (window, chsize, horflag)) + (window, size, horflag)) { Lisp_Object new; struct window *o, *p; struct frame *f; - int size; + int csize; int psize; if (NILP (window)) @@ -3550,29 +3606,29 @@ and put SIZE columns in the first of the pair. o = XWINDOW (window); f = XFRAME (WINDOW_FRAME (o)); - if (NILP (chsize)) + if (NILP (size)) { if (!NILP (horflag)) /* In the new scheme, we are symmetric with respect to separators so there is no need to do weird things here. */ { psize = WINDOW_WIDTH (o) >> 1; - size = window_pixel_width_to_char_width (o, psize, 0); + csize = window_pixel_width_to_char_width (o, psize, 0); } else { psize = WINDOW_HEIGHT (o) >> 1; - size = window_pixel_height_to_char_height (o, psize, 1); + csize = window_pixel_height_to_char_height (o, psize, 1); } } else { - CHECK_INT (chsize); - size = XINT (chsize); + CHECK_INT (size); + csize = XINT (size); if (!NILP (horflag)) - psize = window_char_width_to_pixel_width (o, size, 0); + psize = window_char_width_to_pixel_width (o, csize, 0); else - psize = window_char_height_to_pixel_height (o, size, 1); + psize = window_char_height_to_pixel_height (o, csize, 1); } if (MINI_WINDOW_P (o)) @@ -3584,11 +3640,11 @@ and put SIZE columns in the first of the pair. if (NILP (horflag)) { - if (size < window_min_height) - error ("Window height %d too small (after splitting)", size); - if (size + window_min_height > window_char_height (o, 1)) + if (csize < window_min_height) + error ("Window height %d too small (after splitting)", csize); + if (csize + window_min_height > window_char_height (o, 1)) error ("Window height %d too small (after splitting)", - window_char_height (o, 1) - size); + window_char_height (o, 1) - csize); if (NILP (o->parent) || NILP (XWINDOW (o->parent)->vchild)) { @@ -3601,11 +3657,11 @@ and put SIZE columns in the first of the pair. } else { - if (size < window_min_width) - error ("Window width %d too small (after splitting)", size); - if (size + window_min_width > window_char_width (o, 0)) + if (csize < window_min_width) + error ("Window width %d too small (after splitting)", csize); + if (csize + window_min_width > window_char_width (o, 0)) error ("Window width %d too small (after splitting)", - window_char_width (o, 0) - size); + window_char_width (o, 0) - csize); if (NILP (o->parent) || NILP (XWINDOW (o->parent)->hchild)) { @@ -3667,58 +3723,54 @@ and put SIZE columns in the first of the pair. DEFUN ("enlarge-window", Fenlarge_window, 1, 3, "_p", /* -Make the selected window N lines bigger. -From program, optional second arg SIDE non-nil means grow sideways N columns, -and optional third arg WINDOW specifies the window to change instead of the -selected window. +Make the selected window COUNT lines taller. +From program, optional second arg HORIZONTALP non-nil means grow +sideways COUNT columns, and optional third arg WINDOW specifies the +window to change instead of the selected window. */ - (n, side, window)) + (count, horizontalp, window)) { - struct window *w = decode_window (window); - CHECK_INT (n); - change_window_height (w, XINT (n), !NILP (side), /* inpixels */ 0); + CHECK_INT (count); + change_window_height (window, XINT (count), horizontalp, /* inpixels */ 0); return Qnil; } DEFUN ("enlarge-window-pixels", Fenlarge_window_pixels, 1, 3, "_p", /* -Make the selected window N pixels bigger. -From program, optional second arg SIDE non-nil means grow sideways N pixels, -and optional third arg WINDOW specifies the window to change instead of the -selected window. +Make the selected window COUNT pixels taller. +From program, optional second arg HORIZONTALP non-nil means grow +sideways COUNT pixels, and optional third arg WINDOW specifies the +window to change instead of the selected window. */ - (n, side, window)) + (count, horizontalp, window)) { - struct window *w = decode_window (window); - CHECK_INT (n); - change_window_height (w, XINT (n), !NILP (side), /* inpixels */ 1); + CHECK_INT (count); + change_window_height (window, XINT (count), horizontalp, /* inpixels */ 1); return Qnil; } DEFUN ("shrink-window", Fshrink_window, 1, 3, "_p", /* -Make the selected window N lines smaller. -From program, optional second arg SIDE non-nil means shrink sideways N columns, -and optional third arg WINDOW specifies the window to change instead of the -selected window. +Make the selected window COUNT lines shorter. +From program, optional second arg HORIZONTALP non-nil means shrink +sideways COUNT columns, and optional third arg WINDOW specifies the +window to change instead of the selected window. */ - (n, side, window)) + (count, horizontalp, window)) { - CHECK_INT (n); - change_window_height (decode_window (window), -XINT (n), !NILP (side), - /* inpixels */ 0); + CHECK_INT (count); + change_window_height (window, -XINT (count), horizontalp, /* inpixels */ 0); return Qnil; } DEFUN ("shrink-window-pixels", Fshrink_window_pixels, 1, 3, "_p", /* -Make the selected window N pixels smaller. -From program, optional second arg SIDE non-nil means shrink sideways N pixels, -and optional third arg WINDOW specifies the window to change instead of the -selected window. +Make the selected window COUNT pixels smaller. +From program, optional second arg HORIZONTALP non-nil means shrink +sideways COUNT pixels, and optional third arg WINDOW specifies the +window to change instead of the selected window. */ - (n, side, window)) + (count, horizontalp, window)) { - CHECK_INT (n); - change_window_height (decode_window (window), -XINT (n), !NILP (side), - /* inpixels */ 1); + CHECK_INT (count); + change_window_height (window, -XINT (count), horizontalp, /* inpixels */ 1); return Qnil; } @@ -3963,11 +4015,12 @@ window_pixheight (Lisp_Object w) keep everything consistent. */ static void -change_window_height (struct window *win, int delta, int widthflag, +change_window_height (Lisp_Object window, int delta, Lisp_Object horizontalp, int inpixels) { + struct window *win = decode_window (window); + int widthflag = !NILP (horizontalp); Lisp_Object parent; - Lisp_Object window; struct window *w; struct frame *f; int *sizep; @@ -4119,10 +4172,11 @@ change_window_height (struct window *win, int delta, int widthflag, -/* Scroll contents of window WINDOW up N lines. If N < (top line height / - average line height) then we just adjust the top clip. */ +/* Scroll contents of window WINDOW up COUNT lines. + If COUNT < (top line height / average line height) then we just adjust + the top clip. */ void -window_scroll (Lisp_Object window, Lisp_Object n, int direction, +window_scroll (Lisp_Object window, Lisp_Object count, int direction, Error_behavior errb) { struct window *w = XWINDOW (window); @@ -4166,14 +4220,14 @@ window_scroll (Lisp_Object window, Lisp_Object n, int direction, MARK_WINDOWS_CHANGED (w); } - if (!NILP (n)) + if (!NILP (count)) { - if (EQ (n, Qminus)) + if (EQ (count, Qminus)) direction *= -1; else { - n = Fprefix_numeric_value (n); - value = XINT (n) * direction; + count = Fprefix_numeric_value (count); + value = XINT (count) * direction; if (!value) return; /* someone just made a pointless call */ @@ -4182,7 +4236,7 @@ window_scroll (Lisp_Object window, Lisp_Object n, int direction, /* If the user didn't specify how far to scroll then we have to figure it out by ourselves. */ - if (NILP (n) || EQ (n, Qminus)) + if (NILP (count) || EQ (count, Qminus)) { /* Going forwards is easy. If that is what we are doing then just set value and the section which handles the user specifying a @@ -4404,32 +4458,32 @@ window_scroll (Lisp_Object window, Lisp_Object n, int direction, } DEFUN ("scroll-up", Fscroll_up, 0, 1, "_P", /* -Scroll text of current window upward N lines; or near full screen if no arg. +Scroll text of current window up COUNT lines; or near full screen if no arg. A near full screen is `next-screen-context-lines' less than a full screen. -Negative N means scroll downward. +Negative COUNT means scroll downward. When calling from a program, supply an integer as argument or nil. On attempt to scroll past end of buffer, `end-of-buffer' is signaled. On attempt to scroll past beginning of buffer, `beginning-of-buffer' is signaled. */ - (n)) + (count)) { - window_scroll (Fselected_window (Qnil), n, 1, ERROR_ME); + window_scroll (Fselected_window (Qnil), count, 1, ERROR_ME); return Qnil; } DEFUN ("scroll-down", Fscroll_down, 0, 1, "_P", /* -Scroll text of current window downward N lines; or near full screen if no arg. +Scroll text of current window down COUNT lines; or near full screen if no arg. A near full screen is `next-screen-context-lines' less than a full screen. -Negative N means scroll upward. +Negative COUNT means scroll upward. When calling from a program, supply a number as argument or nil. On attempt to scroll past end of buffer, `end-of-buffer' is signaled. On attempt to scroll past beginning of buffer, `beginning-of-buffer' is signaled. */ - (n)) + (count)) { - window_scroll (Fselected_window (Qnil), n, -1, ERROR_ME); + window_scroll (Fselected_window (Qnil), count, -1, ERROR_ME); return Qnil; } @@ -4479,9 +4533,9 @@ showing that buffer is used. } DEFUN ("scroll-other-window", Fscroll_other_window, 0, 1, "_P", /* -Scroll next window upward N lines; or near full frame if no arg. +Scroll next window upward COUNT lines; or near full frame if no arg. The next window is the one below the current one; or the one at the top -if the current one is at the bottom. Negative N means scroll downward. +if the current one is at the bottom. Negative COUNT means scroll downward. When calling from a program, supply a number as argument or nil. If in the minibuffer, `minibuffer-scroll-window' if non-nil @@ -4489,40 +4543,40 @@ specifies the window to scroll. If `other-window-scroll-buffer' is non-nil, scroll the window showing that buffer, popping the buffer up if necessary. */ - (n)) + (count)) { - window_scroll (Fother_window_for_scrolling (), n, 1, ERROR_ME); + window_scroll (Fother_window_for_scrolling (), count, 1, ERROR_ME); return Qnil; } DEFUN ("scroll-left", Fscroll_left, 0, 1, "_P", /* -Scroll selected window display N columns left. -Default for N is window width minus 2. +Scroll selected window display COUNT columns left. +Default for COUNT is window width minus 2. */ - (n)) + (count)) { Lisp_Object window = Fselected_window (Qnil); struct window *w = XWINDOW (window); - int count = (NILP (n) ? - window_char_width (w, 0) - 2 : - XINT (Fprefix_numeric_value (n))); + int n = (NILP (count) ? + window_char_width (w, 0) - 2 : + XINT (Fprefix_numeric_value (count))); - return Fset_window_hscroll (window, make_int (w->hscroll + count)); + return Fset_window_hscroll (window, make_int (w->hscroll + n)); } DEFUN ("scroll-right", Fscroll_right, 0, 1, "_P", /* -Scroll selected window display N columns right. -Default for N is window width minus 2. +Scroll selected window display COUNT columns right. +Default for COUNT is window width minus 2. */ - (n)) + (count)) { Lisp_Object window = Fselected_window (Qnil); struct window *w = XWINDOW (window); - int count = (NILP (n) ? - window_char_width (w, 0) - 2 : - XINT (Fprefix_numeric_value (n))); + int n = (NILP (count) ? + window_char_width (w, 0) - 2 : + XINT (Fprefix_numeric_value (count))); - return Fset_window_hscroll (window, make_int (w->hscroll - count)); + return Fset_window_hscroll (window, make_int (w->hscroll - n)); } DEFUN ("center-to-window-line", Fcenter_to_window_line, 0, 2, "_P", /* @@ -5050,9 +5104,9 @@ window_config_equal (Lisp_Object conf1, Lisp_Object conf2) DEFUN ("window-configuration-p", Fwindow_configuration_p, 1, 1, 0, /* Return t if OBJECT is a window-configuration object. */ - (obj)) + (object)) { - return WINDOW_CONFIGURATIONP (obj) ? Qt : Qnil; + return WINDOW_CONFIGURATIONP (object) ? Qt : Qnil; } static int @@ -5729,8 +5783,9 @@ DEFUN ("current-window-configuration", Fcurrent_window_configuration, 0, 1, 0, / Return an object representing the current window configuration of FRAME. If FRAME is nil or omitted, use the selected frame. This describes the number of windows, their sizes and current buffers, -and for each displayed buffer, where display starts, and the positions of -point and mark. An exception is made for point in the current buffer: +and for each window on FRAME the displayed buffer, where display +starts, and the positions of point and mark. +An exception is made for point in the current buffer: its value is -not- saved. */ (frame)) @@ -6136,7 +6191,7 @@ This is a specifier; use `set-specifier' to change it. set_specifier_caching (Vmodeline_shadow_thickness, offsetof (struct window, modeline_shadow_thickness), modeline_shadow_thickness_changed, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("has-modeline-p", &Vhas_modeline_p /* *Whether the modeline should be displayed. @@ -6152,7 +6207,7 @@ This is a specifier; use `set-specifier' to change it. has changed, but not one to indicate that the modeline has been turned off or on. */ some_window_value_changed, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("vertical-divider-always-visible-p", &Vvertical_divider_always_visible_p /* @@ -6171,7 +6226,7 @@ This is a specifier; use `set-specifier' to change it. offsetof (struct window, vertical_divider_always_visible_p), vertical_divider_changed_in_window, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("vertical-divider-shadow-thickness", &Vvertical_divider_shadow_thickness /* *How thick to draw 3D shadows around vertical dividers. @@ -6186,7 +6241,7 @@ This is a specifier; use `set-specifier' to change it. offsetof (struct window, vertical_divider_shadow_thickness), vertical_divider_changed_in_window, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("vertical-divider-line-width", &Vvertical_divider_line_width /* *The width of the vertical dividers, not including shadows. @@ -6217,7 +6272,7 @@ This is a specifier; use `set-specifier' to change it. offsetof (struct window, vertical_divider_line_width), vertical_divider_changed_in_window, - 0, 0); + 0, 0, 0); DEFVAR_SPECIFIER ("vertical-divider-spacing", &Vvertical_divider_spacing /* *How much space to leave around the vertical dividers. @@ -6246,5 +6301,5 @@ This is a specifier; use `set-specifier' to change it. set_specifier_caching (Vvertical_divider_spacing, offsetof (struct window, vertical_divider_spacing), vertical_divider_changed_in_window, - 0, 0); + 0, 0, 0); } diff --git a/src/window.h b/src/window.h index 15ce2b3..b72ec92 100644 --- a/src/window.h +++ b/src/window.h @@ -310,7 +310,7 @@ DECLARE_LRECORD (window_configuration, struct window_config); EXFUN (Fget_buffer_window, 3); EXFUN (Fmove_to_window_line, 2); EXFUN (Frecenter, 2); -EXFUN (Freplace_buffer_in_windows, 1); +EXFUN (Freplace_buffer_in_windows, 3); EXFUN (Fselect_window, 2); EXFUN (Fselected_window, 1); EXFUN (Fset_window_buffer, 3); diff --git a/tests/ChangeLog b/tests/ChangeLog index e435bb2..4accfc3 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,39 @@ +2000-11-14 Martin Buchholz + + * XEmacs 21.2.37 is released. + +2000-11-09 Yoshiki Hayashi + + * automated/lisp-test.el: More format tests. + +2000-11-10 Yoshiki Hayashi + + * automated/ccl-tests.el (ccl-test-simple-read-and-write): + (ccl-test-read-write-multibyte-character): Use make-char + for non MULE XEmacs. + +2000-10-15 MIYASHITA Hisashi + + * automated/ccl-tests.el: New file. + +2000-10-30 Yoshiki Hayashi + + * automated/lisp-test.el: Add test for format. + +2000-10-13 Yoshiki Hayashi + + * automated/byte-compiler-test.el: Add optimization test for + byte-after-unbind-ops. + +2000-10-13 Yoshiki Hayashi + + * automated/hash-table-test.el: Make new cons cell for + equal and not eq object. + +2000-10-03 Yoshiki Hayashi + + * automated/lisp-test.el: Add replace-match test. + 2000-10-04 Martin Buchholz * XEmacs 21.2.36 is released. diff --git a/tests/automated/byte-compiler-tests.el b/tests/automated/byte-compiler-tests.el index 21c110f..11f355a 100644 --- a/tests/automated/byte-compiler-tests.el +++ b/tests/automated/byte-compiler-tests.el @@ -118,3 +118,102 @@ (before-and-after-compile-equal (- 3)) (before-and-after-compile-equal (- simplyamarker 1)) (before-and-after-compile-equal (- simplyamarker)) + +;; byte-after-unbind-ops + +;; byte-constant +;; byte-dup + +;; byte-symbolp +(before-and-after-compile-equal + (let ((x 's)) + (unwind-protect + (symbolp x) + (setq x 1)))) + +;; byte-consp +(before-and-after-compile-equal + (let ((x '(a b))) + (unwind-protect + (consp x) + (setq x 1)))) + +;; byte-stringp +(before-and-after-compile-equal + (let ((x "a")) + (unwind-protect + (stringp x) + (setq x 1)))) + +;; byte-listp +(before-and-after-compile-equal + (let ((x '(a b c))) + (unwind-protect + (listp x) + (setq x 1)))) + +;; byte-numberp +(before-and-after-compile-equal + (let ((x 1)) + (unwind-protect + (numberp x) + (setq x nil)))) + +;; byte-integerp +(before-and-after-compile-equal + (let ((x 1)) + (unwind-protect + (integerp x) + (setq x nil)))) + +;; byte-equal +(before-and-after-compile-equal + (let ((x 'a) + (y 'a)) + (unwind-protect + (eq x y) + (setq x 'c)))) + +;; byte-not +(before-and-after-compile-equal + (let (x) + (unwind-protect + (not x) + (setq x t)))) + +;; byte-cons +(before-and-after-compile-equal + (equal '(1 . 2) + (let ((x 1) + (y 2)) + (unwind-protect + (cons x y) + (setq x t))))) + +;; byte-list1 +(before-and-after-compile-equal + (equal '(1) + (let ((x 1)) + (unwind-protect + (list x) + (setq x t))))) + +;; byte-list2 +(before-and-after-compile-equal + (equal '(1 . 2) + (let ((x 1) + (y 2)) + (unwind-protect + (list x y) + (setq x t))))) + +;; byte-interactive-p + +;; byte-equal +(before-and-after-compile-equal + (let (x y) + (setq x '(1 . 2)) + (setq y '(1 . 2)) + (unwind-protect + (equal x y) + (setq y '(1 . 3))))) diff --git a/tests/automated/hash-table-tests.el b/tests/automated/hash-table-tests.el index 8aba946..1c8af88 100644 --- a/tests/automated/hash-table-tests.el +++ b/tests/automated/hash-table-tests.el @@ -164,13 +164,13 @@ (dotimes (j iterations) (puthash (+ one 0.0) t ht) (puthash (+ two 0.0) t ht) - (puthash (concat "1" "2") t ht) - (puthash (concat "3" "4") t ht)) + (puthash (cons 1 2) t ht) + (puthash (cons 3 4) t ht)) (Assert (eq (hashtable-test-function ht) 'eq)) (Assert (eq (hash-table-test ht) 'eq)) (Assert (= (* iterations 4) (hash-table-count ht))) (Assert (eq nil (gethash 1.0 ht))) - (Assert (eq nil (gethash "12" ht))) + (Assert (eq nil (gethash '(1 . 2) ht))) (check-copy ht) ) @@ -178,13 +178,13 @@ (dotimes (j iterations) (puthash (+ one 0.0) t ht) (puthash (+ two 0.0) t ht) - (puthash (concat "1" "2") t ht) - (puthash (concat "3" "4") t ht)) + (puthash (cons 1 2) t ht) + (puthash (cons 3 4) t ht)) (Assert (eq (hashtable-test-function ht) 'eql)) (Assert (eq (hash-table-test ht) 'eql)) (Assert (= (+ 2 (* 2 iterations)) (hash-table-count ht))) (Assert (eq t (gethash 1.0 ht))) - (Assert (eq nil (gethash "12" ht))) + (Assert (eq nil (gethash '(1 . 2) ht))) (check-copy ht) ) @@ -192,13 +192,13 @@ (dotimes (j iterations) (puthash (+ one 0.0) t ht) (puthash (+ two 0.0) t ht) - (puthash (concat "1" "2") t ht) - (puthash (concat "3" "4") t ht)) + (puthash (cons 1 2) t ht) + (puthash (cons 3 4) t ht)) (Assert (eq (hashtable-test-function ht) 'equal)) (Assert (eq (hash-table-test ht) 'equal)) (Assert (= 4 (hash-table-count ht))) (Assert (eq t (gethash 1.0 ht))) - (Assert (eq t (gethash "12" ht))) + (Assert (eq t (gethash '(1 . 2) ht))) (check-copy ht) ) diff --git a/tests/automated/lisp-tests.el b/tests/automated/lisp-tests.el index 66c9272..c4d22b1 100644 --- a/tests/automated/lisp-tests.el +++ b/tests/automated/lisp-tests.el @@ -832,6 +832,15 @@ (Assert (equal (split-string ",foo,,bar," ",+") '("" "foo" "bar" ""))) (Assert (not (string-match "\\(\\.\\=\\)" "."))) +(Assert (string= "" (let ((str "test string")) + (if (string-match "^.*$" str) + (replace-match "\\U" t nil str))))) +(with-temp-buffer + (erase-buffer) + (insert "test string") + (re-search-backward "^.*$") + (replace-match "\\U" t) + (Assert (and (bobp) (eobp)))) ;;----------------------------------------------------- ;; Test near-text buffer functions. @@ -945,3 +954,72 @@ ;; Time-related tests ;;----------------------------------------------------- (Assert (= (length (current-time-string)) 24)) + +;;----------------------------------------------------- +;; format test +;;----------------------------------------------------- +(Assert (string= (format "%d" 10) "10")) +(Assert (string= (format "%o" 8) "10")) +(Assert (string= (format "%x" 31) "1f")) +(Assert (string= (format "%X" 31) "1F")) +(Assert (string= (format "%e" 100) "1.000000e+02")) +(Assert (string= (format "%E" 100) "1.000000E+02")) +(Assert (string= (format "%f" 100) "100.000000")) +(Assert (string= (format "%g" 100.0) "100")) +(Assert (string= (format "%g" 0.000001) "1e-06")) +(Assert (string= (format "%g" 0.0001) "0.0001")) +(Assert (string= (format "%G" 100.0) "100")) +(Assert (string= (format "%G" 0.000001) "1E-06")) +(Assert (string= (format "%G" 0.0001) "0.0001")) + +(Assert (string= (format "%2$d%1$d" 10 20) "2010")) +(Assert (string= (format "%-d" 10) "10")) +(Assert (string= (format "%-4d" 10) "10 ")) +(Assert (string= (format "%+d" 10) "+10")) +(Assert (string= (format "%+d" -10) "-10")) +(Assert (string= (format "%+4d" 10) " +10")) +(Assert (string= (format "%+4d" -10) " -10")) +(Assert (string= (format "% d" 10) " 10")) +(Assert (string= (format "% d" -10) "-10")) +(Assert (string= (format "% 4d" 10) " 10")) +(Assert (string= (format "% 4d" -10) " -10")) +(Assert (string= (format "%0d" 10) "10")) +(Assert (string= (format "%0d" -10) "-10")) +(Assert (string= (format "%04d" 10) "0010")) +(Assert (string= (format "%04d" -10) "-010")) +(Assert (string= (format "%*d" 4 10) " 10")) +(Assert (string= (format "%*d" 4 -10) " -10")) +(Assert (string= (format "%*d" -4 10) "10 ")) +(Assert (string= (format "%*d" -4 -10) "-10 ")) +(Assert (string= (format "%#d" 10) "10")) +(Assert (string= (format "%#o" 8) "010")) +(Assert (string= (format "%#x" 16) "0x10")) +(Assert (string= (format "%#e" 100) "1.000000e+02")) +(Assert (string= (format "%#E" 100) "1.000000E+02")) +(Assert (string= (format "%#f" 100) "100.000000")) +(Assert (string= (format "%#g" 100.0) "100.000")) +(Assert (string= (format "%#g" 0.000001) "1.00000e-06")) +(Assert (string= (format "%#g" 0.0001) "0.000100000")) +(Assert (string= (format "%#G" 100.0) "100.000")) +(Assert (string= (format "%#G" 0.000001) "1.00000E-06")) +(Assert (string= (format "%#G" 0.0001) "0.000100000")) +(Assert (string= (format "%.1d" 10) "10")) +(Assert (string= (format "%.4d" 10) "0010")) +;; Combination of `-', `+', ` ', `0', `#', `.', `*' +(Assert (string= (format "%-04d" 10) "0010")) +(Assert (string= (format "%-*d" 4 10) "10 ")) +;; #### Correctness of this behavior is questionable. +;; It might be better to signal error. +(Assert (string= (format "%-*d" -4 10) "10 ")) +;; These behavior is not specified. +;; (format "%-+d" 10) +;; (format "%- d" 10) +;; (format "%-01d" 10) +;; (format "%-#4x" 10) +;; (format "%-.1d" 10) + +(Assert (string= (format "%01.1d" 10) "10")) +(Assert (string= (format "%03.1d" 10) "010")) +(Assert (string= (format "%01.3d" 10) "10")) +(Assert (string= (format "%1.3d" 10) "10")) +(Assert (string= (format "%3.1d" 10) " 10")) diff --git a/version.sh b/version.sh index 05e3746..78e3f2d 100644 --- a/version.sh +++ b/version.sh @@ -2,8 +2,8 @@ emacs_is_beta=t emacs_major_version=21 emacs_minor_version=2 -emacs_beta_version=36 -xemacs_codename="Notus" +emacs_beta_version=37 +xemacs_codename="Pan" infodock_major_version=4 infodock_minor_version=0 infodock_build_version=8