aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiles Bader2004-07-11 22:08:06 +0000
committerMiles Bader2004-07-11 22:08:06 +0000
commit89f3c0c9fda25756ee311a6d0467a97bac203eb5 (patch)
treebe9d2244f2ba1e7ecd4d680e92e5fdffca58ab03
parent094194de121c8b93c7b183182cb0853ec54fe1aa (diff)
parentda38045d0a9949d46814683391e094a3612b6b41 (diff)
downloademacs-89f3c0c9fda25756ee311a6d0467a97bac203eb5.tar.gz
emacs-89f3c0c9fda25756ee311a6d0467a97bac203eb5.zip
Revision: miles@gnu.org--gnu-2004/emacs--unicode--0--patch-23
Merge from emacs--cvs-trunk--0 Patches applied: * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-442 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-444 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-445 Tweak permissions * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-446 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-450 Update from CVS
-rw-r--r--etc/ChangeLog4
-rw-r--r--etc/NEWS17
-rw-r--r--lisp/ChangeLog76
-rw-r--r--lisp/ediff-mult.el2
-rw-r--r--lisp/emacs-lisp/re-builder.el3
-rw-r--r--lisp/files.el7
-rw-r--r--lisp/mouse.el3
-rw-r--r--lisp/printing.el218
-rw-r--r--lisp/progmodes/cperl-mode.el2
-rw-r--r--lisp/replace.el3
-rw-r--r--lisp/simple.el3
-rw-r--r--lisp/term/mac-win.el13
-rw-r--r--lisp/wid-edit.el2
-rw-r--r--lisp/window.el41
-rw-r--r--lisp/xml.el400
-rw-r--r--lispref/ChangeLog21
-rw-r--r--lispref/frames.texi21
-rw-r--r--lispref/os.texi213
-rw-r--r--src/ChangeLog25
-rw-r--r--src/buffer.c14
-rw-r--r--src/editfns.c59
-rw-r--r--src/fns.c4
-rw-r--r--src/keyboard.c12
-rw-r--r--src/window.c31
24 files changed, 822 insertions, 372 deletions
diff --git a/etc/ChangeLog b/etc/ChangeLog
index 356946001bd..d9c0c2816f0 100644
--- a/etc/ChangeLog
+++ b/etc/ChangeLog
@@ -1,3 +1,7 @@
12004-07-08 David Kastrup <dak@gnu.org>
2
3 * NEWS (Lisp changes in 21.4): document (match-data t) change.
4
12002-06-26 Eli Zaretskii <eliz@is.elta.co.il> 52002-06-26 Eli Zaretskii <eliz@is.elta.co.il>
2 6
3 * FOR-RELEASE: Moved to the admin directory. 7 * FOR-RELEASE: Moved to the admin directory.
diff --git a/etc/NEWS b/etc/NEWS
index 4a706bfaf4f..ae67d3758eb 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2246,7 +2246,7 @@ mode-lines in inverse-video.
2246** New package benchmark.el contains simple support for convenient 2246** New package benchmark.el contains simple support for convenient
2247timing measurements of code (including the garbage collection component). 2247timing measurements of code (including the garbage collection component).
2248 2248
2249** The new Lisp library fringe.el controls the apperance of fringes. 2249** The new Lisp library fringe.el controls the appearance of fringes.
2250 2250
2251** `cfengine-mode' is a major mode for editing GNU Cfengine 2251** `cfengine-mode' is a major mode for editing GNU Cfengine
2252configuration files. 2252configuration files.
@@ -2254,7 +2254,10 @@ configuration files.
2254* Lisp Changes in Emacs 21.4 2254* Lisp Changes in Emacs 21.4
2255 2255
2256** If a command sets transient-mark-mode to `only', that 2256** If a command sets transient-mark-mode to `only', that
2257enables Transient Mark mode for the following command, only. 2257enables Transient Mark mode for the following command only.
2258During that following command, the value of transient-mark-mode
2259is `identity'. If it is still `identity' at the end of the command,
2260it changes to nil.
2258 2261
2259+++ 2262+++
2260** Cleaner way to enter key sequences. 2263** Cleaner way to enter key sequences.
@@ -3027,6 +3030,11 @@ variable is used by read-file-name-internal to filter the completion list.
3027** The new variable `read-file-name-function' can be used by lisp code 3030** The new variable `read-file-name-function' can be used by lisp code
3028to override the internal read-file-name function. 3031to override the internal read-file-name function.
3029 3032
3033
3034** The new variable `read-file-name-completion-ignore-case' specifies
3035whether completion ignores case when reading a file name with the
3036`read-file-name' function.
3037
3030+++ 3038+++
3031** The new function `read-directory-name' can be used instead of 3039** The new function `read-directory-name' can be used instead of
3032`read-file-name' to read a directory name; when used, completion 3040`read-file-name' to read a directory name; when used, completion
@@ -3634,6 +3642,11 @@ it in that buffer.
3634properties from surrounding text. 3642properties from surrounding text.
3635 3643
3636+++ 3644+++
3645** `(match-data t)' will append the buffer as a final element of the
3646match data if the last match was on a buffer. `set-match-data' will
3647accept this for restoring the match state.
3648
3649+++
3637** New function `buffer-local-value'. 3650** New function `buffer-local-value'.
3638 3651
3639This function returns the buffer-local binding of VARIABLE (a symbol) 3652This function returns the buffer-local binding of VARIABLE (a symbol)
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 92552debee2..68fe5246458 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,79 @@
12004-07-10 Luc Teirlinck <teirllm@auburn.edu>
2
3 * files.el (switch-to-buffer-other-window): Doc fix.
4
5 * window.el (save-selected-window, one-window-p)
6 (split-window-keep-point, split-window-vertically)
7 (split-window-horizontally): Doc fixes.
8
92004-07-10 Vinicius Jose Latorre <viniciusjl@ig.com.br>
10
11 * printing.el: Doc fix. Now it uses call-process instead of
12 shell-command for low command execution.
13 (pr-version): New version number (6.8).
14 (pr-shell-file-name): Option removed.
15 (pr-shell-command): Fun removed.
16 (pr-call-process): New fun. Replace pr-shell-command.
17 (pr-standard-path, pr-remove-nil-from-list): New funs.
18 (zmacs-region-stays, current-mouse-event, current-menubar): New var.
19 (pr-ps-file-preview, pr-ps-file-using-ghostscript, pr-ps-file-print)
20 (pr-setup, pr-ps-set-printer, pr-txt-set-printer)
21 (pr-ps-utility-process, pr-txt-print): Code fix.
22
232004-07-10 Stephan Stahl <stahl@eos.franken.de> (tiny change)
24
25 * ediff-mult.el (ediff-meta-truncate-filenames): Change type to
26 boolean.
27
282004-07-09 Lars Hansen <larsh@math.ku.dk>
29
30 * wid-edit.el (widget-field-buffer): Doc fix.
31
322004-07-09 John Paul Wallington <jpw@gnu.org>
33
34 * emacs-lisp/re-builder.el (reb-update-overlays): Distinguish
35 between one and several matches in message.
36
372004-07-09 Richard M. Stallman <rms@gnu.org>
38
39 * mouse.el (mouse-set-region-1): If transient-mark-mode
40 is `identity', change it to `only'.
41
42 * simple.el (current-word): Doc fix.
43
442004-07-09 Mark A. Hershberger <mah@everybody.org>
45
46 * progmodes/cperl-mode.el (cperl-mode): Adapt defun-prompt-regexp
47 so that it is more understanding of whitespace.
48
49 * xml.el (xml-maybe-do-ns, xml-parse-tag): Produce elements in the
50 form
51 (("ns" . "element") (attr-list) children) instead of
52 ((:ns . "element") (attr-list) children) in order to reduce the
53 number of symbols used.
54 (xml-skip-dtd): Change to use xml-parse-dtd but set
55 xml-validating-parsing to nil.
56 (xml-parse-dtd): Parse entity deleclarations in DOCTYPEs.
57 (xml-substitute-entity): Remove in favor of new entity substitution.
58 (xml-substitute-special): Rewrite in to substitute complex
59 entities from DOCTYPE declarations.
60 (xml-parse-fragment): Parse fragments from entity deleclarations.
61 (xml-parse-region, xml-parse-tag, xml-parse-attlist)
62 (xml-parse-dtd, xml-substitute-special): Make validity checks
63 conditioned on xml-validating-parser. Add "Not Well Formed" to
64 error messages about well-formedness.
65
662004-07-08 Steven Tamm <steventamm@mac.com>
67
68 * term/mac-win.el (mac-scroll-ignore-events, mac-scroll-down)
69 (mac-scroll-down-line, mac-scroll-up, mac-scroll-up-line):
70 Do not treat double clicks and triple clicks specially in the
71 scroll bar (preventing strange repositioning problems)
72
732004-07-06 Stefan <monnier@iro.umontreal.ca>
74
75 * replace.el (query-replace-regexp-eval): Fix last change.
76
12004-07-05 Stefan <monnier@iro.umontreal.ca> 772004-07-05 Stefan <monnier@iro.umontreal.ca>
2 78
3 * replace.el (query-replace-descr): New fun. 79 * replace.el (query-replace-descr): New fun.
diff --git a/lisp/ediff-mult.el b/lisp/ediff-mult.el
index f5eff1eb49d..cf6edc2d129 100644
--- a/lisp/ediff-mult.el
+++ b/lisp/ediff-mult.el
@@ -200,7 +200,7 @@ Should be a sexp. For instance (car ediff-filtering-regexp-history) or nil."
200(defcustom ediff-meta-truncate-filenames t 200(defcustom ediff-meta-truncate-filenames t
201 "*If non-nil, truncate long file names in the session group buffers. 201 "*If non-nil, truncate long file names in the session group buffers.
202This can be toggled with `ediff-toggle-filename-truncation'." 202This can be toggled with `ediff-toggle-filename-truncation'."
203 :type 'hook 203 :type 'boolean
204 :group 'ediff-mult) 204 :group 'ediff-mult)
205(defcustom ediff-registry-setup-hook nil 205(defcustom ediff-registry-setup-hook nil
206 "*Hooks run just after the registry control panel is set up." 206 "*Hooks run just after the registry control panel is set up."
diff --git a/lisp/emacs-lisp/re-builder.el b/lisp/emacs-lisp/re-builder.el
index 83d3649006e..c6112c4a105 100644
--- a/lisp/emacs-lisp/re-builder.el
+++ b/lisp/emacs-lisp/re-builder.el
@@ -670,9 +670,10 @@ If SUBEXP is non-nil mark only the corresponding sub-expressions."
670 (overlay-put overlay 'priority i))) 670 (overlay-put overlay 'priority i)))
671 (setq i (1+ i)))))) 671 (setq i (1+ i))))))
672 (let ((count (if subexp submatches matches))) 672 (let ((count (if subexp submatches matches)))
673 (message"%s %smatch(es)%s" 673 (message"%s %smatch%s%s"
674 (if (= 0 count) "No" (int-to-string count)) 674 (if (= 0 count) "No" (int-to-string count))
675 (if subexp "subexpression " "") 675 (if subexp "subexpression " "")
676 (if (= 1 count) "" "es")
676 (if (and reb-auto-match-limit 677 (if (and reb-auto-match-limit
677 (= reb-auto-match-limit count)) 678 (= reb-auto-match-limit count))
678 " (limit reached)" ""))) 679 " (limit reached)" "")))
diff --git a/lisp/files.el b/lisp/files.el
index 1d500379925..30f318fbf69 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -869,8 +869,15 @@ use with M-x."
869 869
870(defun switch-to-buffer-other-window (buffer &optional norecord) 870(defun switch-to-buffer-other-window (buffer &optional norecord)
871 "Select buffer BUFFER in another window. 871 "Select buffer BUFFER in another window.
872If BUFFER does not identify an existing buffer, then this function
873creates a buffer with that name.
874
875When called from Lisp, BUFFER can be a buffer, a string \(a buffer name),
876or nil. If BUFFER is nil, then this function chooses a buffer
877using `other-buffer'.
872Optional second arg NORECORD non-nil means 878Optional second arg NORECORD non-nil means
873do not put this buffer at the front of the list of recently selected ones. 879do not put this buffer at the front of the list of recently selected ones.
880This function returns the buffer it switched to.
874 881
875This uses the function `display-buffer' as a subroutine; see its 882This uses the function `display-buffer' as a subroutine; see its
876documentation for additional customization information." 883documentation for additional customization information."
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 7f9d080478a..b73967b99dc 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -625,7 +625,8 @@ This should be bound to a mouse drag event."
625 625
626(defun mouse-set-region-1 () 626(defun mouse-set-region-1 ()
627 ;; Set transient-mark-mode for a little while. 627 ;; Set transient-mark-mode for a little while.
628 (setq transient-mark-mode (or transient-mark-mode 'only)) 628 (if (memq transient-mark-mode '(nil identity))
629 (setq transient-mark-mode 'only))
629 (setq mouse-last-region-beg (region-beginning)) 630 (setq mouse-last-region-beg (region-beginning))
630 (setq mouse-last-region-end (region-end)) 631 (setq mouse-last-region-end (region-end))
631 (setq mouse-last-region-tick (buffer-modified-tick))) 632 (setq mouse-last-region-tick (buffer-modified-tick)))
diff --git a/lisp/printing.el b/lisp/printing.el
index 57dd0691f99..351d6b64e85 100644
--- a/lisp/printing.el
+++ b/lisp/printing.el
@@ -3,18 +3,18 @@
3;; Copyright (C) 2000, 2001, 2002, 2003, 2004 3;; Copyright (C) 2000, 2001, 2002, 2003, 2004
4;; Free Software Foundation, Inc. 4;; Free Software Foundation, Inc.
5 5
6;; Author: Vinicius Jose Latorre <vinicius@cpqd.com.br> 6;; Author: Vinicius Jose Latorre <viniciusjl@ig.com.br>
7;; Maintainer: Vinicius Jose Latorre <vinicius@cpqd.com.br> 7;; Maintainer: Vinicius Jose Latorre <viniciusjl@ig.com.br>
8;; Time-stamp: <2004/04/05 23:41:49 vinicius> 8;; Time-stamp: <2004/07/10 18:48:24 vinicius>
9;; Keywords: wp, print, PostScript 9;; Keywords: wp, print, PostScript
10;; Version: 6.7.4 10;; Version: 6.8
11;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/ 11;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/
12 12
13(defconst pr-version "6.7.4" 13(defconst pr-version "6.8"
14 "printing.el, v 6.7.4 <2004/03/31 vinicius> 14 "printing.el, v 6.8 <2004/07/10 vinicius>
15 15
16Please send all bug fixes and enhancements to 16Please send all bug fixes and enhancements to
17 Vinicius Jose Latorre <vinicius@cpqd.com.br> 17 Vinicius Jose Latorre <viniciusjl@ig.com.br>
18") 18")
19 19
20;; This file is part of GNU Emacs. 20;; This file is part of GNU Emacs.
@@ -40,10 +40,23 @@ Please send all bug fixes and enhancements to
40;; Introduction 40;; Introduction
41;; ------------ 41;; ------------
42;; 42;;
43;; This package provides some printing utilities that includes 43;; This package provides an user interface to some printing utilities that
44;; previewing/printing a PostScript file, printing a text file and 44;; includes previewing/printing a PostScript file, printing a text file and
45;; previewing/printing some major modes (like mh-folder-mode, 45;; previewing/printing some major modes (like mh-folder-mode,
46;; rmail-summary-mode, gnus-summary-mode, etc). 46;; rmail-summary-mode, gnus-summary-mode, etc). It also includes a
47;; PostScript/text printer database.
48;;
49;; Indeed, there are two user interfaces:
50;;
51;; * one is via menubar:
52;; When `printing' is loaded, the menubar is modified to use `printing'
53;; menu instead of the print options in menubar.
54;; This is the default user interface.
55;;
56;; * other is via buffer interface:
57;; It is an option of `printing' menu, but it can be binded into another
58;; key, so user can activate the buffer interface directly without using
59;; a menu. See `pr-interface' command.
47;; 60;;
48;; `printing' was inspired on: 61;; `printing' was inspired on:
49;; 62;;
@@ -172,7 +185,7 @@ Please send all bug fixes and enhancements to
172;; Tips 185;; Tips
173;; ---- 186;; ----
174;; 187;;
175;; 1. If your have a local printer, that is, a printer which is connected 188;; 1. If you have a local printer, that is, a printer which is connected
176;; directly to your computer, don't forget to connect the printer to your 189;; directly to your computer, don't forget to connect the printer to your
177;; computer before printing. 190;; computer before printing.
178;; 191;;
@@ -187,16 +200,26 @@ Please send all bug fixes and enhancements to
187;; another buffer and, then, print the file or the new static buffer. 200;; another buffer and, then, print the file or the new static buffer.
188;; An example of dynamic buffer is the *Messages* buffer. 201;; An example of dynamic buffer is the *Messages* buffer.
189;; 202;;
190;; 4. When running Emacs on Windows with cygwin, check if the 203;; 4. When running Emacs on Windows (with or without cygwin), check if your
191;; `pr-shell-file-name' variable is set to the proper shell. This shell 204;; printer is a text printer or not by typing in a DOS window:
192;; will execute the commands to preview/print the buffer, file or directory. 205;;
193;; Also check the setting of `pr-path-style' variable. 206;; print /D:\\host\printer somefile.txt
194;; Probably, you should use: 207;;
208;; Where, `host' is the machine where your printer is directly connected,
209;; `printer' is the printer name and `somefile.txt' is a text file.
195;; 210;;
196;; (setq pr-shell-file-name "bash") 211;; If the printer `\\host\printer' doesn't print the content of
197;; (setq pr-path-style 'unix) 212;; `somefile.txt' or, instead, it returns the following message:
198;; 213;;
199;; And use / instead of \ when specifying a directory. 214;; PostScript Error Handler
215;; Offending Command = CCC
216;; Stack =
217;;
218;; Where `CCC' is whatever is at the beginning of the text to be printed.
219;;
220;; Therefore, the printer `\\host\printer' is not a text printer, but a
221;; PostScript printer. So, please, don't include this printer in
222;; `pr-txt-printer-alist' (which see).
200;; 223;;
201;; 224;;
202;; Using `printing' 225;; Using `printing'
@@ -479,9 +502,6 @@ Please send all bug fixes and enhancements to
479;; `pr-buffer-verbose' Non-nil means to be verbose when editing a 502;; `pr-buffer-verbose' Non-nil means to be verbose when editing a
480;; field in interface buffer. 503;; field in interface buffer.
481;; 504;;
482;; `pr-shell-file-name' Specify file name to load inferior shells
483;; from.
484;;
485;; To set the above options you may: 505;; To set the above options you may:
486;; 506;;
487;; a) insert the code in your ~/.emacs, like: 507;; a) insert the code in your ~/.emacs, like:
@@ -912,8 +932,8 @@ Please send all bug fixes and enhancements to
912(require 'ps-print) 932(require 'ps-print)
913 933
914 934
915(and (string< ps-print-version "6.5.7") 935(and (string< ps-print-version "6.6.4")
916 (error "`printing' requires `ps-print' package version 6.5.7 or later.")) 936 (error "`printing' requires `ps-print' package version 6.6.4 or later."))
917 937
918 938
919(eval-and-compile 939(eval-and-compile
@@ -1064,6 +1084,15 @@ Valid values are:
1064 path)) 1084 path))
1065 1085
1066 1086
1087(defun pr-standard-path (path)
1088 "Ensure the proper directory separator depending on the OS.
1089That is, if Emacs is running on DOS/Windows, ensure dos/windows-style directory
1090separator; otherwise, ensure unix-style directory separator."
1091 (if (or pr-cygwin-system ps-windows-system)
1092 (subst-char-in-string ?/ ?\\ path)
1093 (subst-char-in-string ?\\ ?/ path)))
1094
1095
1067;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1096;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1068;; User Interface (II) 1097;; User Interface (II)
1069 1098
@@ -2314,16 +2343,6 @@ It's used by `pr-interface'."
2314 :group 'printing) 2343 :group 'printing)
2315 2344
2316 2345
2317(defcustom pr-shell-file-name
2318 (if (and (not pr-cygwin-system)
2319 ps-windows-system)
2320 "cmdproxy.exe"
2321 shell-file-name)
2322 "*Specify file name to load inferior shells from."
2323 :type 'string
2324 :group 'printing)
2325
2326
2327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2328;; Internal Variables 2347;; Internal Variables
2329 2348
@@ -2410,6 +2429,7 @@ See `pr-ps-printer-alist'.")
2410 (and pr-auto-region transient-mark-mode mark-active))) 2429 (and pr-auto-region transient-mark-mode mark-active)))
2411 2430
2412 ((eq ps-print-emacs-type 'xemacs) ; XEmacs 2431 ((eq ps-print-emacs-type 'xemacs) ; XEmacs
2432 (defvar zmacs-region-stays nil) ; to avoid compilation gripes
2413 (defsubst pr-region-active-p () 2433 (defsubst pr-region-active-p ()
2414 (and pr-auto-region (not zmacs-region-stays) (ps-mark-active-p))))) 2434 (and pr-auto-region (not zmacs-region-stays) (ps-mark-active-p)))))
2415 2435
@@ -3792,9 +3812,7 @@ image in a file with that name."
3792 "Preview PostScript file FILENAME." 3812 "Preview PostScript file FILENAME."
3793 (interactive (list (pr-ps-infile-preprint "Preview "))) 3813 (interactive (list (pr-ps-infile-preprint "Preview ")))
3794 (and (stringp filename) (file-exists-p filename) 3814 (and (stringp filename) (file-exists-p filename)
3795 (let ((shell-file-name pr-shell-file-name)) 3815 (pr-call-process pr-gv-command filename)))
3796 (start-process-shell-command "PREVIEW" "*Messages*"
3797 (pr-command pr-gv-command) filename))))
3798 3816
3799 3817
3800;;;###autoload 3818;;;###autoload
@@ -3815,12 +3833,13 @@ image in a file with that name."
3815 (let* ((file (pr-expand-file-name filename)) 3833 (let* ((file (pr-expand-file-name filename))
3816 (tempfile (pr-dosify-path (make-temp-name file)))) 3834 (tempfile (pr-dosify-path (make-temp-name file))))
3817 ;; gs use 3835 ;; gs use
3818 (pr-shell-command 3836 (pr-call-process pr-gs-command
3819 (concat (pr-command pr-gs-command) 3837 (format "-sDEVICE=%s" pr-gs-device)
3820 " -sDEVICE=" pr-gs-device 3838 (format "-r%d" pr-gs-resolution)
3821 " -r" (int-to-string pr-gs-resolution) 3839 (pr-switches-string pr-gs-switches "pr-gs-switches")
3822 " " (pr-switches-string pr-gs-switches "pr-gs-switches") 3840 (format "-sOutputFile=\"%s\"" tempfile)
3823 " -sOutputFile=" tempfile " " file " -c quit")) 3841 file
3842 "-c quit")
3824 ;; printing 3843 ;; printing
3825 (pr-ps-file-print tempfile) 3844 (pr-ps-file-print tempfile)
3826 ;; deleting 3845 ;; deleting
@@ -3841,16 +3860,16 @@ image in a file with that name."
3841 (erase-buffer) 3860 (erase-buffer)
3842 (insert-file-contents-literally file)) 3861 (insert-file-contents-literally file))
3843 (pr-despool-print)) 3862 (pr-despool-print))
3844 (pr-shell-command 3863 (apply 'pr-call-process
3845 (concat (pr-command pr-ps-command) " " 3864 pr-ps-command
3846 (pr-switches-string pr-ps-switches "pr-gs-switches") " " 3865 (pr-switches-string pr-ps-switches "pr-gs-switches")
3847 (if (string-match "cp" pr-ps-command) 3866 (if (string-match "cp" pr-ps-command)
3848 ;; for "cp" (cmd in out) 3867 ;; for "cp" (cmd in out)
3849 (concat "\"" file "\" " 3868 (list file
3850 pr-ps-printer-switch pr-ps-printer) 3869 (concat pr-ps-printer-switch pr-ps-printer))
3851 ;; else, for others (cmd out in) 3870 ;; else, for others (cmd out in)
3852 (concat pr-ps-printer-switch pr-ps-printer 3871 (list (concat pr-ps-printer-switch pr-ps-printer)
3853 " \"" file "\"")))))))) 3872 file)))))))
3854 3873
3855 3874
3856;;;###autoload 3875;;;###autoload
@@ -4252,9 +4271,22 @@ Or choose the menu option Printing/Show Settings/printing."
4252 #'ps-print-quote 4271 #'ps-print-quote
4253 (list 4272 (list
4254 (concat "\n;;; printing.el version " pr-version "\n") 4273 (concat "\n;;; printing.el version " pr-version "\n")
4255 '(19 . pr-shell-file-name) 4274 ";; internal vars"
4256 '(19 . pr-path-style) 4275 (ps-comment-string "pr-txt-command " pr-txt-command)
4257 '(19 . pr-path-alist) 4276 (ps-comment-string "pr-txt-switches "
4277 (pr-switches-string pr-txt-switches "pr-txt-switches"))
4278 (ps-comment-string "pr-txt-printer " pr-txt-printer)
4279 (ps-comment-string "pr-ps-command " pr-ps-command)
4280 (ps-comment-string "pr-ps-switches "
4281 (pr-switches-string pr-ps-switches "pr-ps-switches"))
4282 (ps-comment-string "pr-ps-printer-switch" pr-ps-printer-switch)
4283 (ps-comment-string "pr-ps-printer " pr-ps-printer)
4284 (ps-comment-string "pr-cygwin-system " pr-cygwin-system)
4285 (ps-comment-string "ps-windows-system " ps-windows-system)
4286 (ps-comment-string "ps-lp-system " ps-lp-system)
4287 nil
4288 '(14 . pr-path-style)
4289 '(14 . pr-path-alist)
4258 nil 4290 nil
4259 '(21 . pr-txt-name) 4291 '(21 . pr-txt-name)
4260 '(21 . pr-txt-printer-alist) 4292 '(21 . pr-txt-printer-alist)
@@ -4570,6 +4602,7 @@ See `pr-visible-entry-alist'.")
4570 (cond 4602 (cond
4571 ((eq ps-print-emacs-type 'xemacs) 4603 ((eq ps-print-emacs-type 'xemacs)
4572 ;; XEmacs 4604 ;; XEmacs
4605 (defvar current-mouse-event nil) ; to avoid compilation gripes
4573 (defun pr-menu-position (entry index horizontal) 4606 (defun pr-menu-position (entry index horizontal)
4574 (pr-x-make-event 4607 (pr-x-make-event
4575 'button-release 4608 'button-release
@@ -4633,6 +4666,7 @@ See `pr-visible-entry-alist'.")
4633 4666
4634 ((eq ps-print-emacs-type 'xemacs) 4667 ((eq ps-print-emacs-type 'xemacs)
4635 ;; XEmacs 4668 ;; XEmacs
4669 (defvar current-menubar nil) ; to avoid compilation gripes
4636 (defun pr-menu-lookup (path) 4670 (defun pr-menu-lookup (path)
4637 (car (pr-x-find-menu-item current-menubar (cons "Printing" path)))) 4671 (car (pr-x-find-menu-item current-menubar (cons "Printing" path))))
4638 4672
@@ -4973,7 +5007,7 @@ non-nil."
4973 pr-ps-command (pr-dosify-path (nth 0 ps)) 5007 pr-ps-command (pr-dosify-path (nth 0 ps))
4974 pr-ps-switches (nth 1 ps) 5008 pr-ps-switches (nth 1 ps)
4975 pr-ps-printer-switch (nth 2 ps) 5009 pr-ps-printer-switch (nth 2 ps)
4976 pr-ps-printer (pr-dosify-path (nth 3 ps))) 5010 pr-ps-printer (nth 3 ps))
4977 (or (stringp pr-ps-command) 5011 (or (stringp pr-ps-command)
4978 (setq pr-ps-command 5012 (setq pr-ps-command
4979 (cond (ps-windows-system "print") 5013 (cond (ps-windows-system "print")
@@ -4998,7 +5032,7 @@ non-nil."
4998 (setq pr-txt-name value 5032 (setq pr-txt-name value
4999 pr-txt-command (pr-dosify-path (nth 0 txt)) 5033 pr-txt-command (pr-dosify-path (nth 0 txt))
5000 pr-txt-switches (nth 1 txt) 5034 pr-txt-switches (nth 1 txt)
5001 pr-txt-printer (pr-dosify-path (nth 2 txt)))) 5035 pr-txt-printer (nth 2 txt)))
5002 (or (stringp pr-txt-command) 5036 (or (stringp pr-txt-command)
5003 (setq pr-txt-command 5037 (setq pr-txt-command
5004 (cond (ps-windows-system "print") 5038 (cond (ps-windows-system "print")
@@ -5211,32 +5245,54 @@ non-nil."
5211 (let (item) 5245 (let (item)
5212 (and (stringp infile) (file-exists-p infile) 5246 (and (stringp infile) (file-exists-p infile)
5213 (setq item (cdr (assq pr-ps-utility pr-ps-utility-alist))) 5247 (setq item (cdr (assq pr-ps-utility pr-ps-utility-alist)))
5214 (pr-shell-command 5248 (pr-call-process (nth 0 item)
5215 (concat (pr-command (nth 0 item)) " " 5249 (pr-switches-string (nth 1 item)
5216 (pr-switches-string (nth 1 item) 5250 "pr-ps-utility-alist entry")
5217 "pr-ps-utility-alist entry") 5251 (pr-switches-string (nth 8 item)
5218 " " 5252 "pr-ps-utility-alist entry")
5219 (pr-switches-string (nth 8 item) 5253 (and (nth 2 item)
5220 "pr-ps-utility-alist entry") 5254 (format (nth 2 item) ps-paper-type))
5221 " " 5255 (format (nth 3 item) n-up)
5222 (and (nth 2 item) 5256 (and pr-file-landscape (nth 4 item))
5223 (format (nth 2 item) ps-paper-type)) 5257 (and pr-file-duplex (nth 5 item))
5224 " " (format (nth 3 item) n-up) " " 5258 (and pr-file-tumble (nth 6 item))
5225 (and pr-file-landscape (nth 4 item)) " " 5259 (pr-expand-file-name infile)
5226 (and pr-file-duplex (nth 5 item)) " " 5260 (nth 7 item)
5227 (and pr-file-tumble (nth 6 item)) 5261 (pr-expand-file-name outfile)))))
5228 " \"" (pr-expand-file-name infile) "\" " 5262
5229 (nth 7 item) 5263
5230 " \"" (pr-expand-file-name outfile) "\""))))) 5264(defun pr-remove-nil-from-list (lst)
5231 5265 (while (and lst (null (car lst)))
5232 5266 (setq lst (cdr lst)))
5233(defun pr-shell-command (command) 5267 (let ((b lst)
5234 (let ((shell-file-name pr-shell-file-name)) 5268 (l (cdr lst)))
5235 (shell-command command))) 5269 (while l
5270 (if (car l)
5271 (setq b l
5272 l (cdr l))
5273 (setq l (cdr l))
5274 (setcdr b l))))
5275 lst)
5276
5277
5278(defun pr-call-process (command &rest args)
5279 (let ((buffer (get-buffer-create "*Printing Command Output*"))
5280 (cmd (pr-command command))
5281 status)
5282 (setq args (pr-remove-nil-from-list args))
5283 (save-excursion
5284 (set-buffer buffer)
5285 (goto-char (point-max))
5286 (insert (format "%s %S\n" cmd args)))
5287 (setq status (apply 'call-process cmd nil buffer nil args))
5288 (save-excursion
5289 (set-buffer buffer)
5290 (goto-char (point-max))
5291 (insert (format "Exit status: %s\n" status)))))
5236 5292
5237 5293
5238(defun pr-txt-print (from to) 5294(defun pr-txt-print (from to)
5239 (let ((lpr-command (pr-command pr-txt-command)) 5295 (let ((lpr-command (pr-standard-path (pr-command pr-txt-command)))
5240 (lpr-switches (pr-switches pr-txt-switches "pr-txt-switches")) 5296 (lpr-switches (pr-switches pr-txt-switches "pr-txt-switches"))
5241 (printer-name pr-txt-printer)) 5297 (printer-name pr-txt-printer))
5242 (lpr-region from to))) 5298 (lpr-region from to)))
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index c651e06b899..e679a48d642 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -1472,7 +1472,7 @@ or as help on variables `cperl-tips', `cperl-problems',
1472 (make-local-variable 'comment-start-skip) 1472 (make-local-variable 'comment-start-skip)
1473 (setq comment-start-skip "#+ *") 1473 (setq comment-start-skip "#+ *")
1474 (make-local-variable 'defun-prompt-regexp) 1474 (make-local-variable 'defun-prompt-regexp)
1475 (setq defun-prompt-regexp "^[ \t]*sub[ \t]+\\([^ \t\n{(;]+\\)\\([ \t]*([^()]*)[ \t]*\\)?[ \t]*") 1475 (setq defun-prompt-regexp "^[ \t]*sub[ \t\n]+\\([^ \t\n{(;]+\\)\\([ \t\n]*([^()]*)[ \t\n]*\\)?[ \t\n]*)")
1476 (make-local-variable 'comment-indent-function) 1476 (make-local-variable 'comment-indent-function)
1477 (setq comment-indent-function 'cperl-comment-indent) 1477 (setq comment-indent-function 'cperl-comment-indent)
1478 (make-local-variable 'parse-sexp-ignore-comments) 1478 (make-local-variable 'parse-sexp-ignore-comments)
diff --git a/lisp/replace.el b/lisp/replace.el
index a7c8b859402..60c28d6c48a 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -287,6 +287,7 @@ Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
287only matches that are surrounded by word boundaries. 287only matches that are surrounded by word boundaries.
288Fourth and fifth arg START and END specify the region to operate on." 288Fourth and fifth arg START and END specify the region to operate on."
289 (interactive 289 (interactive
290 (progn
290 (barf-if-buffer-read-only) 291 (barf-if-buffer-read-only)
291 (let* ((from 292 (let* ((from
292 ;; Let-bind the history var to disable the "foo -> bar" default. 293 ;; Let-bind the history var to disable the "foo -> bar" default.
@@ -305,7 +306,7 @@ Fourth and fifth arg START and END specify the region to operate on."
305 (if (and transient-mark-mode mark-active) 306 (if (and transient-mark-mode mark-active)
306 (region-beginning)) 307 (region-beginning))
307 (if (and transient-mark-mode mark-active) 308 (if (and transient-mark-mode mark-active)
308 (region-end))))) 309 (region-end))))))
309 (perform-replace regexp (cons 'replace-eval-replacement to-expr) 310 (perform-replace regexp (cons 'replace-eval-replacement to-expr)
310 t 'literal delimited nil nil start end)) 311 t 'literal delimited nil nil start end))
311 312
diff --git a/lisp/simple.el b/lisp/simple.el
index 8da9e8028f0..c45437fb123 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -3364,7 +3364,8 @@ With argument, do this that many times."
3364 "Return the symbol or word that point is on (or a nearby one) as a string. 3364 "Return the symbol or word that point is on (or a nearby one) as a string.
3365The return value includes no text properties. 3365The return value includes no text properties.
3366If optional arg STRICT is non-nil, return nil unless point is within 3366If optional arg STRICT is non-nil, return nil unless point is within
3367or adjacent to a symbol or word. 3367or adjacent to a symbol or word. In all cases the value can be nil
3368if there is no word nearby.
3368The function, belying its name, normally finds a symbol. 3369The function, belying its name, normally finds a symbol.
3369If optional arg REALLY-WORD is non-nil, it finds just a word." 3370If optional arg REALLY-WORD is non-nil, it finds just a word."
3370 (save-excursion 3371 (save-excursion
diff --git a/lisp/term/mac-win.el b/lisp/term/mac-win.el
index 1220c046cb7..15e813c53d3 100644
--- a/lisp/term/mac-win.el
+++ b/lisp/term/mac-win.el
@@ -68,24 +68,29 @@
68 (goto-char (window-start window)) 68 (goto-char (window-start window))
69 (mac-scroll-up-line))))) 69 (mac-scroll-up-line)))))
70 70
71(defun mac-scroll-ignore-events ()
72 ;; Ignore confusing non-mouse events
73 (while (not (memq (car-safe (read-event))
74 '(mouse-1 double-mouse-1 triple-mouse-1))) nil))
75
71(defun mac-scroll-down () 76(defun mac-scroll-down ()
72 (track-mouse 77 (track-mouse
73 (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) 78 (mac-scroll-ignore-events)
74 (scroll-down))) 79 (scroll-down)))
75 80
76(defun mac-scroll-down-line () 81(defun mac-scroll-down-line ()
77 (track-mouse 82 (track-mouse
78 (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) 83 (mac-scroll-ignore-events)
79 (scroll-down 1))) 84 (scroll-down 1)))
80 85
81(defun mac-scroll-up () 86(defun mac-scroll-up ()
82 (track-mouse 87 (track-mouse
83 (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) 88 (mac-scroll-ignore-events)
84 (scroll-up))) 89 (scroll-up)))
85 90
86(defun mac-scroll-up-line () 91(defun mac-scroll-up-line ()
87 (track-mouse 92 (track-mouse
88 (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) 93 (mac-scroll-ignore-events)
89 (scroll-up 1))) 94 (scroll-up 1)))
90 95
91(defun xw-defined-colors (&optional frame) 96(defun xw-defined-colors (&optional frame)
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index e6ce5ae71db..bdbe607317d 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -1144,7 +1144,7 @@ When not inside a field, move to the previous button or field."
1144 field))) 1144 field)))
1145 1145
1146(defun widget-field-buffer (widget) 1146(defun widget-field-buffer (widget)
1147 "Return the start of WIDGET's editing field." 1147 "Return the buffer of WIDGET's editing field."
1148 (let ((overlay (widget-get widget :field-overlay))) 1148 (let ((overlay (widget-get widget :field-overlay)))
1149 (cond ((overlayp overlay) 1149 (cond ((overlayp overlay)
1150 (overlay-buffer overlay)) 1150 (overlay-buffer overlay))
diff --git a/lisp/window.el b/lisp/window.el
index 188b3acf311..96bfc8b5581 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -34,7 +34,8 @@
34Also restore the selected window of each frame as it was at the start 34Also restore the selected window of each frame as it was at the start
35of this construct. 35of this construct.
36However, if a window has become dead, don't get an error, 36However, if a window has become dead, don't get an error,
37just refrain from reselecting it." 37just refrain from reselecting it.
38Return the value of the last form in BODY."
38 `(let ((save-selected-window-window (selected-window)) 39 `(let ((save-selected-window-window (selected-window))
39 ;; It is necessary to save all of these, because calling 40 ;; It is necessary to save all of these, because calling
40 ;; select-window changes frame-selected-window for whatever 41 ;; select-window changes frame-selected-window for whatever
@@ -63,15 +64,17 @@ This does not include the mode line (if any) or the header line (if any)."
63 (if header-line-format 1 0)))))) 64 (if header-line-format 1 0))))))
64 65
65(defun one-window-p (&optional nomini all-frames) 66(defun one-window-p (&optional nomini all-frames)
66 "Return non-nil if the selected window is the only window (in its frame). 67 "Return non-nil if the selected window is the only window.
67Optional arg NOMINI non-nil means don't count the minibuffer 68Optional arg NOMINI non-nil means don't count the minibuffer
68even if it is active. 69even if it is active. Otherwise, the minibuffer is counted
70when it is active.
69 71
70The optional arg ALL-FRAMES t means count windows on all frames. 72The optional arg ALL-FRAMES t means count windows on all frames.
71If it is `visible', count windows on all visible frames. 73If it is `visible', count windows on all visible frames.
72ALL-FRAMES nil or omitted means count only the selected frame, 74ALL-FRAMES nil or omitted means count only the selected frame,
73plus the minibuffer it uses (which may be on another frame). 75plus the minibuffer it uses (which may be on another frame).
74If ALL-FRAMES is neither nil nor t, count only the selected frame." 76ALL-FRAMES 0 means count all windows in all visible or iconified frames.
77If ALL-FRAMES is anything else, count only the selected frame."
75 (let ((base-window (selected-window))) 78 (let ((base-window (selected-window)))
76 (if (and nomini (eq base-window (minibuffer-window))) 79 (if (and nomini (eq base-window (minibuffer-window)))
77 (setq base-window (next-window base-window))) 80 (setq base-window (next-window base-window)))
@@ -87,7 +90,7 @@ bars (top, bottom, or nil)."
87 (let ((vert (nth 2 (window-scroll-bars window))) 90 (let ((vert (nth 2 (window-scroll-bars window)))
88 (hor nil)) 91 (hor nil))
89 (when (or (eq vert t) (eq hor t)) 92 (when (or (eq vert t) (eq hor t))
90 (let ((fcsb (frame-current-scroll-bars 93 (let ((fcsb (frame-current-scroll-bars
91 (window-frame (or window (selected-window)))))) 94 (window-frame (or window (selected-window))))))
92 (if (eq vert t) 95 (if (eq vert t)
93 (setq vert (car fcsb))) 96 (setq vert (car fcsb)))
@@ -268,29 +271,38 @@ If WINDOW is nil or omitted, it defaults to the currently selected window."
268 271
269;; I think this should be the default; I think people will prefer it--rms. 272;; I think this should be the default; I think people will prefer it--rms.
270(defcustom split-window-keep-point t 273(defcustom split-window-keep-point t
271 "*If non-nil, split windows keeps the original point in both children. 274 "*If non-nil, \\[split-window-vertically] keeps the original point \
275in both children.
272This is often more convenient for editing. 276This is often more convenient for editing.
273If nil, adjust point in each of the two windows to minimize redisplay. 277If nil, adjust point in each of the two windows to minimize redisplay.
274This is convenient on slow terminals, but point can move strangely." 278This is convenient on slow terminals, but point can move strangely.
279
280This option applies only to `split-window-vertically' and
281functions that call it. `split-window' always keeps the original
282point in both children,"
275 :type 'boolean 283 :type 'boolean
276 :group 'windows) 284 :group 'windows)
277 285
278(defun split-window-vertically (&optional arg) 286(defun split-window-vertically (&optional arg)
279 "Split current window into two windows, one above the other. 287 "Split current window into two windows, one above the other.
280The uppermost window gets ARG lines and the other gets the rest. 288The uppermost window gets ARG lines and the other gets the rest.
281Negative arg means select the size of the lowermost window instead. 289Negative ARG means select the size of the lowermost window instead.
282With no argument, split equally or close to it. 290With no argument, split equally or close to it.
283Both windows display the same buffer now current. 291Both windows display the same buffer now current.
284 292
285If the variable `split-window-keep-point' is non-nil, both new windows 293If the variable `split-window-keep-point' is non-nil, both new windows
286will get the same value of point as the current window. This is often 294will get the same value of point as the current window. This is often
287more convenient for editing. 295more convenient for editing. The upper window is the selected window.
288 296
289Otherwise, we chose window starts so as to minimize the amount of 297Otherwise, we choose window starts so as to minimize the amount of
290redisplay; this is convenient on slow terminals. The new selected 298redisplay; this is convenient on slow terminals. The new selected
291window is the one that the current value of point appears in. The 299window is the one that the current value of point appears in. The
292value of point can change if the text around point is hidden by the 300value of point can change if the text around point is hidden by the
293new mode line." 301new mode line.
302
303Regardless of the value of `split-window-keep-point', the upper
304window is the original one and the return value is the new, lower
305window."
294 (interactive "P") 306 (interactive "P")
295 (let ((old-w (selected-window)) 307 (let ((old-w (selected-window))
296 (old-point (point)) 308 (old-point (point))
@@ -338,10 +350,13 @@ new mode line."
338(defun split-window-horizontally (&optional arg) 350(defun split-window-horizontally (&optional arg)
339 "Split current window into two windows side by side. 351 "Split current window into two windows side by side.
340This window becomes the leftmost of the two, and gets ARG columns. 352This window becomes the leftmost of the two, and gets ARG columns.
341Negative arg means select the size of the rightmost window instead. 353Negative ARG means select the size of the rightmost window instead.
342The argument includes the width of the window's scroll bar; if there 354The argument includes the width of the window's scroll bar; if there
343are no scroll bars, it includes the width of the divider column 355are no scroll bars, it includes the width of the divider column
344to the window's right, if any. No arg means split equally." 356to the window's right, if any. No ARG means split equally.
357
358The original, leftmost window remains selected.
359The return value is the new, rightmost window."
345 (interactive "P") 360 (interactive "P")
346 (let ((old-w (selected-window)) 361 (let ((old-w (selected-window))
347 (size (and arg (prefix-numeric-value arg)))) 362 (size (and arg (prefix-numeric-value arg))))
diff --git a/lisp/xml.el b/lisp/xml.el
index 03ef6346c70..993ef59b276 100644
--- a/lisp/xml.el
+++ b/lisp/xml.el
@@ -84,6 +84,20 @@
84;;** 84;;**
85;;******************************************************************* 85;;*******************************************************************
86 86
87(defvar xml-entity-alist
88 '(("lt" . "<")
89 ("gt" . ">")
90 ("apos" . "'")
91 ("quot" . "\"")
92 ("amp" . "&"))
93 "The defined entities. Entities are added to this when the DTD is parsed.")
94
95(defvar xml-sub-parser nil
96 "Dynamically set this to a non-nil value if you want to parse an XML fragment.")
97
98(defvar xml-validating-parser nil
99 "Set to non-nil to get validity checking.")
100
87(defsubst xml-node-name (node) 101(defsubst xml-node-name (node)
88 "Return the tag associated with NODE. 102 "Return the tag associated with NODE.
89Without namespace-aware parsing, the tag is a symbol. 103Without namespace-aware parsing, the tag is a symbol.
@@ -164,6 +178,48 @@ If PARSE-NS is non-nil, then QNAMES are expanded."
164 (kill-buffer (current-buffer))) 178 (kill-buffer (current-buffer)))
165 xml))) 179 xml)))
166 180
181
182(let* ((start-chars (concat ":[:alpha:]_"))
183 (name-chars (concat "-[:digit:]." start-chars))
184;;[3] S ::= (#x20 | #x9 | #xD | #xA)+
185 (whitespace "[ \t\n\r]"))
186;;[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6]
187;; | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF]
188;; | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF]
189;; | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
190 (defvar xml-name-start-char-re (concat "[" start-chars "]"))
191;;[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
192 (defvar xml-name-char-re (concat "[" name-chars "]"))
193;;[5] Name ::= NameStartChar (NameChar)*
194 (defvar xml-name-re (concat xml-name-start-char-re xml-name-char-re "*"))
195;;[6] Names ::= Name (#x20 Name)*
196 (defvar xml-names-re (concat xml-name-re "\\(?: " xml-name-re "\\)*"))
197;;[7] Nmtoken ::= (NameChar)+
198 (defvar xml-nmtoken-re (concat xml-name-char-re "+"))
199;;[8] Nmtokens ::= Nmtoken (#x20 Nmtoken)*
200 (defvar xml-nmtokens-re (concat xml-nmtoken-re "\\(?: " xml-name-re "\\)*"))
201;;[66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'
202 (defvar xml-char-ref-re "\\(?:&#[0-9]+;\\|&#x[0-9a-fA-F]+;\\)")
203;;[68] EntityRef ::= '&' Name ';'
204 (defvar xml-entity-ref (concat "&" xml-name-re ";"))
205;;[69] PEReference ::= '%' Name ';'
206 (defvar xml-pe-reference-re (concat "%" xml-name-re ";"))
207;;[67] Reference ::= EntityRef | CharRef
208 (defvar xml-reference-re (concat "\\(?:" xml-entity-ref "\\|" xml-char-ref-re "\\)"))
209;;[9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"'
210;; | "'" ([^%&'] | PEReference | Reference)* "'"
211 (defvar xml-entity-value-re (concat "\\(?:\"\\(?:[^%&\"]\\|" xml-pe-reference-re
212 "\\|" xml-reference-re "\\)*\"\\|'\\(?:[^%&']\\|"
213 xml-pe-reference-re "\\|" xml-reference-re "\\)*'\\)")))
214;;[75] ExternalID ::= 'SYSTEM' S SystemLiteral
215;; | 'PUBLIC' S PubidLiteral S SystemLiteral
216;;[76] NDataDecl ::= S 'NDATA' S
217;;[73] EntityDef ::= EntityValue| (ExternalID NDataDecl?)
218;;[71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'
219;;[74] PEDef ::= EntityValue | ExternalID
220;;[72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
221;;[70] EntityDecl ::= GEDecl | PEDecl
222
167;; Note that this is setup so that we can do whitespace-skipping with 223;; Note that this is setup so that we can do whitespace-skipping with
168;; `(skip-syntax-forward " ")', inter alia. Previously this was slow 224;; `(skip-syntax-forward " ")', inter alia. Previously this was slow
169;; compared with `re-search-forward', but that has been fixed. Also 225;; compared with `re-search-forward', but that has been fixed. Also
@@ -229,9 +285,9 @@ If PARSE-NS is non-nil, then QNAMES are expanded."
229 (progn 285 (progn
230 (forward-char -1) 286 (forward-char -1)
231 (setq result (xml-parse-tag parse-dtd parse-ns)) 287 (setq result (xml-parse-tag parse-dtd parse-ns))
232 (if (and xml result) 288 (if (and xml result (not xml-sub-parser))
233 ;; translation of rule [1] of XML specifications 289 ;; translation of rule [1] of XML specifications
234 (error "XML files can have only one toplevel tag") 290 (error "XML: (Not Well-Formed) Only one root tag allowed")
235 (cond 291 (cond
236 ((null result)) 292 ((null result))
237 ((and (listp (car result)) 293 ((and (listp (car result))
@@ -265,10 +321,24 @@ specify that the name shouldn't be given a namespace."
265 ;; matching cons in xml-ns. In which case we 321 ;; matching cons in xml-ns. In which case we
266 (ns (or (cdr (assoc (if special "xmlns" prefix) 322 (ns (or (cdr (assoc (if special "xmlns" prefix)
267 xml-ns)) 323 xml-ns))
268 :))) 324 "")))
269 (cons ns (if special "" lname))) 325 (cons ns (if special "" lname)))
270 (intern name))) 326 (intern name)))
271 327
328(defun xml-parse-fragment (&optional parse-dtd parse-ns)
329 "Parse xml-like fragments."
330 (let ((xml-sub-parser t)
331 children)
332 (while (not (eobp))
333 (let ((bit (xml-parse-tag
334 parse-dtd parse-ns)))
335 (if children
336 (setq children (append (list bit) children))
337 (if (stringp bit)
338 (setq children (list bit))
339 (setq children bit)))))
340 (reverse children)))
341
272(defun xml-parse-tag (&optional parse-dtd parse-ns) 342(defun xml-parse-tag (&optional parse-dtd parse-ns)
273 "Parse the tag at point. 343 "Parse the tag at point.
274If PARSE-DTD is non-nil, the DTD of the document, if any, is parsed and 344If PARSE-DTD is non-nil, the DTD of the document, if any, is parsed and
@@ -278,16 +348,17 @@ Returns one of:
278 - a list : the matching node 348 - a list : the matching node
279 - nil : the point is not looking at a tag. 349 - nil : the point is not looking at a tag.
280 - a pair : the first element is the DTD, the second is the node." 350 - a pair : the first element is the DTD, the second is the node."
281 (let ((xml-ns (if (consp parse-ns) 351 (let ((xml-validating-parser (or parse-dtd xml-validating-parser))
352 (xml-ns (if (consp parse-ns)
282 parse-ns 353 parse-ns
283 (if parse-ns 354 (if parse-ns
284 (list 355 (list
285 ;; Default for empty prefix is no namespace 356 ;; Default for empty prefix is no namespace
286 (cons "" :) 357 (cons "" "")
287 ;; "xml" namespace 358 ;; "xml" namespace
288 (cons "xml" :http://www.w3.org/XML/1998/namespace) 359 (cons "xml" "http://www.w3.org/XML/1998/namespace")
289 ;; We need to seed the xmlns namespace 360 ;; We need to seed the xmlns namespace
290 (cons "xmlns" :http://www.w3.org/2000/xmlns/)))))) 361 (cons "xmlns" "http://www.w3.org/2000/xmlns/"))))))
291 (cond 362 (cond
292 ;; Processing instructions (like the <?xml version="1.0"?> tag at the 363 ;; Processing instructions (like the <?xml version="1.0"?> tag at the
293 ;; beginning of a document). 364 ;; beginning of a document).
@@ -299,18 +370,15 @@ Returns one of:
299 ((looking-at "<!\\[CDATA\\[") 370 ((looking-at "<!\\[CDATA\\[")
300 (let ((pos (match-end 0))) 371 (let ((pos (match-end 0)))
301 (unless (search-forward "]]>" nil t) 372 (unless (search-forward "]]>" nil t)
302 (error "CDATA section does not end anywhere in the document")) 373 (error "XML: (Not Well Formed) CDATA section does not end anywhere in the document"))
303 (buffer-substring pos (match-beginning 0)))) 374 (buffer-substring pos (match-beginning 0))))
304 ;; DTD for the document 375 ;; DTD for the document
305 ((looking-at "<!DOCTYPE") 376 ((looking-at "<!DOCTYPE")
306 (let (dtd) 377 (let ((dtd (xml-parse-dtd parse-ns)))
307 (if parse-dtd 378 (skip-syntax-forward " ")
308 (setq dtd (xml-parse-dtd)) 379 (if xml-validating-parser
309 (xml-skip-dtd)) 380 (cons dtd (xml-parse-tag nil xml-ns))
310 (skip-syntax-forward " ") 381 (xml-parse-tag nil xml-ns))))
311 (if dtd
312 (cons dtd (xml-parse-tag nil xml-ns))
313 (xml-parse-tag nil xml-ns))))
314 ;; skip comments 382 ;; skip comments
315 ((looking-at "<!--") 383 ((looking-at "<!--")
316 (search-forward "-->") 384 (search-forward "-->")
@@ -332,65 +400,76 @@ Returns one of:
332 (when (consp xml-ns) 400 (when (consp xml-ns)
333 (dolist (attr attrs) 401 (dolist (attr attrs)
334 (when (and (consp (car attr)) 402 (when (and (consp (car attr))
335 (eq :http://www.w3.org/2000/xmlns/ 403 (equal "http://www.w3.org/2000/xmlns/"
336 (caar attr))) 404 (caar attr)))
337 (push (cons (cdar attr) (intern (concat ":" (cdr attr)))) 405 (push (cons (cdar attr) (cdr attr))
338 xml-ns)))) 406 xml-ns))))
339 407
340 (setq children (list attrs (xml-maybe-do-ns node-name "" xml-ns))) 408 (setq children (list attrs (xml-maybe-do-ns node-name "" xml-ns)))
341 409
342 ;; is this an empty element ? 410 ;; is this an empty element ?
343 (if (looking-at "/>") 411 (if (looking-at "/>")
344 (progn
345 (forward-char 2)
346 (nreverse children))
347
348 ;; is this a valid start tag ?
349 (if (eq (char-after) ?>)
350 (progn 412 (progn
351 (forward-char 1) 413 (forward-char 2)
352 ;; Now check that we have the right end-tag. Note that this
353 ;; one might contain spaces after the tag name
354 (let ((end (concat "</" node-name "\\s-*>")))
355 (while (not (looking-at end))
356 (cond
357 ((looking-at "</")
358 (error "XML: Invalid end tag (expecting %s) at pos %d"
359 node-name (point)))
360 ((= (char-after) ?<)
361 (let ((tag (xml-parse-tag nil xml-ns)))
362 (when tag
363 (push tag children))))
364 (t
365 (setq pos (point))
366 (search-forward "<")
367 (forward-char -1)
368 (let ((string (buffer-substring pos (point)))
369 (pos 0))
370
371 ;; Clean up the string. As per XML
372 ;; specifications, the XML processor should
373 ;; always pass the whole string to the
374 ;; application. But \r's should be replaced:
375 ;; http://www.w3.org/TR/2000/REC-xml-20001006#sec-line-ends
376 (while (string-match "\r\n?" string pos)
377 (setq string (replace-match "\n" t t string))
378 (setq pos (1+ (match-beginning 0))))
379
380 (setq string (xml-substitute-special string))
381 (setq children
382 (if (stringp (car children))
383 ;; The two strings were separated by a comment.
384 (cons (concat (car children) string)
385 (cdr children))
386 (cons string children))))))))
387
388 (goto-char (match-end 0))
389 (nreverse children)) 414 (nreverse children))
390 ;; This was an invalid start tag 415
391 (error "XML: Invalid attribute list"))))) 416 ;; is this a valid start tag ?
392 (t ;; This is not a tag. 417 (if (eq (char-after) ?>)
393 (error "XML: Invalid character"))))) 418 (progn
419 (forward-char 1)
420 ;; Now check that we have the right end-tag. Note that this
421 ;; one might contain spaces after the tag name
422 (let ((end (concat "</" node-name "\\s-*>")))
423 (while (not (looking-at end))
424 (cond
425 ((looking-at "</")
426 (error "XML: (Not Well-Formed) Invalid end tag (expecting %s) at pos %d"
427 node-name (point)))
428 ((= (char-after) ?<)
429 (let ((tag (xml-parse-tag nil xml-ns)))
430 (when tag
431 (push tag children))))
432 (t
433 (let ((expansion (xml-parse-string)))
434 (setq children
435 (if (stringp expansion)
436 (if (stringp (car children))
437 ;; The two strings were separated by a comment.
438 (setq children (append (concat (car children) expansion)
439 (cdr children)))
440 (setq children (append (list expansion) children)))
441 (setq children (append expansion children))))))))
442
443 (goto-char (match-end 0))
444 (nreverse children)))
445 ;; This was an invalid start tag (Expected ">", but didn't see it.)
446 (error "XML: (Well-Formed) Couldn't parse tag: %s"
447 (buffer-substring (- (point) 10) (+ (point) 1)))))))
448 (t ;; (Not one of PI, CDATA, Comment, End tag, or Start tag)
449 (unless xml-sub-parser ; Usually, we error out.
450 (error "XML: (Well-Formed) Invalid character"))
451
452 ;; However, if we're parsing incrementally, then we need to deal
453 ;; with stray CDATA.
454 (xml-parse-string)))))
455
456(defun xml-parse-string ()
457 "Parse the next whatever. Could be a string, or an element."
458 (let* ((pos (point))
459 (string (progn (if (search-forward "<" nil t)
460 (forward-char -1)
461 (goto-char (point-max)))
462 (buffer-substring pos (point)))))
463 ;; Clean up the string. As per XML specifications, the XML
464 ;; processor should always pass the whole string to the
465 ;; application. But \r's should be replaced:
466 ;; http://www.w3.org/TR/2000/REC-xml-20001006#sec-line-ends
467 (setq pos 0)
468 (while (string-match "\r\n?" string pos)
469 (setq string (replace-match "\n" t t string))
470 (setq pos (1+ (match-beginning 0))))
471
472 (xml-substitute-special string)))
394 473
395(defun xml-parse-attlist (&optional xml-ns) 474(defun xml-parse-attlist (&optional xml-ns)
396 "Return the attribute-list after point. 475 "Return the attribute-list after point.
@@ -412,18 +491,23 @@ Leave point at the first non-blank character after the tag."
412 (setq end-pos (match-end 0)) 491 (setq end-pos (match-end 0))
413 (if (looking-at "'\\([^']*\\)'") 492 (if (looking-at "'\\([^']*\\)'")
414 (setq end-pos (match-end 0)) 493 (setq end-pos (match-end 0))
415 (error "XML: Attribute values must be given between quotes"))) 494 (error "XML: (Not Well-Formed) Attribute values must be given between quotes")))
416 495
417 ;; Each attribute must be unique within a given element 496 ;; Each attribute must be unique within a given element
418 (if (assoc name attlist) 497 (if (assoc name attlist)
419 (error "XML: each attribute must be unique within an element")) 498 (error "XML: (Not Well-Formed) Each attribute must be unique within an element"))
420 499
421 ;; Multiple whitespace characters should be replaced with a single one 500 ;; Multiple whitespace characters should be replaced with a single one
422 ;; in the attributes 501 ;; in the attributes
423 (let ((string (match-string 1)) 502 (let ((string (match-string 1))
424 (pos 0)) 503 (pos 0))
425 (replace-regexp-in-string "\\s-\\{2,\\}" " " string) 504 (replace-regexp-in-string "\\s-\\{2,\\}" " " string)
426 (push (cons name (xml-substitute-special string)) attlist)) 505 (let ((expansion (xml-substitute-special string)))
506 (unless (stringp expansion)
507 ; We say this is the constraint. It is acctually that
508 ; external entities nor "<" can be in an attribute value.
509 (error "XML: (Not Well-Formed) Entities in attributes cannot expand into elements"))
510 (push (cons name expansion) attlist)))
427 511
428 (goto-char end-pos) 512 (goto-char end-pos)
429 (skip-syntax-forward " ")) 513 (skip-syntax-forward " "))
@@ -442,24 +526,16 @@ Leave point at the first non-blank character after the tag."
442(defun xml-skip-dtd () 526(defun xml-skip-dtd ()
443 "Skip the DTD at point. 527 "Skip the DTD at point.
444This follows the rule [28] in the XML specifications." 528This follows the rule [28] in the XML specifications."
445 (forward-char (length "<!DOCTYPE")) 529 (let ((xml-validating-parser nil))
446 (if (looking-at "\\s-*>") 530 (xml-parse-dtd)))
447 (error "XML: invalid DTD (excepting name of the document)"))
448 (condition-case nil
449 (progn
450 (forward-sexp)
451 (skip-syntax-forward " ")
452 (if (looking-at "\\[")
453 (re-search-forward "]\\s-*>")
454 (search-forward ">")))
455 (error (error "XML: No end to the DTD"))))
456 531
457(defun xml-parse-dtd () 532(defun xml-parse-dtd (&optional parse-ns)
458 "Parse the DTD at point." 533 "Parse the DTD at point."
459 (forward-char (eval-when-compile (length "<!DOCTYPE"))) 534 (forward-char (eval-when-compile (length "<!DOCTYPE")))
460 (skip-syntax-forward " ") 535 (skip-syntax-forward " ")
461 (if (looking-at ">") 536 (if (and (looking-at ">")
462 (error "XML: invalid DTD (excepting name of the document)")) 537 xml-validating-parser)
538 (error "XML: (Validity) Invalid DTD (expecting name of the document)"))
463 539
464 ;; Get the name of the document 540 ;; Get the name of the document
465 (looking-at xml-name-regexp) 541 (looking-at xml-name-regexp)
@@ -477,27 +553,27 @@ This follows the rule [28] in the XML specifications."
477 (re-search-forward 553 (re-search-forward
478 "\\='\\([[:space:][:alnum:]-()+,./:=?;!*#@$_%]*\\)'" 554 "\\='\\([[:space:][:alnum:]-()+,./:=?;!*#@$_%]*\\)'"
479 nil t)) 555 nil t))
480 (error "XML: missing public id")) 556 (error "XML: Missing Public ID"))
481 (let ((pubid (match-string 1))) 557 (let ((pubid (match-string 1)))
558 (skip-syntax-forward " ")
482 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t) 559 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t)
483 (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t)) 560 (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t))
484 (error "XML: missing system id")) 561 (error "XML: Missing System ID"))
485 (push (list pubid (match-string 1) 'public) dtd))) 562 (push (list pubid (match-string 1) 'public) dtd)))
486 ((looking-at "SYSTEM\\s-+") 563 ((looking-at "SYSTEM\\s-+")
487 (goto-char (match-end 0)) 564 (goto-char (match-end 0))
488 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t) 565 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t)
489 (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t)) 566 (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t))
490 (error "XML: missing system id")) 567 (error "XML: Missing System ID"))
491 (push (list (match-string 1) 'system) dtd))) 568 (push (list (match-string 1) 'system) dtd)))
492 (skip-syntax-forward " ") 569 (skip-syntax-forward " ")
493 (if (eq ?> (char-after)) 570 (if (eq ?> (char-after))
494 (forward-char) 571 (forward-char)
495 (skip-syntax-forward " ")
496 (if (not (eq (char-after) ?\[)) 572 (if (not (eq (char-after) ?\[))
497 (error "XML: bad DTD") 573 (error "XML: Bad DTD")
498 (forward-char) 574 (forward-char)
499 ;; Parse the rest of the DTD 575 ;; Parse the rest of the DTD
500 ;; Fixme: Deal with ENTITY, ATTLIST, NOTATION, PIs. 576 ;; Fixme: Deal with ATTLIST, NOTATION, PIs.
501 (while (not (looking-at "\\s-*\\]")) 577 (while (not (looking-at "\\s-*\\]"))
502 (skip-syntax-forward " ") 578 (skip-syntax-forward " ")
503 (cond 579 (cond
@@ -521,11 +597,13 @@ This follows the rule [28] in the XML specifications."
521 ((string-match "^%[^;]+;[ \t\n\r]*$" type) ;; substitution 597 ((string-match "^%[^;]+;[ \t\n\r]*$" type) ;; substitution
522 nil) 598 nil)
523 (t 599 (t
524 (error "XML: Invalid element type in the DTD"))) 600 (if xml-validating-parser
601 error "XML: (Validity) Invalid element type in the DTD")))
525 602
526 ;; rule [45]: the element declaration must be unique 603 ;; rule [45]: the element declaration must be unique
527 (if (assoc element dtd) 604 (if (and (assoc element dtd)
528 (error "XML: element declarations must be unique in a DTD (<%s>)" 605 xml-validating-parser)
606 (error "XML: (Validity) Element declarations must be unique in a DTD (<%s>)"
529 element)) 607 element))
530 608
531 ;; Store the element in the DTD 609 ;; Store the element in the DTD
@@ -533,12 +611,49 @@ This follows the rule [28] in the XML specifications."
533 (goto-char end-pos)) 611 (goto-char end-pos))
534 ((looking-at "<!--") 612 ((looking-at "<!--")
535 (search-forward "-->")) 613 (search-forward "-->"))
536 614 ((looking-at (concat "<!ENTITY[ \t\n\r]*\\(" xml-name-re
615 "\\)[ \t\n\r]*\\(" xml-entity-value-re
616 "\\)[ \t\n\r]*>"))
617 (let ((name (buffer-substring (nth 2 (match-data))
618 (nth 3 (match-data))))
619 (value (buffer-substring (+ (nth 4 (match-data)) 1)
620 (- (nth 5 (match-data)) 1))))
621 (goto-char (nth 1 (match-data)))
622 (setq xml-entity-alist
623 (append xml-entity-alist
624 (list (cons name
625 (with-temp-buffer
626 (insert value)
627 (goto-char (point-min))
628 (xml-parse-fragment
629 xml-validating-parser
630 parse-ns))))))))
631 ((or (looking-at (concat "<!ENTITY[ \t\n\r]+\\(" xml-name-re
632 "\\)[ \t\n\r]+SYSTEM[ \t\n\r]+"
633 "\\(\"[^\"]*\"\\|'[^']*'\\)[ \t\n\r]*>"))
634 (looking-at (concat "<!ENTITY[ \t\n\r]+\\(" xml-name-re
635 "\\)[ \t\n\r]+PUBLIC[ \t\n\r]+"
636 "\"[- \r\na-zA-Z0-9'()+,./:=?;!*#@$_%]*\""
637 "\\|'[- \r\na-zA-Z0-9()+,./:=?;!*#@$_%]*'"
638 "[ \t\n\r]+\\(\"[^\"]*\"\\|'[^']*'\\)"
639 "[ \t\n\r]*>")))
640 (let ((name (buffer-substring (nth 2 (match-data))
641 (nth 3 (match-data))))
642 (file (buffer-substring (+ (nth 4 (match-data)) 1)
643 (- (nth 5 (match-data)) 1))))
644 (goto-char (nth 1 (match-data)))
645 (setq xml-entity-alist
646 (append xml-entity-alist
647 (list (cons name (with-temp-buffer
648 (insert-file-contents file)
649 (goto-char (point-min))
650 (xml-parse-fragment
651 xml-validating-parser
652 parse-ns))))))))
537 (t 653 (t
538 (error "XML: Invalid DTD item"))) 654 (error "XML: (Validity) Invalid DTD item")))))
539 655 (if (looking-at "\\s-*]>")
540 ;; Skip the end of the DTD 656 (goto-char (nth 1 (match-data)))))
541 (search-forward ">"))))
542 (nreverse dtd))) 657 (nreverse dtd)))
543 658
544(defun xml-parse-elem-type (string) 659(defun xml-parse-elem-type (string)
@@ -580,41 +695,72 @@ This follows the rule [28] in the XML specifications."
580;;** 695;;**
581;;******************************************************************* 696;;*******************************************************************
582 697
583(eval-when-compile
584 (defvar str)) ; dynamic from replace-regexp-in-string
585
586;; Fixme: Take declared entities from the DTD when they're available.
587(defun xml-substitute-entity (match)
588 "Subroutine of `xml-substitute-special'."
589 (save-match-data
590 (let ((match1 (match-string 1 str)))
591 (cond ((string= match1 "lt") "<")
592 ((string= match1 "gt") ">")
593 ((string= match1 "apos") "'")
594 ((string= match1 "quot") "\"")
595 ((string= match1 "amp") "&")
596 ((and (string-match "#\\([0-9]+\\)" match1)
597 (let ((c (decode-char
598 'ucs
599 (string-to-number (match-string 1 match1)))))
600 (if c (string c))))) ; else unrepresentable
601 ((and (string-match "#x\\([[:xdigit:]]+\\)" match1)
602 (let ((c (decode-char
603 'ucs
604 (string-to-number (match-string 1 match1) 16))))
605 (if c (string c)))))
606 ;; Default to asis. Arguably, unrepresentable code points
607 ;; might be best replaced with U+FFFD.
608 (t match)))))
609
610(defun xml-substitute-special (string) 698(defun xml-substitute-special (string)
611 "Return STRING, after subsituting entity references." 699 "Return STRING, after subsituting entity references."
612 ;; This originally made repeated passes through the string from the 700 ;; This originally made repeated passes through the string from the
613 ;; beginning, which isn't correct, since then either "&amp;amp;" or 701 ;; beginning, which isn't correct, since then either "&amp;amp;" or
614 ;; "&#38;amp;" won't DTRT. 702 ;; "&#38;amp;" won't DTRT.
615 (replace-regexp-in-string "&\\([^;]+\\);"
616 #'xml-substitute-entity string t t))
617 703
704 (let ((point 0)
705 children end-point)
706 (while (string-match "&\\([^;]+\\);" string point)
707 (setq end-point (match-end 0))
708 (let* ((this-part (match-string 1 string))
709 (prev-part (substring string point (match-beginning 0)))
710 (entity (assoc this-part xml-entity-alist))
711 (expansion
712 (cond ((string-match "#\\([0-9]+\\)" this-part)
713 (let ((c (decode-char
714 'ucs
715 (string-to-number (match-string 1 this-part)))))
716 (if c (string c))))
717 ((string-match "#x\\([[:xdigit:]]+\\)" this-part)
718 (let ((c (decode-char
719 'ucs
720 (string-to-number (match-string 1 this-part) 16))))
721 (if c (string c))))
722 (entity
723 (cdr entity))
724 (t
725 (if xml-validating-parser
726 (error "XML: (Validity) Undefined entity `%s'"
727 (match-string 1 this-part)))))))
728
729 (cond ((null children)
730 (if (stringp expansion)
731 (setq children (concat prev-part expansion))
732 (if (stringp (car (last expansion)))
733 (progn
734 (setq children
735 (list (concat prev-part (car expansion))
736 (cdr expansion))))
737 (setq children (append expansion prev-part)))))
738 ((stringp children)
739 (if (stringp expansion)
740 (setq children (concat children prev-part expansion))
741 (setq children (list expansion (concat prev-part children)))))
742 ((and (stringp expansion)
743 (stringp (car children)))
744 (setcar children (concat prev-part expansion (car children))))
745 ((stringp expansion)
746 (setq children (append (concat prev-part expansion)
747 children)))
748 ((stringp (car children))
749 (setcar children (concat (car children) prev-part))
750 (setq children (append expansion children)))
751 (t
752 (setq children (list expansion
753 prev-part
754 children))))
755 (setq point end-point)))
756 (cond ((stringp children)
757 (concat children (substring string point)))
758 ((stringp (car (last children)))
759 (concat (car children) (substring string point)))
760 ((null children)
761 string)
762 (t
763 (nreverse children)))))
618;;******************************************************************* 764;;*******************************************************************
619;;** 765;;**
620;;** Printing a tree. 766;;** Printing a tree.
diff --git a/lispref/ChangeLog b/lispref/ChangeLog
index a27d59b72fa..cdf120e7a41 100644
--- a/lispref/ChangeLog
+++ b/lispref/ChangeLog
@@ -1,3 +1,24 @@
12004-07-09 Richard M. Stallman <rms@gnu.org>
2
3 * frames.texi (Input Focus): Minor fix.
4
52004-07-07 Luc Teirlinck <teirllm@auburn.edu>
6
7 * frames.texi (Input Focus): Clarify descriptions of
8 `select-frame-set-input-focus' and `select-frame'.
9
102004-07-06 Luc Teirlinck <teirllm@auburn.edu>
11
12 * os.texi: Various small changes in addition to:
13 (Killing Emacs): Expand and clarify description of
14 `kill-emacs-query-functions' and `kill-emacs-hook'.
15 (System Environment): Expand and clarify description of `getenv'
16 and `setenv'.
17 (Timers): Clarify description of `run-at-time'.
18 (Translating Input): Correct description of
19 `extra-keyboard-modifiers'.
20 (Flow Control): Correct description of `enable-flow-control'.
21
12004-07-06 Thien-Thi Nguyen <ttn@gnu.org> 222004-07-06 Thien-Thi Nguyen <ttn@gnu.org>
2 23
3 * os.texi: Update copyright. 24 * os.texi: Update copyright.
diff --git a/lispref/frames.texi b/lispref/frames.texi
index 24540f471f8..61522e3598c 100644
--- a/lispref/frames.texi
+++ b/lispref/frames.texi
@@ -997,7 +997,7 @@ Some window systems and window managers direct keyboard input to the
997window object that the mouse is in; others require explicit clicks or 997window object that the mouse is in; others require explicit clicks or
998commands to @dfn{shift the focus} to various window objects. Either 998commands to @dfn{shift the focus} to various window objects. Either
999way, Emacs automatically keeps track of which frame has the focus. To 999way, Emacs automatically keeps track of which frame has the focus. To
1000switch to a different frame from a lisp function, call 1000switch to a different frame from a Lisp function, call
1001@code{select-frame-set-input-focus}. 1001@code{select-frame-set-input-focus}.
1002 1002
1003Lisp programs can also switch frames ``temporarily'' by calling the 1003Lisp programs can also switch frames ``temporarily'' by calling the
@@ -1006,17 +1006,19 @@ concept of focus; rather, it escapes from the window manager's control
1006until that control is somehow reasserted. 1006until that control is somehow reasserted.
1007 1007
1008When using a text-only terminal, only one frame can be displayed at a 1008When using a text-only terminal, only one frame can be displayed at a
1009time on the terminal, so @code{select-frame} actually displays the 1009time on the terminal, so after a call to @code{select-frame}, the next
1010newly selected frame. This frame remains displayed until a subsequent 1010redisplay actually displays the newly selected frame. This frame
1011call to @code{select-frame} or @code{select-frame-set-input-focus}. 1011remains selected until a subsequent call to @code{select-frame} or
1012Each terminal frame has a number which appears in the mode line before 1012@code{select-frame-set-input-focus}. Each terminal frame has a number
1013the buffer name (@pxref{Mode Line Variables}). 1013which appears in the mode line before the buffer name (@pxref{Mode
1014Line Variables}).
1014 1015
1015@defun select-frame-set-input-focus frame 1016@defun select-frame-set-input-focus frame
1016This function makes @var{frame} the selected frame, raises it (should 1017This function makes @var{frame} the selected frame, raises it (should
1017it happen to be obscured by other frames) and tries to give it the X 1018it happen to be obscured by other frames) and tries to give it the X
1018server's focus. On a text-only terminal, the new frame gets displayed 1019server's focus. On a text-only terminal, the next redisplay displays
1019on the entire terminal screen. 1020the new frame on the entire terminal screen. The return value of this
1021function is not significant.
1020@end defun 1022@end defun
1021 1023
1022@c ??? This is not yet implemented properly. 1024@c ??? This is not yet implemented properly.
@@ -1026,7 +1028,8 @@ focus of the X server if any. The selection of @var{frame} lasts until
1026the next time the user does something to select a different frame, or 1028the next time the user does something to select a different frame, or
1027until the next time this function is called. The specified @var{frame} 1029until the next time this function is called. The specified @var{frame}
1028becomes the selected frame, as explained above, and the terminal that 1030becomes the selected frame, as explained above, and the terminal that
1029@var{frame} is on becomes the selected terminal. 1031@var{frame} is on becomes the selected terminal. This function
1032returns @var{frame}, or @code{nil} if @var{frame} has been deleted.
1030 1033
1031In general, you should never use @code{select-frame} in a way that could 1034In general, you should never use @code{select-frame} in a way that could
1032switch to a different terminal without switching back when you're done. 1035switch to a different terminal without switching back when you're done.
diff --git a/lispref/os.texi b/lispref/os.texi
index d52464e7409..3e1b93339ad 100644
--- a/lispref/os.texi
+++ b/lispref/os.texi
@@ -237,7 +237,7 @@ This normal hook is run, once, just before loading all the init files
237This normal hook is run, once, just after loading all the init files 237This normal hook is run, once, just after loading all the init files
238(the user's init file, @file{default.el}, and/or @file{site-start.el}), 238(the user's init file, @file{default.el}, and/or @file{site-start.el}),
239before loading the terminal-specific library and processing the 239before loading the terminal-specific library and processing the
240command-line arguments. 240command-line action arguments.
241@end defvar 241@end defvar
242 242
243@defvar emacs-startup-hook 243@defvar emacs-startup-hook
@@ -248,7 +248,7 @@ arguments, just before @code{term-setup-hook}.
248 248
249@defvar user-init-file 249@defvar user-init-file
250@tindex user-init-file 250@tindex user-init-file
251This variable holds the file name of the user's init file. If the 251This variable holds the absolute file name of the user's init file. If the
252actual init file loaded is a compiled file, such as @file{.emacs.elc}, 252actual init file loaded is a compiled file, such as @file{.emacs.elc},
253the value refers to the corresponding source file. 253the value refers to the corresponding source file.
254@end defvar 254@end defvar
@@ -471,20 +471,31 @@ been saved, is lost when the Emacs process is killed. Because killing
471Emacs inadvertently can lose a lot of work, Emacs queries for 471Emacs inadvertently can lose a lot of work, Emacs queries for
472confirmation before actually terminating if you have buffers that need 472confirmation before actually terminating if you have buffers that need
473saving or subprocesses that are running. This is done in the function 473saving or subprocesses that are running. This is done in the function
474@code{save-buffers-kill-emacs}. 474@code{save-buffers-kill-emacs}, the higher level function from which
475@code{kill-emacs} is usually called.
475 476
476@defvar kill-emacs-query-functions 477@defvar kill-emacs-query-functions
477After asking the standard questions, @code{save-buffers-kill-emacs} 478After asking the standard questions, @code{save-buffers-kill-emacs}
478calls the functions in the list @code{kill-emacs-query-functions}, in 479calls the functions in the list @code{kill-emacs-query-functions}, in
479order of appearance, with no arguments. These functions can ask for 480order of appearance, with no arguments. These functions can ask for
480additional confirmation from the user. If any of them returns 481additional confirmation from the user. If any of them returns
481@code{nil}, Emacs is not killed. 482@code{nil}, @code{save-buffers-kill-emacs} does not kill Emacs, and
483does not run the remaining functions in this hook. Calling
484@code{kill-emacs} directly does not run this hook.
482@end defvar 485@end defvar
483 486
484@defvar kill-emacs-hook 487@defvar kill-emacs-hook
485This variable is a normal hook; once @code{save-buffers-kill-emacs} is 488This variable is a normal hook; once @code{save-buffers-kill-emacs} is
486finished with all file saving and confirmation, it runs the functions in 489finished with all file saving and confirmation, it calls
487this hook. This hook is not run in batch mode. 490@code{kill-emacs} which runs the functions in this hook.
491@code{kill-emacs} does not run this hook in batch mode.
492
493@code{kill-emacs} may be invoked directly (that is not via
494@code{save-buffers-kill-emacs}) if the terminal is disconnected, or in
495similar situations where interaction with the user is not possible.
496Thus, if your hook needs to interact with the user, put it on
497@code{kill-emacs-query-functions}; if it needs to run regardless of
498how Emacs is killed, put it on @code{kill-emacs-hook}.
488@end defvar 499@end defvar
489 500
490@node Suspending Emacs 501@node Suspending Emacs
@@ -508,7 +519,7 @@ give input to some other job such as a shell merely by moving to a
508different window. Therefore, suspending is not allowed when Emacs is using 519different window. Therefore, suspending is not allowed when Emacs is using
509a window system (X or MS Windows). 520a window system (X or MS Windows).
510 521
511@defun suspend-emacs string 522@defun suspend-emacs &optional string
512This function stops Emacs and returns control to the superior process. 523This function stops Emacs and returns control to the superior process.
513If and when the superior process resumes Emacs, @code{suspend-emacs} 524If and when the superior process resumes Emacs, @code{suspend-emacs}
514returns @code{nil} to its caller in Lisp. 525returns @code{nil} to its caller in Lisp.
@@ -542,10 +553,10 @@ Emacs is suspended. But it is read and executed by the shell.
542 (function (lambda () 553 (function (lambda ()
543 (or (y-or-n-p 554 (or (y-or-n-p
544 "Really suspend? ") 555 "Really suspend? ")
545 (error "Suspend cancelled"))))) 556 (error "Suspend canceled")))))
546 @result{} (lambda nil 557 @result{} (lambda nil
547 (or (y-or-n-p "Really suspend? ") 558 (or (y-or-n-p "Really suspend? ")
548 (error "Suspend cancelled"))) 559 (error "Suspend canceled")))
549@end group 560@end group
550@group 561@group
551(add-hook 'suspend-resume-hook 562(add-hook 'suspend-resume-hook
@@ -694,8 +705,10 @@ Emacs was dumped. @xref{Building Emacs}.)
694@deffn Command getenv var 705@deffn Command getenv var
695@cindex environment variable access 706@cindex environment variable access
696This function returns the value of the environment variable @var{var}, 707This function returns the value of the environment variable @var{var},
697as a string. Within Emacs, the environment variable values are kept in 708as a string. @var{var} should be a string. If @var{var} is undefined
698the Lisp variable @code{process-environment}. 709in the environment, @code{getenv} returns @code{nil}. If returns
710@samp{""} if @var{var} is set but null. Within Emacs, the environment
711variable values are kept in the Lisp variable @code{process-environment}.
699 712
700@example 713@example
701@group 714@group
@@ -717,11 +730,22 @@ HOME=/user/lewis
717@end deffn 730@end deffn
718 731
719@c Emacs 19 feature 732@c Emacs 19 feature
720@deffn Command setenv variable value 733@deffn Command setenv variable &optional value
721This command sets the value of the environment variable named 734This command sets the value of the environment variable named
722@var{variable} to @var{value}. Both arguments should be strings. This 735@var{variable} to @var{value}. @var{variable} should be a string.
723function works by modifying @code{process-environment}; binding that 736Internally, Emacs Lisp can handle any string. However, normally
724variable with @code{let} is also reasonable practice. 737@var{variable} should be a valid shell identifier, that is, a sequence
738of letters, digits and underscores, starting with a letter or
739underscore. Otherwise, errors may occur if subprocesses of Emacs try
740to access the value of @var{variable}. If @var{value} is omitted or
741@code{nil}, @code{setenv} removes @var{variable} from the environment.
742Otherwise, @var{value} should be a string.
743
744@code{setenv} works by modifying @code{process-environment}; binding
745that variable with @code{let} is also reasonable practice.
746
747@code{setenv} returns the new value of @var{variable}, or @code{nil}
748if it removed @var{variable} from the environment.
725@end deffn 749@end deffn
726 750
727@defvar process-environment 751@defvar process-environment
@@ -801,6 +825,10 @@ an error. On some platforms, access to load averages requires
801installing Emacs as setuid or setgid so that it can read kernel 825installing Emacs as setuid or setgid so that it can read kernel
802information, and that usually isn't advisable. 826information, and that usually isn't advisable.
803 827
828If the 1-minute load average is available, but the 5- or 15-minute
829averages are not, this function returns a shortened list containing
830the available averages.
831
804@example 832@example
805@group 833@group
806(load-average) 834(load-average)
@@ -820,12 +848,14 @@ lewis@@rocky[5] % uptime
820@end defun 848@end defun
821 849
822@defun emacs-pid 850@defun emacs-pid
823This function returns the process @acronym{ID} of the Emacs process. 851This function returns the process @acronym{ID} of the Emacs process,
852as an integer.
824@end defun 853@end defun
825 854
826@defvar tty-erase-char 855@defvar tty-erase-char
827This variable holds the erase character that was selected 856This variable holds the erase character that was selected
828in the system's terminal driver, before Emacs was started. 857in the system's terminal driver, before Emacs was started.
858The value is @code{nil} if Emacs is running under a window system.
829@end defvar 859@end defvar
830 860
831@defun setprv privilege-name &optional setp getprv 861@defun setprv privilege-name &optional setp getprv
@@ -836,7 +866,7 @@ whether the privilege is to be turned on or off. Its default is
836@code{nil}. The function returns @code{t} if successful, @code{nil} 866@code{nil}. The function returns @code{t} if successful, @code{nil}
837otherwise. 867otherwise.
838 868
839 If the third argument, @var{getprv}, is non-@code{nil}, @code{setprv} 869If the third argument, @var{getprv}, is non-@code{nil}, @code{setprv}
840does not change the privilege, but returns @code{t} or @code{nil} 870does not change the privilege, but returns @code{t} or @code{nil}
841indicating whether the privilege is currently enabled. 871indicating whether the privilege is currently enabled.
842@end defun 872@end defun
@@ -845,8 +875,9 @@ indicating whether the privilege is currently enabled.
845@section User Identification 875@section User Identification
846 876
847@defvar init-file-user 877@defvar init-file-user
848This variable says which user's init files should be used by Emacs---or 878This variable says which user's init files should be used by
849@code{nil} if none. The value reflects command-line options such as 879Emacs---or @code{nil} if none. @code{""} stands for the user who
880originally logged in. The value reflects command-line options such as
850@samp{-q} or @samp{-u @var{user}}. 881@samp{-q} or @samp{-u @var{user}}.
851 882
852Lisp packages that load files of customizations, or any other sort of 883Lisp packages that load files of customizations, or any other sort of
@@ -873,7 +904,8 @@ is set, that value is used. Otherwise, if the environment variable
873on the effective @acronym{UID}, not the real @acronym{UID}. 904on the effective @acronym{UID}, not the real @acronym{UID}.
874 905
875If you specify @var{uid}, the value is the user name that corresponds 906If you specify @var{uid}, the value is the user name that corresponds
876to @var{uid} (which should be an integer). 907to @var{uid} (which should be an integer), or @code{nil} if there is
908no such user.
877 909
878@example 910@example
879@group 911@group
@@ -904,7 +936,7 @@ of the environment variable @code{NAME}, if that is set.
904If the Emacs job's user-id does not correspond to any known user (and 936If the Emacs job's user-id does not correspond to any known user (and
905provided @code{NAME} is not set), the value is @code{"unknown"}. 937provided @code{NAME} is not set), the value is @code{"unknown"}.
906 938
907If @var{uid} is non-@code{nil}, then it should be an integer (a user-id) 939If @var{uid} is non-@code{nil}, then it should be a number (a user-id)
908or a string (a login name). Then @code{user-full-name} returns the full 940or a string (a login name). Then @code{user-full-name} returns the full
909name corresponding to that user-id or login name. If you specify a 941name corresponding to that user-id or login name. If you specify a
910user-id or login name that isn't defined, it returns @code{nil}. 942user-id or login name that isn't defined, it returns @code{nil}.
@@ -956,7 +988,8 @@ The argument @var{time-value}, if given, specifies a time to format
956instead of the current time. The argument should be a list whose first 988instead of the current time. The argument should be a list whose first
957two elements are integers. Thus, you can use times obtained from 989two elements are integers. Thus, you can use times obtained from
958@code{current-time} (see below) and from @code{file-attributes} 990@code{current-time} (see below) and from @code{file-attributes}
959(@pxref{File Attributes}). 991(@pxref{Definition of file-attributes}). @var{time-value} can also be
992a cons of two integers, but this is considered obsolete.
960 993
961@example 994@example
962@group 995@group
@@ -971,7 +1004,7 @@ two elements are integers. Thus, you can use times obtained from
971This function returns the system's time value as a list of three 1004This function returns the system's time value as a list of three
972integers: @code{(@var{high} @var{low} @var{microsec})}. The integers 1005integers: @code{(@var{high} @var{low} @var{microsec})}. The integers
973@var{high} and @var{low} combine to give the number of seconds since 1006@var{high} and @var{low} combine to give the number of seconds since
9740:00 January 1, 1970 (local time), which is 10070:00 January 1, 1970 UTC (Coordinated Universal Time), which is
975@ifnottex 1008@ifnottex
976@var{high} * 2**16 + @var{low}. 1009@var{high} * 2**16 + @var{low}.
977@end ifnottex 1010@end ifnottex
@@ -984,7 +1017,8 @@ start of the current second (or 0 for systems that return time with
984the resolution of only one second). 1017the resolution of only one second).
985 1018
986The first two elements can be compared with file time values such as you 1019The first two elements can be compared with file time values such as you
987get with the function @code{file-attributes}. @xref{File Attributes}. 1020get with the function @code{file-attributes}.
1021@xref{Definition of file-attributes}.
988@end defun 1022@end defun
989 1023
990@c Emacs 19 feature 1024@c Emacs 19 feature
@@ -1001,20 +1035,21 @@ if the user has specified a time zone that does not use a seasonal time
1001adjustment, then the value is constant through time. 1035adjustment, then the value is constant through time.
1002 1036
1003If the operating system doesn't supply all the information necessary to 1037If the operating system doesn't supply all the information necessary to
1004compute the value, both elements of the list are @code{nil}. 1038compute the value, the unknown elements of the list are @code{nil}.
1005 1039
1006The argument @var{time-value}, if given, specifies a time to analyze 1040The argument @var{time-value}, if given, specifies a time to analyze
1007instead of the current time. The argument should be a cons cell 1041instead of the current time. The argument should have the same form
1008containing two integers, or a list whose first two elements are 1042as for @code{current-time-string} (see above). Thus, you can use
1009integers. Thus, you can use times obtained from @code{current-time} 1043times obtained from @code{current-time} (see above) and from
1010(see above) and from @code{file-attributes} (@pxref{File Attributes}). 1044@code{file-attributes}. @xref{Definition of file-attributes}.
1011@end defun 1045@end defun
1012 1046
1013@defun set-time-zone-rule tz 1047@defun set-time-zone-rule tz
1014This function specifies the local time zone according to @var{tz}. If 1048This function specifies the local time zone according to @var{tz}. If
1015@var{tz} is @code{nil}, that means to use an implementation-defined 1049@var{tz} is @code{nil}, that means to use an implementation-defined
1016default time zone. If @var{tz} is @code{t}, that means to use 1050default time zone. If @var{tz} is @code{t}, that means to use
1017Universal Time. 1051Universal Time. Otherwise, @var{tz} should be a string specifying a
1052time zone rule.
1018@end defun 1053@end defun
1019 1054
1020@defun float-time &optional time-value 1055@defun float-time &optional time-value
@@ -1022,7 +1057,7 @@ This function returns the current time as a floating-point number of
1022seconds since the epoch. The argument @var{time-value}, if given, 1057seconds since the epoch. The argument @var{time-value}, if given,
1023specifies a time to convert instead of the current time. The argument 1058specifies a time to convert instead of the current time. The argument
1024should have the same form as for @code{current-time-string} (see 1059should have the same form as for @code{current-time-string} (see
1025above), and it also accepts the output of @code{current-time} and 1060above). Thus, it accepts the output of @code{current-time} and
1026@code{file-attributes}. 1061@code{file-attributes}.
1027 1062
1028@emph{Warning}: Since the result is floating point, it may not be 1063@emph{Warning}: Since the result is floating point, it may not be
@@ -1036,7 +1071,7 @@ exact. Do not use this function if precise time stamps are required.
1036to strings or to calendrical information. There is also a function to 1071to strings or to calendrical information. There is also a function to
1037convert calendrical information to a time value. You can get time 1072convert calendrical information to a time value. You can get time
1038values from the functions @code{current-time} (@pxref{Time of Day}) and 1073values from the functions @code{current-time} (@pxref{Time of Day}) and
1039@code{file-attributes} (@pxref{File Attributes}). 1074@code{file-attributes} (@pxref{Definition of file-attributes}).
1040 1075
1041Many operating systems are limited to time values that contain 32 bits 1076Many operating systems are limited to time values that contain 32 bits
1042of information; these systems typically handle only the times from 1077of information; these systems typically handle only the times from
@@ -1189,6 +1224,7 @@ Here is what the elements mean:
1189@table @var 1224@table @var
1190@item seconds 1225@item seconds
1191The number of seconds past the minute, as an integer between 0 and 59. 1226The number of seconds past the minute, as an integer between 0 and 59.
1227On some operating systems, this is 60 for leap seconds.
1192@item minutes 1228@item minutes
1193The number of minutes past the hour, as an integer between 0 and 59. 1229The number of minutes past the hour, as an integer between 0 and 59.
1194@item hour 1230@item hour
@@ -1225,9 +1261,9 @@ yourself before you call @code{encode-time}.
1225The optional argument @var{zone} defaults to the current time zone and 1261The optional argument @var{zone} defaults to the current time zone and
1226its daylight savings time rules. If specified, it can be either a list 1262its daylight savings time rules. If specified, it can be either a list
1227(as you would get from @code{current-time-zone}), a string as in the 1263(as you would get from @code{current-time-zone}), a string as in the
1228@code{TZ} environment variable, or an integer (as you would get from 1264@code{TZ} environment variable, @code{t} for Universal Time, or an
1229@code{decode-time}). The specified zone is used without any further 1265integer (as you would get from @code{decode-time}). The specified
1230alteration for daylight savings time. 1266zone is used without any further alteration for daylight savings time.
1231 1267
1232If you pass more than seven arguments to @code{encode-time}, the first 1268If you pass more than seven arguments to @code{encode-time}, the first
1233six are used as @var{seconds} through @var{year}, the last argument is 1269six are used as @var{seconds} through @var{year}, the last argument is
@@ -1309,15 +1345,18 @@ because most timer functions don't do a lot of work. Indeed, for a
1309timer to call a function that takes substantial time to run is likely 1345timer to call a function that takes substantial time to run is likely
1310to be annoying. 1346to be annoying.
1311 1347
1312@defun run-at-time time repeat function &rest args 1348@deffn Command run-at-time time repeat function &rest args
1313This function arranges to call @var{function} with arguments @var{args} 1349This sets up a timer that calls the function @var{function} with
1314at time @var{time}. The argument @var{function} is a function to call 1350arguments @var{args} at time @var{time}. If @var{repeat} is a number
1315later, and @var{args} are the arguments to give it when it is called. 1351(integer or floating point), the timer also runs every @var{repeat}
1316The time @var{time} is specified as a string. 1352seconds after that. If @var{repeat} is @code{nil}, the timer runs
1353only once.
1354
1355@var{time} may specify an absolute or a relative time.
1317 1356
1318Absolute times may be specified in a wide variety of formats; this 1357Absolute times may be specified in a wide variety of formats; this
1319function tries to accept all the commonly used date formats. Valid 1358function tries to accept all the commonly used date formats. The most
1320formats include these two, 1359convenient formats are strings. Valid such formats include these two,
1321 1360
1322@example 1361@example
1323@var{year}-@var{month}-@var{day} @var{hour}:@var{min}:@var{sec} @var{timezone} 1362@var{year}-@var{month}-@var{day} @var{hour}:@var{min}:@var{sec} @var{timezone}
@@ -1330,7 +1369,7 @@ where in both examples all fields are numbers; the format that
1330@code{current-time-string} returns is also allowed, and many others 1369@code{current-time-string} returns is also allowed, and many others
1331as well. 1370as well.
1332 1371
1333To specify a relative time, use numbers followed by units. 1372To specify a relative time as a string, use numbers followed by units.
1334For example: 1373For example:
1335 1374
1336@table @samp 1375@table @samp
@@ -1345,13 +1384,9 @@ denotes exactly 103 months, 123 days, and 10862 seconds from now.
1345For relative time values, Emacs considers a month to be exactly thirty 1384For relative time values, Emacs considers a month to be exactly thirty
1346days, and a year to be exactly 365.25 days. 1385days, and a year to be exactly 365.25 days.
1347 1386
1348If @var{time} is a number (integer or floating point), that specifies a 1387Not all convenient formats are strings. If @var{time} is a number
1349relative time measured in seconds. 1388(integer or floating point), that specifies a relative time measured
1350 1389in seconds.
1351The argument @var{repeat} specifies how often to repeat the call. If
1352@var{repeat} is @code{nil}, there are no repetitions; @var{function} is
1353called just once, at @var{time}. If @var{repeat} is a number, it
1354specifies a repetition period measured in seconds.
1355 1390
1356In most cases, @var{repeat} has no effect on when @emph{first} call 1391In most cases, @var{repeat} has no effect on when @emph{first} call
1357takes place---@var{time} alone specifies that. There is one exception: 1392takes place---@var{time} alone specifies that. There is one exception:
@@ -1362,7 +1397,7 @@ functions like @code{display-time}.
1362The function @code{run-at-time} returns a timer value that identifies 1397The function @code{run-at-time} returns a timer value that identifies
1363the particular scheduled future action. You can use this value to call 1398the particular scheduled future action. You can use this value to call
1364@code{cancel-timer} (see below). 1399@code{cancel-timer} (see below).
1365@end defun 1400@end deffn
1366 1401
1367@defmac with-timeout (seconds timeout-forms@dots{}) body@dots{} 1402@defmac with-timeout (seconds timeout-forms@dots{}) body@dots{}
1368Execute @var{body}, but give up after @var{seconds} seconds. If 1403Execute @var{body}, but give up after @var{seconds} seconds. If
@@ -1388,7 +1423,7 @@ calls one of those primitives. So use @code{with-timeout} only with a
1388a timer to avoid waiting too long for an answer. @xref{Yes-or-No 1423a timer to avoid waiting too long for an answer. @xref{Yes-or-No
1389Queries}. 1424Queries}.
1390 1425
1391@defun run-with-idle-timer secs repeat function &rest args 1426@deffn Command run-with-idle-timer secs repeat function &rest args
1392Set up a timer which runs when Emacs has been idle for @var{secs} 1427Set up a timer which runs when Emacs has been idle for @var{secs}
1393seconds. The value of @var{secs} may be an integer or a floating point 1428seconds. The value of @var{secs} may be an integer or a floating point
1394number. 1429number.
@@ -1400,7 +1435,7 @@ remains idle for @var{secs} seconds.
1400 1435
1401The function @code{run-with-idle-timer} returns a timer value which you 1436The function @code{run-with-idle-timer} returns a timer value which you
1402can use in calling @code{cancel-timer} (see below). 1437can use in calling @code{cancel-timer} (see below).
1403@end defun 1438@end deffn
1404 1439
1405@cindex idleness 1440@cindex idleness
1406 Emacs becomes ``idle'' when it starts waiting for user input, and it 1441 Emacs becomes ``idle'' when it starts waiting for user input, and it
@@ -1426,8 +1461,8 @@ set up to repeat will subsequently run another time, one by one.
1426@defun cancel-timer timer 1461@defun cancel-timer timer
1427Cancel the requested action for @var{timer}, which should be a value 1462Cancel the requested action for @var{timer}, which should be a value
1428previously returned by @code{run-at-time} or @code{run-with-idle-timer}. 1463previously returned by @code{run-at-time} or @code{run-with-idle-timer}.
1429This cancels the effect of that call to @code{run-at-time}; the arrival 1464This cancels the effect of that call to one of these functions; the
1430of the specified time will not cause anything special to happen. 1465arrival of the specified time will not cause anything special to happen.
1431@end defun 1466@end defun
1432 1467
1433@node Terminal Input 1468@node Terminal Input
@@ -1450,7 +1485,7 @@ functions.
1450@cindex input modes 1485@cindex input modes
1451@cindex terminal input modes 1486@cindex terminal input modes
1452 1487
1453@defun set-input-mode interrupt flow meta quit-char 1488@defun set-input-mode interrupt flow meta &optional quit-char
1454This function sets the mode for reading keyboard input. If 1489This function sets the mode for reading keyboard input. If
1455@var{interrupt} is non-null, then Emacs uses input interrupts. If it is 1490@var{interrupt} is non-null, then Emacs uses input interrupts. If it is
1456@code{nil}, then it uses @sc{cbreak} mode. The default setting is 1491@code{nil}, then it uses @sc{cbreak} mode. The default setting is
@@ -1523,31 +1558,30 @@ being read; then subsequences containing it are checked first with
1523@c Emacs 19 feature 1558@c Emacs 19 feature
1524@defvar extra-keyboard-modifiers 1559@defvar extra-keyboard-modifiers
1525This variable lets Lisp programs ``press'' the modifier keys on the 1560This variable lets Lisp programs ``press'' the modifier keys on the
1526keyboard. The value is a bit mask: 1561keyboard. The value is a character. Only the modifiers of the
1527 1562character matter. Each time the user types a keyboard key, it is
1528@table @asis 1563altered as if those modifier keys were held down. For instance, if
1529@item 1 1564you bind @code{extra-keyboard-modifiers} to @code{?\C-\M-a}, then all
1530The @key{SHIFT} key. 1565keyboard input characters typed during the scope of the binding will
1531@item 2 1566have the control and meta modifiers applied to them. The character
1532The @key{LOCK} key. 1567@code{?\C-@@}, equivalent to the integer 0, does not count as a control
1533@item 4 1568character for this purpose, but as a character with no modifiers.
1534The @key{CTL} key. 1569Thus, setting @code{extra-keyboard-modifiers} to zero cancels any
1535@item 8 1570modification.
1536The @key{META} key.
1537@end table
1538
1539Each time the user types a keyboard key, it is altered as if the
1540modifier keys specified in the bit mask were held down.
1541 1571
1542When using a window system, the program can ``press'' any of the 1572When using a window system, the program can ``press'' any of the
1543modifier keys in this way. Otherwise, only the @key{CTL} and @key{META} 1573modifier keys in this way. Otherwise, only the @key{CTL} and @key{META}
1544keys can be virtually pressed. 1574keys can be virtually pressed.
1575
1576Note that this variable applies only to events that really come from
1577the keyboard, and has no effect on mouse events or any other events.
1545@end defvar 1578@end defvar
1546 1579
1547@defvar keyboard-translate-table 1580@defvar keyboard-translate-table
1548This variable is the translate table for keyboard characters. It lets 1581This variable is the translate table for keyboard characters. It lets
1549you reshuffle the keys on the keyboard without changing any command 1582you reshuffle the keys on the keyboard without changing any command
1550bindings. Its value is normally a char-table, or else @code{nil}. 1583bindings. Its value is normally a char-table, or else @code{nil}.
1584(It can also be a string or vector, but this is considered obsolete.)
1551 1585
1552If @code{keyboard-translate-table} is a char-table 1586If @code{keyboard-translate-table} is a char-table
1553(@pxref{Char-Tables}), then each character read from the keyboard is 1587(@pxref{Char-Tables}), then each character read from the keyboard is
@@ -1587,6 +1621,11 @@ Note that this translation is the first thing that happens to a
1587character after it is read from the terminal. Record-keeping features 1621character after it is read from the terminal. Record-keeping features
1588such as @code{recent-keys} and dribble files record the characters after 1622such as @code{recent-keys} and dribble files record the characters after
1589translation. 1623translation.
1624
1625Note also that this translation is done before the characters are
1626supplied to input methods (@pxref{Input Methods}). Use
1627@code{translation-table-for-input} (@pxref{Translation of Characters}),
1628if you want to translate characters after input methods operate.
1590@end defvar 1629@end defvar
1591 1630
1592@defun keyboard-translate from to 1631@defun keyboard-translate from to
@@ -1699,7 +1738,7 @@ to turn the character that follows into a Hyper character:
1699 1738
1700Finally, if you have enabled keyboard character set decoding using 1739Finally, if you have enabled keyboard character set decoding using
1701@code{set-keyboard-coding-system}, decoding is done after the 1740@code{set-keyboard-coding-system}, decoding is done after the
1702translations listed above. @xref{Specifying Coding Systems}. In future 1741translations listed above. @xref{Terminal I/O Encoding}. In future
1703Emacs versions, character set decoding may be done before the other 1742Emacs versions, character set decoding may be done before the other
1704translations. 1743translations.
1705 1744
@@ -1804,7 +1843,10 @@ often than to actual Emacs bugs. Once you are certain which characters
1804were actually output, you can determine reliably whether they correspond 1843were actually output, you can determine reliably whether they correspond
1805to the Termcap specifications in use. 1844to the Termcap specifications in use.
1806 1845
1807See also @code{open-dribble-file} in @ref{Terminal Input}. 1846You close the termscript file by calling this function with an
1847argument of @code{nil}.
1848
1849See also @code{open-dribble-file} in @ref{Recording Input}.
1808 1850
1809@example 1851@example
1810@group 1852@group
@@ -1969,10 +2011,16 @@ terminals, the flow control problem is gradually disappearing. For the
1969mean time, Emacs provides a convenient way of enabling flow control if 2011mean time, Emacs provides a convenient way of enabling flow control if
1970you want it: call the function @code{enable-flow-control}. 2012you want it: call the function @code{enable-flow-control}.
1971 2013
1972@deffn Command enable-flow-control 2014@deffn Command enable-flow-control &optional arg
1973This function enables use of @kbd{C-s} and @kbd{C-q} for output flow 2015When @var{arg} is a positive integer, this function enables use of
1974control, and provides the characters @kbd{C-\} and @kbd{C-^} as aliases 2016@kbd{C-s} and @kbd{C-q} for output flow control, and provides the
1975for them using @code{keyboard-translate-table} (@pxref{Translating Input}). 2017characters @kbd{C-\} and @kbd{C-^} as aliases for them using
2018@code{keyboard-translate-table} (@pxref{Translating Input}).
2019
2020When @var{arg} is a negative integer or zero, it disables these
2021features. When @var{arg} is @code{nil} or omitted, it toggles.
2022Interactively, @var{arg} is the prefix argument. If non-@code{nil},
2023its numeric value is used.
1976@end deffn 2024@end deffn
1977 2025
1978You can use the function @code{enable-flow-control-on} in your 2026You can use the function @code{enable-flow-control-on} in your
@@ -1994,7 +2042,7 @@ if the terminal type is one of @var{termtypes}. For example:
1994@item 2042@item
1995@cindex @sc{cbreak} 2043@cindex @sc{cbreak}
1996It sets @sc{cbreak} mode for terminal input, and tells the operating 2044It sets @sc{cbreak} mode for terminal input, and tells the operating
1997system to handle flow control, with @code{(set-input-mode nil t)}. 2045system to handle flow control. This is done using @code{set-input-mode}.
1998 2046
1999@item 2047@item
2000It sets up @code{keyboard-translate-table} to translate @kbd{C-\} and 2048It sets up @code{keyboard-translate-table} to translate @kbd{C-\} and
@@ -2061,10 +2109,11 @@ saved session to restore. For Emacs, this argument is @samp{--smid
2061Emacs supports saving state by using a hook called 2109Emacs supports saving state by using a hook called
2062@code{emacs-save-session-functions}. Each function in this hook is 2110@code{emacs-save-session-functions}. Each function in this hook is
2063called when the session manager tells Emacs that the window system is 2111called when the session manager tells Emacs that the window system is
2064shutting down. The functions are called with the current buffer set 2112shutting down. The functions are called with no arguments and with the
2065to a temporary buffer. Each function can use @code{insert} to add 2113current buffer set to a temporary buffer. Each function can use
2066Lisp code to this buffer. At the end, Emacs saves the buffer in a 2114@code{insert} to add Lisp code to this buffer. At the end, Emacs
2067file that another Emacs will later load in order to restart the saved session. 2115saves the buffer in a file that a subsequent Emacs invocation will
2116load in order to restart the saved session.
2068 2117
2069If a function in @code{emacs-save-session-functions} returns 2118If a function in @code{emacs-save-session-functions} returns
2070non-@code{nil}, Emacs tells the session manager to cancel the 2119non-@code{nil}, Emacs tells the session manager to cancel the
diff --git a/src/ChangeLog b/src/ChangeLog
index 254069032ed..3d70d69cd69 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,7 +1,32 @@
12004-07-10 Luc Teirlinck <teirllm@auburn.edu>
2
3 * buffer.c (Fswitch_to_buffer, Fpop_to_buffer): Doc fixes.
4
5 * window.c (Fwindow_buffer, Fother_window, Fget_lru_window)
6 (Fget_largest_window, Fget_buffer_window, Fdelete_windows_on)
7 (Freplace_buffer_in_windows, Fset_window_buffer)
8 (Fselect-window, Fdisplay-buffer, Fsplit_window): Doc fixes.
9 (syms_of_window): Expand docstring of `display-buffer-function'.
10
112004-07-09 Luc Teirlinck <teirllm@auburn.edu>
12
13 * editfns.c (Ffloat_time, Fformat_time_string, Fdecode_time)
14 (Fcurrent_time_string, Fcurrent_time_zone): Mention in docstrings
15 that time values of the type (HIGH . LOW) are considered obsolete.
16
172004-07-06 Luc Teirlinck <teirllm@auburn.edu>
18
19 * keyboard.c (syms_of_keyboard): Fix `keyboard-translate-table'
20 docstring.
21
22 * fns.c (Fclear_string): Declare `len' before call to CHECK_STRING.
23
12004-07-06 John Paul Wallington <jpw@gnu.org> 242004-07-06 John Paul Wallington <jpw@gnu.org>
2 25
3 * eval.c (Fdefmacro): Signal an error if NAME is not a symbol. 26 * eval.c (Fdefmacro): Signal an error if NAME is not a symbol.
4 27
28 * fns.c (Fclear_string): Signal an error if STRING is not a string.
29
52004-07-05 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> 302004-07-05 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
6 31
7 * macterm.c (mac_initialize_display_info): Use CGGetActiveDisplayList 32 * macterm.c (mac_initialize_display_info): Use CGGetActiveDisplayList
diff --git a/src/buffer.c b/src/buffer.c
index bd4e061b05f..8bc20776957 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1665,9 +1665,15 @@ switch_to_buffer_1 (buffer, norecord)
1665 1665
1666DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ", 1666DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ",
1667 doc: /* Select buffer BUFFER in the current window. 1667 doc: /* Select buffer BUFFER in the current window.
1668BUFFER may be a buffer or a buffer name. 1668If BUFFER does not identify an existing buffer,
1669then this function creates a buffer with that name.
1670
1671When called from Lisp, BUFFER may be a buffer, a string \(a buffer name),
1672or nil. If BUFFER is nil, then this function chooses a buffer
1673using `other-buffer'.
1669Optional second arg NORECORD non-nil means 1674Optional second arg NORECORD non-nil means
1670do not put this buffer at the front of the list of recently selected ones. 1675do not put this buffer at the front of the list of recently selected ones.
1676This function returns the buffer it switched to.
1671 1677
1672WARNING: This is NOT the way to work on another buffer temporarily 1678WARNING: This is NOT the way to work on another buffer temporarily
1673within a Lisp program! Use `set-buffer' instead. That avoids messing with 1679within a Lisp program! Use `set-buffer' instead. That avoids messing with
@@ -1690,11 +1696,15 @@ the window-buffer correspondences. */)
1690 1696
1691DEFUN ("pop-to-buffer", Fpop_to_buffer, Spop_to_buffer, 1, 3, 0, 1697DEFUN ("pop-to-buffer", Fpop_to_buffer, Spop_to_buffer, 1, 3, 0,
1692 doc: /* Select buffer BUFFER in some window, preferably a different one. 1698 doc: /* Select buffer BUFFER in some window, preferably a different one.
1693If BUFFER is nil, then some other buffer is chosen. 1699BUFFER may be a buffer, a string \(a buffer name), or nil.
1700If BUFFER is a string which is not the name of an existing buffer,
1701then this function creates a buffer with that name.
1702If BUFFER is nil, then it chooses some other buffer.
1694If `pop-up-windows' is non-nil, windows can be split to do this. 1703If `pop-up-windows' is non-nil, windows can be split to do this.
1695If optional second arg OTHER-WINDOW is non-nil, insist on finding another 1704If optional second arg OTHER-WINDOW is non-nil, insist on finding another
1696window even if BUFFER is already visible in the selected window, 1705window even if BUFFER is already visible in the selected window,
1697and ignore `same-window-regexps' and `same-window-buffer-names'. 1706and ignore `same-window-regexps' and `same-window-buffer-names'.
1707This function returns the buffer it switched to.
1698This uses the function `display-buffer' as a subroutine; see the documentation 1708This uses the function `display-buffer' as a subroutine; see the documentation
1699of `display-buffer' for additional customization information. 1709of `display-buffer' for additional customization information.
1700 1710
diff --git a/src/editfns.c b/src/editfns.c
index 9928beff678..2782a966bf0 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -1426,10 +1426,10 @@ lisp_time_argument (specified_time, result, usec)
1426DEFUN ("float-time", Ffloat_time, Sfloat_time, 0, 1, 0, 1426DEFUN ("float-time", Ffloat_time, Sfloat_time, 0, 1, 0,
1427 doc: /* Return the current time, as a float number of seconds since the epoch. 1427 doc: /* Return the current time, as a float number of seconds since the epoch.
1428If SPECIFIED-TIME is given, it is the time to convert to float 1428If SPECIFIED-TIME is given, it is the time to convert to float
1429instead of the current time. The argument should have the forms: 1429instead of the current time. The argument should have the form
1430 (HIGH . LOW) or (HIGH LOW USEC) or (HIGH LOW . USEC). 1430(HIGH LOW . IGNORED). Thus, you can use times obtained from
1431Thus, you can use times obtained from `current-time' 1431`current-time' and from `file-attributes'. SPECIFIED-TIME can also
1432and from `file-attributes'. 1432have the form (HIGH . LOW), but this is considered obsolete.
1433 1433
1434WARNING: Since the result is floating point, it may not be exact. 1434WARNING: Since the result is floating point, it may not be exact.
1435Do not use this function if precise time stamps are required. */) 1435Do not use this function if precise time stamps are required. */)
@@ -1501,8 +1501,9 @@ emacs_memftimeu (s, maxsize, format, format_len, tp, ut)
1501 1501
1502DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 1, 3, 0, 1502DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 1, 3, 0,
1503 doc: /* Use FORMAT-STRING to format the time TIME, or now if omitted. 1503 doc: /* Use FORMAT-STRING to format the time TIME, or now if omitted.
1504TIME is specified as (HIGH LOW . IGNORED) or (HIGH . LOW), as returned by 1504TIME is specified as (HIGH LOW . IGNORED), as returned by
1505`current-time' or `file-attributes'. 1505`current-time' or `file-attributes'. The obsolete form (HIGH . LOW)
1506is also still accepted.
1506The third, optional, argument UNIVERSAL, if non-nil, means describe TIME 1507The third, optional, argument UNIVERSAL, if non-nil, means describe TIME
1507as Universal Time; nil means describe TIME in the local time zone. 1508as Universal Time; nil means describe TIME in the local time zone.
1508The value is a copy of FORMAT-STRING, but with certain constructs replaced 1509The value is a copy of FORMAT-STRING, but with certain constructs replaced
@@ -1598,17 +1599,19 @@ For example, to produce full ISO 8601 format, use "%Y-%m-%dT%T%z". */)
1598 1599
1599DEFUN ("decode-time", Fdecode_time, Sdecode_time, 0, 1, 0, 1600DEFUN ("decode-time", Fdecode_time, Sdecode_time, 0, 1, 0,
1600 doc: /* Decode a time value as (SEC MINUTE HOUR DAY MONTH YEAR DOW DST ZONE). 1601 doc: /* Decode a time value as (SEC MINUTE HOUR DAY MONTH YEAR DOW DST ZONE).
1601The optional SPECIFIED-TIME should be a list of (HIGH LOW . IGNORED) 1602The optional SPECIFIED-TIME should be a list of (HIGH LOW . IGNORED),
1602or (HIGH . LOW), as from `current-time' and `file-attributes', or `nil' 1603as from `current-time' and `file-attributes', or `nil' to use the
1603to use the current time. The list has the following nine members: 1604current time. The obsolete form (HIGH . LOW) is also still accepted.
1604SEC is an integer between 0 and 60; SEC is 60 for a leap second, which 1605The list has the following nine members: SEC is an integer between 0
1605only some operating systems support. MINUTE is an integer between 0 and 59. 1606and 60; SEC is 60 for a leap second, which only some operating systems
1606HOUR is an integer between 0 and 23. DAY is an integer between 1 and 31. 1607support. MINUTE is an integer between 0 and 59. HOUR is an integer
1607MONTH is an integer between 1 and 12. YEAR is an integer indicating the 1608between 0 and 23. DAY is an integer between 1 and 31. MONTH is an
1608four-digit year. DOW is the day of week, an integer between 0 and 6, where 1609integer between 1 and 12. YEAR is an integer indicating the
16090 is Sunday. DST is t if daylight savings time is effect, otherwise nil. 1610four-digit year. DOW is the day of week, an integer between 0 and 6,
1610ZONE is an integer indicating the number of seconds east of Greenwich. 1611where 0 is Sunday. DST is t if daylight savings time is effect,
1611(Note that Common Lisp has different meanings for DOW and ZONE.) */) 1612otherwise nil. ZONE is an integer indicating the number of seconds
1613east of Greenwich. (Note that Common Lisp has different meanings for
1614DOW and ZONE.) */)
1612 (specified_time) 1615 (specified_time)
1613 Lisp_Object specified_time; 1616 Lisp_Object specified_time;
1614{ 1617{
@@ -1740,13 +1743,11 @@ The format is `Sun Sep 16 01:03:52 1973'.
1740However, see also the functions `decode-time' and `format-time-string' 1743However, see also the functions `decode-time' and `format-time-string'
1741which provide a much more powerful and general facility. 1744which provide a much more powerful and general facility.
1742 1745
1743If SPECIFIED-TIME is given, it is a time to format instead 1746If SPECIFIED-TIME is given, it is a time to format instead of the
1744of the current time. The argument should have the form: 1747current time. The argument should have the form (HIGH LOW . IGNORED).
1745 (HIGH . LOW) 1748Thus, you can use times obtained from `current-time' and from
1746or the form: 1749`file-attributes'. SPECIFIED-TIME can also have the form (HIGH . LOW),
1747 (HIGH LOW . IGNORED). 1750but this is considered obsolete. */)
1748Thus, you can use times obtained from `current-time'
1749and from `file-attributes'. */)
1750 (specified_time) 1751 (specified_time)
1751 Lisp_Object specified_time; 1752 Lisp_Object specified_time;
1752{ 1753{
@@ -1797,12 +1798,10 @@ OFFSET is an integer number of seconds ahead of UTC (east of Greenwich).
1797 A negative value means west of Greenwich. 1798 A negative value means west of Greenwich.
1798NAME is a string giving the name of the time zone. 1799NAME is a string giving the name of the time zone.
1799If SPECIFIED-TIME is given, the time zone offset is determined from it 1800If SPECIFIED-TIME is given, the time zone offset is determined from it
1800instead of using the current time. The argument should have the form: 1801instead of using the current time. The argument should have the form
1801 (HIGH . LOW) 1802(HIGH LOW . IGNORED). Thus, you can use times obtained from
1802or the form: 1803`current-time' and from `file-attributes'. SPECIFIED-TIME can also
1803 (HIGH LOW . IGNORED). 1804have the form (HIGH . LOW), but this is considered obsolete.
1804Thus, you can use times obtained from `current-time'
1805and from `file-attributes'.
1806 1805
1807Some operating systems cannot provide all this information to Emacs; 1806Some operating systems cannot provide all this information to Emacs;
1808in this case, `current-time-zone' returns a list containing nil for 1807in this case, `current-time-zone' returns a list containing nil for
diff --git a/src/fns.c b/src/fns.c
index ef1ce628b17..fe59cb57793 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -2298,7 +2298,9 @@ This makes STRING unibyte and may change its length. */)
2298 (string) 2298 (string)
2299 Lisp_Object string; 2299 Lisp_Object string;
2300{ 2300{
2301 int len = SBYTES (string); 2301 int len;
2302 CHECK_STRING (string);
2303 len = SBYTES (string);
2302 bzero (SDATA (string), len); 2304 bzero (SDATA (string), len);
2303 STRING_SET_CHARS (string, len); 2305 STRING_SET_CHARS (string, len);
2304 STRING_SET_UNIBYTE (string); 2306 STRING_SET_UNIBYTE (string);
diff --git a/src/keyboard.c b/src/keyboard.c
index 469b15fb683..382f99058d4 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -11149,11 +11149,13 @@ Useful to set before you dump a modified Emacs. */);
11149 11149
11150 DEFVAR_LISP ("keyboard-translate-table", &Vkeyboard_translate_table, 11150 DEFVAR_LISP ("keyboard-translate-table", &Vkeyboard_translate_table,
11151 doc: /* Translate table for keyboard input, or nil. 11151 doc: /* Translate table for keyboard input, or nil.
11152Each character is looked up in this string and the contents used instead. 11152If non-nil, the value should be a char-table. Each character read
11153The value may be a string, a vector, or a char-table. 11153from the keyboard is looked up in this char-table. If the value found
11154If it is a string or vector of length N, 11154there is non-nil, then it is used instead of the actual input character.
11155character codes N and up are untranslated. 11155
11156In a vector or a char-table, an element which is nil means "no translation". 11156The value can also be a string or vector, but this is considered obsolete.
11157If it is a string or vector of length N, character codes N and up are left
11158untranslated. In a vector, an element which is nil means "no translation".
11157 11159
11158This is applied to the characters supplied to input methods, not their 11160This is applied to the characters supplied to input methods, not their
11159output. See also `translation-table-for-input'. */); 11161output. See also `translation-table-for-input'. */);
diff --git a/src/window.c b/src/window.c
index d3203c99e90..62ce399e95c 100644
--- a/src/window.c
+++ b/src/window.c
@@ -393,7 +393,8 @@ decode_any_window (window)
393} 393}
394 394
395DEFUN ("window-buffer", Fwindow_buffer, Swindow_buffer, 0, 1, 0, 395DEFUN ("window-buffer", Fwindow_buffer, Swindow_buffer, 0, 1, 0,
396 doc: /* Return the buffer that WINDOW is displaying. */) 396 doc: /* Return the buffer that WINDOW is displaying.
397WINDOW defaults to the selected window. */)
397 (window) 398 (window)
398 Lisp_Object window; 399 Lisp_Object window;
399{ 400{
@@ -1747,8 +1748,8 @@ DEFUN ("other-window", Fother_window, Sother_window, 1, 2, "p",
1747 doc: /* Select the ARG'th different window on this frame. 1748 doc: /* Select the ARG'th different window on this frame.
1748All windows on current frame are arranged in a cyclic order. 1749All windows on current frame are arranged in a cyclic order.
1749This command selects the window ARG steps away in that order. 1750This command selects the window ARG steps away in that order.
1750A negative ARG moves in the opposite order. If the optional second 1751A negative ARG moves in the opposite order. The optional second
1751argument ALL_FRAMES is non-nil, cycle through all frames. */) 1752argument ALL_FRAMES has the same meaning as in `next-window', which see. */)
1752 (arg, all_frames) 1753 (arg, all_frames)
1753 Lisp_Object arg, all_frames; 1754 Lisp_Object arg, all_frames;
1754{ 1755{
@@ -2066,6 +2067,7 @@ check_all_windows ()
2066DEFUN ("get-lru-window", Fget_lru_window, Sget_lru_window, 0, 1, 0, 2067DEFUN ("get-lru-window", Fget_lru_window, Sget_lru_window, 0, 1, 0,
2067 doc: /* Return the window least recently selected or used for display. 2068 doc: /* Return the window least recently selected or used for display.
2068Return a full-width window if possible. 2069Return a full-width window if possible.
2070A minibuffer window is never a candidate.
2069If optional argument FRAME is `visible', search all visible frames. 2071If optional argument FRAME is `visible', search all visible frames.
2070If FRAME is 0, search all visible and iconified frames. 2072If FRAME is 0, search all visible and iconified frames.
2071If FRAME is t, search all frames. 2073If FRAME is t, search all frames.
@@ -2085,6 +2087,7 @@ If FRAME is a frame, search only that frame. */)
2085 2087
2086DEFUN ("get-largest-window", Fget_largest_window, Sget_largest_window, 0, 1, 0, 2088DEFUN ("get-largest-window", Fget_largest_window, Sget_largest_window, 0, 1, 0,
2087 doc: /* Return the largest window in area. 2089 doc: /* Return the largest window in area.
2090A minibuffer window is never a candidate.
2088If optional argument FRAME is `visible', search all visible frames. 2091If optional argument FRAME is `visible', search all visible frames.
2089If FRAME is 0, search all visible and iconified frames. 2092If FRAME is 0, search all visible and iconified frames.
2090If FRAME is t, search all frames. 2093If FRAME is t, search all frames.
@@ -2099,6 +2102,7 @@ If FRAME is a frame, search only that frame. */)
2099 2102
2100DEFUN ("get-buffer-window", Fget_buffer_window, Sget_buffer_window, 1, 2, 0, 2103DEFUN ("get-buffer-window", Fget_buffer_window, Sget_buffer_window, 1, 2, 0,
2101 doc: /* Return a window currently displaying BUFFER, or nil if none. 2104 doc: /* Return a window currently displaying BUFFER, or nil if none.
2105BUFFER can be a buffer or a buffer name.
2102If optional argument FRAME is `visible', search all visible frames. 2106If optional argument FRAME is `visible', search all visible frames.
2103If optional argument FRAME is 0, search all visible and iconified frames. 2107If optional argument FRAME is 0, search all visible and iconified frames.
2104If FRAME is t, search all frames. 2108If FRAME is t, search all frames.
@@ -2181,6 +2185,7 @@ value is reasonable when this function is called. */)
2181DEFUN ("delete-windows-on", Fdelete_windows_on, Sdelete_windows_on, 2185DEFUN ("delete-windows-on", Fdelete_windows_on, Sdelete_windows_on,
2182 1, 2, "bDelete windows on (buffer): ", 2186 1, 2, "bDelete windows on (buffer): ",
2183 doc: /* Delete all windows showing BUFFER. 2187 doc: /* Delete all windows showing BUFFER.
2188BUFFER must be a buffer or the name of an existing buffer.
2184Optional second argument FRAME controls which frames are affected. 2189Optional second argument FRAME controls which frames are affected.
2185If optional argument FRAME is `visible', search all visible frames. 2190If optional argument FRAME is `visible', search all visible frames.
2186If FRAME is 0, search all visible and iconified frames. 2191If FRAME is 0, search all visible and iconified frames.
@@ -2210,7 +2215,8 @@ If FRAME is a frame, search only that frame. */)
2210DEFUN ("replace-buffer-in-windows", Freplace_buffer_in_windows, 2215DEFUN ("replace-buffer-in-windows", Freplace_buffer_in_windows,
2211 Sreplace_buffer_in_windows, 2216 Sreplace_buffer_in_windows,
2212 1, 1, "bReplace buffer in windows: ", 2217 1, 1, "bReplace buffer in windows: ",
2213 doc: /* Replace BUFFER with some other buffer in all windows showing it. */) 2218 doc: /* Replace BUFFER with some other buffer in all windows showing it.
2219BUFFER may be a buffer or the name of an existing buffer. */)
2214 (buffer) 2220 (buffer)
2215 Lisp_Object buffer; 2221 Lisp_Object buffer;
2216{ 2222{
@@ -3022,7 +3028,7 @@ set_window_buffer (window, buffer, run_hooks_p, keep_margins_p)
3022 3028
3023DEFUN ("set-window-buffer", Fset_window_buffer, Sset_window_buffer, 2, 3, 0, 3029DEFUN ("set-window-buffer", Fset_window_buffer, Sset_window_buffer, 2, 3, 0,
3024 doc: /* Make WINDOW display BUFFER as its contents. 3030 doc: /* Make WINDOW display BUFFER as its contents.
3025BUFFER can be a buffer or buffer name. 3031BUFFER can be a buffer or the name of an existing buffer.
3026Optional third arg KEEP-MARGINS non-nil means that WINDOW's current 3032Optional third arg KEEP-MARGINS non-nil means that WINDOW's current
3027display margins, fringe widths, and scroll bar settings are maintained; 3033display margins, fringe widths, and scroll bar settings are maintained;
3028the default is to reset these from BUFFER's local settings or the frame 3034the default is to reset these from BUFFER's local settings or the frame
@@ -3063,7 +3069,7 @@ defaults. */)
3063DEFUN ("select-window", Fselect_window, Sselect_window, 1, 2, 0, 3069DEFUN ("select-window", Fselect_window, Sselect_window, 1, 2, 0,
3064 doc: /* Select WINDOW. Most editing will apply to WINDOW's buffer. 3070 doc: /* Select WINDOW. Most editing will apply to WINDOW's buffer.
3065If WINDOW is not already selected, make WINDOW's buffer current 3071If WINDOW is not already selected, make WINDOW's buffer current
3066and make WINDOW the frame's selected window. 3072and make WINDOW the frame's selected window. Return WINDOW.
3067Optional second arg NORECORD non-nil means 3073Optional second arg NORECORD non-nil means
3068do not put this buffer at the front of the list of recently selected ones. 3074do not put this buffer at the front of the list of recently selected ones.
3069 3075
@@ -3247,7 +3253,8 @@ See `same-window-buffer-names' and `same-window-regexps'. */)
3247DEFUN ("display-buffer", Fdisplay_buffer, Sdisplay_buffer, 1, 3, 3253DEFUN ("display-buffer", Fdisplay_buffer, Sdisplay_buffer, 1, 3,
3248 "BDisplay buffer: \nP", 3254 "BDisplay buffer: \nP",
3249 doc: /* Make BUFFER appear in some window but don't select it. 3255 doc: /* Make BUFFER appear in some window but don't select it.
3250BUFFER can be a buffer or a buffer name. 3256BUFFER must be the name of an existing buffer, or, when called from Lisp,
3257a buffer.
3251If BUFFER is shown already in some window, just use that one, 3258If BUFFER is shown already in some window, just use that one,
3252unless the window is the selected window and the optional second 3259unless the window is the selected window and the optional second
3253argument NOT-THIS-WINDOW is non-nil (interactively, with prefix arg). 3260argument NOT-THIS-WINDOW is non-nil (interactively, with prefix arg).
@@ -3590,7 +3597,11 @@ WINDOW defaults to selected one and SIZE to half its size.
3590If optional third arg HORFLAG is non-nil, split side by side 3597If optional third arg HORFLAG is non-nil, split side by side
3591and put SIZE columns in the first of the pair. In that case, 3598and put SIZE columns in the first of the pair. In that case,
3592SIZE includes that window's scroll bar, or the divider column to its right. 3599SIZE includes that window's scroll bar, or the divider column to its right.
3593Returns the newly-created window. */) 3600Interactively, all arguments are nil.
3601
3602Returns the newly created window (which is the lower or rightmost one).
3603The upper or leftmost window is the original one and remains selected.
3604See Info node `(elisp)Splitting Windows' for more details and examples.*/)
3594 (window, size, horflag) 3605 (window, size, horflag)
3595 Lisp_Object window, size, horflag; 3606 Lisp_Object window, size, horflag;
3596{ 3607{
@@ -6455,7 +6466,9 @@ the buffer; `temp-buffer-show-hook' is not run unless this function runs it. */
6455 DEFVAR_LISP ("display-buffer-function", &Vdisplay_buffer_function, 6466 DEFVAR_LISP ("display-buffer-function", &Vdisplay_buffer_function,
6456 doc: /* If non-nil, function to call to handle `display-buffer'. 6467 doc: /* If non-nil, function to call to handle `display-buffer'.
6457It will receive two args, the buffer and a flag which if non-nil means 6468It will receive two args, the buffer and a flag which if non-nil means
6458 that the currently selected window is not acceptable. 6469that the currently selected window is not acceptable.
6470It should choose or create a window, display the specified buffer in it,
6471and return the window.
6459Commands such as `switch-to-buffer-other-window' and `find-file-other-window' 6472Commands such as `switch-to-buffer-other-window' and `find-file-other-window'
6460work using this function. */); 6473work using this function. */);
6461 Vdisplay_buffer_function = Qnil; 6474 Vdisplay_buffer_function = Qnil;