changeset 89989:e23928ac5a97

Revision: miles@gnu.org--gnu-2004/emacs--unicode--0--patch-47 Merge from emacs--cvs-trunk--0 Patches applied: * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-571 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-572 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-574 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-575 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-576 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-579 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-580 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-31 - miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-33 Update from CVS * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-34 Merge from emacs--cvs-trunk--0 * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-35 - miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-37 Update from CVS
author Miles Bader <miles@gnu.org>
date Wed, 29 Sep 2004 07:22:20 +0000
parents 3c5b3356d8e5 (current diff) cee5a9d8ee71 (diff)
children 9cdfbf04b9ea
files ChangeLog configure configure.in etc/ChangeLog etc/NEWS etc/PROBLEMS leim/ChangeLog lisp/ChangeLog lisp/calendar/diary-lib.el lisp/dired.el lisp/files.el lisp/fringe.el lisp/gnus/ChangeLog lisp/gnus/flow-fill.el lisp/gnus/gnus-art.el lisp/gnus/gnus-cache.el lisp/gnus/gnus-msg.el lisp/gnus/gnus.el lisp/gnus/message.el lisp/gnus/mm-bodies.el lisp/gnus/mm-decode.el lisp/gnus/mm-util.el lisp/gnus/mml.el lisp/gnus/nnfolder.el lisp/gnus/nnheader.el lisp/gnus/nnml.el lisp/gnus/rfc2047.el lisp/printing.el lisp/progmodes/gdb-ui.el lisp/term.el lisp/textmodes/enriched.el lispref/ChangeLog lispref/display.texi lispref/searching.texi lispref/text.texi man/ChangeLog man/display.texi man/emacs-mime.texi man/gnus-faq.texi man/gnus.texi man/message.texi src/ChangeLog src/buffer.c src/config.in src/dispextern.h src/fringe.c src/xdisp.c
diffstat 58 files changed, 1275 insertions(+), 555 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Sep 28 04:38:25 2004 +0000
+++ b/ChangeLog	Wed Sep 29 07:22:20 2004 +0000
@@ -1,3 +1,8 @@
+2004-09-25  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* configure.in (HAVE_EXECSHIELD): Only define on x86.
+	* configure: Rebuild.
+
 2004-09-24  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
 
 	* configure.in: Check for exec-shield.
--- a/configure	Tue Sep 28 04:38:25 2004 +0000
+++ b/configure	Wed Sep 29 07:22:20 2004 +0000
@@ -4302,7 +4302,7 @@
 fi
 
 if test "$emacs_cv_execshield" = 1; then
-   # Extract the first word of "setarch", so it can be a program name with args.
+  # Extract the first word of "setarch", so it can be a program name with args.
 set dummy setarch; ac_word=$2
 echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
@@ -4343,13 +4343,25 @@
 fi
 
 
-   if test "$setarch" != no; then
+  if test "$setarch" != no && test "$machine" = "intel386"; then
 
 cat >>confdefs.h <<\_ACEOF
 #define HAVE_EXECSHIELD 1
 _ACEOF
 
-   fi
+  else
+    case "`cat /proc/sys/kernel/exec-shield`" in
+      0) ;;
+      *)
+        { { echo "$as_me:$LINENO: error: Exec-shield is turned on.
+Emacs can not dump itself if exec-shield is turned on.
+See \`etc/PROBLEMS' for further information." >&5
+echo "$as_me: error: Exec-shield is turned on.
+Emacs can not dump itself if exec-shield is turned on.
+See \`etc/PROBLEMS' for further information." >&2;}
+   { (exit 1); exit 1; }; }
+    esac
+  fi
 fi
 
 #### Extract some information from the operating system and machine files.
--- a/configure.in	Tue Sep 28 04:38:25 2004 +0000
+++ b/configure.in	Wed Sep 29 07:22:20 2004 +0000
@@ -1288,13 +1288,22 @@
 
 dnl check if exec-shield is present.
 AC_CHECK_FILE(/proc/sys/kernel/exec-shield, emacs_cv_execshield=1,
-					    emacs_cv_execshield=0)
+                                            emacs_cv_execshield=0)
 if test "$emacs_cv_execshield" = 1; then
-   AC_PATH_PROG(SETARCH, setarch, no)
-   AC_SUBST(SETARCH)
-   if test "$setarch" != no; then
-     AC_DEFINE(HAVE_EXECSHIELD, 1, [Define to 1 if this OS has exec shield.])
-   fi
+  AC_PATH_PROG(SETARCH, setarch, no)
+  AC_SUBST(SETARCH)
+  if test "$setarch" != no && test "$machine" = "intel386"; then
+    AC_DEFINE(HAVE_EXECSHIELD, 1,
+    [Define to 1 if this OS has exec shield and we can handle it.])
+  else
+    case "`cat /proc/sys/kernel/exec-shield`" in
+      0) ;;
+      *)
+        AC_MSG_ERROR([Exec-shield is turned on.
+Emacs can not dump itself if exec-shield is turned on.
+See `etc/PROBLEMS' for further information.])
+    esac
+  fi
 fi
 
 #### Extract some information from the operating system and machine files.
--- a/etc/ChangeLog	Tue Sep 28 04:38:25 2004 +0000
+++ b/etc/ChangeLog	Wed Sep 29 07:22:20 2004 +0000
@@ -1,3 +1,18 @@
+2004-09-26  Luc Teirlinck  <teirllm@auburn.edu>
+
+	* enriched.doc: `enriched-annotation-alist' is now called
+	`enriched-translations'.
+
+2004-09-26  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* e/eterm.ti: Comment out smcup, rmcup. Add kbs, kdch1, rc, sc.
+	Reformat.
+        * e/eterm: Regenerate.
+
+2004-09-25  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* PROBLEMS: Updated exec-shield description.
+
 2004-09-16  Dan Nicolaescu  <dann@ics.uci.edu>
 
 	* e/eterm.ti: Change the strings for smso and rmso.
--- a/etc/NEWS	Tue Sep 28 04:38:25 2004 +0000
+++ b/etc/NEWS	Wed Sep 29 07:22:20 2004 +0000
@@ -2330,6 +2330,7 @@
 
 * Lisp Changes in Emacs 21.4
 
++++
 ** Major mode functions now run the new normal hook
 `after-change-major-mode-hook', at their very end, after the mode hooks.
 
--- a/etc/PROBLEMS	Tue Sep 28 04:38:25 2004 +0000
+++ b/etc/PROBLEMS	Wed Sep 29 07:22:20 2004 +0000
@@ -2333,28 +2333,34 @@
 *** Linux: Segfault during `make bootstrap' under certain recent versions of the Linux kernel.
 
 With certain recent Linux kernels (like the one of Redhat Fedora Core
-1), the new "Exec-shield" functionality is enabled by default, which
+1 and 2), the new "Exec-shield" functionality is enabled by default, which
 creates a different memory layout that breaks the emacs dumper.
 
+Configure can overcome the problem of exec-shield if the architecture is
+x86 and the program setarch is present.  On other architectures no
+workaround is known.
+
 You can check the Exec-shield state like this:
 
     cat /proc/sys/kernel/exec-shield
 
-It returns 1 or 2 when Exec-shield is enabled, 0 otherwise.  Please
+It returns non-zero when Exec-shield is enabled, 0 otherwise.  Please
 read your system documentation for more details on Exec-shield and
-associated commands.
+associated commands.  Exec-shield can be turned off with this command:
+
+    echo "0" > /proc/sys/kernel/exec-shield
 
 When Exec-shield is enabled, building Emacs will segfault during the
 execution of this command:
 
-temacs --batch --load loadup [dump|bootstrap]
+    ./temacs --batch --load loadup [dump|bootstrap]
 
 To work around this problem, it is necessary to temporarily disable
-Exec-shield while building Emacs, using the `setarch' command like
-this:
-
-    setarch i386 ./configure <configure parameters>
-    setarch i386 make <make parameters>
+Exec-shield while building Emacs, or, on x86, by using the `setarch'
+command when running temacs like this:
+
+    setarch i386 ./temacs --batch --load loadup [dump|bootstrap]
+
 
 *** Fatal signal in the command  temacs -l loadup inc dump.
 
--- a/etc/e/eterm.ti	Tue Sep 28 04:38:25 2004 +0000
+++ b/etc/e/eterm.ti	Wed Sep 29 07:22:20 2004 +0000
@@ -1,21 +1,61 @@
 eterm,
-	lines#24,cols#80,
-	colors#8,pairs#64,
-	cuu1=\E[A,cud1=\n,cub1=\b,cuf1=\E[C,home=\E[H,cr=\r,
-	cuu=\E[%p1%dA,cud=\E[%p1%dB,cub=\E[%p1%dD,cuf=\E[%p1%dC,
+	colors#8,
+	cols#80,
+	lines#24,
+	pairs#64,
+	am,
+	mir,
+	xenl,
+	bel=^G,
+	bold=\E[1m,
+	clear=\E[H\E[J,
+	cr=\r,
+	csr=\E[%i%p1%d;%p2%dr,
+	cub1=\b,
+	cub=\E[%p1%dD,
+	cud1=\n,
+	cud=\E[%p1%dB,
+	cuf1=\E[C,
+	cuf=\E[%p1%dC,
 	cup=\E[%i%p1%d;%p2%dH,
-	ind=\n,csr=\E[%i%p1%d;%p2%dr,
-	il1=\E[L,il=\E[%p1%dL,
-	clear=\E[H\E[J,ed=\E[J,el=\E[K,el1=\E[1K,
-	dl1=\E[M,dl=\E[%p1%dM,dch1=\E[P,dch=\E[%p1%dP,
-	smir=\E[4h,rmir=\E[4l,ich=\E[%p1%d@,mir,
-	smcup=\E7\E[?47h,rmcup=\E[2J\E[?47l\E8,
-	ht=\t,khome=\E[1~,kend=\E[4~,knp=\E[6~,kpp=\E[5~,
-	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
- 	smso=\E[7m,rmso=\E[27m,
-	smul=\E[4m,rmul=\E[24m,
-	rev=\E[7m,bold=\E[1m,sgr0=\E[m,
-	invis=\E[8m,op=\E[39;49m,
-	setab=\E[%p1%{40}%+%dm, setaf=\E[%p1%{30}%+%dm,
-	bel=^G,xenl,am,
-
+	cuu1=\E[A,
+	cuu=\E[%p1%dA,
+	dch1=\E[P,
+	dch=\E[%p1%dP,
+	dl1=\E[M,
+	dl=\E[%p1%dM,
+	ed=\E[J,
+	el1=\E[1K,
+	el=\E[K,
+	home=\E[H,
+	ht=\t,
+	ich=\E[%p1%d@,
+	il1=\E[L,
+	il=\E[%p1%dL,
+	ind=\n,
+	invis=\E[8m,
+	kbs=^?,
+	kcub1=\EOD,
+	kcud1=\EOB,
+	kcuf1=\EOC,
+	kcuu1=\EOA,
+	kdch1=\E[3~,
+	kend=\E[4~,
+	khome=\E[1~,
+	knp=\E[6~,
+	kpp=\E[5~,
+	op=\E[39;49m,
+	rc=\E8,
+	rev=\E[7m,
+	rmir=\E[4l,
+	rmso=\E[27m,
+	rmul=\E[24m,
+	sc=\E7,
+	setab=\E[%p1%{40}%+%dm,
+	setaf=\E[%p1%{30}%+%dm,
+	sgr0=\E[m,
+	smir=\E[4h,
+	smul=\E[4m,
+ 	smso=\E[7m,
+#	smcup=\E[?47h,
+#	rmcup=\E[?47l,
--- a/etc/enriched.doc	Tue Sep 28 04:38:25 2004 +0000
+++ b/etc/enriched.doc	Wed Sep 29 07:22:20 2004 +0000
@@ -196,11 +196,11 @@
 enriched-verbose.
 
 </fixed></indent>-<indent> You can add annotations for your own text properties by making
-additions to <fixed>enriched-annotation-alist</fixed>.  Note that the
-standard requires you to name your annotation starting<italic> "x-"
-</italic>(as in <italic>"x-read-only"</italic>).  Please send me any such additions that
-you think might be of general interest so that I can include
-them in the distribution.</indent>
+additions to <fixed>enriched-translations</fixed>.  Note that the standard
+requires you to name your annotation starting<italic> "x-" </italic>(as in
+<italic>"x-read-only"</italic>).  Please send me any such additions that you
+think might be of general interest so that I can include them
+in the distribution.</indent>
 
 </indent>
 
--- a/leim/ChangeLog	Tue Sep 28 04:38:25 2004 +0000
+++ b/leim/ChangeLog	Wed Sep 29 07:22:20 2004 +0000
@@ -1,3 +1,8 @@
+2004-09-25  Kenichi Handa  <handa@m17n.org>
+
+	* quail/uni-input.el (ucs-input-method): Add error clause to
+	condition-case.
+
 2004-09-21  Kenichi Handa  <handa@m17n.org>
 
 	* quail/uni-input.el: Move the call of register-input-method to
--- a/lisp/ChangeLog	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/ChangeLog	Wed Sep 29 07:22:20 2004 +0000
@@ -1,6 +1,79 @@
+2004-09-28  Stefan  <monnier@iro.umontreal.ca>
+
+	* dired.el (dired-view-command-alist): Use more efficient regexps.
+	Remove dubious arguments.
+	(dired-align-file): New function.
+	(dired-insert-directory): Use it.
+	(dired-move-to-end-of-filename): Make the " -> " search more specific.
+	(dired-buffers-for-dir): Remove unused var `pattern'.
+
+2004-09-29  Kim F. Storm  <storm@cua.dk>
+
+	* progmodes/gdb-ui.el (breakpoint): Define as fringe bitmap.
+	(gdb-mouse-toggle-breakpoint): Fix fringe-bitmaps-at-pos usage.
+	(gdb-put-breakpoint-icon): Use breakpoint bitmap.
+
+	* fringe.el (fringe-bitmap-p): New macro.
+	(fringe-bitmaps): Add standard fringe bitmaps on load.
+
+2004-09-28  Matthew Mundell  <matt@mundell.ukfsn.org>  (tiny change)
+
+	* calendar/diary-lib.el (list-diary-entries): Save diary buffer
+	from diary display excursion.  Store diary buffer's point for
+	`simple-diary-display'.
+	(simple-diary-display): Set window point and start when
+	displaying buffer, to preserve point.
+
+2004-09-27  Luc Teirlinck  <teirllm@auburn.edu>
+
+	* textmodes/enriched.el (enriched-translations): Replace defconst
+	with defvar.
+
+2004-09-26  Vinicius Jose Latorre  <viniciusjl@ig.com.br>
+
+	* printing.el: Doc fix.
+	(pr-version): New version number (6.8.1).
+	(pr-ps-file-using-ghostscript): Use make-temp-file instead of
+	make-temp-name.
+	(pr-delete-file): Check if file exists before deleting it.  Reported by
+	Lennart Borgman <lennart.borgman.073@student.lu.se>.
+
+2004-09-26  Stefan  <monnier@iro.umontreal.ca>
+
+	* term.el (term-display-table): New variable.
+	(term-mode): Use it.
+	(term-exec-1): Set the coding system to binary.
+	(term-emulate-terminal): Decode the string before inserting it.
+
+2004-09-26  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* term.el (term-ansi-at-eval-string, term-ansi-default-fg)
+	(term-ansi-default-bg, term-ansi-current-temp): Delete unused
+	vars.
+	(map): Bind S-prior, S-next and S-insert.
+	(term-mode): Set `indent-tabs-mode' to nil.
+	(term-paste): New function to be bound to S-insert.
+	(term-send-del, term-send-backspace): Change the strings sent.
+	(term-termcap-format): Synchronyze with etc/e/eterm.ti.
+	(term-handle-colors-array): Fix handling of underline and reverse.
+	(term-handle-ansi-escape): Do not handle smcup/rmcup. Add
+	comments.
+	(term-erase-in-line): Fix comparison.
+        (term-emulate-terminal): Fix line wrap handling.
+	(term-start-output-log): Renamed from `term-set-output-log'.
+	(term-stop-output-log): Renamed from `term-stop-photo'.
+        (term-switch-to-alternate-sub-buffer): Comment out, unused.
+
+2004-09-25  Stefan  <monnier@iro.umontreal.ca>
+
+	* dired.el (dired-move-to-filename): Don't output a message if
+	raise-error is non-nil.  Fix return position and value.
+
+	* files.el (insert-directory): Obey --dired even with symlinks.
+
 2004-09-25  Lars Hansen  <larsh@math.ku.dk>
 
-	* ls-lisp.el (ls-lisp-format): Mark file names with poperty
+	* ls-lisp.el (ls-lisp-format): Mark file names with property
 	dired-filename.
 
 2004-09-25  Kim F. Storm  <storm@cua.dk>
@@ -21,8 +94,8 @@
 	it, and show completions.
 	(ido-all-completions): Let bind ido-directory-too-big to nil.
 	(ido-exhibit): Handle ido-directory-too-big.
-	(ido-read-buffer): Handle fallback to read-buffer.  Init
-	ido-directory-too-big.
+	(ido-read-buffer): Handle fallback to read-buffer.
+	Init ido-directory-too-big.
 	(ido-read-file-name, ido-read-directory-name, ido-completing-read):
 	Init ido-directory-too-big.
 
--- a/lisp/calendar/diary-lib.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/calendar/diary-lib.el	Wed Sep 29 07:22:20 2004 +0000
@@ -4,6 +4,7 @@
 ;;           Free Software Foundation, Inc.
 
 ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
+;; Maintainer: Glenn Morris <gmorris@ast.cam.ac.uk>
 ;; Keywords: calendar
 
 ;; This file is part of GNU Emacs.
@@ -296,6 +297,8 @@
   :type    'sexp
   :version "21.4")
 
+(defvar diary-saved-point)		; internal
+
 (defun list-diary-entries (date number)
   "Create and display a buffer containing the relevant lines in diary-file.
 The arguments are DATE and NUMBER; the entries selected are those
@@ -345,112 +348,116 @@
             (set-buffer diary-buffer)
             (or (verify-visited-file-modtime diary-buffer)
                 (revert-buffer t t))))
-        (setq file-glob-attrs (nth 1 (diary-pull-attrs nil "")))
-        (setq selective-display t)
-        (setq selective-display-ellipses nil)
-        (if diary-header-line-flag
-            (setq header-line-format diary-header-line-format))
-        (setq old-diary-syntax-table (syntax-table))
-        (set-syntax-table diary-syntax-table)
-        (unwind-protect
-            (let ((buffer-read-only nil)
-                  (diary-modified (buffer-modified-p))
-                  (mark (regexp-quote diary-nonmarking-symbol)))
-              ;; First and last characters must be ^M or \n for
-              ;; selective display to work properly
-              (goto-char (1- (point-max)))
-              (if (not (looking-at "\^M\\|\n"))
-                  (progn
-                    (goto-char (point-max))
-                    (insert "\^M")))
-              (goto-char (point-min))
-              (if (not (looking-at "\^M\\|\n"))
-                  (insert "\^M"))
-              (subst-char-in-region (point-min) (point-max) ?\n ?\^M t)
-              (calendar-for-loop i from 1 to number do
-                 (let ((d diary-date-forms)
-                       (month (extract-calendar-month date))
-                       (day (extract-calendar-day date))
-                       (year (extract-calendar-year date))
-                       (entry-found (list-sexp-diary-entries date)))
-                   (while d
-                     (let*
-                          ((date-form (if (equal (car (car d)) 'backup)
-                                          (cdr (car d))
-                                        (car d)))
-                          (backup (equal (car (car d)) 'backup))
-                          (dayname
-                           (format "%s\\|%s\\.?"
-                            (calendar-day-name date)
-                            (calendar-day-name date 'abbrev)))
-                          (monthname
-                           (format "\\*\\|%s\\|%s\\.?"
-                            (calendar-month-name month)
-                            (calendar-month-name month 'abbrev)))
-                          (month (concat "\\*\\|0*" (int-to-string month)))
-                          (day (concat "\\*\\|0*" (int-to-string day)))
-                          (year
-                           (concat
-                            "\\*\\|0*" (int-to-string year)
-                            (if abbreviated-calendar-year
-                                (concat "\\|" (format "%02d" (% year 100)))
-                              "")))
-                          (regexp
-                           (concat
-                            "\\(\\`\\|\^M\\|\n\\)" mark "?\\("
-                            (mapconcat 'eval date-form "\\)\\(")
-                            "\\)"))
-                          (case-fold-search t))
-                       (goto-char (point-min))
-                       (while (re-search-forward regexp nil t)
-                         (if backup (re-search-backward "\\<" nil t))
-                         (if (and (or (char-equal (preceding-char) ?\^M)
-                                      (char-equal (preceding-char) ?\n))
-                                  (not (looking-at " \\|\^I")))
-                             ;;  Diary entry that consists only of date.
-                             (backward-char 1)
-                           ;; Found a nonempty diary entry--make it visible and
-                           ;; add it to the list.
-                           (setq entry-found t)
-                           (let ((entry-start (point))
-                                 date-start temp)
-                             (re-search-backward "\^M\\|\n\\|\\`")
-                             (setq date-start (point))
-                             (re-search-forward "\^M\\|\n" nil t 2)
-                             (while (looking-at " \\|\^I")
-                               (re-search-forward "\^M\\|\n" nil t))
-                             (backward-char 1)
-                             (subst-char-in-region date-start
-                                (point) ?\^M ?\n t)
-			     (setq entry (buffer-substring entry-start (point))
-				   temp (diary-pull-attrs entry file-glob-attrs)
-				   entry (nth 0 temp))
-                             (add-to-diary-list
-                              date
-			      entry
-                              (buffer-substring
-                               (1+ date-start) (1- entry-start))
-			      (copy-marker entry-start) (nth 1 temp))))))
-                     (setq d (cdr d)))
-                   (or entry-found
-                       (not diary-list-include-blanks)
-                       (setq diary-entries-list
-                             (append diary-entries-list
-                                     (list (list date "" "" "" "")))))
-                   (setq date
-                         (calendar-gregorian-from-absolute
-                           (1+ (calendar-absolute-from-gregorian date))))
-                   (setq entry-found nil)))
-              (set-buffer-modified-p diary-modified))
-          (set-syntax-table old-diary-syntax-table))
-        (goto-char (point-min))
-        (run-hooks 'nongregorian-diary-listing-hook
-                   'list-diary-entries-hook)
-        (if diary-display-hook
-            (run-hooks 'diary-display-hook)
-          (simple-diary-display))
-        (run-hooks 'diary-hook)
-        diary-entries-list))))
+        ;; d-s-p is passed to the diary display function.
+        (let ((diary-saved-point (point)))
+          (save-excursion
+            (setq file-glob-attrs (nth 1 (diary-pull-attrs nil "")))
+            (setq selective-display t)
+            (setq selective-display-ellipses nil)
+            (if diary-header-line-flag
+                (setq header-line-format diary-header-line-format))
+            (setq old-diary-syntax-table (syntax-table))
+            (set-syntax-table diary-syntax-table)
+            (unwind-protect
+                (let ((buffer-read-only nil)
+                      (diary-modified (buffer-modified-p))
+                      (mark (regexp-quote diary-nonmarking-symbol)))
+                  ;; First and last characters must be ^M or \n for
+                  ;; selective display to work properly
+                  (goto-char (1- (point-max)))
+                  (if (not (looking-at "\^M\\|\n"))
+                      (progn
+                        (goto-char (point-max))
+                        (insert "\^M")))
+                  (goto-char (point-min))
+                  (if (not (looking-at "\^M\\|\n"))
+                      (insert "\^M"))
+                  (subst-char-in-region (point-min) (point-max) ?\n ?\^M t)
+                  (calendar-for-loop
+                   i from 1 to number do
+                   (let ((d diary-date-forms)
+                         (month (extract-calendar-month date))
+                         (day (extract-calendar-day date))
+                         (year (extract-calendar-year date))
+                         (entry-found (list-sexp-diary-entries date)))
+                     (while d
+                       (let*
+                           ((date-form (if (equal (car (car d)) 'backup)
+                                           (cdr (car d))
+                                         (car d)))
+                            (backup (equal (car (car d)) 'backup))
+                            (dayname
+                             (format "%s\\|%s\\.?"
+                                     (calendar-day-name date)
+                                     (calendar-day-name date 'abbrev)))
+                            (monthname
+                             (format "\\*\\|%s\\|%s\\.?"
+                                     (calendar-month-name month)
+                                     (calendar-month-name month 'abbrev)))
+                            (month (concat "\\*\\|0*" (int-to-string month)))
+                            (day (concat "\\*\\|0*" (int-to-string day)))
+                            (year
+                             (concat
+                              "\\*\\|0*" (int-to-string year)
+                              (if abbreviated-calendar-year
+                                  (concat "\\|" (format "%02d" (% year 100)))
+                                "")))
+                            (regexp
+                             (concat
+                              "\\(\\`\\|\^M\\|\n\\)" mark "?\\("
+                              (mapconcat 'eval date-form "\\)\\(")
+                              "\\)"))
+                            (case-fold-search t))
+                         (goto-char (point-min))
+                         (while (re-search-forward regexp nil t)
+                           (if backup (re-search-backward "\\<" nil t))
+                           (if (and (or (char-equal (preceding-char) ?\^M)
+                                        (char-equal (preceding-char) ?\n))
+                                    (not (looking-at " \\|\^I")))
+                               ;;  Diary entry that consists only of date.
+                               (backward-char 1)
+                             ;; Found a nonempty diary entry--make it
+                             ;; visible and add it to the list.
+                             (setq entry-found t)
+                             (let ((entry-start (point))
+                                   date-start temp)
+                               (re-search-backward "\^M\\|\n\\|\\`")
+                               (setq date-start (point))
+                               (re-search-forward "\^M\\|\n" nil t 2)
+                               (while (looking-at " \\|\^I")
+                                 (re-search-forward "\^M\\|\n" nil t))
+                               (backward-char 1)
+                               (subst-char-in-region date-start
+                                                     (point) ?\^M ?\n t)
+                               (setq entry (buffer-substring entry-start (point))
+                                     temp (diary-pull-attrs entry file-glob-attrs)
+                                     entry (nth 0 temp))
+                               (add-to-diary-list
+                                date
+                                entry
+                                (buffer-substring
+                                 (1+ date-start) (1- entry-start))
+                                (copy-marker entry-start) (nth 1 temp))))))
+                       (setq d (cdr d)))
+                     (or entry-found
+                         (not diary-list-include-blanks)
+                         (setq diary-entries-list
+                               (append diary-entries-list
+                                       (list (list date "" "" "" "")))))
+                     (setq date
+                           (calendar-gregorian-from-absolute
+                            (1+ (calendar-absolute-from-gregorian date))))
+                     (setq entry-found nil)))
+                  (set-buffer-modified-p diary-modified))
+              (set-syntax-table old-diary-syntax-table))
+            (goto-char (point-min))
+            (run-hooks 'nongregorian-diary-listing-hook
+                       'list-diary-entries-hook)
+            (if diary-display-hook
+                (run-hooks 'diary-display-hook)
+              (simple-diary-display))
+            (run-hooks 'diary-hook)
+            diary-entries-list))))))
 
 (defun include-other-diary-files ()
   "Include the diary entries from other diary files with those of diary-file.
@@ -528,8 +535,12 @@
           (setq buffer-read-only t)
           (display-buffer holiday-buffer)
           (message  "No diary entries for %s" date-string))
-      (display-buffer (find-buffer-visiting
-                       (substitute-in-file-name diary-file)))
+      (with-current-buffer
+          (find-buffer-visiting (substitute-in-file-name diary-file))
+        (let ((window (display-buffer (current-buffer))))
+          ;; d-s-p is passed from list-diary-entries.
+          (set-window-point window diary-saved-point)
+          (set-window-start window (point-min))))
       (message "Preparing diary...done"))))
 
 (defface diary-button-face '((((type pc) (class color))
--- a/lisp/dired.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/dired.el	Wed Sep 29 07:22:20 2004 +0000
@@ -202,10 +202,11 @@
 
 ;; Fixme: This should use mailcap.
 (defcustom dired-view-command-alist
-  '(("[.]\\(ps\\|ps_pages\\|eps\\)\\'" . "gv -spartan -color -watch %s")
-    ("[.]pdf\\'" . "xpdf %s")
-    ("[.]\\(jpe?g\\|gif\\|png\\)\\'" . "eog %s")
-    ("[.]dvi\\'" . "xdvi -sidemargin 0.5 -topmargin 1 %s"))
+  '(("\\.\\(ps\\|ps_pages\\|eps\\)\\'" . "gv %s")
+    ("\\.pdf\\'" . "xpdf %s")
+    ;; ("\\.pod\\'" . "perldoc %s")
+    ("\\.\\(jpe?g\\|gif\\|png\\)\\'" . "eog %s")
+    ("\\.dvi\\'" . "xdvi %s"))
   "Alist specifying how to view special types of files.
 Each element has the form (REGEXP . SHELL-COMMAND).
 When the file name matches REGEXP, `dired-view-file'
@@ -797,6 +798,112 @@
 	(dired-insert-directory dir dired-actual-switches
 				file-list (not file-list) t)))))
 
+(defun dired-align-file (beg end)
+  "Align the fields of a file to the ones of surrounding lines.
+BEG..END is the line where the file info is located."
+  ;; Some versions of ls try to adjust the size of each field so as to just
+  ;; hold the largest element ("largest" in the current invocation, of
+  ;; course).  So when a single line is output, the size of each field is
+  ;; just big enough for that one output.  Thus when dired refreshes one
+  ;; line, the alignment if this line w.r.t the rest is messed up because
+  ;; the fields of that one line will generally be smaller.
+  ;;
+  ;; To work around this problem, we here add spaces to try and re-align the
+  ;; fields as needed.  Since this is purely aesthetic, it is of utmost
+  ;; importance that it doesn't mess up anything like
+  ;; `dired-move-to-filename'.  To this end, we limit ourselves to adding
+  ;; spaces only, and to only add them at places where there was already at
+  ;; least one space.  This way, as long as `dired-move-to-filename-regexp'
+  ;; always matches spaces with "*" or "+", we know we haven't made anything
+  ;; worse.  There is one spot where the exact number of spaces is
+  ;; important, which is just before the actual filename, so we refrain from
+  ;; adding spaces there (and within the filename as well, of course).
+  (save-excursion
+    (let (file file-col other other-col)
+      ;; Check the there is indeed a file, and that there is anoter adjacent
+      ;; file with which to align, and that additional spaces are needed to
+      ;; align the filenames.
+      (when (and (setq file (progn (goto-char beg)
+				   (dired-move-to-filename nil end)))
+		 (setq file-col (current-column))
+		 (setq other
+		       (or (and (goto-char beg)
+				(zerop (forward-line -1))
+				(dired-move-to-filename))
+			   (and (goto-char beg)
+				(zerop (forward-line 1))
+				(dired-move-to-filename))))
+		 (setq other-col (current-column))
+		 (/= file other)
+		 ;; Make sure there is some work left to do.
+		 (> other-col file-col))
+	;; If we've only looked at the line above, check to see if the line
+	;; below exists as well and if so, align with the shorter one.
+	(when (and (< other file)
+		   (goto-char beg)
+		   (zerop (forward-line 1))
+		   (dired-move-to-filename))
+	  (let ((alt-col (current-column)))
+	    (when (< alt-col other-col)
+	      (setq other-col alt-col)
+	      (setq other (point)))))
+	;; Keep positions uptodate when we insert stuff.
+	(if (> other file) (setq other (copy-marker other)))
+	(setq file (copy-marker file))
+	;; Main loop.
+	(goto-char beg)
+	(while (and (> other-col file-col)
+		    (skip-chars-forward "^ ")
+		    ;; Skip the spaces, and make sure there's at least one.
+		    (> (skip-chars-forward " ") 0)
+		    ;; Don't touch anything just before (and after) the
+		    ;; beginning of the filename.
+		    (> file (point)))
+	  ;; We're now just in front of a field, with a space behind us.
+	  (let* ((curcol (current-column))
+		 ;; Nums are right-aligned.
+		 (num-align (looking-at "[0-9]"))
+		 ;; Let's look at the other line, in the same column: we
+		 ;; should be either near the end of the previous field, or
+		 ;; in the space between that field and the next.
+		 ;; [ Of course, it's also possible that we're already within
+		 ;; the next field or even past it, but that's unlikely since
+		 ;; other-col > file-col. ]
+		 ;; Let's find the distance to the alignment-point (either
+		 ;; the beginning or the end of the next field, depending on
+		 ;; whether this field is left or right aligned).
+		 (align-pt-offset
+		  (save-excursion
+		    (goto-char other)
+		    (move-to-column curcol)
+		    (when (looking-at
+			   (concat
+			    (if (eq (char-before) ?\ ) " *" "[^ ]* *")
+			    (if num-align "[0-9][^ ]*")))
+		      (- (match-end 0) (match-beginning 0)))))
+		 ;; Now, the number of spaces to insert is align-pt-offset
+		 ;; minus the distance to the equivalent point on the
+		 ;; current line.
+		 (spaces
+		  (if (not num-align)
+		      align-pt-offset
+		    (and align-pt-offset
+			 (save-excursion
+			   (skip-chars-forward "^ ")
+			   (- align-pt-offset (- (current-column) curcol)))))))
+	    (when (and spaces (> spaces 0))
+	      (setq file-col (+ spaces file-col))
+	      (if (> file-col other-col)
+		  (setq spaces (- spaces (- file-col other-col))))
+	      (insert-char ?\s spaces)
+	      ;; Let's just make really sure we did not mess up.
+	      (unless (save-excursion
+			(equal (dired-move-to-filename) (marker-position file)))
+		;; Damn!  We messed up: let's revert the change.
+		(delete-char (- spaces))))))
+	(set-marker file nil)))))
+			 
+
 (defun dired-insert-directory (dir switches &optional file-list wildcard hdr)
   "Insert a directory listing of DIR, Dired style.
 Use SWITCHES to make the listings.
@@ -815,7 +922,10 @@
     ;; with the new value of dired-move-to-filename-regexp.
     (if file-list
 	(dolist (f file-list)
-	  (insert-directory f switches nil nil))
+	  (let ((beg (point)))
+	    (insert-directory f switches nil nil)
+	    ;; Re-align fields, if necessary.
+	    (dired-align-file beg (point))))
       (insert-directory dir switches wildcard (not wildcard)))
     ;; Quote certain characters, unless ls quoted them for us.
     (if (not (string-match "b" dired-actual-switches))
@@ -1762,6 +1872,8 @@
 ;; Move to first char of filename on this line.
 ;; Returns position (point) or nil if no filename on this line."
 (defun dired-move-to-filename (&optional raise-error eol)
+  "Move to the beginning of the filename on the current line.
+Return the position of the beginning of the filename, or nil if none found."
   ;; This is the UNIX version.
   (or eol (setq eol (line-end-position)))
   (beginning-of-line)
@@ -1774,8 +1886,10 @@
       (goto-char (match-end 0)))
      ((re-search-forward dired-permission-flags-regexp eol t)
       ;; Ha!  There *is* a file.  Our regexp-from-hell just failed to find it.
-      (funcall (if raise-error 'error 'message)
-	       "Unrecognized line!  Check dired-move-to-filename-regexp"))
+      (if raise-error
+	  (error "Unrecognized line!  Check dired-move-to-filename-regexp"))
+      (beginning-of-line)
+      nil)
      (raise-error
       (error "No file on this line")))))
 
@@ -1818,9 +1932,9 @@
 	    (or no-error (error "No file on this line"))))
 	;; Move point to end of name:
 	(if symlink
-	    (if (search-forward " ->" eol t)
+	    (if (search-forward " -> " eol t)
 		(progn
-		  (forward-char -3)
+		  (forward-char -4)
 		  (and used-F
 		       dired-ls-F-marks-symlinks
 		       (eq (preceding-char) ?@)	;; did ls really mark the link?
@@ -1885,7 +1999,7 @@
 ;; As a side effect, killed dired buffers for DIR are removed from
 ;; dired-buffers.
   (setq dir (file-name-as-directory dir))
-  (let ((alist dired-buffers) result elt buf pattern)
+  (let ((alist dired-buffers) result elt buf)
     (while alist
       (setq elt (car alist)
 	    buf (cdr elt))
--- a/lisp/files.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/files.el	Wed Sep 29 07:22:20 2004 +0000
@@ -4376,7 +4376,8 @@
 		  (while (< (point) end)
 		    (let ((start (+ beg (read (current-buffer))))
 			  (end (+ beg (read (current-buffer)))))
-		      (if (= (char-after end) ?\n)
+		      (if (memq (char-after end) '(?\n ?\ ))
+			  ;; End is followed by \n or by " -> ".
 			  (put-text-property start end 'dired-filename t)
 			;; It seems that we can't trust ls's output as to
 			;; byte positions of filenames.
--- a/lisp/fringe.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/fringe.el	Wed Sep 29 07:22:20 2004 +0000
@@ -37,27 +37,29 @@
 
 ;; Standard fringe bitmaps
 
-(defconst no-fringe-bitmap 0)
-(defconst undef-fringe-bitmap 1)
-(defconst left-truncation-fringe-bitmap 2)
-(defconst right-truncation-fringe-bitmap 3)
-(defconst up-arrow-fringe-bitmap 4)
-(defconst down-arrow-fringe-bitmap 5)
-(defconst continued-line-fringe-bitmap 6)
-(defconst continuation-line-fringe-bitmap 7)
-(defconst overlay-arrow-fringe-bitmap 8)
-(defconst top-left-angle-fringe-bitmap 9)
-(defconst top-right-angle-fringe-bitmap 10)
-(defconst bottom-left-angle-fringe-bitmap 11)
-(defconst bottom-right-angle-fringe-bitmap 12)
-(defconst left-bracket-fringe-bitmap 13)
-(defconst right-bracket-fringe-bitmap 14)
-(defconst filled-box-cursor-fringe-bitmap 15)
-(defconst hollow-box-cursor-fringe-bitmap 16)
-(defconst hollow-square-fringe-bitmap 17)
-(defconst bar-cursor-fringe-bitmap 18)
-(defconst hbar-cursor-fringe-bitmap 19)
-(defconst empty-line-fringe-bitmap 20)
+(defmacro fringe-bitmap-p (symbol)
+  "Return non-nil if SYMBOL is a fringe bitmap."
+  `(get ,symbol 'fringe))
+
+(defvar fringe-bitmaps)
+
+(unless (get 'left-truncation 'fringe)
+  (let ((bitmaps '(left-truncation right-truncation
+		   up-arrow down-arrow
+		   continued-line continuation-line
+		   overlay-arrow
+		   top-left-angle top-right-angle
+		   bottom-left-angle bottom-right-angle
+		   left-bracket right-bracket
+		   filled-box-cursor hollow-box-cursor hollow-square
+		   bar-cursor hbar-cursor
+		   empty-line))
+	(bn 2))
+    (while bitmaps
+      (push (car bitmaps) fringe-bitmaps)
+      (put (car bitmaps) 'fringe bn)
+      (setq bitmaps (cdr bitmaps)
+	    bn (1+ bn)))))
 
 
 ;; Control presence of fringes
@@ -228,7 +230,7 @@
 			(window-fringes))
 	       0)
            (float (frame-char-width))))
-  
+
 (provide 'fringe)
 
 ;;; arch-tag: 6611ef60-0869-47ed-8b93-587ee7d3ff5d
--- a/lisp/gnus/ChangeLog	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/ChangeLog	Wed Sep 29 07:22:20 2004 +0000
@@ -1,3 +1,77 @@
+2004-09-28  Jesper Harder  <harder@ifa.au.dk>
+
+	* gnus-picon.el: Require cl.
+
+	* mml-sec.el (mml-signencrypt-style): Don't depend on Gnus.
+
+	* mml-smime.el: Require cl.  Autoload message-fetch-field.
+
+	* gnus-fun.el: Require gnus-ems and gnus-util.
+
+	* gnus-diary.el (gnus-diary-header-schedule): caddr -> car (cddr
+
+	* gnus-art.el (gnus-article-edit-mode): Define before first
+	reference.
+
+	* gnus.el (gnus-method-to-server): Move defsubst before first use.
+
+	* spam.el (spam-check-spamoracle, spam-spamoracle-learn): Fix
+	format string mismatch.
+	* nnml.el (nnml-request-set-mark, nnml-save-marks): do.	
+	* nnfolder.el (nnfolder-request-set-mark, nnfolder-save-marks): do.
+
+2004-09-27  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus.el (gnus-version-number): Set to 5.11.
+
+2004-09-27  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* mm-decode.el (mm-copy-to-buffer): Don't use set-buffer-multibyte.
+
+2004-09-26  Jesper Harder  <harder@ifa.au.dk>
+
+	* gnus-msg.el (gnus-post-news): Use blank Newsgroups line if
+	GROUP is a virtual group.
+
+	* mm-util.el (mm-charset-synonym-alist): Remove obsolete entries
+	for big5 and gb2312.
+	
+	* rfc2047.el (rfc2047-pad-base64): Deal with more cases of invalid
+	padding.
+
+	* mm-bodies.el (mm-7bit-chars): Don't include \r.	
+
+	* mml.el (mml-compute-boundary-1): Don't uncompress files.
+
+	* rfc2047.el (rfc2047-qp-or-base64): New function to reduce
+	dependencies.
+	(rfc2047-encode): Use it.
+	
+	* flow-fill.el: Typo.
+
+	* mml.el (mml-generate-mime-1): Don't use format=flowed with
+	inline PGP.
+
+	* gnus.el (gnus-getenv-nntpserver): Strip whitespace.
+
+	* gnus-cache.el (gnus-cache-save-buffers): Check if buffer is
+	alive.  Reported by Laurent Martelli <laurent@aopsys.com>.
+
+	* mm-util.el (mm-image-load-path): Handle nil in load-path.
+	From Christian Neukirchen <chneukirchen@yahoo.de>.
+
+	* html2text.el (html2text-replace-list): Add &amp; and &apos;.
+
+	* nnheader.el (nnheader-max-head-length): Increase to 8192.
+
+	* message.el (message-clone-locals): Clone sendmail and smtp
+	variables.
+
+2004-09-23  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus-msg.el (gnus-configure-posting-styles): Narrow to headers
+	in `header' match.  Reported by Svend Tollak Munkejord.
+
 2004-09-20  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* mm-decode.el (mm-copy-to-buffer): Preserve the data's unibyteness.
--- a/lisp/gnus/flow-fill.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/flow-fill.el	Wed Sep 29 07:22:20 2004 +0000
@@ -1,4 +1,4 @@
-;;; flow-fill.el --- interprete RFC2646 "flowed" text
+;;; flow-fill.el --- interpret RFC2646 "flowed" text
 
 ;; Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
--- a/lisp/gnus/gnus-art.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/gnus-art.el	Wed Sep 29 07:22:20 2004 +0000
@@ -1464,6 +1464,8 @@
 
 (defvar gnus-inhibit-hiding nil)
 
+(defvar gnus-article-edit-mode nil)
+
 ;;; Macros for dealing with the article buffer.
 
 (defmacro gnus-with-article-headers (&rest forms)
--- a/lisp/gnus/gnus-cache.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/gnus-cache.el	Wed Sep 29 07:22:20 2004 +0000
@@ -125,9 +125,8 @@
 	  (overview-file (gnus-cache-file-name
 			  (car gnus-cache-buffer) ".overview")))
       ;; write the overview only if it was modified
-      (when (buffer-modified-p buffer)
-	(save-excursion
-	  (set-buffer buffer)
+      (when (and (buffer-live-p buffer) (buffer-modified-p buffer))
+	(with-current-buffer buffer
 	  (if (> (buffer-size) 0)
 	      ;; Non-empty overview, write it to a file.
 	      (let ((coding-system-for-write
--- a/lisp/gnus/gnus-diary.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/gnus-diary.el	Wed Sep 29 07:22:20 2004 +0000
@@ -204,7 +204,7 @@
      (let ((head (cdr (assoc (intern (format "X-Diary-%s" (car elt)))
 			     headers))))
        (when head
-	 (nndiary-parse-schedule-value head (cadr elt) (caddr elt)))))
+	 (nndiary-parse-schedule-value head (cadr elt) (car (cddr elt))))))
    nndiary-headers))
 
 ;; #### NOTE: Gnus sometimes gives me a HEADER not corresponding to any
--- a/lisp/gnus/gnus-fun.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/gnus-fun.el	Wed Sep 29 07:22:20 2004 +0000
@@ -26,8 +26,11 @@
 ;;; Code:
 
 (eval-when-compile
-  (require 'cl)
-  (require 'mm-util))
+  (require 'cl))
+
+(require 'mm-util)
+(require 'gnus-ems)
+(require 'gnus-util)
 
 (defcustom gnus-x-face-directory (expand-file-name "x-faces" gnus-directory)
   "*Directory where X-Face PBM files are stored."
--- a/lisp/gnus/gnus-msg.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/gnus-msg.el	Wed Sep 29 07:22:20 2004 +0000
@@ -915,7 +915,9 @@
 		     (not to-address)))
 	    ;; This is news.
 	    (if post
-		(message-news (or to-group group))
+		(message-news
+		 (or to-group
+		     (and (not (gnus-virtual-group-p pgroup)) group)))
 	      (set-buffer gnus-article-copy)
 	      (gnus-msg-treat-broken-reply-to)
 	      (message-followup (if (or newsgroup-p force-news)
@@ -1801,9 +1803,11 @@
 		;; Obsolete format of header match.
 		(and (gnus-buffer-live-p gnus-article-copy)
 		     (with-current-buffer gnus-article-copy
-		       (let ((header (message-fetch-field (pop style))))
-			 (and header
-			      (string-match (pop style) header))))))
+		       (save-restriction
+			 (nnheader-narrow-to-headers)
+			 (let ((header (message-fetch-field (pop style))))
+			   (and header
+				(string-match (pop style) header)))))))
 	       ((or (symbolp match)
 		    (functionp match))
 		(cond
@@ -1819,9 +1823,11 @@
 		  ;; New format of header match.
 		  (and (gnus-buffer-live-p gnus-article-copy)
 		       (with-current-buffer gnus-article-copy
-			 (let ((header (message-fetch-field (nth 1 match))))
-			   (and header
-				(string-match (nth 2 match) header))))))
+			 (save-restriction
+			   (nnheader-narrow-to-headers)
+			   (let ((header (message-fetch-field (nth 1 match))))
+			     (and header
+				  (string-match (nth 2 match) header)))))))
 		 (t
 		  ;; This is a form to be evaled.
 		  (eval match)))))
--- a/lisp/gnus/gnus-picon.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/gnus-picon.el	Wed Sep 29 07:22:20 2004 +0000
@@ -40,8 +40,9 @@
 ;;
 ;;; Code:
 
+(eval-when-compile (require 'cl))
+
 (require 'gnus)
-(require 'custom)
 (require 'gnus-art)
 
 ;;; User variables:
--- a/lisp/gnus/gnus.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/gnus.el	Wed Sep 29 07:22:20 2004 +0000
@@ -282,7 +282,7 @@
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "5.10.6"
+(defconst gnus-version-number "5.11"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Gnus v%s" gnus-version-number)
@@ -1104,9 +1104,8 @@
       (and (file-readable-p gnus-nntpserver-file)
 	   (with-temp-buffer
 	     (insert-file-contents gnus-nntpserver-file)
-	     (let ((name (buffer-string)))
-	       (unless (string-match "\\`[ \t\n]*$" name)
-		 name))))))
+	     (when (re-search-forward "[^ \t\n\r]+" nil t)
+	       (match-string 0))))))
 
 (defcustom gnus-select-method
   (condition-case nil
@@ -3309,38 +3308,6 @@
           (push (cons server result) gnus-server-method-cache))
 	result)))
 
-(defsubst gnus-method-to-server (method)
-  (catch 'server-name
-    (setq method (or method gnus-select-method))
-
-    ;; Perhaps it is already in the cache.
-    (mapc (lambda (name-method)
-            (if (equal (cdr name-method) method)
-                (throw 'server-name (car name-method))))
-          gnus-server-method-cache)
-
-    (mapc
-     (lambda (server-alist)
-       (mapc (lambda (name-method)
-               (when (gnus-methods-equal-p (cdr name-method) method)
-                 (unless (member name-method gnus-server-method-cache)
-                   (push name-method gnus-server-method-cache))
-                 (throw 'server-name (car name-method))))
-             server-alist))
-     (let ((alists (list gnus-server-alist
-                         gnus-predefined-server-alist)))
-       (if gnus-select-method
-           (push (list (cons "native" gnus-select-method)) alists))
-       alists))
-
-    (let* ((name (if (member (cadr method) '(nil ""))
-                     (format "%s" (car method))
-                   (format "%s:%s" (car method) (cadr method))))
-           (name-method (cons name method)))
-      (unless (member name-method gnus-server-method-cache)
-        (push name-method gnus-server-method-cache))
-      name)))
-
 (defsubst gnus-server-get-method (group method)
   ;; Input either a server name, and extended server name, or a
   ;; select method, and return a select method.
--- a/lisp/gnus/html2text.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/html2text.el	Wed Sep 29 07:22:20 2004 +0000
@@ -1,5 +1,5 @@
 ;;; html2text.el --- a simple html to plain text converter
-;; Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
 
 ;; Author: Joakim Hove <hove@phys.ntnu.no>
 
@@ -42,7 +42,8 @@
 (defvar html2text-format-single-element-list '(("hr" . html2text-clean-hr)))
 
 (defvar html2text-replace-list
-  '(("&nbsp;" . " ") ("&gt;" . ">") ("&lt;" . "<") ("&quot;" . "\""))
+  '(("&nbsp;" . " ") ("&gt;" . ">") ("&lt;" . "<") ("&quot;" . "\"")
+    ("&amp;" . "&") ("&apos;" . "'"))
   "The map of entity to text.
 
 This is an alist were each element is a dotted pair consisting of an
--- a/lisp/gnus/message.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/message.el	Wed Sep 29 07:22:20 2004 +0000
@@ -6685,7 +6685,7 @@
   (let ((locals (save-excursion
 		  (set-buffer buffer)
 		  (buffer-local-variables)))
-	(regexp "^gnus\\|^nn\\|^message\\|^user-mail-address"))
+	(regexp "^gnus\\|^nn\\|^message\\|^sendmail\\|^smtp\\|^user-mail-address"))
     (mapcar
      (lambda (local)
        (when (and (consp local)
--- a/lisp/gnus/mm-bodies.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/mm-bodies.el	Wed Sep 29 07:22:20 2004 +0000
@@ -38,9 +38,16 @@
 (require 'rfc2047)
 (require 'mm-encode)
 
-;; 8bit treatment gets any char except: 0x32 - 0x7f, CR, LF, TAB, BEL,
+;; 8bit treatment gets any char except: 0x32 - 0x7f, LF, TAB, BEL,
 ;; BS, vertical TAB, form feed, and ^_
-(defvar mm-7bit-chars "\x20-\x7f\r\n\t\x7\x8\xb\xc\x1f")
+;;
+;; Note that CR is *not* included, as that would allow a non-paired CR
+;; in the body contrary to RFC 2822:
+;;
+;;   - CR and LF MUST only occur together as CRLF; they MUST NOT
+;;     appear independently in the body.
+
+(defvar mm-7bit-chars "\x20-\x7f\n\t\x7\x8\xb\xc\x1f")
 
 (defcustom mm-body-charset-encoding-alist
   '((iso-2022-jp . 7bit)
--- a/lisp/gnus/mm-decode.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/mm-decode.el	Wed Sep 29 07:22:20 2004 +0000
@@ -623,14 +623,14 @@
   "Copy the contents of the current buffer to a fresh buffer."
   (save-excursion
     (let ((obuf (current-buffer))
-	  (multibyte enable-multibyte-characters)
 	  beg)
       (goto-char (point-min))
       (search-forward-regexp "^\n" nil t)
       (setq beg (point))
-      (set-buffer (generate-new-buffer " *mm*"))
-      ;; Preserve the data's unibyteness (for url-insert-file-contents).
-      (set-buffer-multibyte multibyte)
+      (set-buffer
+       ;; Preserve the data's unibyteness (for url-insert-file-contents).
+       (let ((default-enable-multibyte-characters (mm-multibyte-p)))
+	 (generate-new-buffer " *mm*")))
       (insert-buffer-substring obuf beg)
       (current-buffer))))
 
--- a/lisp/gnus/mm-util.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/mm-util.el	Wed Sep 29 07:22:20 2004 +0000
@@ -133,15 +133,9 @@
 
 (defvar mm-charset-synonym-alist
   `(
-    ;; Perfectly fine?  A valid MIME name, anyhow.
-    ,@(unless (mm-coding-system-p 'big5)
-       '((big5 . cn-big5)))
     ;; Not in XEmacs, but it's not a proper MIME charset anyhow.
     ,@(unless (mm-coding-system-p 'x-ctext)
        '((x-ctext . ctext)))
-    ;; Apparently not defined in Emacs 20, but is a valid MIME name.
-    ,@(unless (mm-coding-system-p 'gb2312)
-       '((gb2312 . cn-gb-2312)))
     ;; ISO-8859-15 is very similar to ISO-8859-1.  But it's _different_!
     ,@(unless (mm-coding-system-p 'iso-8859-15)
        '((iso-8859-15 . iso-8859-1)))
@@ -727,11 +721,12 @@
 (defun mm-image-load-path (&optional package)
   (let (dir result)
     (dolist (path load-path (nreverse result))
-      (if (file-directory-p
-	   (setq dir (concat (file-name-directory
-			      (directory-file-name path))
-			     "etc/" (or package "gnus/"))))
-	  (push dir result))
+      (when (and path
+		 (file-directory-p
+		  (setq dir (concat (file-name-directory
+				     (directory-file-name path))
+				    "etc/" (or package "gnus/")))))
+	(push dir result))
       (push path result))))
 
 ;; Fixme: This doesn't look useful where it's used.
--- a/lisp/gnus/mml-sec.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/mml-sec.el	Wed Sep 29 07:22:20 2004 +0000
@@ -113,7 +113,7 @@
 	    (setf (second style-item) style)
 	  ;; otherwise, just return the current value
 	  (second style-item))
-      (gnus-message 3 "Warning, attempt to set invalid signencrypt-style"))))
+      (message "Warning, attempt to set invalid signencrypt style"))))
 
 ;;; Security functions
 
--- a/lisp/gnus/mml-smime.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/mml-smime.el	Wed Sep 29 07:22:20 2004 +0000
@@ -25,9 +25,12 @@
 
 ;;; Code:
 
+(eval-when-compile (require 'cl))
+
 (require 'smime)
 (require 'mm-decode)
 (autoload 'message-narrow-to-headers "message")
+(autoload 'message-fetch-field "message")
 
 (defun mml-smime-sign (cont)
   (when (null smime-keys)
--- a/lisp/gnus/mml.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/mml.el	Wed Sep 29 07:22:20 2004 +0000
@@ -449,6 +449,7 @@
 		    ;; actually are hard newlines in the text.
 		    (let (use-hard-newlines)
 		      (when (and (string= type "text/plain")
+				 (not (string= (cdr (assq 'sign cont)) "pgp"))
 				 (or (null (assq 'format cont))
 				     (string= (cdr (assq 'format cont))
 					      "flowed"))
@@ -590,7 +591,7 @@
 	  (insert-buffer-substring (cdr (assq 'buffer cont))))
 	 ((and (setq filename (cdr (assq 'filename cont)))
 	       (not (equal (cdr (assq 'nofile cont)) "yes")))
-	  (mm-insert-file-contents filename))
+	  (mm-insert-file-contents filename nil nil nil nil t))
 	 (t
 	  (insert (cdr (assq 'contents cont)))))
 	(goto-char (point-min))
--- a/lisp/gnus/nnfolder.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/nnfolder.el	Wed Sep 29 07:22:20 2004 +0000
@@ -1174,7 +1174,7 @@
       (let ((range (nth 0 action))
 	    (what  (nth 1 action))
 	    (marks (nth 2 action)))
-	(assert (or (eq what 'add) (eq what 'del)) t
+	(assert (or (eq what 'add) (eq what 'del)) nil
 		"Unknown request-set-mark action: %s" what)
 	(dolist (mark marks)
 	  (setq nnfolder-marks (gnus-update-alist-soft
--- a/lisp/gnus/nnheader.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/nnheader.el	Wed Sep 29 07:22:20 2004 +0000
@@ -1,7 +1,7 @@
 ;;; nnheader.el --- header access macros for Gnus and its backends
 
 ;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996,
-;;        1997, 1998, 2000, 2001, 2002, 2003
+;;        1997, 1998, 2000, 2001, 2002, 2003, 2004
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
@@ -58,7 +58,7 @@
   :group 'gnus-server
   :type 'boolean)
 
-(defvar nnheader-max-head-length 4096
+(defvar nnheader-max-head-length 8192
   "*Max length of the head of articles.
 
 Value is an integer, nil, or t.  nil means read in chunks of a file
--- a/lisp/gnus/nnml.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/nnml.el	Wed Sep 29 07:22:20 2004 +0000
@@ -923,7 +923,7 @@
       (let ((range (nth 0 action))
 	    (what  (nth 1 action))
 	    (marks (nth 2 action)))
-	(assert (or (eq what 'add) (eq what 'del)) t
+	(assert (or (eq what 'add) (eq what 'del)) nil
 		"Unknown request-set-mark action: %s" what)
 	(dolist (mark marks)
 	  (setq nnml-marks (gnus-update-alist-soft
--- a/lisp/gnus/rfc2047.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/rfc2047.el	Wed Sep 29 07:22:20 2004 +0000
@@ -126,6 +126,25 @@
 ;;; Functions for encoding RFC2047 messages
 ;;;
 
+(defun rfc2047-qp-or-base64 ()
+  "Return the type with which to encode the buffer.
+This is either `base64' or `quoted-printable'."
+  (save-excursion
+    (let ((limit (min (point-max) (+ 2000 (point-min))))
+	  (n8bit 0))
+      (goto-char (point-min))
+      (skip-chars-forward "\x20-\x7f\r\n\t" limit)
+      (while (< (point) limit)
+	(incf n8bit)
+	(forward-char 1)
+	(skip-chars-forward "\x20-\x7f\r\n\t" limit))
+      (if (or (< (* 6 n8bit) (- limit (point-min)))
+	      ;; Don't base64, say, a short line with a single
+	      ;; non-ASCII char when splitting parts by charset.
+	      (= n8bit 1))
+	  'quoted-printable
+	'base64))))
+
 (defun rfc2047-narrow-to-field ()
   "Narrow the buffer to the header on the current line."
   (beginning-of-line)
@@ -411,7 +430,7 @@
 		       ;; encoding, choose the one that's shorter.
 		       (save-restriction
 			 (narrow-to-region b e)
-			 (if (eq (mm-qp-or-base64) 'base64)
+			 (if (eq (rfc2047-qp-or-base64) 'base64)
 			     'B
 			   'Q))))
 	 (start (concat
@@ -720,11 +739,15 @@
   ;; Be more liberal to accept buggy base64 strings. If
   ;; base64-decode-string accepts buggy strings, this function could
   ;; be aliased to identity.
-  (case (mod (length string) 4)
-    (0 string)
-    (1 string) ;; Error, don't pad it.
-    (2 (concat string "=="))
-    (3 (concat string "="))))
+  (if (= 0 (mod (length string) 4))
+      string
+    (when (string-match "=+$" string)
+      (setq string (substring string 0 (match-beginning 0))))
+    (case (mod (length string) 4)
+      (0 string)
+      (1 string) ;; Error, don't pad it.
+      (2 (concat string "=="))
+      (3 (concat string "=")))))
 
 (defun rfc2047-decode (charset encoding string)
   "Decode STRING from the given MIME CHARSET in the given ENCODING.
--- a/lisp/gnus/spam.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/gnus/spam.el	Wed Sep 29 07:22:20 2004 +0000
@@ -1746,7 +1746,7 @@
 		  (goto-char (point-min))
 		  (when (re-search-forward "^X-Spam: yes;" nil t)
 		    spam-split-group))
-	      (error "Error running spamoracle" status))))))))
+	      (error "Error running spamoracle: %s" status))))))))
 
 (defun spam-spamoracle-learn (articles article-is-spam-p &optional unregister)
   "Run spamoracle in training mode."
@@ -1768,8 +1768,8 @@
 			   `("-f" ,spam-spamoracle-database
 			     "add" ,arg)
 			 `("add" ,arg)))))
-	  (when (not (eq 0 status))
-	    (error "Error running spamoracle" status)))))))
+	  (unless (eq 0 status)
+	    (error "Error running spamoracle: %s" status)))))))
 
 (defun spam-spamoracle-learn-ham (articles &optional unregister)
   (spam-spamoracle-learn articles nil unregister))
--- a/lisp/printing.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/printing.el	Wed Sep 29 07:22:20 2004 +0000
@@ -5,13 +5,13 @@
 
 ;; Author: Vinicius Jose Latorre <viniciusjl@ig.com.br>
 ;; Maintainer: Vinicius Jose Latorre <viniciusjl@ig.com.br>
-;; Time-stamp: <2004/09/21 22:51:58 vinicius>
+;; Time-stamp: <2004/09/26 22:11:24 vinicius>
 ;; Keywords: wp, print, PostScript
-;; Version: 6.8
+;; Version: 6.8.1
 ;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/
 
-(defconst pr-version "6.8"
-  "printing.el, v 6.8 <2004/09/21 vinicius>
+(defconst pr-version "6.8.1"
+  "printing.el, v 6.8.1 <2004/09/26 vinicius>
 
 Please send all bug fixes and enhancements to
 	Vinicius Jose Latorre <viniciusjl@ig.com.br>
@@ -125,16 +125,16 @@
 ;; Novices (First Users)
 ;; ---------------------
 ;;
-;; First of all, take a glance of printing documentation only to have an idea
-;; of what `printing' is capable.
+;; First of all, see printing documentation only to get an idea of what
+;; `printing' is capable.
 ;;
 ;; Then try to set the variables: `pr-ps-name', `pr-ps-printer-alist',
 ;; `pr-txt-name', `pr-txt-printer-alist' and `pr-path-alist'.  These variables
 ;; are the main variables for printing processing.
 ;;
-;; Now, please, see these variables documentation more in deep.  You can do
-;; this by typing C-h v pr-ps-name RET (for example) if you already loaded
-;; printing package, or by browsing printing.el source file.
+;; Now, please, see these variables documentation deeper.  You can do this by
+;; typing C-h v pr-ps-name RET (for example) if you already loaded printing
+;; package, or by browsing printing.el source file.
 ;;
 ;; If the documentation isn't clear or if you find a way to improve the
 ;; documentation, please, send an email to maintainer.  All printing users
@@ -263,7 +263,8 @@
 ;;    in Windows.  The gsprint utility is faster than ghostscript to print
 ;;    monochrome PostScript.
 ;;
-;;    The efficiency is similar to print non-monochrome PostScript file.
+;;    To print non-monochrome PostScript file, the efficiency of ghostscript
+;;    is similar to gsprint.
 ;;
 ;;    Also the gsprint utility comes together with gsview distribution.
 ;;
@@ -3887,7 +3888,7 @@
   (interactive (list (pr-ps-infile-preprint "Print preview ")))
   (and (stringp filename) (file-exists-p filename)
        (let* ((file (pr-expand-file-name filename))
-	      (tempfile (pr-dosify-file-name (make-temp-name file))))
+	      (tempfile (pr-dosify-file-name (make-temp-file file))))
 	 ;; gs use
 	 (pr-call-process pr-gs-command
 			  (format "-sDEVICE=%s" pr-gs-device)
@@ -5221,7 +5222,8 @@
 
 
 (defun pr-delete-file (file)
-  (and pr-delete-temp-file (delete-file file)))
+  (and pr-delete-temp-file (file-exists-p file)
+       (delete-file file)))
 
 
 (defun pr-expand-file-name (filename)
--- a/lisp/progmodes/gdb-ui.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/progmodes/gdb-ui.el	Wed Sep 29 07:22:20 2004 +0000
@@ -1069,8 +1069,9 @@
 (defvar breakpoint-disabled-icon nil
   "Icon for disabled breakpoint in display margin")
 
-(defvar breakpoint-bitmap nil
-  "Bitmap for breakpoint in fringe")
+;; Bitmap for breakpoint in fringe
+(define-fringe-bitmap 'breakpoint
+  "\x3c\x7e\xff\xff\xff\xff\x7e\x3c")
 
 (defface breakpoint-enabled-bitmap-face
   '((t
@@ -1140,9 +1141,8 @@
 	  (save-excursion
 	    (goto-char (posn-point posn))
 	    (if (or (posn-object posn)
-		    (and breakpoint-bitmap
-			 (eq (car (fringe-bitmaps-at-pos (posn-point posn)))
-			     breakpoint-bitmap)))
+		    (eq (car (fringe-bitmaps-at-pos (posn-point posn)))
+			'breakpoint))
 		(gud-remove nil)
 	      (gud-break nil)))))))
 
@@ -1831,11 +1831,7 @@
 	(if (>= (car (window-fringes)) 8)
 	    (gdb-put-string
 	     nil (1+ start)
-	     `(left-fringe
-	       ,(or breakpoint-bitmap
-		    (setq breakpoint-bitmap
-			  (define-fringe-bitmap
-			    "\x3c\x7e\xff\xff\xff\xff\x7e\x3c")))
+	     `(left-fringe breakpoint
 	       ,(if enabled
 		    'breakpoint-enabled-bitmap-face
 		  'breakpoint-disabled-bitmap-face)))
--- a/lisp/term.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/term.el	Wed Sep 29 07:22:20 2004 +0000
@@ -1,6 +1,6 @@
 ;;; term.el --- general command interpreter in a window stuff
 
-;;; Copyright (C) 1988, 1990, 1992, 1994, 1995 Free Software Foundation, Inc.
+;;; Copyright (C) 1988, 1990, 1992, 1994, 1995, 2004 Free Software Foundation, Inc.
 
 ;; Author: Per Bothner <bothner@cygnus.com>
 ;; Based on comint mode written by: Olin Shivers <shivers@cs.cmu.edu>
@@ -676,7 +676,6 @@
 (defvar term-terminal-menu)
 
 ;;; Let's silence the byte-compiler -mm
-(defvar term-ansi-at-eval-string nil)
 (defvar term-ansi-at-host nil)
 (defvar term-ansi-at-dir nil)
 (defvar term-ansi-at-user nil)
@@ -692,9 +691,6 @@
 (defvar term-ansi-current-highlight 0)
 (defvar term-ansi-current-reverse 0)
 (defvar term-ansi-current-invisible 0)
-(defvar term-ansi-default-fg 0)
-(defvar term-ansi-default-bg 0)
-(defvar term-ansi-current-temp 0)
 
 ;;; Four should be enough, if you want more, just add. -mm
 (defvar term-terminal-more-parameters 0)
@@ -915,6 +911,9 @@
     (define-key term-raw-map [backspace] 'term-send-backspace)
     (define-key term-raw-map [home] 'term-send-home)
     (define-key term-raw-map [end] 'term-send-end)
+    (define-key term-raw-map [S-prior] 'scroll-down)
+    (define-key term-raw-map [S-next] 'scroll-up)
+    (define-key term-raw-map [S-insert] 'term-paste)
     (define-key term-raw-map [prior] 'term-send-prior)
     (define-key term-raw-map [next] 'term-send-next)))
 
@@ -930,6 +929,27 @@
 
 (put 'term-mode 'mode-class 'special)
 
+
+;;; Use this variable as a display table for `term-mode'.
+(defvar term-display-table
+  (let ((dt (or (copy-sequence standard-display-table)
+		(make-display-table)))
+        i)
+    ;; avoid changing the display table for ^J
+    (setq i 0) 
+    (while (< i 10)
+      (aset dt i (vector i))
+      (setq i (1+ i)))
+    (setq i 11) 
+    (while (< i 32)
+      (aset dt i (vector i))
+      (setq i (1+ i)))
+    (setq i 128)
+    (while (< i 256)
+      (aset dt i (vector i))
+      (setq i (1+ i)))
+    dt))
+
 (defun term-mode ()
   "Major mode for interacting with an inferior interpreter.
 The interpreter name is same as buffer name, sans the asterisks.
@@ -979,6 +999,9 @@
   (setq major-mode 'term-mode)
   (setq mode-name "Term")
   (use-local-map term-mode-map)
+  ;; we do not want indent to sneak in any tabs
+  (setq indent-tabs-mode nil)
+  (setq buffer-display-table term-display-table)
   (make-local-variable 'term-home-marker)
   (setq term-home-marker (copy-marker 0))
   (make-local-variable 'term-saved-home-marker)
@@ -1182,6 +1205,11 @@
 					((eq arg '-) -1)
 					(t (1- arg)))))))
 
+(defun term-paste ()
+  "Insert the last stretch of killed text at point."
+  (interactive)
+   (term-send-raw-string (current-kill 0)))
+
 ;; Which would be better:  "\e[A" or "\eOA"? readline accepts either.
 ;; For my configuration it's definitely better \eOA but YMMV. -mm
 ;; For example: vi works with \eOA while elm wants \e[A ...
@@ -1193,8 +1221,8 @@
 (defun term-send-end   () (interactive) (term-send-raw-string "\e[4~"))
 (defun term-send-prior () (interactive) (term-send-raw-string "\e[5~"))
 (defun term-send-next  () (interactive) (term-send-raw-string "\e[6~"))
-(defun term-send-del   () (interactive) (term-send-raw-string "\C-?"))
-(defun term-send-backspace  () (interactive) (term-send-raw-string "\C-H"))
+(defun term-send-del   () (interactive) (term-send-raw-string "\e[3~"))
+(defun term-send-backspace  () (interactive) (term-send-raw-string "\C-?"))
 
 (defun term-char-mode ()
   "Switch to char (\"raw\") sub-mode of term mode.
@@ -1364,14 +1392,15 @@
   "%s%s:li#%d:co#%d:cl=\\E[H\\E[J:cd=\\E[J:bs:am:xn:cm=\\E[%%i%%d;%%dH\
 :nd=\\E[C:up=\\E[A:ce=\\E[K:ho=\\E[H:pt\
 :al=\\E[L:dl=\\E[M:DL=\\E[%%dM:AL=\\E[%%dL:cs=\\E[%%i%%d;%%dr:sf=^J\
-:te=\\E[2J\\E[?47l\\E8:ti=\\E7\\E[?47h\
 :dc=\\E[P:DC=\\E[%%dP:IC=\\E[%%d@:im=\\E[4h:ei=\\E[4l:mi:\
 :so=\\E[7m:se=\\E[m:us=\\E[4m:ue=\\E[m:md=\\E[1m:mr=\\E[7m:me=\\E[m\
 :UP=\\E[%%dA:DO=\\E[%%dB:LE=\\E[%%dD:RI=\\E[%%dC\
 :kl=\\EOD:kd=\\EOB:kr=\\EOC:ku=\\EOA:kN=\\E[6~:kP=\\E[5~:@7=\\E[4~:kh=\\E[1~\
 :mk=\\E[8m:cb=\\E[1K:op=\\E[39;49m:Co#8:pa#64:AB=\\E[4%%dm:AF=\\E[3%%dm:cr=^M\
-:bl=^G:do=^J:le=^H:ta=^I:se=\E[27m:ue=\E24m:"
+:bl=^G:do=^J:le=^H:ta=^I:se=\E[27m:ue=\E24m\
+:kb=^?:kD=^[[3~:sc=\E7:rc=\E8:"
 ;;; : -undefine ic
+;;; don't define :te=\\E[2J\\E[?47l\\E8:ti=\\E7\\E[?47h\
   "termcap capabilities supported")
 
 ;;; This auxiliary function cranks up the process for term-exec in
@@ -1398,9 +1427,10 @@
 	(process-connection-type t)
 	;; We should suppress conversion of end-of-line format.
 	(inhibit-eol-conversion t)
-	;; inhibit-eol-conversion doesn't seem to do the job, but this does.
-	(coding-system-for-read 'unknown-unix)
-	)
+	;; The process's output contains not just chars but also binary
+	;; escape codes, so we need to see the raw output.  We will have to
+	;; do the decoding by hand on the parts that are made of chars.
+	(coding-system-for-read 'binary))
     (apply 'start-process name buffer
 	   "/bin/sh" "-c"
 	   (format "stty -nl echo rows %d columns %d sane 2>/dev/null;\
@@ -2691,7 +2721,12 @@
 		   (if (not funny) (setq funny str-length))
 		   (cond ((> funny i)
 			  (cond ((eq term-terminal-state 1)
-				 (term-move-columns 1)
+				 ;; We are in state 1, we need to wrap
+				 ;; around.  Go to the beginning of
+				 ;; the next line and switch to state
+				 ;; 0.
+				 (term-down 1)
+				 (term-move-columns (- (term-current-column)))
 				 (setq term-terminal-state 0)))
 			  (setq count (- funny i))
 			  (setq temp (- (+ (term-horizontal-column) count)
@@ -2700,6 +2735,7 @@
 				((> count temp)	;; Some chars fit.
 				 ;; This iteration, handle only what fits.
 				 (setq count (- count temp))
+				 (setq temp 0)
 				 (setq funny (+ count i)))
 				((or (not (or term-pager-count
 					      term-scroll-with-delete))
@@ -2720,7 +2756,7 @@
 			  ;; following point if not eob nor insert-mode.
 			  (let ((old-column (current-column))
 				columns pos)
-			    (insert (substring str i funny))
+			    (insert (decode-coding-string (substring str i funny) locale-coding-system))
 			    (setq term-current-column (current-column)
 				  columns (- term-current-column old-column))
 			    (when (not (or (eobp) term-insert-mode))
@@ -2739,7 +2775,7 @@
 				 (setq term-terminal-state 1)))
 			  (setq i (1- funny)))
 			 ((and (setq term-terminal-state 0)
-			       (eq char ?\^I)) ; TAB
+			       (eq char ?\^I)) ; TAB (terminfo: ht)
 			  ;; FIXME:  Does not handle line wrap!
 			  (setq count (term-current-column))
 			  (setq count (+ count 8 (- (mod count 8))))
@@ -2766,7 +2802,7 @@
 			  (if (not (and term-kill-echo-list
 					(term-check-kill-echo-list)))
 			      (term-down 1 t)))
-			 ((eq char ?\b)
+			 ((eq char ?\b)  ;; (terminfo: cub1)
 			  (term-move-columns -1))
 			 ((eq char ?\033) ; Escape
 			  (setq term-terminal-state 2))
@@ -2816,13 +2852,13 @@
 			 ((eq char ?M) ;; scroll reversed
 			  (term-insert-lines 1)
 			  (setq term-terminal-state 0))
-			 ((eq char ?7) ;; Save cursor
+			 ((eq char ?7) ;; Save cursor (terminfo: sc)
 			  (term-handle-deferred-scroll)
 			  (setq term-saved-cursor
 				(cons (term-current-row)
 				      (term-horizontal-column)))
 			  (setq term-terminal-state 0))
-			 ((eq char ?8) ;; Restore cursor
+			 ((eq char ?8) ;; Restore cursor (terminfo: rc)
 			  (if term-saved-cursor
 			      (term-goto (car term-saved-cursor)
 					 (cdr term-saved-cursor)))
@@ -2974,14 +3010,14 @@
    ((eq parameter 8)
     (setq term-ansi-current-invisible 1))
 
+;;; Reset underline (i.e. terminfo rmul)
+   ((eq parameter 24)
+    (setq term-ansi-current-underline 0))
+
 ;;; Reset reverse (i.e. terminfo rmso)
-   ((eq parameter 24)
+   ((eq parameter 27)
     (setq term-ansi-current-reverse 0))
 
-;;; Reset underline (i.e. terminfo rmul)
-   ((eq parameter 27)
-    (setq term-ansi-current-underline 0))
-
 ;;; Foreground
    ((and (>= parameter 30) (<= parameter 37))
     (setq term-ansi-current-color (- parameter 29)))
@@ -3095,7 +3131,7 @@
     (term-goto
      (1- term-terminal-previous-parameter)
      (1- term-terminal-parameter)))
-   ;; \E[A - cursor up
+   ;; \E[A - cursor up (terminfo: cuu1)
    ((eq char ?A)
     (term-handle-deferred-scroll)
     (term-down (- (max 1 term-terminal-parameter)) t))
@@ -3108,13 +3144,13 @@
    ;; \E[D - cursor left
    ((eq char ?D)
     (term-move-columns (- (max 1 term-terminal-parameter))))
-   ;; \E[J - clear to end of screen
+   ;; \E[J - clear to end of screen (terminfo: ed, clear)
    ((eq char ?J)
     (term-erase-in-display term-terminal-parameter))
-   ;; \E[K - clear to end of line
+   ;; \E[K - clear to end of line (terminfo: el, el1)
    ((eq char ?K)
     (term-erase-in-line term-terminal-parameter))
-   ;; \E[L - insert lines
+   ;; \E[L - insert lines (terminfo: il, il1)
    ((eq char ?L)
     (term-insert-lines (max 1 term-terminal-parameter)))
    ;; \E[M - delete lines
@@ -3128,19 +3164,22 @@
     (term-insert-spaces (max 1 term-terminal-parameter)))
    ;; \E[?h - DEC Private Mode Set
    ((eq char ?h)
-    (cond ((eq term-terminal-parameter 4)
+    (cond ((eq term-terminal-parameter 4)  ;; (terminfo: smir)
 	   (setq term-insert-mode t))
-	  ((eq term-terminal-parameter 47)
-	   (term-switch-to-alternate-sub-buffer t))))
+	  ;; ((eq term-terminal-parameter 47) ;; (terminfo: smcup)
+	  ;; (term-switch-to-alternate-sub-buffer t))
+	  ))
    ;; \E[?l - DEC Private Mode Reset
    ((eq char ?l)
-    (cond ((eq term-terminal-parameter 4)
+    (cond ((eq term-terminal-parameter 4)  ;; (terminfo: rmir)
 	   (setq term-insert-mode nil))
-	  ((eq term-terminal-parameter 47)
-	   (term-switch-to-alternate-sub-buffer nil))))
+	  ;; ((eq term-terminal-parameter 47) ;; (terminfo: rmcup)
+	  ;; (term-switch-to-alternate-sub-buffer nil))
+	  ))
 
 ;;; Modified to allow ansi coloring -mm
-   ;; \E[m - Set/reset standard mode
+   ;; \E[m - Set/reset modes, set bg/fg 
+   ;;(terminfo: smso,rmso,smul,rmul,rev,bold,sgr0,invis,op,setab,setaf)
    ((eq char ?m)
     (when (= term-terminal-more-parameters 1)
       (if (>= term-terminal-previous-parameter-4 0)
@@ -3184,32 +3223,32 @@
 	    (not (and (= term-scroll-start 0)
 		      (= term-scroll-end term-height))))))
 
-(defun term-switch-to-alternate-sub-buffer (set)
-  ;; If asked to switch to (from) the alternate sub-buffer, and already (not)
-  ;; using it, do nothing.  This test is needed for some programs (including
-  ;; Emacs) that emit the ti termcap string twice, for unknown reason.
-  (term-handle-deferred-scroll)
-  (if (eq set (not (term-using-alternate-sub-buffer)))
-      (let ((row (term-current-row))
-	    (col (term-horizontal-column)))
-	(cond (set
-	       (goto-char (point-max))
-	       (if (not (eq (preceding-char) ?\n))
-		   (term-insert-char ?\n 1))
-	       (setq term-scroll-with-delete t)
-	       (setq term-saved-home-marker (copy-marker term-home-marker))
-	       (set-marker term-home-marker (point)))
-	      (t
-	       (setq term-scroll-with-delete
-		     (not (and (= term-scroll-start 0)
-			       (= term-scroll-end term-height))))
-	       (set-marker term-home-marker term-saved-home-marker)
-	       (set-marker term-saved-home-marker nil)
-	       (setq term-saved-home-marker nil)
-	       (goto-char term-home-marker)))
-	(setq term-current-column nil)
-	(setq term-current-row 0)
-	(term-goto row col))))
+;; (defun term-switch-to-alternate-sub-buffer (set)
+;;   ;; If asked to switch to (from) the alternate sub-buffer, and already (not)
+;;   ;; using it, do nothing.  This test is needed for some programs (including
+;;   ;; Emacs) that emit the ti termcap string twice, for unknown reason.
+;;   (term-handle-deferred-scroll)
+;;   (if (eq set (not (term-using-alternate-sub-buffer)))
+;;       (let ((row (term-current-row))
+;; 	    (col (term-horizontal-column)))
+;; 	(cond (set
+;; 	       (goto-char (point-max))
+;; 	       (if (not (eq (preceding-char) ?\n))
+;; 		   (term-insert-char ?\n 1))
+;; 	       (setq term-scroll-with-delete t)
+;; 	       (setq term-saved-home-marker (copy-marker term-home-marker))
+;; 	       (set-marker term-home-marker (point)))
+;; 	      (t
+;; 	       (setq term-scroll-with-delete
+;; 		     (not (and (= term-scroll-start 0)
+;; 			       (= term-scroll-end term-height))))
+;; 	       (set-marker term-home-marker term-saved-home-marker)
+;; 	       (set-marker term-saved-home-marker nil)
+;; 	       (setq term-saved-home-marker nil)
+;; 	       (goto-char term-home-marker)))
+;; 	(setq term-current-column nil)
+;; 	(setq term-current-row 0)
+;; 	(term-goto row col))))
 
 ;; Default value for the symbol term-command-hook.
 
@@ -3519,11 +3558,11 @@
   (if (not (bolp)) (insert-before-markers ?\n)))
 
 (defun term-erase-in-line (kind)
-  (if (> kind 1) ;; erase left of point
+  (if (= kind 1) ;; erase left of point
       (let ((cols (term-horizontal-column)) (saved-point (point)))
 	(term-vertical-motion 0)
 	(delete-region (point) saved-point)
-	(term-insert-char ?\n cols)))
+	(term-insert-char ?  cols)))
   (if (not (eq kind 1)) ;; erase right of point
       (let ((saved-point (point))
 	    (wrapped (and (zerop (term-horizontal-column))
@@ -3622,7 +3661,7 @@
     (term-insert-char ?\n lines)
     (goto-char start)))
 
-(defun term-set-output-log (name)
+(defun term-start-output-log (name)
   "Record raw inferior process output in a buffer."
   (interactive (list (if term-log-buffer
 			 nil
@@ -3644,10 +3683,10 @@
     (message "Recording terminal emulator output into buffer \"%s\""
 	     (buffer-name term-log-buffer))))
 
-(defun term-stop-photo ()
+(defun term-stop-output-log ()
   "Discontinue raw inferior process logging."
   (interactive)
-  (term-set-output-log nil))
+  (term-start-output-log nil))
 
 (defun term-show-maximum-output ()
   "Put the end of the buffer at the bottom of the window."
--- a/lisp/textmodes/enriched.el	Tue Sep 28 04:38:25 2004 +0000
+++ b/lisp/textmodes/enriched.el	Wed Sep 29 07:22:20 2004 +0000
@@ -102,7 +102,7 @@
 (defconst enriched-annotation-regexp "<\\(/\\)?\\([-A-Za-z0-9]+\\)>"
   "Regular expression matching enriched-text annotations.")
 
-(defconst enriched-translations
+(defvar enriched-translations
   '((face          (bold-italic "bold" "italic")
 		   (bold        "bold")
 		   (italic      "italic")
--- a/lispref/ChangeLog	Tue Sep 28 04:38:25 2004 +0000
+++ b/lispref/ChangeLog	Wed Sep 29 07:22:20 2004 +0000
@@ -1,3 +1,14 @@
+2004-09-28  Richard M. Stallman  <rms@gnu.org>
+
+	* text.texi (Special Properties): Clarify line-spacing and line-height.
+
+	* searching.texi (Regexp Search): Add looking-back.
+
+2004-09-25  Luc Teirlinck  <teirllm@auburn.edu>
+
+	* display.texi: Correct typos.
+	(Image Descriptors): Correct xref's.
+
 2004-09-25  Richard M. Stallman  <rms@gnu.org>
 
 	* text.texi (Special Properties): Cleanups in `cursor'.
--- a/lispref/display.texi	Tue Sep 28 04:38:25 2004 +0000
+++ b/lispref/display.texi	Wed Sep 29 07:22:20 2004 +0000
@@ -2716,7 +2716,7 @@
 or @code{bottom}.
 
 The @var{align} argument may also be a list @code{(@var{align}
-@var{periodic})} where @var{align} is intepreted as described above.
+@var{periodic})} where @var{align} is interpreted as described above.
 If @var{periodic} is non-@code{nil}, it specifies that the rows in
 @code{bits} should be repeated enough times to reach the specified
 height.
@@ -2988,7 +2988,7 @@
 used with @code{:align-to} to specify that the position is relative to
 the left edge of the given area.  Once the base offset for a relative
 position has been set (by the first occurrence of one of these
-symbols), further occurences of these symbols are interpreted as the
+symbols), further occurrences of these symbols are interpreted as the
 width of the specified area.  For example, to align to the center of
 the left-margin, use
 
@@ -3181,7 +3181,7 @@
 your machine.  In some environments, Emacs allows loading image
 libraries on demand; if so, the variable @code{image-library-alist}
 can be used to modify the set of known names for these dynamic
-libraries (though it is not posible to add new image formats).
+libraries (though it is not possible to add new image formats).
 
   The supported image formats include XBM, XPM (needing the
 libraries @code{libXpm} version 3.4k and @code{libz}), GIF (needing
@@ -3409,7 +3409,7 @@
 
 @item :pointer @var{shape}
 This specifies the pointer shape when the mouse pointer is over this
-image.  @xref{Pointer Shapes}, for available pointer shapes.
+image.  @xref{Pointer Shape}, for available pointer shapes.
 
 @item :map @var{map}
 This associates an image map of @dfn{hot spots} with this image.
@@ -3437,7 +3437,7 @@
 property it defines a tool-tip for the hot-spot, and if it contains
 a @code{pointer} property, it defines the shape of the mouse cursor when
 it is over the hot-spot.
-@xref{Pointer Shapes}, for available pointer shapes.
+@xref{Pointer Shape}, for available pointer shapes.
 
 When you click the mouse when the mouse pointer is over a hot-spot, an
 event is composed by combining the @var{id} of the hot-spot with the
--- a/lispref/searching.texi	Tue Sep 28 04:38:25 2004 +0000
+++ b/lispref/searching.texi	Wed Sep 29 07:22:20 2004 +0000
@@ -975,6 +975,32 @@
 @end example
 @end defun
 
+@defun looking-back regexp &optional limit
+This function returns @code{t} if @var{regexp} matches text before
+point, ending at point, and @code{nil} otherwise.
+
+Because regular expression matching works only going forward, this is
+implemented by searching backwards from point for a match that ends at
+point.  That can be quite slow if it has to search a long distance.
+You can bound the time required by specifying @var{limit}, which says
+not to search before @var{limit}.  In this case, the match that is
+found must begin at or after @var{limit}.
+
+@example
+@group
+---------- Buffer: foo ----------
+I read "@point{}The cat in the hat
+comes back" twice.
+---------- Buffer: foo ----------
+
+(looking-back "read \"" 3)
+     @result{} t
+(looking-back "read \"" 4)
+     @result{} nil
+@end group
+@end example
+@end defun
+
 @node POSIX Regexps
 @section POSIX Regular Expression Searching
 
--- a/lispref/text.texi	Tue Sep 28 04:38:25 2004 +0000
+++ b/lispref/text.texi	Wed Sep 29 07:22:20 2004 +0000
@@ -2989,12 +2989,11 @@
 
 @item line-spacing
 @kindex line-spacing @r{(text property)}
-A newline can have a @code{line-spacing} text or overlay property
-that controls the height of the corresponding display line.
-@c ???  Which display line is "corresponding"?
-The @code{line-spacing} property overrides the default frame line
-spacing and the buffer local @code{line-spacing} variable.  We will
-call the property value @var{line-spacing}.
+A newline can have a @code{line-spacing} text or overlay property that
+controls the height of the display line ending with that newline.  The
+property value overrides the default frame line spacing and the buffer
+local @code{line-spacing} variable.  We will call the property value
+@var{line-spacing}.
 
 If @var{line-spacing} is a positive integer, the value specifies
 additional vertical space, below the display line, in pixels.
@@ -3012,18 +3011,13 @@
 @item line-height
 @kindex line-height @r{(text property)}
 A newline can have a @code{line-height} text or overlay property that
-controls the total height of the corresponding display line.
-@c ???  Which display line is "corresponding"?
+controls the total height of the display line ending in that newline.
 We will call the property value @var{line-height}.
 
-If @var{line-height} is 0, the newline does not contribute to the
-height of the display row; instead the height of the newline glyph is
-reduced.
-@c ??? That is not clear.  Reduced how much?
-In that case, any @code{line-spacing} property on
-this newline is ignored.  This can be used to tile small images or
-image slices without adding blank areas between the images.
-@c ??? Precisely which of these features does ``this'' mean?
+If @var{line-height} is 0, the height of the line is determined solely
+from its contents; nothing is added.  Any @code{line-spacing} property
+on this newline is ignored.  This case is useful for tiling small
+images or image slices without adding blank areas between the images.
 
 If @var{line-height} is a positive integer, the value specifies the
 minimum line height in pixels.  The line's ascent height is
--- a/man/ChangeLog	Tue Sep 28 04:38:25 2004 +0000
+++ b/man/ChangeLog	Wed Sep 29 07:22:20 2004 +0000
@@ -1,3 +1,63 @@
+2004-09-28  Kim F. Storm  <storm@cua.dk>
+
+	* display.texi (Display Custom) <indicate-buffer-boundaries>:
+	Align with new functionality.
+
+2004-09-26  Jesper Harder  <harder@ifa.au.dk>
+
+	* sieve.texi (Manage Sieve API): nil -> @code{nil}.
+	* pgg.texi (User Commands, Backend methods): do.
+	* gnus.texi: Markup fixes.
+	(Setting Process Marks): Fix `M P a' entry.
+	* emacs-mime: Fixes.
+
+2004-09-23  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus-faq.texi ([5.12]): Fix code example for FQDN in Message-Ids
+	again.
+	Use 5.10 instead of 5.10.0.
+
+2004-09-20  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+	* gnus.texi (Summary Mail Commands): S D e.
+
+2004-09-20  Raymond Scholz  <ray-2004@zonix.de>  (tiny change)
+
+	* gnus.texi (Misc Article): Refer to `Summary Buffer Mode Line' in
+	the gnus-article-mode-line-format section.
+
+2004-09-20  Helmut Waitzmann  <Helmut.Waitzmann@web.de>  (tiny change)
+
+	* gnus.texi (Various Summary Stuff): Fix the documentation for
+	gnus-newsgroup-variables.
+
+2004-09-20  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* gnus.texi (MIME Commands): Added
+	gnus-mime-display-multipart-as-mixed,
+	gnus-mime-display-multipart-alternative-as-mixed,
+	gnus-mime-display-multipart-related-as-mixed.
+	(Mail Source Customization): Clarify `mail-source-directory'.
+	(Splitting Mail): Mention gnus-group-find-new-groups.
+	(SpamOracle): Fixed typo.
+
+	* gnus-faq.texi: Untabify.
+	([6.3]): nnir.el is in contrib directory.
+
+	* message.texi (News Headers): Clarify how a unique ID is created.
+
+	* gnus.texi (Batching Agents): Fixed typo in example.  Reported
+	by Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp>.
+
+2004-09-20  Andre Srinivasan  <andre@e2open.com>
+
+	* gnus.texi (Group Parameters): Added more on hooks.  (Small
+	change.)
+
+2004-09-20  Florian Weimer  <fw@deneb.enyo.de>
+
+	* gnus.texi (Charsets): Point to relevant section in emacs-mime.
+
 2004-09-22  Luc Teirlinck  <teirllm@auburn.edu>
 
 	* display.texi (Display Custom): Remove stray `@end defvar'.
--- a/man/display.texi	Tue Sep 28 04:38:25 2004 +0000
+++ b/man/display.texi	Wed Sep 29 07:22:20 2004 +0000
@@ -1007,22 +1007,26 @@
 and bottom of the left or right fringe if the window can be scrolled
 in either direction.
 
-The buffer-local variable @code{indicate-buffer-boundaries} controls
+  The buffer-local variable @code{indicate-buffer-boundaries} controls
 how the buffer boundaries and window scrolling is indicated in the
 fringes.
 
-If the value is @code{left} or @code{right}, both angle and arrow
+  If the value is @code{left} or @code{right}, both angle and arrow
 bitmaps are displayed in the left or right fringe, respectively.
-Any other non-@code{nil} value causes the bitmap on the top line to be
-displayed in the left fringe, and the bitmap on the bottom line in the
-right fringe.
 
-If value is a cons @code{(angles . arrows)}, the car specifies the
-position of the angle bitmaps, and the cdr specifies the position of
-the arrow bitmaps.  For example, @code{(t .  right)} places the top
-angle bitmap in left fringe, the bottom angle bitmap in right fringe,
-and both arrow bitmaps in right fringe.  To show just the angle
-bitmaps in the left fringe, but no arrow bitmaps, use @code{(left . nil)}.
+  If value is an alist, each element @code{(@var{indicator} .
+@var{position})} specifies the position of one of the indicators.
+The @var{indicator} must be one of @code{top}, @code{bottom},
+@code{up}, @code{down}, or @code{t} which specifies the default
+position for the indicators not present in the alist.
+The @var{position} is one of @code{left}, @code{right}, or @code{ni}
+which specifies not to show this indicator.
+
+  For example, @code{((top . left) (t . right))} places the top angle
+bitmap in left fringe, the bottom angle bitmap in right fringe, and
+both arrow bitmaps in right fringe.  To show just the angle bitmaps in
+the left fringe, but no arrow bitmaps, use @code{((top .  left)
+(bottom . left))}.
 
 @vindex default-indicate-buffer-boundaries
   The value of the variable @code{default-indicate-buffer-boundaries}
--- a/man/emacs-mime.texi	Tue Sep 28 04:38:25 2004 +0000
+++ b/man/emacs-mime.texi	Wed Sep 29 07:22:20 2004 +0000
@@ -328,7 +328,7 @@
 
 @item mm-inline-large-images
 @vindex mm-inline-large-images
-When displaying inline images that are larger than the window, XEmacs
+When displaying inline images that are larger than the window, Emacs
 does not enable scrolling, which means that you cannot see the whole
 image.  To prevent this, the library tries to determine the image size
 before displaying it inline, and if it doesn't fit the window, the
--- a/man/gnus-faq.texi	Tue Sep 28 04:38:25 2004 +0000
+++ b/man/gnus-faq.texi	Wed Sep 29 07:22:20 2004 +0000
@@ -102,7 +102,7 @@
 
 @menu
 * [1.1]::   What is the latest version of Gnus?
-* [1.2]::   What's new in 5.10.0?
+* [1.2]::   What's new in 5.10?
 * [1.3]::   Where and how to get Gnus?
 * [1.4]::   What to do with the tarball now? 
 * [1.5]::   Which version of Emacs do I need?
@@ -119,7 +119,7 @@
 
 Answer: 
 
- Jingle please: Gnus 5.10.0 is released, get it while it's
+ Jingle please: Gnus 5.10 is released, get it while it's
  hot! As well as the step in version number is rather
  small, Gnus 5.10 has tons of new features which you
  shouldn't miss, however if you are cautious, you might
@@ -131,7 +131,7 @@
 @end ifnottex
 @subsubheading Question 1.2: 
 
-What's new in 5.10.0?
+What's new in 5.10?
 
 Answer: 
 
@@ -227,7 +227,7 @@
 
 Answer: 
 
- Gnus 5.10.0 requires an Emacs version that is greater
+ Gnus 5.10 requires an Emacs version that is greater
  than or equal to Emacs 20.7 or XEmacs 21.1.
  
 @ifnottex
@@ -440,7 +440,7 @@
 @example
 
 SET HOME=C:\myhome
-	    
+            
 @end example
 
 @noindent
@@ -548,9 +548,9 @@
 
 @example
 (add-to-list 'gnus-secondary-select-methods 
-	     '(nntp "news.yourSecondProvider.net"))
+             '(nntp "news.yourSecondProvider.net"))
 (add-to-list 'gnus-secondary-select-methods 
-	     '(nntp "news.yourThirdProvider.net"))	    
+             '(nntp "news.yourThirdProvider.net"))          
 @end example
  
 @ifnottex
@@ -745,9 +745,9 @@
 (add-to-list 
  'gnus-secondary-select-methods
  '(nnimap "Give the baby a name"
-	  (nnimap-address "imap.yourProvider.net")
-	  (nnimap-port 143)
-	  (nnimap-list-pattern "archive.*")))
+          (nnimap-address "imap.yourProvider.net")
+          (nnimap-port 143)
+          (nnimap-list-pattern "archive.*")))
 @end example
 
 @noindent
@@ -877,7 +877,7 @@
  fetched when you enter a group and slow down the process of entering a group).
  
 
- If you already use Gnus 5.10.0, you can say 
+ If you already use Gnus 5.10, you can say 
  @samp{/o N} 
  In summary buffer to load the last N messages, this feature is not available in 5.8.8
  
@@ -1000,7 +1000,7 @@
 
 Answer: 
 
- Only if you use Gnus 5.10.0 or younger. In this case you've got the
+ Only if you use Gnus 5.10 or younger. In this case you've got the
  choice between w3, w3m, links, lynx and html2text, which
  one is used can be specified in the variable
  mm-text-html-renderer, so if you want links to render your
@@ -1033,7 +1033,7 @@
  @samp{W Y f} gives you full deuglify.
  See @samp{W Y C-h} or
  have a look at the menus for other deuglifications).
- Outlook deuglify is only available since Gnus 5.10.0.
+ Outlook deuglify is only available since Gnus 5.10.
  
 @ifnottex
 @node [4.9], [4.10], [4.8], FAQ 4 - Reading messages
@@ -1204,8 +1204,8 @@
 @example
 (gnus-add-configuration 
  '(article (vertical 1.0
-		     (summary .35 point)
-		     (article 1.0))))
+                     (summary .35 point)
+                     (article 1.0))))
 @end example
  
 
@@ -1252,7 +1252,7 @@
  sadly hard tabulators are broken in 5.8.8.
  
 
- Since 5.10.0, Gnus offers you some very nice new specifiers,
+ Since 5.10, Gnus offers you some very nice new specifiers,
  e.g. %B which draws a thread-tree and %&user-date which
  gives you a date where the details are dependent of the
  articles age. Here's an example which uses both:
@@ -1771,7 +1771,7 @@
 @end example
 
 @noindent
- if you already use Gnus 5.10.0, if you still use 5.8.8 or
+ if you already use Gnus 5.10, if you still use 5.8.8 or
  5.9 try this instead:
  
 
@@ -1793,7 +1793,7 @@
 
 Answer: 
 
- Since 5.10.0 Gnus doesn't generate a sender header by
+ Since 5.10 Gnus doesn't generate a sender header by
  default. For older Gnus' try this in ~/.gnus:
  
 
@@ -1851,10 +1851,10 @@
 @end example
 @noindent
  in ~/.gnus.  If you use Gnus 5.9 or ealier, you can use this
-instead:
+instead (works for newer versions a well):
 @example
 (eval-after-load "message"
-  '(let (myfqdn "yourmachine.yourdomain.tld");; <-- Edit this!
+  '(let ((fqdn "yourmachine.yourdomain.tld"));; <-- Edit this!
      (if (boundp 'message-user-fqdn)
          (setq message-user-fqdn fqdn)
        (gnus-message 1 "Redefining `message-make-fqdn'.")
@@ -2021,7 +2021,7 @@
  the raw message, look for the message-id, and say
  @samp{M-^ the@@message.id RET} in a
  summary buffer.
- Since Gnus 5.10.0 there's also a Gnus interface for
+ Since Gnus 5.10 there's also a Gnus interface for
  groups.google.com which you can call with
  @samp{G W}) in group buffer.
  
@@ -2046,9 +2046,9 @@
  engines and with the help of nnir you can search trough
  the indexed mail and generate a temporary group with all
  messages which met your search criteria. If this sound
- cool to you get nnir.el from
- @uref{ftp://ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/}
- or @uref{ftp://ftp.is.informatik.uni-duisburg.de/pub/src/emacs/}.
+ cool to you get nnir.el from the contrib directory of the Gnus
+ distribution or
+ @uref{http://quimby.gnus.org/cgi-bin/cvsweb.cgi/~checkout~/gnus/contrib/nnir.el?rev=HEAD&content-type=text/plain}
  Instructions on how to use it are at the top of the file.
  
 @ifnottex
@@ -2231,7 +2231,7 @@
  later when you're offline. It kind of mimics offline
  newsreaders like e.g. Forte Agent. If you want to use
  the Agent place the following in ~/.gnus if you are
- still using 5.8.8 or 5.9 (it's the default since 5.10.0):
+ still using 5.8.8 or 5.9 (it's the default since 5.10):
  
 
 @example
@@ -2524,7 +2524,7 @@
 
 @noindent
  in ~/.emacs. If you don't care about width of CJK
- characters or use Gnus 5.10.0 or younger together with a
+ characters or use Gnus 5.10 or younger together with a
  recent GNU Emacs, you should say
  
 
@@ -2538,7 +2538,7 @@
  two suggestions). Finally if you are still using 5.8.8
  or 5.9 and experience speed problems with summary
  buffer generation, you definitely should update to
- 5.10.0 since there quite some work on improving it has
+ 5.10 since there quite some work on improving it has
  been done.
  
 @ifnottex
--- a/man/gnus.texi	Tue Sep 28 04:38:25 2004 +0000
+++ b/man/gnus.texi	Wed Sep 29 07:22:20 2004 +0000
@@ -3013,11 +3013,23 @@
 the group by putting @code{(gnus-list-identifiers "DOCBOOK-APPS:")}
 into the group parameters for the group.
 
-This can also be used as a group-specific hook function, if you'd like.
-If you want to hear a beep when you enter a group, you could put
-something like @code{(dummy-variable (ding))} in the parameters of that
-group.  @code{dummy-variable} will be set to the result of the
-@code{(ding)} form, but who cares?
+This can also be used as a group-specific hook function.  If you want to
+hear a beep when you enter a group, you could put something like
+@code{(dummy-variable (ding))} in the parameters of that group.
+@code{dummy-variable} will be set to the (meaningless) result of the
+@code{(ding)} form.  
+
+Alternatively, since the VARIABLE becomes local to the group, this
+pattern can be used to temporarily change a hook.  For example, if the
+following is added to a group parameter
+
+@lisp
+(gnus-summary-prepared-hook
+  '(lambda nil (local-set-key "d" (local-key-binding "n"))))
+@end lisp
+
+when the group is entered, the 'd' key will not mark the article as
+expired.
 
 @end table
 
@@ -5368,6 +5380,13 @@
 This command understands the process/prefix convention
 (@pxref{Process/Prefix}).
 
+@item S D e
+@kindex S D e (Summary)
+@findex gnus-summary-resend-message-edit
+
+Like the previous command, but will allow you to edit the message as
+if it were a new message before resending.
+
 @item S O m
 @kindex S O m (Summary)
 @findex gnus-uu-digest-mail-forward
@@ -6187,7 +6206,7 @@
 @item M P a
 @kindex M P a (Summary)
 @findex gnus-uu-mark-all
-Mark all articles in series order (@code{gnus-uu-mark-series}).
+Mark all articles in series order (@code{gnus-uu-mark-all}).
 
 @item M P b
 @kindex M P b (Summary)
@@ -9328,6 +9347,26 @@
 @item gnus-mime-multipart-functions
 Alist of @acronym{MIME} multipart types and functions to handle them.
 
+@vindex gnus-mime-display-multipart-alternative-as-mixed
+@item gnus-mime-display-multipart-alternative-as-mixed
+Display "multipart/alternative" parts as "multipart/mixed".
+
+@vindex gnus-mime-display-multipart-related-as-mixed
+@item gnus-mime-display-multipart-related-as-mixed
+Display "multipart/related" parts as "multipart/mixed".
+
+If displaying "text/html" is discouraged, see
+@code{mm-discouraged-alternatives} in @ref{Display Customization,
+Display Customization, , emacs-mime, Emacs-Mime Manual}.  Images or
+other material inside a "multipart/related" part might be overlooked
+when this variable is nil.
+
+@vindex gnus-mime-display-multipart-as-mixed
+@item gnus-mime-display-multipart-as-mixed
+Display "multipart" parts as "multipart/mixed".  If t, it overrides nil
+values of @code{gnus-mime-display-multipart-alternative-as-mixed} and
+@code{gnus-mime-display-multipart-related-as-mixed}.
+
 @vindex mm-file-name-rewrite-functions
 @item mm-file-name-rewrite-functions
 List of functions used for rewriting file names of @acronym{MIME} parts.
@@ -9424,6 +9463,10 @@
 @cindex coding system aliases
 @cindex preferred charset
 
+@xref{Encoding Customization, , Encoding Customization, emacs-mime,
+The Emacs MIME Manual}, for additional variables that control which
+MIME charsets are used when sending messages.
+
 Other charset tricks that may be useful, although not Gnus-specific:
 
 If there are several @acronym{MIME} charsets that encode the same Emacs
@@ -10136,11 +10179,19 @@
 @vindex gnus-newsgroup-variables
 @item gnus-newsgroup-variables
 A list of newsgroup (summary buffer) local variables, or cons of
-variables and their default values (when the default values are not
-@code{nil}), that should be made global while the summary buffer is
-active.  These variables can be used to set variables in the group
-parameters while still allowing them to affect operations done in
-other buffers.  For example:
+variables and their default expressions to be evalled (when the default
+values are not @code{nil}), that should be made global while the summary
+buffer is active.
+
+Note: The default expressions will be evaluated (using function
+@code{eval}) before assignment to the local variable rather than just
+assigned to it.  If the default expression is the symbol @code{global},
+that symbol will not be evaluated but the global value of the local
+variable will be used instead.
+
+These variables can be used to set variables in the group parameters
+while still allowing them to affect operations done in other
+buffers.  For example:
 
 @lisp
 (setq gnus-newsgroup-variables
@@ -10149,6 +10200,7 @@
  "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^To:")))
 @end lisp
 
+Also @pxref{Group Parameters}.
 @end table
 
 
@@ -11269,9 +11321,9 @@
 @vindex gnus-article-mode-line-format
 @item gnus-article-mode-line-format
 This variable is a format string along the same lines as
-@code{gnus-summary-mode-line-format} (@pxref{Mode Line Formatting}).  It
-accepts the same format specifications as that variable, with two
-extensions:
+@code{gnus-summary-mode-line-format} (@pxref{Summary Buffer Mode
+Line}).  It accepts the same format specifications as that variable,
+with two extensions:
 
 @table @samp
 
@@ -13203,7 +13255,9 @@
 that haven't been matched by any of the other regexps.  (These rules are
 processed from the beginning of the alist toward the end.  The first
 rule to make a match will ``win'', unless you have crossposting enabled.
-In that case, all matching rules will ``win''.)
+In that case, all matching rules will ``win''.)  When new groups are
+created by splitting mail, you may want to run
+@code{gnus-group-find-new-groups} to see the new groups.
 
 If you like to tinker with this yourself, you can set this variable to a
 function of your choice.  This function will be called without any
@@ -13771,10 +13825,10 @@
 
 @item mail-source-directory
 @vindex mail-source-directory
-Directory where files (if any) will be stored.  The default is
-@file{~/Mail/}.  At present, the only thing this is used for is to say
-where the incoming files will be stored if the previous variable is
-@code{nil}.
+Directory where incoming mail source files (if any) will be stored.  The
+default is @file{~/Mail/}.  At present, the only thing this is used for
+is to say where the incoming files will be stored if the variable
+@code{mail-source-delete-incoming} is @code{nil} or a number.
 
 @item mail-source-incoming-file-prefix
 @vindex mail-source-incoming-file-prefix
@@ -16571,7 +16625,7 @@
 This instructs the @code{imap.el} package to log any exchanges with
 the server.  The log is stored in the buffer @samp{*imap-log*}.  Look
 for error messages, which sometimes are tagged with the keyword
-@code{BAD} - but when submitting a bug, make sure to include all the
+@code{BAD}---but when submitting a bug, make sure to include all the
 data.
 
 @node Other Sources
@@ -18246,8 +18300,8 @@
 While it may be obvious to all, the only headers and articles
 available while unplugged are those headers and articles that were
 fetched into the Agent while previously plugged.  To put it another
-way, "If you forget to fetch something while plugged, you might have a
-less than satisfying unplugged session".  For this reason, the Agent
+way, ``If you forget to fetch something while plugged, you might have a
+less than satisfying unplugged session''.  For this reason, the Agent
 adds two visual effects to your summary buffer.  These effects display
 the download status of each article so that you always know which
 articles will be available when unplugged.
@@ -18624,7 +18678,7 @@
 
 @example
 #!/bin/sh
-emacs -batch -l ~/.emacs -f -l ~/.gnus.el gnus-agent-batch >/dev/null 2>&1
+emacs -batch -l ~/.emacs -l ~/.gnus.el gnus-agent-batch >/dev/null 2>&1
 @end example
 
 
@@ -20436,8 +20490,8 @@
 ...
 @end example
 
-Then that means "score on the from header of the grandparent of the
-current article".  An indirection is quite fast, but it's better to say:
+Then that means ``score on the from header of the grandparent of the
+current article''.  An indirection is quite fast, but it's better to say:
 
 @example
 (1-
@@ -22656,7 +22710,7 @@
 articles becomes the substitute for checking incoming mail.  Whether
 only unseen articles or all unread articles will be processed is
 determined by the @code{spam-autodetect-recheck-messages}.  When set
-to t, unread messages will be rechecked.
+to @code{t}, unread messages will be rechecked.
 
 @code{spam-autodetect} grants the user at once more and less control
 of spam filtering.  The user will have more control over each group's
--- a/man/message.texi	Tue Sep 28 04:38:25 2004 +0000
+++ b/man/message.texi	Wed Sep 29 07:22:20 2004 +0000
@@ -1551,8 +1551,8 @@
 @cindex Sun
 @cindex i-did-not-set--mail-host-address--so-tickle-me
 This required header will be generated by Message.  A unique ID will be
-created based on the date, time, user name and system name.  For the
-domain part, message will look (in this order) at
+created based on the date, time, user name (for the local part) and the
+domain part.  For the domain part, message will look (in this order) at
 @code{message-user-fqdn}, @code{system-name}, @code{mail-host-address}
 and @code{message-user-mail-address} (i.e. @code{user-mail-address})
 until a probably valid fully qualified domain name (FQDN) was found.
--- a/man/pgg.texi	Tue Sep 28 04:38:25 2004 +0000
+++ b/man/pgg.texi	Wed Sep 29 07:22:20 2004 +0000
@@ -135,8 +135,9 @@
 If encryption is successful, it replaces the current region contents (in
 the accessible portion) with the resulting data.
 
-If optional argument @var{sign} is non-nil, the function is request to
-do a combined sign and encrypt.  This currently only work with GnuPG.
+If optional argument @var{sign} is non-@code{nil}, the function is
+request to do a combined sign and encrypt.  This currently only work
+with GnuPG.
 @end deffn
 
 @deffn Command pgg-decrypt-region start end
@@ -301,9 +302,9 @@
 
 @deffn Method pgg-scheme-encrypt-region scheme start end recipients &optional sign
 Encrypt the current region between @var{start} and @var{end} for
-@var{recipients}.  If @var{sign} is non-nil, do a combined sign and
-encrypt.  If encryption is successful, it returns @code{t}, otherwise
-@code{nil}.
+@var{recipients}.  If @var{sign} is non-@code{nil}, do a combined sign
+and encrypt.  If encryption is successful, it returns @code{t},
+otherwise @code{nil}.
 @end deffn
 
 @deffn Method pgg-scheme-decrypt-region scheme start end
--- a/man/sieve.texi	Tue Sep 28 04:38:25 2004 +0000
+++ b/man/sieve.texi	Wed Sep 29 07:22:20 2004 +0000
@@ -277,7 +277,7 @@
 
 @item sieve-manage-log
 @vindex sieve-manage-log
-If non-nil, should be a string naming a buffer where a protocol trace
+If non-@code{nil}, should be a string naming a buffer where a protocol trace
 is dumped (for debugging purposes).
 
 @end table
@@ -313,7 +313,8 @@
 
 @item sieve-manage-havespace
 @findex sieve-manage-havespace
-Returns non-nil iff server have roam for a script of given size.
+Returns non-@code{nil} iff server have roam for a script of given
+size.
 
 @item sieve-manage-getscript
 @findex sieve-manage-getscript
--- a/src/ChangeLog	Tue Sep 28 04:38:25 2004 +0000
+++ b/src/ChangeLog	Wed Sep 29 07:22:20 2004 +0000
@@ -1,3 +1,41 @@
+2004-09-29  Kim F. Storm  <storm@cua.dk>
+
+	* dispextern.h (valid_fringe_bitmap_p): Fix prototype.
+
+	* fringe.c (Vfringe_bitmaps): New variable.
+	(syms_of_fringe): DEFVAR_LISP it.
+	(valid_fringe_bitmap_p): Rename from valid_fringe_bitmap_id_p.
+	Change arg to Lisp_Object and fail if not an integer.
+	(get_fringe_bitmap_name, resolve_fringe_bitmap)
+	(destroy_fringe_bitmap): New functions.
+	(Fdestroy_fringe_bitmap): Change arg to bitmap symbol.  Use
+	destroy_fringe_bitmap.  Remove symbol from Vfringe_bitmaps and
+	clear its fringe property.
+	(init_fringe_bitmap): Use destroy_fringe_bitmap instead of
+	Fdestroy_fringe_bitmap.
+	(Fdefine_fringe_bitmap): Add BITMAP arg specifying new or existing
+	bitmap symbol; remove WHICH arg.  Add symbol to Vfringe_bitmaps
+	and set fringe property.  Signal error if no free slots.
+	(Fset_fringe_bitmap_face): Change arg to bitmap symbol.
+	(Ffringe_bitmaps_at_pos): Return bitmap symbols instead of numbers.
+
+	* xdisp.c (handle_single_display_prop): Fringe bitmaps are now
+	symbols with a fringe property.
+
+2004-09-27  Kim F. Storm  <storm@cua.dk>
+
+	* buffer.c (syms_of_buffer) <indicate-buffer-boundaries>:
+	Doc fix.  Format may now be a symbol or alist, not a cons.
+
+	* fringe.c (update_window_fringes): Handle new formats of
+	indicate-buffer-boundaries (symbol or alist).  No longer
+	allow a simple cons.
+	(Ffringe_bitmaps_at_pos): Use nil value for no bitmap.
+
+2004-09-25  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* config.in: Rebuild
+
 2004-09-24  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
 
 	* config.in: Rebuild.
--- a/src/buffer.c	Tue Sep 28 04:38:25 2004 +0000
+++ b/src/buffer.c	Wed Sep 29 07:22:20 2004 +0000
@@ -5698,16 +5698,20 @@
 of a window on window-systems with angle bitmaps, or if the window can be
 scrolled, the top and bottom line of the window are marked with up and down
 arrow bitmaps.
-If value is `left' or `right', both angle and arrow bitmaps are displayed in
-the left or right fringe, resp.  Any other non-nil value causes the
-bitmap on the top line to be displayed in the left fringe, and the
-bitmap on the bottom line in the right fringe.
-If value is a cons (ANGLES . ARROWS), the car specifies the position
-of the angle bitmaps, and the cdr specifies the position of the arrow
-bitmaps.  For example, (t . right) places the top angle bitmap in left
-fringe, the bottom angle bitmap in right fringe, and both arrow
+
+If value is a symbol `left' or `right', both angle and arrow bitmaps
+are displayed in the left or right fringe, resp.
+
+If value is an alist, each element (INDICATOR . POSITION) specifies
+the position of one of the indicators.  INDICATOR is one of `top',
+`bottom', `up', `down', or t, which specifies the default position,
+and POSITION is one of `left', `right', or nil, meaning do not show
+this indicator.
+
+For example, ((top . left) (t . right)) places the top angle bitmap in
+left fringe, the bottom angle bitmap in right fringe, and both arrow
 bitmaps in right fringe.  To show just the angle bitmaps in the left
-fringe, but no arrow bitmaps, use (left . nil).  */);
+fringe, but no arrow bitmaps, use ((top .  left) (bottom . left)).  */);
 
   DEFVAR_PER_BUFFER ("scroll-up-aggressively",
 		     &current_buffer->scroll_up_aggressively, Qnil,
--- a/src/config.in	Tue Sep 28 04:38:25 2004 +0000
+++ b/src/config.in	Wed Sep 29 07:22:20 2004 +0000
@@ -136,7 +136,7 @@
 /* Define to 1 if you have the `euidaccess' function. */
 #undef HAVE_EUIDACCESS
 
-/* Define to 1 if this OS has exec shield. */
+/* Define to 1 if this OS has exec shield and we can handle it. */
 #undef HAVE_EXECSHIELD
 
 /* Define to 1 if you have the <fcntl.h> header file. */
--- a/src/dispextern.h	Tue Sep 28 04:38:25 2004 +0000
+++ b/src/dispextern.h	Wed Sep 29 07:22:20 2004 +0000
@@ -2634,7 +2634,7 @@
 
 /* Defined in fringe.c */
 
-int valid_fringe_bitmap_id_p (int);
+int valid_fringe_bitmap_p (Lisp_Object);
 void draw_fringe_bitmap P_ ((struct window *, struct glyph_row *, int));
 void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *));
 void draw_window_fringes P_ ((struct window *));
--- a/src/fringe.c	Tue Sep 28 04:38:25 2004 +0000
+++ b/src/fringe.c	Wed Sep 29 07:22:20 2004 +0000
@@ -31,12 +31,22 @@
 
 #ifdef HAVE_WINDOW_SYSTEM
 
+extern Lisp_Object Qfringe;
 extern Lisp_Object Qtop, Qbottom, Qcenter;
+extern Lisp_Object Qup, Qdown, Qleft, Qright;
 
 /* Non-nil means that newline may flow into the right fringe.  */
 
 Lisp_Object Voverflow_newline_into_fringe;
 
+/* List of known fringe bitmap symbols.
+
+   The fringe bitmap number is stored in the `fringe' property on
+   those symbols.  Names for the built-in bitmaps are installed by
+   loading fringe.el.
+ */
+
+Lisp_Object Vfringe_bitmaps;
 
 enum fringe_bitmap_type
 {
@@ -443,15 +453,90 @@
 /* Return 1 if FRINGE_ID is a valid fringe bitmap id.  */
 
 int
-valid_fringe_bitmap_id_p (fringe_id)
-     int fringe_id;
+valid_fringe_bitmap_p (bitmap)
+     Lisp_Object bitmap;
+{
+  int bn;
+
+  if (!INTEGERP (bitmap))
+    return 0;
+
+  bn = XINT (bitmap);
+  return (bn >= NO_FRINGE_BITMAP
+	  && bn < max_used_fringe_bitmap
+	  && (bn < MAX_STANDARD_FRINGE_BITMAPS
+	      || fringe_bitmaps[bn] != NULL));
+}
+
+/* Get fringe bitmap name for bitmap number BN.
+
+   Found by traversing Vfringe_bitmaps comparing BN to the
+   fringe property for each symbol.
+
+   Return BN if not found in Vfringe_bitmaps.  */
+
+static Lisp_Object
+get_fringe_bitmap_name (bn)
+     int bn;
 {
-  return (fringe_id >= NO_FRINGE_BITMAP
-	  && fringe_id < max_used_fringe_bitmap
-	  && (fringe_id < MAX_STANDARD_FRINGE_BITMAPS
-	      || fringe_bitmaps[fringe_id] != NULL));
+  Lisp_Object bitmaps;
+  Lisp_Object num;
+
+  /* Zero means no bitmap -- return nil.  */
+  if (bn <= 0)
+    return Qnil;
+
+  bitmaps = Vfringe_bitmaps;
+  num = make_number (bn);
+
+  while (CONSP (bitmaps))
+    {
+      Lisp_Object bitmap = XCAR (bitmaps);
+      if (EQ (num, Fget (bitmap, Qfringe)))
+	return bitmap;
+      bitmaps = XCDR (bitmaps);
+    }
+
+  return num;
 }
 
+
+/* Resolve a BITMAP parameter.
+
+   An INTEGER, corresponding to a bitmap number.
+   A STRING which is interned to a symbol.
+   A SYMBOL which has a fringe property which is a bitmap number.
+*/
+
+static int
+resolve_fringe_bitmap (bitmap, namep)
+     Lisp_Object bitmap;
+     Lisp_Object *namep;
+{
+  if (namep)
+    *namep = Qnil;
+
+  if (STRINGP (bitmap))
+    bitmap = intern (SDATA (bitmap));
+
+  if (SYMBOLP (bitmap))
+    {
+      if (namep)
+	*namep = bitmap;
+      bitmap = Fget (bitmap, Qfringe);
+    }
+
+  if (valid_fringe_bitmap_p (bitmap))
+    {
+      if (namep && NILP (*namep))
+	*namep = get_fringe_bitmap_name (XINT (bitmap));
+      return XINT (bitmap);
+    }
+
+  return -1;
+}
+
+
 /* Draw the bitmap WHICH in one of the left or right fringes of
    window W.  ROW is the glyph row for which to display the bitmap; it
    determines the vertical position at which the bitmap has to be
@@ -706,9 +791,10 @@
   int rn, nrows = w->current_matrix->nrows;
   int y;
   int redraw_p = 0;
-  Lisp_Object ind;
-  int boundary_pos = 0, arrow_pos = 0;
-  int empty_pos = 0;
+  Lisp_Object boundary_top = Qnil, boundary_bot = Qnil;
+  Lisp_Object arrow_top = Qnil, arrow_bot = Qnil;
+  Lisp_Object empty_pos;
+  Lisp_Object ind = Qnil;
 
   if (w->pseudo_window_p)
     return 0;
@@ -716,23 +802,29 @@
   if (!MINI_WINDOW_P (w)
       && (ind = XBUFFER (w->buffer)->indicate_buffer_boundaries, !NILP (ind)))
     {
-      int do_eob = 1, do_bob = 1;
-      Lisp_Object arrows;
-
-      if (CONSP (ind))
-	arrows = XCDR (ind), ind = XCAR (ind);
+      if (EQ (ind, Qleft) || EQ (ind, Qright))
+	boundary_top = boundary_bot = arrow_top = arrow_bot = ind;
+      else if (CONSP (ind) && CONSP (XCAR (ind)))
+	{
+	  Lisp_Object pos;
+	  if (pos = Fassq (Qt, ind), !NILP (pos))
+	    boundary_top = boundary_bot = arrow_top = arrow_bot = XCDR (pos);
+	  if (pos = Fassq (Qtop, ind), !NILP (pos))
+	    boundary_top = XCDR (pos);
+	  if (pos = Fassq (Qbottom, ind), !NILP (pos))
+	    boundary_bot = XCDR (pos);
+	  if (pos = Fassq (Qup, ind), !NILP (pos))
+	    arrow_top = XCDR (pos);
+	  if (pos = Fassq (Qdown, ind), !NILP (pos))
+	    arrow_bot = XCDR (pos);
+	}
       else
-	arrows = ind;
+	ind = Qnil;
+    }
 
-      if (EQ (ind, Qleft))
-	boundary_pos = -1;
-      else if (EQ (ind, Qright))
-	boundary_pos = 1;
-
-      if (EQ (arrows, Qleft))
-	arrow_pos = -1;
-      else if (EQ (arrows, Qright))
-	arrow_pos = 1;
+  if (!NILP (ind))
+    {
+      int do_eob = 1, do_bob = 1;
 
       for (y = 0, rn = 0;
 	   y < yb && rn < nrows;
@@ -753,17 +845,17 @@
 	  row->indicate_bob_p = row->indicate_top_line_p = 0;
 	  row->indicate_eob_p = row->indicate_bottom_line_p = 0;
 
-	  if (!NILP (ind)
+	  if (!NILP (boundary_top)
 	      && MATRIX_ROW_START_CHARPOS (row) <= BUF_BEGV (XBUFFER (w->buffer)))
 	    row->indicate_bob_p = do_bob, do_bob = 0;
-	  else if (!NILP (arrows)
+	  else if (!NILP (arrow_top)
 		   && (WINDOW_WANTS_HEADER_LINE_P (w) ? 1 : 0) == rn)
 	    row->indicate_top_line_p = 1;
 
-	  if (!NILP (ind)
+	  if (!NILP (boundary_bot)
 	      && MATRIX_ROW_END_CHARPOS (row) >= BUF_ZV (XBUFFER (w->buffer)))
 	    row->indicate_eob_p = do_eob, do_eob = 0;
-	  else if (!NILP (arrows)
+	  else if (!NILP (arrow_bot)
 		   && y + row->height >= yb)
 	    row->indicate_bottom_line_p = 1;
 
@@ -775,10 +867,9 @@
 	}
     }
 
-  if (EQ (XBUFFER (w->buffer)->indicate_empty_lines, Qright))
-    empty_pos = 1;
-  else if (EQ (XBUFFER (w->buffer)->indicate_empty_lines, Qleft))
-    empty_pos = -1;
+  empty_pos = XBUFFER (w->buffer)->indicate_empty_lines;
+  if (!NILP (empty_pos) && !EQ (empty_pos, Qright))
+    empty_pos = WINDOW_LEFT_FRINGE_WIDTH (w) == 0 ? Qright : Qleft;
 
   for (y = 0, rn = 0;
        y < yb && rn < nrows;
@@ -802,20 +893,20 @@
 	  left = row->left_user_fringe_bitmap;
 	  left_face_id = row->left_user_fringe_face_id;
 	}
-      else if (row->indicate_bob_p && boundary_pos <= 0)
-	left = ((row->indicate_eob_p && boundary_pos < 0)
+      else if (row->indicate_bob_p && EQ (boundary_top, Qleft))
+	left = ((row->indicate_eob_p && EQ (boundary_bot, Qleft))
 		? LEFT_BRACKET_BITMAP : TOP_LEFT_ANGLE_BITMAP);
-      else if (row->indicate_eob_p && boundary_pos < 0)
+      else if (row->indicate_eob_p && EQ (boundary_bot, Qleft))
 	left = BOTTOM_LEFT_ANGLE_BITMAP;
       else if (row->truncated_on_left_p)
 	left = LEFT_TRUNCATION_BITMAP;
       else if (MATRIX_ROW_CONTINUATION_LINE_P (row))
 	left = CONTINUATION_LINE_BITMAP;
-      else if (row->indicate_empty_line_p && empty_pos <= 0)
+      else if (row->indicate_empty_line_p && EQ (empty_pos, Qleft))
 	left = ZV_LINE_BITMAP;
-      else if (row->indicate_top_line_p && arrow_pos <= 0)
+      else if (row->indicate_top_line_p && EQ (arrow_top, Qleft))
 	left = UP_ARROW_BITMAP;
-      else if (row->indicate_bottom_line_p && arrow_pos < 0)
+      else if (row->indicate_bottom_line_p && EQ (arrow_bot, Qleft))
 	left = DOWN_ARROW_BITMAP;
       else
 	left = NO_FRINGE_BITMAP;
@@ -828,22 +919,20 @@
 	  right = row->right_user_fringe_bitmap;
 	  right_face_id = row->right_user_fringe_face_id;
 	}
-      else if (row->indicate_bob_p && boundary_pos > 0)
-	right = ((row->indicate_eob_p && boundary_pos >= 0)
+      else if (row->indicate_bob_p && EQ (boundary_top, Qright))
+	right = ((row->indicate_eob_p && EQ (boundary_bot, Qright))
 		 ? RIGHT_BRACKET_BITMAP : TOP_RIGHT_ANGLE_BITMAP);
-      else if (row->indicate_eob_p && boundary_pos >= 0)
+      else if (row->indicate_eob_p && EQ (boundary_bot, Qright))
 	right = BOTTOM_RIGHT_ANGLE_BITMAP;
       else if (row->truncated_on_right_p)
 	right = RIGHT_TRUNCATION_BITMAP;
       else if (row->continued_p)
 	right = CONTINUED_LINE_BITMAP;
-      else if (row->indicate_top_line_p && arrow_pos > 0)
+      else if (row->indicate_top_line_p && EQ (arrow_top, Qright))
 	right = UP_ARROW_BITMAP;
-      else if (row->indicate_bottom_line_p && arrow_pos >= 0)
+      else if (row->indicate_bottom_line_p && EQ (arrow_bot, Qright))
 	right = DOWN_ARROW_BITMAP;
-      else if (row->indicate_empty_line_p
-	       && (empty_pos > 0
-		   || (WINDOW_LEFT_FRINGE_WIDTH (w) == 0 && empty_pos == 0)))
+      else if (row->indicate_empty_line_p && EQ (empty_pos, Qright))
 	right = ZV_LINE_BITMAP;
       else
 	right = NO_FRINGE_BITMAP;
@@ -978,20 +1067,13 @@
       redraw_frame (f);
 }
 
-DEFUN ("destroy-fringe-bitmap", Fdestroy_fringe_bitmap, Sdestroy_fringe_bitmap,
-       1, 1, 0,
-       doc: /* Destroy fringe bitmap WHICH.
-If WHICH overrides a standard fringe bitmap, the original bitmap is restored.  */)
-  (which)
-     Lisp_Object which;
+
+void
+destroy_fringe_bitmap (n)
+     int n;
 {
-  int n;
   struct fringe_bitmap **fbp;
 
-  CHECK_NUMBER (which);
-  if (n = XINT (which), n >= max_used_fringe_bitmap)
-    return Qnil;
-
   fringe_faces[n] = FRINGE_FACE_ID;
 
   fbp = &fringe_bitmaps[n];
@@ -1006,7 +1088,31 @@
   while (max_used_fringe_bitmap > MAX_STANDARD_FRINGE_BITMAPS
 	 && fringe_bitmaps[max_used_fringe_bitmap - 1] == NULL)
     max_used_fringe_bitmap--;
+}
 
+
+DEFUN ("destroy-fringe-bitmap", Fdestroy_fringe_bitmap, Sdestroy_fringe_bitmap,
+       1, 1, 0,
+       doc: /* Destroy fringe bitmap BITMAP.
+If BITMAP overrides a standard fringe bitmap, the original bitmap is restored.  */)
+  (bitmap)
+     Lisp_Object bitmap;
+{
+  int n;
+  Lisp_Object sym;
+
+  n = resolve_fringe_bitmap (bitmap, &sym);
+  if (n < 0)
+    return Qnil;
+
+  destroy_fringe_bitmap (n);
+
+  if (SYMBOLP (sym))
+    {
+      Vfringe_bitmaps = Fdelq (sym, Vfringe_bitmaps);
+      /* It would be better to remove the fringe property.  */
+      Fput (sym, Qfringe, Qnil);
+    }
   return Qnil;
 }
 
@@ -1077,7 +1183,7 @@
 
   if (!once_p)
     {
-      Fdestroy_fringe_bitmap (make_number (which));
+      destroy_fringe_bitmap (which);
 
       if (rif->define_fringe_bitmap)
 	rif->define_fringe_bitmap (which, fb->bits, fb->height, fb->width);
@@ -1090,26 +1196,32 @@
 
 
 DEFUN ("define-fringe-bitmap", Fdefine_fringe_bitmap, Sdefine_fringe_bitmap,
-       1, 5, 0,
-       doc: /* Define a fringe bitmap from BITS of height HEIGHT and width WIDTH.
+       2, 5, 0,
+       doc: /* Define fringe bitmap BITMAP from BITS of size HEIGHT x WIDTH.
+BITMAP is a symbol or string naming the new fringe bitmap.
 BITS is either a string or a vector of integers.
 HEIGHT is height of bitmap.  If HEIGHT is nil, use length of BITS.
 WIDTH must be an integer between 1 and 16, or nil which defaults to 8.
-Optional fourth arg ALIGN may be one of `top', `center', or `bottom',
+Optional fifth arg ALIGN may be one of `top', `center', or `bottom',
 indicating the positioning of the bitmap relative to the rows where it
 is used; the default is to center the bitmap.  Fourth arg may also be a
 list (ALIGN PERIODIC) where PERIODIC non-nil specifies that the bitmap
 should be repeated.
-Optional fifth argument WHICH is bitmap number to redefine.
-Return new bitmap number, or nil of no more free bitmap slots.  */)
-  (bits, height, width, align, which)
-     Lisp_Object bits, height, width, align, which;
+If BITMAP already exists, the existing definition is replaced.  */)
+  (bitmap, bits, height, width, align)
+     Lisp_Object bitmap, bits, height, width, align;
 {
   Lisp_Object len;
   int n, h, i, j;
   unsigned short *b;
   struct fringe_bitmap fb, *xfb;
   int fill1 = 0, fill2 = 0;
+  Lisp_Object sym;
+
+  n = resolve_fringe_bitmap (bitmap, &sym);
+
+  if (NILP (sym) || INTEGERP (sym))
+    sym = wrong_type_argument (Qsymbolp, bitmap);
 
   if (!STRINGP (bits) && !VECTORP (bits))
     bits = wrong_type_argument (Qstringp, bits);
@@ -1162,7 +1274,7 @@
   else if (!NILP (align) && !EQ (align, Qcenter))
     error ("Bad align argument");
 
-  if (NILP (which))
+  if (n < 0)
     {
       if (max_used_fringe_bitmap < MAX_FRINGE_BITMAPS)
 	n = max_used_fringe_bitmap++;
@@ -1174,16 +1286,11 @@
 	    if (fringe_bitmaps[n] == NULL)
 	      break;
 	  if (n == MAX_FRINGE_BITMAPS)
-	    return Qnil;
+	    error ("Cannot define more fringe bitmaps");
 	}
-      which = make_number (n);
-    }
-  else
-    {
-      CHECK_NUMBER (which);
-      n = XINT (which);
-      if (n <= NO_FRINGE_BITMAP || n >= MAX_FRINGE_BITMAPS)
-	error ("Invalid fringe bitmap number");
+
+      Vfringe_bitmaps = Fcons (sym, Vfringe_bitmaps);
+      Fput (sym, Qfringe, make_number (n));
     }
 
   fb.dynamic = 1;
@@ -1211,21 +1318,22 @@
 
   init_fringe_bitmap (n, xfb, 0);
 
-  return which;
+  return sym;
 }
 
 DEFUN ("set-fringe-bitmap-face", Fset_fringe_bitmap_face, Sset_fringe_bitmap_face,
        1, 2, 0,
-       doc: /* Set face for fringe bitmap FRINGE-ID to FACE.
+       doc: /* Set face for fringe bitmap BITMAP to FACE.
 If FACE is nil, reset face to default fringe face.  */)
-  (fringe_id, face)
-     Lisp_Object fringe_id, face;
+  (bitmap, face)
+     Lisp_Object bitmap, face;
 {
+  int bn;
   int face_id;
 
-  CHECK_NUMBER (fringe_id);
-  if (!valid_fringe_bitmap_id_p (XINT (fringe_id)))
-    error ("Invalid fringe id");
+  bn = resolve_fringe_bitmap (bitmap, 0);
+  if (bn < 0)
+    error ("Undefined fringe bitmap");
 
   if (!NILP (face))
     {
@@ -1236,7 +1344,7 @@
   else
     face_id = FRINGE_FACE_ID;
 
-  fringe_faces [XINT (fringe_id)] = face_id;
+  fringe_faces [bn] = face_id;
 
   return Qnil;
 }
@@ -1247,7 +1355,8 @@
 If WINDOW is nil, use selected window.  If POS is nil, use value of point
 in that window.  Return value is a cons (LEFT . RIGHT) where LEFT and RIGHT
 are the fringe bitmap numbers for the bitmaps in the left and right fringe,
-resp.  Return nil if POS is not visible in WINDOW.  */)
+resp.  If left or right fringe is empty, the corresponding element is nil.
+Return nil if POS is not visible in WINDOW.  */)
   (pos, window)
      Lisp_Object pos, window;
 {
@@ -1274,8 +1383,8 @@
   row = MATRIX_FIRST_TEXT_ROW (w->current_matrix);
   row = row_containing_pos (w, textpos, row, NULL, 0);
   if (row)
-    return Fcons (make_number (row->left_fringe_bitmap),
-		  make_number (row->right_fringe_bitmap));
+    return Fcons (get_fringe_bitmap_name (row->left_fringe_bitmap),
+		  get_fringe_bitmap_name (row->right_fringe_bitmap));
   else
     return Qnil;
 }
@@ -1288,7 +1397,6 @@
 void
 syms_of_fringe ()
 {
-
   defsubr (&Sdestroy_fringe_bitmap);
   defsubr (&Sdefine_fringe_bitmap);
   defsubr (&Sfringe_bitmaps_at_pos);
@@ -1303,6 +1411,10 @@
 If nil, also continue lines which are exactly as wide as the window.  */);
   Voverflow_newline_into_fringe = Qt;
 
+  DEFVAR_LISP ("fringe-bitmaps", &Vfringe_bitmaps,
+    doc: /* List of fringe bitmap symbols.
+You must (require 'fringe) to use fringe bitmap symbols in your programs." */);
+  Vfringe_bitmaps = Qnil;
 }
 
 /* Initialize this module when Emacs starts.  */
--- a/src/xdisp.c	Tue Sep 28 04:38:25 2004 +0000
+++ b/src/xdisp.c	Wed Sep 29 07:22:20 2004 +0000
@@ -308,6 +308,7 @@
 extern Lisp_Object QCwidth, QCheight, QCascent;
 extern Lisp_Object Qscroll_bar;
 extern Lisp_Object Qcursor;
+extern Lisp_Object Qfringe;
 
 /* Non-nil means highlight trailing whitespace.  */
 
@@ -3581,8 +3582,9 @@
 
 #ifdef HAVE_WINDOW_SYSTEM
 	  value = XCAR (XCDR (prop));
-	  if (!NUMBERP (value)
-	      || !valid_fringe_bitmap_id_p (XINT (value)))
+	  if (!SYMBOLP (value)
+	      || (value = Fget (value, Qfringe),
+		  !valid_fringe_bitmap_p (value)))
 	    return 0;
 
 	  if (CONSP (XCDR (XCDR (prop))))