# HG changeset patch # User Karoly Lorentey # Date 1136254528 0 # Node ID c69d44922688cdfa33e7e9ac62f0dca4d97eedb1 # Parent ff74a86c2b167ea4386f077b48c37a2ac62a5920# Parent 11f1a38de9af39ce2a698c02fd179ae8f17b45c9 Merged from miles@gnu.org--gnu-2005 (patch 682) Patches applied: * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-682 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-490 diff -r ff74a86c2b16 -r c69d44922688 ChangeLog --- a/ChangeLog Tue Jan 03 01:50:46 2006 +0000 +++ b/ChangeLog Tue Jan 03 02:15:28 2006 +0000 @@ -1,4 +1,8 @@ -2005-12-25 Giorgos Keramidas (tiny change) +2005-12-29 Andreas Schwab + + * config.guess, config.sub: Updated from master source. + +2005-12-25 Giorgos Keramidas (tiny change) * configure.in: use amdx86-64 for freebsd on x86_64. diff -r ff74a86c2b16 -r c69d44922688 config.guess --- a/config.guess Tue Jan 03 01:50:46 2006 +0000 +++ b/config.guess Tue Jan 03 02:15:28 2006 +0000 @@ -3,7 +3,7 @@ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. -timestamp='2005-08-03' +timestamp='2005-12-23' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -764,7 +764,12 @@ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin @@ -779,7 +784,7 @@ i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; - x86:Interix*:[34]*) + x86:Interix*:[345]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) @@ -851,7 +856,7 @@ #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) @@ -870,7 +875,7 @@ #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) @@ -919,6 +924,9 @@ sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; @@ -964,7 +972,7 @@ LIBC=gnulibc1 # endif #else - #ifdef __INTEL_COMPILER + #if defined(__INTEL_COMPILER) || defined(__PGI) LIBC=gnu #else LIBC=gnuaout @@ -974,7 +982,7 @@ LIBC=dietlibc #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^LIBC/{s: ::g;p;}'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit @@ -1185,7 +1193,6 @@ *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in - *86) UNAME_PROCESSOR=i686 ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} @@ -1264,6 +1271,9 @@ i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 diff -r ff74a86c2b16 -r c69d44922688 config.sub --- a/config.sub Tue Jan 03 01:50:46 2006 +0000 +++ b/config.sub Tue Jan 03 02:15:28 2006 +0000 @@ -3,7 +3,7 @@ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. -timestamp='2005-07-08' +timestamp='2005-12-23' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -119,8 +119,9 @@ # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ - kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; @@ -171,6 +172,10 @@ -hiux*) os=-hiuxwe2 ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` @@ -187,6 +192,10 @@ # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` @@ -239,7 +248,7 @@ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ - | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ + | m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -257,7 +266,7 @@ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ - | ms1 \ + | mt \ | msp430 \ | ns16k | ns32k \ | or32 \ @@ -286,6 +295,9 @@ ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; + ms1) + basic_machine=mt-unknown + ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and @@ -336,7 +348,7 @@ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ - | ms1-* \ + | mt-* \ | msp430-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ @@ -696,6 +708,9 @@ basic_machine=i386-pc os=-msdos ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; mvs) basic_machine=i370-ibm os=-mvs @@ -803,6 +818,12 @@ pc532 | pc532-*) basic_machine=ns32k-pc532 ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; @@ -859,6 +880,10 @@ basic_machine=i586-unknown os=-pw32 ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; rom68k) basic_machine=m68k-rom68k os=-coff @@ -1181,14 +1206,15 @@ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku*) + | -skyos* | -haiku* | -rdos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) diff -r ff74a86c2b16 -r c69d44922688 etc/ChangeLog --- a/etc/ChangeLog Tue Jan 03 01:50:46 2006 +0000 +++ b/etc/ChangeLog Tue Jan 03 02:15:28 2006 +0000 @@ -2,7 +2,7 @@ * e/eterm-color.ti: Temporarily disable the ri entry. * e/eterm-color: Regenerate. - + 2005-12-21 L$,1 q(Brentey K,Aa(Broly * TODO: Add note on the multi-tty branch. @@ -35,7 +35,7 @@ * orgcard.tex: Version 3.20 -2005-11-16 Nick Roberts +2005-11-16 Nick Roberts * images/gud/go.xpm, images/gud/go.pbm: Old gud-remove icons. Use for run/continue. @@ -45,7 +45,7 @@ Use a more appropriate variable name. * images/gud/remove.xpm, images/gud/remove.pbm * images/gud/break.xpm, images/gud/break.pbm: Make more intuitive. - + 2005-11-09 Nick Roberts * images/gud/pp.xpm, images/gud/pp.pbm: New icons. @@ -55,7 +55,7 @@ * images/copy.xpm, images/copy.pbm, images/low-color/copy.xpm * images/save.xpm, images/save.pbm, images/low-color/save.xpm: Adjust baseline. - + 2005-11-06 Jan Dj,Ad(Brv * images/up-node.xpm, images/prev-node.xpm, images/next-node.xpm @@ -165,18 +165,18 @@ * images/right-arrow.*: Moved here from lisp/toolbar/right_arrow.*. * images/up-arrow.*: Moved here from lisp/toolbar/up_arrow.*. * images/low-color/back-arrow.*: Moved here from - lisp/toolbar/lc-back_arrow.*. + lisp/toolbar/lc-back_arrow.*. * images/low-color/fwd-arrow.*: Moved here from lisp/toolbar/lc-fwd_arrow.*. * images/low-color/jump-to.*: Moved here from lisp/toolbar/lc-jump_to.*. * images/low-color/left-arrow.*: Moved here from - lisp/toolbar/lc-left_arrow.*. + lisp/toolbar/lc-left_arrow.*. * images/low-color/right-arrow.*: Moved here from - lisp/toolbar/lc-right_arrow.*. + lisp/toolbar/lc-right_arrow.*. * images/low-color/up-arrow.*: Moved here from lisp/toolbar/lc-up_arrow.*. - * images/mail/compose.*: Moved here from lisp/toolbar/mail_compose.*. + * images/mail/compose.*: Moved here from lisp/toolbar/mail_compose.*. * images/mail/send.*: Moved here from lisp/toolbar/mail_send.*. * images/README: Incorporated the content of lisp/toolbar/README @@ -191,7 +191,7 @@ next.*, nexti.*, step.*, and stepi.* , respectively, as the file-name no longer clashes on 8+3 filesystems. -2005-10-14 Bill Wohler +2005-10-14 Bill Wohler * images/gud/break.*: Moved here from toolbar/gud-break.*. * images/gud/cont.*: Moved here from toolbar/gud-cont.*. @@ -209,10 +209,10 @@ * images/gud/up.*: Moved here from toolbar/gud-up.*. * images/gud/watch.*: Moved here from toolbar/gud-watch.*. -2005-10-14 Bill Wohler +2005-10-14 Bill Wohler Released MH-E version 7.85. - + * NEWS, MH-E-NEWS: Updated for release 7.85. 2005-10-10 Jan Dj,Ad(Brv diff -r ff74a86c2b16 -r c69d44922688 etc/NEWS --- a/etc/NEWS Tue Jan 03 01:50:46 2006 +0000 +++ b/etc/NEWS Tue Jan 03 02:15:28 2006 +0000 @@ -817,6 +817,10 @@ *** The variable `cursor-in-non-selected-windows' can now be set to any of the recognized cursor types. ++++ +*** On text terminals, the variable `visible-cursor' controls whether Emacs +uses the "very visible" cursor (the default) or the normal cursor. + ** New faces: +++ diff -r ff74a86c2b16 -r c69d44922688 lib-src/ChangeLog --- a/lib-src/ChangeLog Tue Jan 03 01:50:46 2006 +0000 +++ b/lib-src/ChangeLog Tue Jan 03 02:15:28 2006 +0000 @@ -1,3 +1,15 @@ +2005-12-30 Eli Zaretskii + + * makefile.w32-in (MOUSE_SUPPORT): Add tooltip.elc. + (lisp1): Add rfn-eshadow.elc, international/utf-16.elc, image.elc, + international/fontset.elc, dnd.elc, mwheel.elc, and tool-bar.elc. + Rearrange the list to be similar to $(shortlisp) in + src/Makefile.in. + (lisp2): Add language/kannada.el, emacs-lisp/syntax.elc, + emacs-lisp/timer.elc, jka-cmpr-hook.elc, font-lock.elc, + jit-lock.elc. Rearrange the list to be similar to $(shortlisp) in + src/Makefile.in. + 2005-12-22 Richard M. Stallman * Makefile.in (update-game-score.o): Delete spurious final `\'. diff -r ff74a86c2b16 -r c69d44922688 lib-src/makefile.w32-in --- a/lib-src/makefile.w32-in Tue Jan 03 01:50:46 2006 +0000 +++ b/lib-src/makefile.w32-in Tue Jan 03 02:15:28 2006 +0000 @@ -154,7 +154,7 @@ # lispsource = ../lisp/ -MOUSE_SUPPORT = $(lispsource)select.elc $(lispsource)scroll-bar.elc $(lispsource)mouse.elc +MOUSE_SUPPORT = $(lispsource)select.elc $(lispsource)scroll-bar.elc $(lispsource)mouse.elc $(lispsource)tooltip.elc WINNT_SUPPORT = $(lispsource)ls-lisp.elc $(lispsource)disp-table.elc $(lispsource)w32-fns.elc $(lispsource)dos-w32.elc $(lispsource)w32-vars.elc # lisp files that are loaded up on other platforms @@ -166,33 +166,35 @@ $(lispsource)buff-menu.elc \ $(lispsource)button.elc \ $(lispsource)emacs-lisp/byte-run.elc \ + $(lispsource)cus-face.elc \ $(lispsource)cus-start.elc \ $(lispsource)custom.elc \ $(lispsource)emacs-lisp/backquote.elc \ $(lispsource)emacs-lisp/lisp-mode.elc \ $(lispsource)emacs-lisp/lisp.elc \ - $(lispsource)env.elc \ + $(lispsource)facemenu.elc \ + $(MOUSE_SUPPORT) \ $(lispsource)faces.elc \ $(lispsource)files.elc \ + $(lispsource)emacs-lisp/float-sup.elc \ $(lispsource)format.elc \ - $(lispsource)facemenu.elc \ - $(MOUSE_SUPPORT) \ - $(lispsource)emacs-lisp/float-sup.elc \ $(lispsource)frame.elc \ $(lispsource)help.elc \ $(lispsource)indent.elc \ $(lispsource)isearch.elc \ + $(lispsource)rfn-eshadow.elc \ $(lispsource)loadup.el \ $(lispsource)loaddefs.el \ $(lispsource)bindings.elc \ $(lispsource)emacs-lisp/map-ynp.elc \ - $(lispsource)menu-bar.elc \ + $(lispsource)env.elc \ $(lispsource)international/mule.elc \ $(lispsource)international/mule-conf.el \ $(lispsource)international/mule-cmds.elc \ $(lispsource)international/characters.elc \ $(lispsource)international/ucs-tables.elc \ $(lispsource)international/utf-8.elc \ + $(lispsource)international/utf-16.elc \ $(lispsource)international/latin-1.el \ $(lispsource)international/latin-2.el \ $(lispsource)international/latin-3.el \ @@ -200,6 +202,11 @@ $(lispsource)international/latin-5.el \ $(lispsource)international/latin-8.el \ $(lispsource)international/latin-9.el \ + $(lispsource)image.elc \ + $(lispsource)international/fontset.elc \ + $(lispsource)dnd.elc \ + $(lispsource)mwheel.elc \ + $(lispsource)tool-bar.elc \ $(lispsource)case-table.elc lisp2 = \ @@ -207,6 +214,7 @@ $(lispsource)language/cyrillic.elc \ $(lispsource)language/indian.elc \ $(lispsource)language/devanagari.el \ + $(lispsource)language/kannada.el \ $(lispsource)language/malayalam.el \ $(lispsource)language/tamil.el \ $(lispsource)language/english.el \ @@ -226,6 +234,7 @@ $(lispsource)language/misc-lang.el \ $(lispsource)language/utf-8-lang.el \ $(lispsource)language/georgian.el \ + $(lispsource)menu-bar.elc \ $(lispsource)paths.el \ $(lispsource)register.elc \ $(lispsource)replace.elc \ @@ -234,11 +243,16 @@ $(lispsource)subr.elc \ $(lispsource)term/tty-colors.elc \ $(lispsource)font-core.elc \ + $(lispsource)emacs-lisp/syntax.elc \ + $(lispsource)font-lock.elc \ + $(lispsource)jit-lock.elc \ $(lispsource)textmodes/fill.elc \ $(lispsource)textmodes/page.elc \ $(lispsource)textmodes/paragraphs.elc \ $(lispsource)textmodes/text-mode.elc \ + $(lispsource)emacs-lisp/timer.elc \ $(lispsource)vc-hooks.elc \ + $(lispsource)jka-cmpr-hook.elc \ $(lispsource)ediff-hook.elc \ $(VMS_SUPPORT) \ $(MSDOS_SUPPORT) \ diff -r ff74a86c2b16 -r c69d44922688 lisp/ChangeLog --- a/lisp/ChangeLog Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/ChangeLog Tue Jan 03 02:15:28 2006 +0000 @@ -1,3 +1,171 @@ +2006-01-01 Richard M. Stallman + + * cus-edit.el (Custom-set, Custom-save): Ask for confirmation. + (Custom-reset-current, Custom-reset-saved): Likewise. + (Custom-reset-standard): Show message if aborted. + (custom-mode): Doc fix, describing those commands. + + * mouse.el (mouse-drag-region-1): When following link via mouse-2, + put on event-kind property. + +2005-12-31 Chong Yidong + + * custom.el (provide-theme): Ban `user' theme name. + (custom-enabling-themes): New variable. + (enable-theme): Don't enable user if custom-enabling-themes is t. + (custom-enabled-themes): Make it a defcustom. + (custom-theme-recalc-face): No-op if face is undefined. + + * cus-edit.el (custom-button-mouse): New variable. + (custom-button-mouse): New face. + (custom-raised-buttons, custom-mode): Use it. + + * cus-theme.el (custom-new-theme-mode): Use custom-button-mouse. + +2005-12-31 Eli Zaretskii + + * progmodes/gud.el (gud-display-line): Support hl-line in the + source buffer. + +2005-12-31 Lennart Borgman (tiny change) + + * mouse.el (mouse-drag-window-above): Verify that the found window + overlaps with the given window in the horizontal dimension. + +2005-12-31 Eli Zaretskii + + * Makefile.in (cvs-update): New target. + + * makefile.w32-in (cvs-update): Ditto. + +2005-12-30 Chong Yidong + + * cus-theme.el (custom-new-theme-mode): Use cus-edit faces. + (custom-new-theme-mode-map): New variable. + +2005-12-30 Richard M. Stallman + + * custom.el (custom-load-themes): Function deleted. + + * cus-edit.el (custom-save-loaded-themes): Function deleted. + (custom-save-variables): Don't delete or add custom-load-themes call. + +2005-12-30 Stefan Monnier + + * cus-start.el: Add `visible-cursor'. + + * progmodes/flymake.el (flymake-copy-buffer-to-temp-buffer): Simplify. + (flymake-parse-output-and-residual): Remove `source-buffer' argument. + (flymake-process-filter): Switch to buffer before calling it instead. + (flymake-post-syntax-check, flymake-highlight-err-lines) + (flymake-delete-own-overlays, flymake-parse-err-lines) + (flymake-start-syntax-check, flymake-start-syntax-check-process) + (flymake-count-lines, flymake-parse-residual): + Remove constant buffer argument. + (flymake-start-syntax-check-for-current-buffer): Remove. + Update callers to use flymake-start-syntax-check instead. + (flymake-display-err-menu-for-current-line): + Remove unused var `mouse-pos'. + (flymake-restore-formatting): Comment out unused function. + (flymake-report-status, flymake-report-fatal-status): Remove buffer + argument, use current-buffer instead. Update callers. + +2005-12-30 Roland Winkler + + * textmodes/bibtex.el (bibtex-mode): Make completion-ignore-case + buffer-local because choose-completion-delete-max-match requires + that we set completion-ignore-case (i.e., binding via let is not + sufficient). + (bibtex-complete): Always set completion-ignore-case and + choose-completion-string-functions. The latter is needed because + choose-completion-string-functions keeps its value if we quit the + *Completions* buffer without requesting a completion. + +2005-12-30 Andreas Schwab + + * progmodes/cc-defs.el: Ignore errors from font-lock-compile-keywords. + +2005-12-30 Eli Zaretskii + + * jit-lock.el (jit-lock-chunk-size): Doc fix. + +2005-12-30 Juri Linkov + + * locate.el (locate-fcodes-file, locate-header-face) + * progmodes/delphi.el (delphi-other-face) + * progmodes/glasses.el (glasses-face): Add tag "None" to const nil. + + * paren.el (show-paren-match, show-paren-mismatch): Use existing + group `paren-showing-faces'. + + * net/goto-addr.el (goto-address-highlight-keymap): Fix docstring. + (goto-address): Fix docstring. + + * net/webjump.el (webjump-sample-sites): Update URLs. + + * textmodes/fill.el (fill-single-word-nobreak-p): Use `sentence-end'. + + * subr.el (cancel-change-group): Add listp around pending-undo-list. + +2005-12-29 Stefan Monnier + + * font-lock.el (font-lock-compile-keywords): Signal an error when + font-lock-set-defaults hasn't been called. + +2005-12-29 Luc Teirlinck + + * subr.el (noreturn, 1value): Doc fixes. + +2005-12-29 Roland Winkler + + * textmodes/bibtex.el (bibtex-text-in-field-bounds): Handle case + that assoc-string returns nil. + +2005-12-29 Roland Winkler + + * textmodes/bibtex.el (bibtex-entry-type-whitespace) + (bibtex-entry-type-str, bibtex-empty-field-re) + (bibtex-search-backward-string, bibtex-preamble-prefix) + (bibtex-search-entry, bibtex-enclosing-entry-maybe-empty-head): Remove. + (bibtex-any-valid-entry-type): New variable. + (bibtex-parse-field-name): Simplify. + (bibtex-parse-string, bibtex-search-forward-string): New arg empty-key. + (bibtex-preamble-prefix): Include left delimiter. + (bibtex-search-forward-field, bibtex-search-backward-field): + Allow unbounded search past entry boundaries (required by bibtex-pop). + (bibtex-text-in-field-bounds): Use push. + (bibtex-text-in-field): Do not use bibtex-narrow-to-entry. + (bibtex-parse-preamble, bibtex-valid-entry) + (bibtex-beginning-first-field): New functions. + (bibtex-skip-to-valid-entry): Use bibtex-valid-entry. Fix regexp. + (bibtex-map-entries): Fix docstring. + (bibtex-flash-head): New arg prompt. Simplify. + (bibtex-enclosing-field): Include code of bibtex-inside-field. + (bibtex-insert-kill): Simplify. Always insert text past the + current field or entry. + (bibtex-format-entry): Use bibtex-parse-field. + (bibtex-pop): Use bibtex-beginning-of-entry and + bibtex-end-of-entry to initiate the search. Insert empty field if + we found ourselves. + (bibtex-print-help-message): New args field and comma. + Handle entry keys. + (bibtex-make-field): Use bibtex-beginning-of-entry. + (bibtex-end-of-entry): Use bibtex-valid-entry. Recognize any + invalid entry. + (bibtex-validate): Use bibtex-valid-entry and bibtex-parse-string. + Handle preambles. Simplify code for thorough test. + (bibtex-next-field, bibtex-find-text, bibtex-find-text-internal): + New arg comma. Handle entry heads. + (bibtex-remove-OPT-or-ALT, bibtex-remove-delimiters) + (bibtex-kill-field, bibtex-copy-field-as-kil, bibtex-empty-field): + New arg comma. + (bibtex-kill-entry): Use bibtex-any-entry-maybe-empty-head. + (bibtex-fill-field): Simplify. + (bibtex-fill-entry): Use bibtex-beginning-first-field and + bibtex-parse-field. + (bibtex-convert-alien): Do not wait before calling bibtex-validate. + (bibtex-complete): Use bibtex-parse-preamble. + 2005-12-29 Nick Roberts * progmodes/gdb-ui.el (gdb-tooltip-print, gdb-tooltip-print-1): @@ -11,8 +179,7 @@ 2005-12-28 Bill Wohler - * simple.el (mh-e-user-agent): Move to mh-e/mh-comp.el and - autoload. + * simple.el (mh-e-user-agent): Move to mh-e/mh-comp.el and autoload. 2005-12-28 Stefan Monnier diff -r ff74a86c2b16 -r c69d44922688 lisp/Makefile.in --- a/lisp/Makefile.in Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/Makefile.in Tue Jan 03 02:15:28 2006 +0000 @@ -119,6 +119,9 @@ updates: update-subdirs autoloads mh-autoloads finder-data custom-deps +# This is useful after "cvs up". +cvs-update: recompile autoloads finder-data custom-deps + # Update the AUTHORS file. update-authors: diff -r ff74a86c2b16 -r c69d44922688 lisp/cus-edit.el --- a/lisp/cus-edit.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/cus-edit.el Tue Jan 03 02:15:28 2006 +0000 @@ -746,22 +746,26 @@ (defun Custom-set () "Set changes in all modified options." (interactive) - (let ((children custom-options)) - (mapc (lambda (child) - (when (eq (widget-get child :custom-state) 'modified) - (widget-apply child :custom-set))) - children))) + (if (y-or-n-p "Set all values according to this buffer? ") + (let ((children custom-options)) + (mapc (lambda (child) + (when (eq (widget-get child :custom-state) 'modified) + (widget-apply child :custom-set))) + children)) + (message "Aborted"))) (defun Custom-save () "Set all modified group members and save them." (interactive) - (let ((children custom-options)) - (mapc (lambda (child) - (when (memq (widget-get child :custom-state) - '(modified set changed rogue)) - (widget-apply child :custom-save))) - children)) - (custom-save-all)) + (if (yes-or-no-p "Save all settings in this buffer? ") + (let ((children custom-options)) + (mapc (lambda (child) + (when (memq (widget-get child :custom-state) + '(modified set changed rogue)) + (widget-apply child :custom-save))) + children) + (custom-save-all)) + (message "Aborted"))) (defvar custom-reset-menu '(("Current" . Custom-reset-current) @@ -784,22 +788,26 @@ (defun Custom-reset-current (&rest ignore) "Reset all modified group members to their current value." (interactive) - (let ((children custom-options)) - (mapc (lambda (widget) - (if (memq (widget-get widget :custom-state) - '(modified changed)) - (widget-apply widget :custom-reset-current))) - children))) + (if (y-or-n-p "Update buffer text to show all current settings? ") + (let ((children custom-options)) + (mapc (lambda (widget) + (if (memq (widget-get widget :custom-state) + '(modified changed)) + (widget-apply widget :custom-reset-current))) + children)) + (message "Aborted"))) (defun Custom-reset-saved (&rest ignore) "Reset all modified or set group members to their saved value." (interactive) - (let ((children custom-options)) - (mapc (lambda (widget) - (if (memq (widget-get widget :custom-state) - '(modified set changed rogue)) - (widget-apply widget :custom-reset-saved))) - children))) + (if (y-or-n-p "Update buffer text to show all saved settings? ") + (let ((children custom-options)) + (mapc (lambda (widget) + (if (memq (widget-get widget :custom-state) + '(modified set changed rogue)) + (widget-apply widget :custom-reset-saved))) + children)) + (message "Aborted"))) (defun Custom-reset-standard (&rest ignore) "Erase all customization (either current or saved) for the group members. @@ -808,18 +816,19 @@ making them as if they had never been customized at all." (interactive) (let ((children custom-options)) - (when (or (and (= 1 (length children)) - (memq (widget-type (car children)) - '(custom-variable custom-face))) - (yes-or-no-p "Really erase all customizations in this buffer? ")) - (mapc (lambda (widget) - (and (if (widget-get widget :custom-standard-value) - (widget-apply widget :custom-standard-value) - t) - (memq (widget-get widget :custom-state) - '(modified set changed saved rogue)) - (widget-apply widget :custom-reset-standard))) - children)))) + (if (or (and (= 1 (length children)) + (memq (widget-type (car children)) + '(custom-variable custom-face))) + (yes-or-no-p "Really erase all customizations in this buffer? ")) + (mapc (lambda (widget) + (and (if (widget-get widget :custom-standard-value) + (widget-apply widget :custom-standard-value) + t) + (memq (widget-get widget :custom-state) + '(modified set changed saved rogue)) + (widget-apply widget :custom-reset-standard))) + children) + (message "Aborted")))) ;;; The Customize Commands @@ -1405,6 +1414,9 @@ (defvar custom-button nil "Face used for buttons in customization buffers.") +(defvar custom-button-mouse nil + "Mouse face used for buttons in customization buffers.") + (defvar custom-button-pressed nil "Face used for pressed buttons in customization buffers.") @@ -1419,6 +1431,8 @@ (custom-set-default variable value) (setq custom-button (if value 'custom-button 'custom-button-unraised)) + (setq custom-button-mouse + (if value 'custom-button-mouse 'highlight)) (setq custom-button-pressed (if value 'custom-button-pressed @@ -1960,6 +1974,16 @@ ;; backward-compatibility alias (put 'custom-button-face 'face-alias 'custom-button) +(defface custom-button-mouse + '((((type x w32 mac) (class color)) + (:box (:line-width 2 :style released-button) + :background "grey90" :foreground "black")) + (t + nil)) + "Mouse face for custom buffer buttons if `custom-raised-buttons' is non-nil." + :version "22.1" + :group 'custom-faces) + (defface custom-button-unraised '((((min-colors 88) (class color) (background light)) :foreground "blue1" :underline t) @@ -1975,6 +1999,9 @@ (setq custom-button (if custom-raised-buttons 'custom-button 'custom-button-unraised)) +(setq custom-button-mouse + (if custom-raised-buttons 'custom-button-mouse 'highlight)) + (defface custom-button-pressed '((((type x w32 mac) (class color)) (:box (:line-width 2 :style pressed-button) @@ -4024,6 +4051,33 @@ (save-buffer)) (unless old-buffer (kill-buffer (current-buffer)))))) + +;;;###autoload +(defun customize-save-customized () + "Save all user options which have been set in this session." + (interactive) + (mapatoms (lambda (symbol) + (let ((face (get symbol 'customized-face)) + (value (get symbol 'customized-value)) + (face-comment (get symbol 'customized-face-comment)) + (variable-comment + (get symbol 'customized-variable-comment))) + (when face + (put symbol 'saved-face face) + (custom-push-theme 'theme-face symbol 'user 'set value) + (put symbol 'customized-face nil)) + (when value + (put symbol 'saved-value value) + (custom-push-theme 'theme-value symbol 'user 'set value) + (put symbol 'customized-value nil)) + (when variable-comment + (put symbol 'saved-variable-comment variable-comment) + (put symbol 'customized-variable-comment nil)) + (when face-comment + (put symbol 'saved-face-comment face-comment) + (put symbol 'customized-face-comment nil))))) + ;; We really should update all custom buffers here. + (custom-save-all)) ;; Editing the custom file contents in a buffer. @@ -4069,10 +4123,8 @@ (defun custom-save-variables () "Save all customized variables in `custom-file'." (save-excursion - (custom-save-delete 'custom-load-themes) (custom-save-delete 'custom-reset-variables) (custom-save-delete 'custom-set-variables) - (custom-save-loaded-themes) (custom-save-resets 'theme-value 'custom-reset-variables nil) (let ((standard-output (current-buffer)) (saved-list (make-list 1 0)) @@ -4131,6 +4183,33 @@ (unless (looking-at "\n") (princ "\n"))))) +(defun custom-save-resets (property setter special) + (let (started-writing ignored-special) + ;; (custom-save-delete setter) Done by caller + (let ((standard-output (current-buffer)) + (mapper `(lambda (object) + (let ((spec (car-safe (get object (quote ,property))))) + (when (and (not (memq object ignored-special)) + (eq (nth 0 spec) 'user) + (eq (nth 1 spec) 'reset)) + ;; Do not write reset statements unless necessary. + (unless started-writing + (setq started-writing t) + (unless (bolp) + (princ "\n")) + (princ "(") + (princ (quote ,setter)) + (princ "\n '(") + (prin1 object) + (princ " ") + (prin1 (nth 3 spec)) + (princ ")"))))))) + (mapc mapper special) + (setq ignored-special special) + (mapatoms mapper) + (when started-writing + (princ ")\n"))))) + (defun custom-save-faces () "Save all customized faces in `custom-file'." (save-excursion @@ -4187,71 +4266,6 @@ (princ ")") (unless (looking-at "\n") (princ "\n"))))) - -(defun custom-save-resets (property setter special) - (let (started-writing ignored-special) - ;; (custom-save-delete setter) Done by caller - (let ((standard-output (current-buffer)) - (mapper `(lambda (object) - (let ((spec (car-safe (get object (quote ,property))))) - (when (and (not (memq object ignored-special)) - (eq (nth 0 spec) 'user) - (eq (nth 1 spec) 'reset)) - ;; Do not write reset statements unless necessary. - (unless started-writing - (setq started-writing t) - (unless (bolp) - (princ "\n")) - (princ "(") - (princ (quote ,setter)) - (princ "\n '(") - (prin1 object) - (princ " ") - (prin1 (nth 3 spec)) - (princ ")"))))))) - (mapc mapper special) - (setq ignored-special special) - (mapatoms mapper) - (when started-writing - (princ ")\n"))))) - -(defun custom-save-loaded-themes () - (let ((themes (reverse (get 'user 'theme-loads-themes))) - (standard-output (current-buffer))) - (when themes - (unless (bolp) (princ "\n")) - (princ "(custom-load-themes") - (mapc (lambda (theme) - (princ "\n '") - (prin1 theme)) themes) - (princ " )\n")))) - -;;;###autoload -(defun customize-save-customized () - "Save all user options which have been set in this session." - (interactive) - (mapatoms (lambda (symbol) - (let ((face (get symbol 'customized-face)) - (value (get symbol 'customized-value)) - (face-comment (get symbol 'customized-face-comment)) - (variable-comment - (get symbol 'customized-variable-comment))) - (when face - (put symbol 'saved-face face) - (custom-push-theme 'theme-face symbol 'user 'set value) - (put symbol 'customized-face nil)) - (when value - (put symbol 'saved-value value) - (custom-push-theme 'theme-value symbol 'user 'set value) - (put symbol 'customized-value nil)) - (when variable-comment - (put symbol 'saved-variable-comment variable-comment) - (put symbol 'customized-variable-comment nil)) - (when face-comment - (put symbol 'saved-face-comment face-comment) - (put symbol 'customized-face-comment nil))))) - ;; We really should update all custom buffers here. - (custom-save-all)) ;;; The Customize Menu. @@ -4400,11 +4414,12 @@ \\\ Invoke button under the mouse pointer. \\[Custom-move-and-invoke] Invoke button under point. \\[widget-button-press] -Set all modifications. \\[Custom-set] -Make all modifications default. \\[Custom-save] -Reset all modified options. \\[Custom-reset-current] -Reset all modified or set options. \\[Custom-reset-saved] -Reset all options. \\[Custom-reset-standard] +Set all options from current text. \\[Custom-set] +Make values in current text permanent. \\[Custom-save] +Make text match actual option values. \\[Custom-reset-current] +Reset options to permanent settings. \\[Custom-reset-saved] +Erase customizations; set options + and buffer text to the standard values. \\[Custom-reset-standard] Entry to this mode calls the value of `custom-mode-hook' if that value is non-nil." @@ -4420,8 +4435,7 @@ (make-local-variable 'widget-button-face) (setq widget-button-face custom-button) (set (make-local-variable 'widget-button-pressed-face) custom-button-pressed) - (if custom-raised-buttons - (set (make-local-variable 'widget-mouse-face) custom-button)) + (set (make-local-variable 'widget-mouse-face) custom-button-mouse) ;; When possible, use relief for buttons, not bracketing. This test ;; may not be optimal. diff -r ff74a86c2b16 -r c69d44922688 lisp/cus-start.el --- a/lisp/cus-start.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/cus-start.el Tue Jan 03 02:15:28 2006 +0000 @@ -274,6 +274,8 @@ (words-include-escapes editing-basics boolean) (open-paren-in-column-0-is-defun-start editing-basics boolean "21.1") + ;; term.c + (visible-cursor cursor boolean "22.1") ;; undo.c (undo-limit undo integer) (undo-strong-limit undo integer) diff -r ff74a86c2b16 -r c69d44922688 lisp/cus-theme.el --- a/lisp/cus-theme.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/cus-theme.el Tue Jan 03 02:15:28 2006 +0000 @@ -31,11 +31,31 @@ (eval-when-compile (require 'wid-edit)) +(defvar custom-new-theme-mode-map + (let ((map (make-keymap))) + (set-keymap-parent map widget-keymap) + (suppress-keymap map) + (define-key map "n" 'widget-forward) + (define-key map "p" 'widget-backward) + (define-key map [mouse-1] 'widget-move-and-invoke) + map) + "Keymap for `custom-new-theme-mode'.") + (define-derived-mode custom-new-theme-mode nil "New-Theme" "Major mode for the buffer created by `customize-create-theme'. Do not call this mode function yourself. It is only meant for internal use by `customize-create-theme'." - (set-keymap-parent custom-new-theme-mode-map widget-keymap)) + (use-local-map custom-new-theme-mode-map) + (define-key custom-new-theme-mode-map [mouse-1] 'widget-move-and-invoke) + (set (make-local-variable 'widget-documentation-face) 'custom-documentation) + (set (make-local-variable 'widget-button-face) custom-button) + (set (make-local-variable 'widget-button-pressed-face) custom-button-pressed) + (set (make-local-variable 'widget-mouse-face) custom-button-mouse) + (when custom-raised-buttons + (set (make-local-variable 'widget-push-button-prefix) "") + (set (make-local-variable 'widget-push-button-suffix) "") + (set (make-local-variable 'widget-link-prefix) "") + (set (make-local-variable 'widget-link-suffix) ""))) (put 'custom-new-theme-mode 'mode-class 'special) (defvar custom-theme-name) diff -r ff74a86c2b16 -r c69d44922688 lisp/custom.el --- a/lisp/custom.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/custom.el Tue Jan 03 02:15:28 2006 +0000 @@ -648,8 +648,7 @@ list would contain an entry for the `user' theme, too. See `custom-known-themes' for a list of known themes." - (unless (or (eq prop 'theme-value) - (eq prop 'theme-face)) + (unless (memq prop '(theme-value theme-face)) (error "Unknown theme property")) (let* ((old (get symbol prop)) (setting (assq theme old)) @@ -1048,21 +1047,15 @@ "Return non-nil if THEME has been loaded." (memq theme custom-loaded-themes)) -(defvar custom-enabled-themes '(user) - "Custom themes currently enabled, highest precedence first. -The first one is always `user'.") - -(defun custom-theme-enabled-p (theme) - "Return non-nil if THEME is enabled." - (memq theme custom-enabled-themes)) - (defun provide-theme (theme) - "Indicate that this file provides THEME. -Add THEME to `custom-loaded-themes', and `provide' whatever -feature name is stored in THEME's property `theme-feature'. + "Indicate that this file provides THEME, and mark it as enabled. +Add THEME to `custom-loaded-themes' and `custom-enabled-themes', +and `provide' the feature name stored in THEME's property `theme-feature'. Usually the `theme-feature' property contains a symbol created by `custom-make-theme-feature'." + (if (eq theme 'user) + (error "Custom theme cannot be named `user'")) (custom-check-theme theme) (provide (get theme 'theme-feature)) (push theme custom-loaded-themes) @@ -1120,15 +1113,11 @@ (load-theme theme))) (push theme themes-loaded)) (put by-theme 'theme-loads-themes themes-loaded))) - -(defun custom-load-themes (&rest body) - "Load themes for the USER theme as specified by BODY. - -See `custom-theme-load-themes' for more information on BODY." - (apply 'custom-theme-load-themes 'user body)) ;;; Enabling and disabling loaded themes. +(defvar custom-enabling-themes nil) + (defun enable-theme (theme) "Reenable all variable and face settings defined by THEME. The newly enabled theme gets the highest precedence (after `user'). @@ -1137,9 +1126,9 @@ This signals an error if THEME does not specify any theme settings. Theme settings are set using `load-theme'." (interactive "SEnable Custom theme: ") + (unless (or (eq theme 'user) (memq theme custom-loaded-themes)) + (error "Theme %s not defined" (symbol-name theme))) (let ((settings (get theme 'theme-settings))) - (if (and (not (eq theme 'user)) (null settings)) - (error "No theme settings defined in %s." (symbol-name theme))) (dolist (s settings) (let* ((prop (car s)) (symbol (cadr s)) @@ -1147,29 +1136,58 @@ (put symbol prop (cons (cddr s) (assq-delete-all theme spec-list))) (if (eq prop 'theme-value) (custom-theme-recalc-variable symbol) - (if (facep symbol) - (custom-theme-recalc-face symbol)))))) - (setq custom-enabled-themes - (cons theme (delq theme custom-enabled-themes))) - ;; `user' must always be the highest-precedence enabled theme. + (custom-theme-recalc-face symbol))))) (unless (eq theme 'user) - (enable-theme 'user))) + (setq custom-enabled-themes + (cons theme (delq theme custom-enabled-themes))) + (unless custom-enabling-themes + (enable-theme 'user)))) + +(defcustom custom-enabled-themes nil + "List of enabled Custom Themes, highest precedence first. + +This does not include the `user' theme, which is set by Customize, +and always takes precedence over other Custom Themes." + :group 'customize + :type '(repeat symbol) + :set (lambda (symbol themes) + ;; Avoid an infinite loop when custom-enabled-themes is + ;; defined in a theme (e.g. `user'). Enabling the theme sets + ;; custom-enabled-themes, which enables the theme... + (unless custom-enabling-themes + (let ((custom-enabling-themes t)) + (setq themes (delq 'user (delete-dups themes))) + (if (boundp symbol) + (dolist (theme (symbol-value symbol)) + (if (not (memq theme themes)) + (disable-theme theme)))) + (dolist (theme (reverse themes)) + (if (or (custom-theme-loaded-p theme) (eq theme 'user)) + (enable-theme theme) + (load-theme theme))) + (enable-theme 'user) + (custom-set-default symbol themes))))) + +(defun custom-theme-enabled-p (theme) + "Return non-nil if THEME is enabled." + (memq theme custom-enabled-themes)) (defun disable-theme (theme) "Disable all variable and face settings defined by THEME. -See `custom-known-themes' for a list of known themes." +See `custom-enabled-themes' for a list of enabled themes." (interactive "SDisable Custom theme: ") - (let ((settings (get theme 'theme-settings))) - (dolist (s settings) - (let* ((prop (car s)) - (symbol (cadr s)) - (spec-list (get symbol prop))) - (put symbol prop (assq-delete-all theme spec-list)) - (if (eq prop 'theme-value) - (custom-theme-recalc-variable symbol) - (custom-theme-recalc-face symbol))))) - (setq custom-enabled-themes - (delq theme custom-enabled-themes))) + (when (memq theme custom-enabled-themes) + (let ((settings (get theme 'theme-settings))) + (dolist (s settings) + (let* ((prop (car s)) + (symbol (cadr s)) + (spec-list (get symbol prop))) + (put symbol prop (assq-delete-all theme spec-list)) + (if (eq prop 'theme-value) + (custom-theme-recalc-variable symbol) + (custom-theme-recalc-face symbol))))) + (setq custom-enabled-themes + (delq theme custom-enabled-themes)))) (defun custom-theme-value (theme setting-list) "Determine the value specified for THEME according to SETTING-LIST. @@ -1217,9 +1235,10 @@ (defun custom-theme-recalc-face (face) "Set FACE according to currently enabled custom themes." - (let ((theme-faces (reverse (get face 'theme-face)))) - (dolist (spec theme-faces) - (face-spec-set face (car (cddr spec)))))) + (if (facep face) + (let ((theme-faces (reverse (get face 'theme-face)))) + (dolist (spec theme-faces) + (face-spec-set face (car (cddr spec))))))) (defun custom-theme-reset-variables (theme &rest args) "Reset the specs in THEME of some variables to their values in other themes. diff -r ff74a86c2b16 -r c69d44922688 lisp/font-lock.el --- a/lisp/font-lock.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/font-lock.el Tue Jan 03 02:15:28 2006 +0000 @@ -1507,6 +1507,13 @@ `font-lock-keywords' doc string. If REGEXP is non-nil, it means these keywords are used for `font-lock-keywords' rather than for `font-lock-syntactic-keywords'." + (if (not font-lock-set-defaults) + ;; This should never happen. But some external packages sometimes + ;; call font-lock in unexpected and incorrect ways. It's important to + ;; stop processing at this point, otherwise we may end up changing the + ;; global value of font-lock-keywords and break highlighting in many + ;; other buffers. + (error "Font-lock trying to use keywords before setting them up")) (if (eq (car-safe keywords) t) keywords (setq keywords diff -r ff74a86c2b16 -r c69d44922688 lisp/jit-lock.el --- a/lisp/jit-lock.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/jit-lock.el Tue Jan 03 02:15:28 2006 +0000 @@ -65,7 +65,9 @@ :group 'font-lock) (defcustom jit-lock-chunk-size 500 - "*Jit-lock chunks of this many characters, or smaller." + "*Jit-lock fontifies chunks of at most this many characters at a time. + +This variable controls both display-time and stealth fontification." :type 'integer :group 'jit-lock) diff -r ff74a86c2b16 -r c69d44922688 lisp/locate.el --- a/lisp/locate.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/locate.el Tue Jan 03 02:15:28 2006 +0000 @@ -144,12 +144,12 @@ (defcustom locate-fcodes-file nil "*File name for the database of file names." - :type '(choice file (const nil)) + :type '(choice (const :tag "None" nil) file) :group 'locate) (defcustom locate-header-face nil "*Face used to highlight the locate header." - :type '(choice face (const nil)) + :type '(choice (const :tag "None" nil) face) :group 'locate) ;;;###autoload diff -r ff74a86c2b16 -r c69d44922688 lisp/makefile.w32-in --- a/lisp/makefile.w32-in Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/makefile.w32-in Tue Jan 03 02:15:28 2006 +0000 @@ -183,6 +183,9 @@ updates: update-subdirs autoloads mh-autoloads finder-data custom-deps +# This is useful after "cvs up". +cvs-update: recompile autoloads finder-data custom-deps + # Update the AUTHORS file. update-authors: diff -r ff74a86c2b16 -r c69d44922688 lisp/mh-e/ChangeLog --- a/lisp/mh-e/ChangeLog Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/mh-e/ChangeLog Tue Jan 03 02:15:28 2006 +0000 @@ -1,3 +1,66 @@ +2006-01-01 Bill Wohler + + * mh-customize.el: Sync docstrings with manual for faces and sort + them alphabetically. + (mh-faces): Move below mh-hooks. + (mh-folder-faces, mh-index-faces, mh-letter-faces) + (mh-show-faces, mh-speed-faces): Delete. Organize faces like + hooks. + (mh-speed-update-interval): Fix group (mh-speedbar, not mh-speed). + (facemenu-unlisted-faces): Might as well ignore all MH-E faces. + (mh-folder-body-face, mh-folder-cur-msg-face) + (mh-folder-cur-msg-number-face, mh-folder-date-face) + (mh-folder-followup-face, mh-folder-msg-number-face) + (mh-folder-deleted-face, mh-folder-refiled-face) + (mh-folder-subject-face, mh-folder-address-face) + (mh-folder-scan-format-face, mh-folder-to-face) + (mh-index-folder-face, mh-show-cc-face, mh-show-date-face) + (mh-show-header-face, mh-show-pgg-good-face) + (mh-show-pgg-unknown-face, mh-show-pgg-bad-face) + (mh-show-to-face, mh-show-from-face, mh-show-subject-face): + Delete. + (mh-folder-cur-msg): Unused. Delete. + (mh-folder-address): Use defface; inherit from mh-folder-subject. + (mh-folder-body, mh-folder-cur-msg-number, mh-folder-date): + Inherit from mh-folder-msg-number. + (mh-folder-deleted): Use defface. Inherit from + mh-folder-msg-number. + (mh-folder-sent-to-me-hint): New face. Inherit from + mh-folder-date. + (mh-folder-sent-to-me-sender): Rename from mh-folder-scan-format. + Use defface. Inherit from mh-folder-followup. + (mh-show-xface): Inherit from mh-show-from and highlight. + (bw-face-generation, bw-toggle-faces) + (bw-new-face-to-old, bw-old-face-to-new): New (tempoarary) + variables, functions for toggling between old and new faces. + + * mh-e.el (font-lock-auto-fontify, font-lock-defaults): Hide in + eval-when-compile. We should probably do this throughout. + (mh-scan-good-msg-regexp, mh-scan-deleted-msg-regexp) + (mh-scan-refiled-msg-regexp, mh-scan-cur-msg-number-regexp) + (mh-scan-date-regexp, mh-scan-rcpt-regexp, mh-scan-body-regexp) + (mh-scan-subject-regexp): Sync docstrings with manual + (mh-scan-format-regexp): Rename to + mh-scan-sent-to-me-sender-regexp. Drop date parenthesized + expression. Make expression more like the others (anchored at the + beginning of line). Sync docstrings with manual. + (mh-folder-font-lock-keywords): Use faces directly rather than + -face variables. Use mh-scan-sent-to-me-sender-regexp instead of + mh-scan-format-regexp, and within that expression, use faces + mh-folder-sent-to-me-hint and mh-folder-sent-to-me-sender instead + of mh-folder-date-face and mh-folder-scan-format-face which were + misleading. + + * mh-mime.el (mh-mime-security-button-face): Use faces directly + rather than -face variables. + + * mh-utils.el (mh-show-font-lock-keywords): Use faces directly + rather than -face variables. + (mh-face-foreground-compat, mh-face-background-compat): New macros. + (mh-face-display-function): Use mh-face-foreground-compat and + mh-face-background-compat to use inherited attributes of + mh-show-xface on Emacs 22 while still working on Emacs 21. + 2005-12-28 Bill Wohler * mh-comp.el (mh-e-user-agent): Move here from simple.el. Use diff -r ff74a86c2b16 -r c69d44922688 lisp/mh-e/mh-customize.el --- a/lisp/mh-e/mh-customize.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/mh-e/mh-customize.el Tue Jan 03 02:15:28 2006 +0000 @@ -204,6 +204,12 @@ :prefix "mh-" :group 'mh-e) +(defgroup mh-hooks nil + "MH-E hooks." + :link '(custom-manual "(mh-e)Top") + :prefix "mh-" + :group 'mh-e) + (defgroup mh-faces nil "Faces used in MH-E." :link '(custom-manual "(mh-e)Top") @@ -211,51 +217,6 @@ :group 'faces :group 'mh-e) -(defgroup mh-hooks nil - "MH-E hooks." - :link '(custom-manual "(mh-e)Top") - :prefix "mh-" - :group 'mh-e) - - - -;;; Faces - -(defgroup mh-folder-faces nil - "Faces used in scan listing." - :link '(custom-manual "(mh-e)Folders") - :prefix "mh-" - :group 'mh-faces - :group 'mh-folder) - -(defgroup mh-index-faces nil - "Faces used in searching." - :link '(custom-manual "(mh-e)Searching") - :prefix "mh-" - :group 'mh-faces - :group 'mh-index) - -(defgroup mh-letter-faces nil - "Faces used in message drafts." - :link '(custom-manual "(mh-e)Editing Drafts") - :prefix "mh-" - :group 'mh-faces - :group 'mh-letter) - -(defgroup mh-show-faces nil - "Faces used in message display." - :link '(custom-manual "(mh-e)Reading Mail") - :prefix "mh-" - :group 'mh-faces - :group 'mh-show) - -(defgroup mh-speed-faces nil - "Faces used in speedbar." - :link '(custom-manual "(mh-e)Speedbar") - :prefix "mh-" - :group 'mh-faces - :group 'mh-speed) - ;;; Emacs interface to the MH mail system (:group mh-e) @@ -1883,13 +1844,13 @@ -;;; The Speedbar (:group 'mh-speed) +;;; The Speedbar (:group 'mh-speedbar) (defcustom mh-speed-update-interval 60 "Time between speedbar updates in seconds. Set to 0 to disable automatic update." :type 'integer - :group 'mh-speed) + :group 'mh-speedbar) @@ -2526,81 +2487,42 @@ -;;; Faces (:group 'mh-*-faces + group where faces described) - - - -;;; Faces Used in Scan Listing (:group 'mh-folder-faces) - -(defvar mh-folder-body-face 'mh-folder-body - "Face used to highlight body text in MH-Folder buffers.") +;;; Faces (:group 'mh-faces + group where faces described) + +(if (boundp 'facemenu-unlisted-faces) + (add-to-list 'facemenu-unlisted-faces "^mh-")) + +(defface mh-folder-address '((t (:inherit mh-folder-subject))) + "Recipient face." + :group 'mh-faces + :group 'mh-folder) + (defface mh-folder-body - (mh-defface-compat - '((((class color) (min-colors 88) (background light)) - (:foreground "RosyBrown")) - (((class color) (min-colors 88) (background dark)) - (:foreground "LightSalmon")) - (((class color)) - (:foreground "green")) - (((class grayscale) (background light)) - (:foreground "DimGray" :italic t)) - (((class grayscale) (background dark)) - (:foreground "LightGray" :italic t)) - (t - (:italic t)))) - "Face used to highlight body text in MH-Folder buffers." - :group 'mh-folder-faces) - -(defvar mh-folder-cur-msg-face 'mh-folder-cur-msg - "Face used for the current message line in MH-Folder buffers.") -(defface mh-folder-cur-msg - (mh-defface-compat - '((((class color) (min-colors 88) (background light)) - (:background "LightGreen") ;Use this for solid background colour - ;; (:underline t) ;Use this for underlining - ) - (((class color) (min-colors 88) (background dark)) - (:background "DarkOliveGreen4")) - (((class color)) - (:background "LightGreen")) - (t - (:underline t)))) - "Face used for the current message line in MH-Folder buffers." - :group 'mh-folder-faces) - -(defvar mh-folder-cur-msg-number-face 'mh-folder-cur-msg-number - "Face used to highlight the current message in MH-Folder buffers.") + '((((class color)) + (:inherit mh-folder-msg-number)) + (t + (:inherit mh-folder-msg-number :italic t))) + "Body text face." + :group 'mh-faces + :group 'mh-folder) + (defface mh-folder-cur-msg-number - (mh-defface-compat - '((((class color) (min-colors 88) (background light)) - (:foreground "Purple")) - (((class color) (min-colors 88) (background dark)) - (:foreground "Cyan")) - (((class color)) - (:foreground "cyan" :weight bold)) - (((class grayscale) (background light)) - (:foreground "LightGray" :bold t)) - (((class grayscale) (background dark)) - (:foreground "DimGray" :bold t)) - (t - (:bold t)))) - "Face used to highlight the current message in MH-Folder buffers." - :group 'mh-folder-faces) - -(defvar mh-folder-date-face 'mh-folder-date - "Face used to highlight the date in MH-Folder buffers.") -(defface mh-folder-date - '((((class color) (background light)) - (:foreground "snow4")) - (((class color) (background dark)) - (:foreground "snow3")) - (t - (:bold t))) - "Face used to highlight the date in MH-Folder buffers." - :group 'mh-folder-faces) - -(defvar mh-folder-followup-face 'mh-folder-followup - "Face used to highlight Re: subject text in MH-Folder buffers.") + '((t + (:inherit mh-folder-msg-number :bold t))) + "Current message number face." + :group 'mh-faces + :group 'mh-folder) + +(defface mh-folder-date '((t (:inherit mh-folder-msg-number))) + "Date face." + :group 'mh-faces + :group 'mh-folder) + +(defface mh-folder-deleted '((t (:inherit mh-folder-msg-number))) + "Deleted message face." + :group 'mh-faces + :group 'mh-folder) + (defface mh-folder-followup '((((class color) (background light)) (:foreground "blue3")) @@ -2608,27 +2530,19 @@ (:foreground "LightGoldenRod")) (t (:bold t))) - "Face used to highlight Re: subject text in MH-Folder buffers." - :group 'mh-folder-faces) - -(defvar mh-folder-msg-number-face 'mh-folder-msg-number - "Face used to highlight the message number in MH-Folder buffers.") + "\"Re:\" face." + :group 'mh-faces + :group 'mh-folder) + (defface mh-folder-msg-number '((((class color) (background light)) (:foreground "snow4")) (((class color) (background dark)) - (:foreground "snow3")) - (t - (:bold t))) - "Face used to highlight the message number in MH-Folder buffers." - :group 'mh-folder-faces) - -(defvar mh-folder-deleted-face 'mh-folder-deleted - "Face used to highlight deleted messages in MH-Folder buffers.") -(copy-face 'mh-folder-msg-number 'mh-folder-deleted) - -(defvar mh-folder-refiled-face 'mh-folder-refiled - "Face used to highlight refiled messages in MH-Folder buffers.") + (:foreground "snow3"))) + "Message number face." + :group 'mh-faces + :group 'mh-folder) + (defface mh-folder-refiled (mh-defface-compat '((((class color) (min-colors 88) (background light)) @@ -2643,13 +2557,26 @@ (:foreground "DimGray" :bold t :italic t)) (t (:bold t :italic t)))) - "Face used to highlight refiled messages in MH-Folder buffers." - :group 'mh-folder-faces) - -(defvar mh-folder-subject-face 'mh-folder-subject - "Face used to highlight subject text in MH-Folder buffers.") -(if (boundp 'facemenu-unlisted-faces) - (add-to-list 'facemenu-unlisted-faces "^mh-folder")) + "Refiled message face." + :group 'mh-faces + :group 'mh-folder) + +(defface mh-folder-sent-to-me-hint '((t (:inherit mh-folder-date))) + "Fontification hint face in messages sent directly to us. +The detection of messages sent to us is governed by the scan +format `mh-scan-format-nmh' and the regular expression +`mh-scan-sent-to-me-sender-regexp'." + :group 'mh-faces + :group 'mh-folder) + +(defface mh-folder-sent-to-me-sender '((t (:inherit mh-folder-followup))) + "Sender face in messages sent directly to us. +The detection of messages sent to us is governed by the scan +format `mh-scan-format-nmh' and the regular expression +`mh-scan-sent-to-me-sender-regexp'." + :group 'mh-faces + :group 'mh-folder) + (defface mh-folder-subject '((((class color) (background light)) (:foreground "blue4")) @@ -2657,8 +2584,9 @@ (:foreground "yellow")) (t (:bold t))) - "Face used to highlight subject text in MH-Folder buffers." - :group 'mh-folder-faces) + "Subject face." + :group 'mh-faces + :group 'mh-folder) (defface mh-folder-tick '((((class color) (background dark)) @@ -2667,19 +2595,10 @@ (:background "#dddf7e")) (t (:underline t))) - "Face used to show ticked messages." - :group 'mh-folder-faces) - -(defvar mh-folder-address-face 'mh-folder-address - "Face used to highlight the address in MH-Folder buffers.") -(copy-face 'mh-folder-subject 'mh-folder-address) - -(defvar mh-folder-scan-format-face 'mh-folder-scan-format - "Face used to highlight `mh-scan-format-regexp' matches in MH-Folder buffers.") -(copy-face 'mh-folder-followup 'mh-folder-scan-format) - -(defvar mh-folder-to-face 'mh-folder-to - "Face used to highlight the To: string in MH-Folder buffers.") + "Ticked message face." + :group 'mh-faces + :group 'mh-folder) + (defface mh-folder-to (mh-defface-compat '((((class color) (min-colors 88) (background light)) @@ -2694,15 +2613,10 @@ (:foreground "LightGray" :italic t)) (t (:italic t)))) - "Face used to highlight the To: string in MH-Folder buffers." - :group 'mh-folder-faces) - - - -;;; Faces Used in Searching (:group 'mh-index-faces) - -(defvar mh-index-folder-face 'mh-index-folder - "Face used to highlight folders in MH-Index buffers.") + "\"To:\" face." + :group 'mh-faces + :group 'mh-folder) + (defface mh-index-folder '((((class color) (background light)) (:foreground "dark green" :bold t)) @@ -2710,12 +2624,9 @@ (:foreground "indian red" :bold t)) (t (:bold t))) - "Face used to highlight folders in MH-Index buffers." - :group 'mh-index-faces) - - - -;;; Faces Used in Message Drafts (:group 'mh-letter-faces) + "Folder heading face in MH-Folder buffers created by searches." + :group 'mh-faces + :group 'mh-index) (defface mh-letter-header-field '((((class color) (background light)) @@ -2724,15 +2635,10 @@ (:background "gray10")) (t (:bold t))) - "Face used to display header fields in draft buffers." - :group 'mh-letter-faces) - - - -;;; Faces Used in Message Display (:group 'mh-show-faces) - -(defvar mh-show-cc-face 'mh-show-cc - "Face used to highlight cc: header fields.") + "Editable header field value face in draft buffers." + :group 'mh-faces + :group 'mh-letter) + (defface mh-show-cc (mh-defface-compat '((((class color) (min-colors 88) (background light)) @@ -2747,11 +2653,10 @@ (:foreground "DimGray" :bold t :italic t)) (t (:bold t :italic t)))) - "Face used to highlight cc: header fields." - :group 'mh-show-faces) - -(defvar mh-show-date-face 'mh-show-date - "Face used to highlight the Date: header field.") + "Face used to highlight \"cc:\" header fields." + :group 'mh-faces + :group 'mh-show) + (defface mh-show-date (mh-defface-compat '((((class color) (min-colors 88) (background light)) @@ -2766,11 +2671,21 @@ (:foreground "DimGray" :bold t)) (t (:bold t :underline t)))) - "Face used to highlight the Date: header field." - :group 'mh-show-faces) - -(defvar mh-show-header-face 'mh-show-header - "Face used to deemphasize unspecified header fields.") + "Face used to highlight \"Date:\" header fields." + :group 'mh-faces + :group 'mh-show) + +(defface mh-show-from + '((((class color) (background light)) + (:foreground "red3")) + (((class color) (background dark)) + (:foreground "cyan")) + (t + (:bold t))) + "Face used to highlight \"From:\" header fields." + :group 'mh-faces + :group 'mh-show) + (defface mh-show-header (mh-defface-compat '((((class color) (min-colors 88) (background light)) @@ -2785,46 +2700,35 @@ (:foreground "LightGray" :italic t)) (t (:italic t)))) - "Face used to deemphasize unspecified header fields." - :group 'mh-show-faces) - -(defvar mh-show-pgg-good-face 'mh-show-pgg-good - "Face used to highlight a good PGG signature.") -(defface mh-show-pgg-good - '((t - (:bold t :foreground "LimeGreen"))) - "Face used to highlight a good PGG signature." - :group 'mh-show-faces) - -(defvar mh-show-pgg-unknown-face 'mh-show-pgg-unknown - "Face used to highlight a PGG signature whose status is unknown. -This face is also used for a signature when the signer is -untrusted.") -(defface mh-show-pgg-unknown - '((t - (:bold t :foreground "DarkGoldenrod2"))) - "Face used to highlight a PGG signature whose status is unknown. -This face is also used for a signature when the signer is untrusted." - :group 'mh-show-faces) - -(defvar mh-show-pgg-bad-face 'mh-show-pgg-bad - "Face used to highlight a bad PGG signature.") -(defface mh-show-pgg-bad - '((t - (:bold t :foreground "DeepPink1"))) - "Face used to highlight a bad PGG signature." - :group 'mh-show-faces) - -(defface mh-show-signature - '((t - (:italic t))) - "Face used to highlight the message signature." - :group 'mh-show-faces) - -(defvar mh-show-to-face 'mh-show-to - "Face used to highlight the To: header field.") -(if (boundp 'facemenu-unlisted-faces) - (add-to-list 'facemenu-unlisted-faces "^mh-show")) + "Face used to deemphasize less interesting header fields." + :group 'mh-faces + :group 'mh-show) + +(defface mh-show-pgg-bad '((t (:bold t :foreground "DeepPink1"))) + "Bad PGG signature face." + :group 'mh-faces + :group 'mh-show) + +(defface mh-show-pgg-good '((t (:bold t :foreground "LimeGreen"))) + "Good PGG signature face." + :group 'mh-faces + :group 'mh-show) + +(defface mh-show-pgg-unknown '((t (:bold t :foreground "DarkGoldenrod2"))) + "Unknown or untrusted PGG signature face." + :group 'mh-faces + :group 'mh-show) + +(defface mh-show-signature '((t (:italic t))) + "Signature face." + :group 'mh-faces + :group 'mh-show) + +(defface mh-show-subject '((t (:inherit mh-folder-subject))) + "Face used to highlight \"Subject:\" header fields." + :group 'mh-faces + :group 'mh-show) + (defface mh-show-to '((((class color) (background light)) (:foreground "SaddleBrown")) @@ -2835,43 +2739,31 @@ (((class grayscale) (background dark)) (:foreground "LightGray" :underline t)) (t (:underline t))) - "Face used to highlight the To: header field." - :group 'mh-show-faces) - -(defvar mh-show-from-face 'mh-show-from - "Face used to highlight the From: header field.") -(defface mh-show-from - '((((class color) (background light)) - (:foreground "red3")) - (((class color) (background dark)) - (:foreground "cyan")) - (t - (:bold t))) - "Face used to highlight the From: header field." - :group 'mh-show-faces) - -(defface mh-show-xface - '((t - (:foreground "black" :background "white"))) - "Face used to display the X-Face image. -The background and foreground is used in the image." - :group 'mh-show-faces) - -(defvar mh-show-subject-face 'mh-show-subject - "Face used to highlight the Subject: header field.") -(copy-face 'mh-folder-subject 'mh-show-subject) - - - -;;; Faces Used in Speedbar (:group 'mh-speed-faces) + "Face used to highlight \"To:\" header fields." + :group 'mh-faces + :group 'mh-show) + +(defface mh-show-xface '((t (:inherit (mh-show-from highlight)))) + "X-Face image face. +The background and foreground are used in the image." + :group 'mh-faces + :group 'mh-show) (defface mh-speedbar-folder '((((class color) (background light)) (:foreground "blue4")) (((class color) (background dark)) (:foreground "light blue"))) - "Face used for folders in the speedbar buffer." - :group 'mh-speed-faces) + "Basic folder face." + :group 'mh-faces + :group 'mh-speedbar) + +(defface mh-speedbar-folder-with-unseen-messages + '((t + (:inherit mh-speedbar-folder :bold t))) + "Folder face when folder contains unread messages." + :group 'mh-faces + :group 'mh-speedbar) (defface mh-speedbar-selected-folder '((((class color) (background light)) @@ -2880,20 +2772,111 @@ (:foreground "red1" :underline t)) (t (:underline t))) - "Face used for the current folder." - :group 'mh-speed-faces) - -(defface mh-speedbar-folder-with-unseen-messages - '((t - (:inherit mh-speedbar-folder :bold t))) - "Face used for folders in the speedbar buffer which have unread messages." - :group 'mh-speed-faces) + "Selected folder face." + :group 'mh-faces + :group 'mh-speedbar) (defface mh-speedbar-selected-folder-with-unseen-messages '((t (:inherit mh-speedbar-selected-folder :bold t))) - "Face used for the current folder when it has unread messages." - :group 'mh-speed-faces) + "Selected folder face when folder contains unread messages." + :group 'mh-faces + :group 'mh-speedbar) + +;;; XXX Temporary function for comparing old and new faces. Delete +;;; when everybody is happy. +(defvar bw-face-generation 'new) + +(defun bw-toggle-faces () + "Toggle between old and new faces." + (interactive) + (cond ((eq bw-face-generation 'new) + (message "Going from new to old...") + (bw-new-face-to-old) + (message "Going from new to old...done") + (setq bw-face-generation 'old)) + ((eq bw-face-generation 'old) + (message "Going from old to new...") + (bw-old-face-to-new) + (message "Going from old to new...done") + (setq bw-face-generation 'new)))) + +(defun bw-new-face-to-old () + "Sets old faces." + (face-spec-set 'mh-folder-body + (mh-defface-compat + '((((class color) (min-colors 88) (background light)) + (:foreground "RosyBrown")) + (((class color) (min-colors 88) (background dark)) + (:foreground "LightSalmon")) + (((class color)) + (:foreground "green")) + (((class grayscale) (background light)) + (:foreground "DimGray" :italic t)) + (((class grayscale) (background dark)) + (:foreground "LightGray" :italic t)) + (t + (:italic t))))) + + (face-spec-set 'mh-folder-msg-number + '((((class color) (background light)) + (:foreground "snow4")) + (((class color) (background dark)) + (:foreground "snow3")) + (t + (:bold t)))) + + (face-spec-set 'mh-folder-cur-msg-number + (mh-defface-compat + '((((class color) (min-colors 88) (background light)) + (:foreground "Purple")) + (((class color) (min-colors 88) (background dark)) + (:foreground "Cyan")) + (((class color)) + (:foreground "cyan" :weight bold)) + (((class grayscale) (background light)) + (:foreground "LightGray" :bold t)) + (((class grayscale) (background dark)) + (:foreground "DimGray" :bold t)) + (t + (:bold t))))) + + (face-spec-set 'mh-folder-date + '((((class color) (background light)) + (:foreground "snow4")) + (((class color) (background dark)) + (:foreground "snow3")) + (t + (:bold t)))) + + (face-spec-set 'mh-folder-msg-number + '((((class color) (background light)) + (:foreground "snow4")) + (((class color) (background dark)) + (:foreground "snow3")) + (t + (:bold t))))) + +(defun bw-old-face-to-new () + "Sets new faces." + (face-spec-set 'mh-folder-body + '((((class color)) + (:inherit mh-folder-msg-number)) + (t + (:inherit mh-folder-msg-number :italic t)))) + + (face-spec-set 'mh-folder-cur-msg-number + '((t + (:inherit mh-folder-msg-number :bold t)))) + + (face-spec-set 'mh-folder-date '((t (:inherit mh-folder-msg-number)))) + + (face-spec-set 'mh-folder-msg-number + '((((class color) (background light)) + (:foreground "snow4")) + (((class color) (background dark)) + (:foreground "snow3"))))) + ;; Local Variables: ;; indent-tabs-mode: nil diff -r ff74a86c2b16 -r c69d44922688 lisp/mh-e/mh-e.el --- a/lisp/mh-e/mh-e.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/mh-e/mh-e.el Tue Jan 03 02:15:28 2006 +0000 @@ -95,8 +95,9 @@ (require 'easymenu) ;; Shush the byte-compiler -(defvar font-lock-auto-fontify) -(defvar font-lock-defaults) +(eval-when-compile + (defvar font-lock-auto-fontify) + (defvar font-lock-defaults)) (defconst mh-version "7.85+cvs" "Version number of MH-E.") @@ -194,7 +195,8 @@ \"^\\\\( *[0-9]+\\\\)[^D^0-9]\". This expression includes the leading space within the parenthesis -since it looks better to highlight it as well. This regular +since it looks better to highlight it as well. The highlighting +is done with the face `mh-folder-msg-number'. This regular expression should be correct as it is needed by non-fontification functions.") @@ -209,7 +211,8 @@ \"^\\\\( *[0-9]+\\\\)D\". This expression includes the leading space within the parenthesis -since it looks better to highlight it as well. This regular +since it looks better to highlight it as well. The highlighting +is done with the face `mh-folder-deleted'. This regular expression should be correct as it is needed by non-fontification functions. See also `mh-note-deleted'.") @@ -224,7 +227,8 @@ \"^\\\\( *[0-9]+\\\\)\\\\^\". This expression includes the leading space within the parenthesis -since it looks better to highlight it as well. This regular +since it looks better to highlight it as well. The highlighting +is done with the face `mh-folder-refiled'. This regular expression should be correct as it is needed by non-fontification functions. See also `mh-note-refiled'.") @@ -246,9 +250,10 @@ This expression includes the leading space and current message marker \"+\" within the parenthesis since it looks better to -highlight these items as well. This regular expression should be -correct as it is needed by non-fontification functions. See also -`mh-note-cur'.") +highlight these items as well. The highlighting is done with the +face `mh-folder-cur-msg-number'. This regular expression should +be correct as it is needed by non-fontification functions. See +also `mh-note-cur'.") (defvar mh-scan-date-regexp "\\([0-9][0-9]/[0-9][0-9]\\)" "This regular expression matches a valid date. @@ -258,8 +263,8 @@ expects this expression to contain only one parenthesized expression which matches the date field as in the default of \"\\\\([0-9][0-9]/[0-9][0-9]\\\\)\"}. If this regular expression -is not correct, the date will not be highlighted. See also -`mh-scan-format-regexp'.") +is not correct, the date will not be highlighted with the face +`mh-folder-date'.") (defvar mh-scan-rcpt-regexp "\\(To:\\)\\(..............\\)" "This regular expression specifies the recipient in messages you sent. @@ -270,8 +275,9 @@ format file generates. The second is expected to match the recipient's name as in the default of \"\\\\(To:\\\\)\\\\(..............\\\\)\". If this regular -expression is not correct, the recipient will not be -highlighted.") +expression is not correct, the \"To:\" string will not be +highlighted with the face `mh-folder-to' and the recipient will +not be highlighted with the face `mh-folder-address'") (defvar mh-scan-body-regexp "\\(<<\\([^\n]+\\)?\\)" "This regular expression matches the message body fragment. @@ -280,7 +286,8 @@ expects this expression to contain at least one parenthesized expression which matches the body text as in the default of \"\\\\(<<\\\\([^\\n]+\\\\)?\\\\)\". If this regular expression is -not correct, the body fragment will not be highlighted.") +not correct, the body fragment will not be highlighted with the +face `mh-folder-body'.") (defvar mh-scan-subject-regexp "^ *[0-9]+........[ ]*...................\\([Rr][Ee]\\(\\[[0-9]+\\]\\)?:\\s-*\\)*\\([^<\n]*\\)" @@ -289,12 +296,13 @@ It must match from the beginning of the line. Note that the default setting of `mh-folder-font-lock-keywords' expects this expression to contain at least three parenthesized expressions. -The first is expected to match the \"Re:\" string, if any. The -second matches an optional bracketed number after \"Re:\", such as -in \"Re[2]:\" (and is thus a sub-expression of the first -expression) and the third is expected to match the subject line -itself as in the default of (broken on multiple lines for -readability): +The first is expected to match the \"Re:\" string, if any, and is +highlighted with the face `mh-folder-followup'. The second +matches an optional bracketed number after \"Re:\", such as in +\"Re[2]:\" (and is thus a sub-expression of the first expression) +and the third is expected to match the subject line itself which +is highlighted with the face `mh-folder-subject'. For example, +the default (broken on multiple lines for readability) is ^ *[0-9]+........[ ]*................... \\\\([Rr][Ee]\\\\(\\\\\\=[[0-9]+\\\\]\\\\)?:\\\\s-*\\\\)* @@ -303,22 +311,22 @@ This regular expression should be correct as it is needed by non-fontification functions.") -(defvar mh-scan-format-regexp - (concat "\\([bct]\\)" mh-scan-date-regexp " *\\(..................\\)") - "This regular expression matches the output of scan. +(defvar mh-scan-sent-to-me-sender-regexp + "^ *[0-9]+.\\([bct]\\).....[ ]*\\(..................\\)" + "This regular expression matches messages sent to us. Note that the default setting of `mh-folder-font-lock-keywords' -expects this expression to contain at least three parenthesized +expects this expression to contain at least two parenthesized expressions. The first should match the fontification hint (see -`mh-scan-format-nmh'), the second is found in -`mh-scan-date-regexp', and the third should match the user name +`mh-scan-format-nmh') and the second should match the user name as in the default of - \"(concat \"\\\\([bct]\\\\)\" mh-scan-date-regexp - \"*\\\\(..................\\\\)\")\". - -If this regular expression is not correct, the notation hints and -the sender will not be highlighted.") + ^ *[0-9]+.\\\\([bct]\\\\).....[ ]*\\\\(..................\\\\) + +If this regular expression is not correct, the notation hints +will not be highlighted with the face +`mh-mh-folder-sent-to-me-hint' and the sender will not be +highlighted with the face `mh-folder-sent-to-me-sender'.") @@ -326,31 +334,37 @@ (list ;; Folders when displaying index buffer (list "^\\+.*" - '(0 mh-index-folder-face)) + '(0 'mh-index-folder)) ;; Marked for deletion (list (concat mh-scan-deleted-msg-regexp ".*") - '(0 mh-folder-deleted-face)) + '(0 'mh-folder-deleted)) ;; Marked for refile (list (concat mh-scan-refiled-msg-regexp ".*") - '(0 mh-folder-refiled-face)) - ;;after subj - (list mh-scan-body-regexp '(1 mh-folder-body-face nil t)) + '(0 'mh-folder-refiled)) + ;; After subject + (list mh-scan-body-regexp + '(1 'mh-folder-body nil t)) + ;; Subject '(mh-folder-font-lock-subject - (1 mh-folder-followup-face append t) - (2 mh-folder-subject-face append t)) - ;;current msg + (1 'mh-folder-followup append t) + (2 'mh-folder-subject append t)) + ;; Current message number (list mh-scan-cur-msg-number-regexp - '(1 mh-folder-cur-msg-number-face)) + '(1 'mh-folder-cur-msg-number)) + ;; Message number (list mh-scan-good-msg-regexp - '(1 mh-folder-msg-number-face)) ;; Msg number - (list mh-scan-date-regexp '(1 mh-folder-date-face)) ;; Date + '(1 'mh-folder-msg-number)) + ;; Date + (list mh-scan-date-regexp + '(1 'mh-folder-date)) + ;; Messages from me (To:) (list mh-scan-rcpt-regexp - '(1 mh-folder-to-face) ;; To: - '(2 mh-folder-address-face)) ;; address - ;; scan font-lock name - (list mh-scan-format-regexp - '(1 mh-folder-date-face) - '(3 mh-folder-scan-format-face))) + '(1 'mh-folder-to) + '(2 'mh-folder-address)) + ;; Messages to me + (list mh-scan-sent-to-me-sender-regexp + '(1 'mh-folder-sent-to-me-hint) + '(2 'mh-folder-sent-to-me-sender))) "Keywords (regular expressions) used to fontify the MH-Folder buffer.") (defvar mh-scan-cmd-note-width 1 diff -r ff74a86c2b16 -r c69d44922688 lisp/mh-e/mh-init.el --- a/lisp/mh-e/mh-init.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/mh-e/mh-init.el Tue Jan 03 02:15:28 2006 +0000 @@ -1,6 +1,6 @@ ;;; mh-init.el --- MH-E initialization -;; Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. +;; Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. ;; Author: Peter S. Galbraith ;; Maintainer: Bill Wohler @@ -334,7 +334,7 @@ (defun mh-defface-compat (spec) "Convert SPEC for defface if necessary to run on older platforms. -See `defface' for the spec definition. +Modifies SPEC in place and returns it. See `defface' for the spec definition. When `mh-min-colors-defined-flag' is nil, this function finds a display with a single \"class\" requirement with a \"color\" @@ -351,7 +351,8 @@ (loop for entry in spec do (when (not (eq (car entry) t)) (if (assoc 'min-colors (car entry)) - (delq (assoc 'min-colors (car entry)) (car entry))))))) + (delq (assoc 'min-colors (car entry)) (car entry)))))) + spec) (provide 'mh-init) diff -r ff74a86c2b16 -r c69d44922688 lisp/mh-e/mh-mime.el --- a/lisp/mh-e/mh-mime.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/mh-e/mh-mime.el Tue Jan 03 02:15:28 2006 +0000 @@ -1407,14 +1407,15 @@ (defun mh-mime-security-button-face (info) "Return the button face to use for encrypted/signed mail based on INFO." (cond ((string-match "OK" info) ;Decrypted mail - mh-show-pgg-good-face) + 'mh-show-pgg-good) ((string-match "Failed" info) ;Decryption failed or signature invalid - mh-show-pgg-bad-face) + 'mh-show-pgg-bad) ((string-match "Undecided" info);Unprocessed mail - mh-show-pgg-unknown-face) + 'mh-show-pgg-unknown) ((string-match "Untrusted" info);Key not trusted - mh-show-pgg-unknown-face) - (t mh-show-pgg-good-face))) + 'mh-show-pgg-unknown) + (t + 'mh-show-pgg-good))) (defun mh-mime-security-press-button (handle) "Callback from security button for part HANDLE." diff -r ff74a86c2b16 -r c69d44922688 lisp/mh-e/mh-utils.el --- a/lisp/mh-e/mh-utils.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/mh-e/mh-utils.el Tue Jan 03 02:15:28 2006 +0000 @@ -402,18 +402,30 @@ (eval-and-compile ;; Otherwise byte-compilation fails on `mh-show-font-lock-keywords-with-cite' (defvar mh-show-font-lock-keywords - '(("^\\(From:\\|Sender:\\)\\(.*\\)" (1 'default) (2 mh-show-from-face)) - (mh-header-to-font-lock (0 'default) (1 mh-show-to-face)) - (mh-header-cc-font-lock (0 'default) (1 mh-show-cc-face)) + '(("^\\(From:\\|Sender:\\)\\(.*\\)" + (1 'default) + (2 'mh-show-from)) + (mh-header-to-font-lock + (0 'default) + (1 'mh-show-to)) + (mh-header-cc-font-lock + (0 'default) + (1 'mh-show-cc)) ("^\\(Reply-To:\\|Return-Path:\\)\\(.*\\)$" - (1 'default) (2 mh-show-from-face)) - (mh-header-subject-font-lock (0 'default) (1 mh-show-subject-face)) + (1 'default) + (2 'mh-show-from)) + (mh-header-subject-font-lock + (0 'default) + (1 'mh-show-subject)) ("^\\(Apparently-To:\\|Newsgroups:\\)\\(.*\\)" - (1 'default) (2 mh-show-cc-face)) + (1 'default) + (2 'mh-show-cc)) ("^\\(In-reply-to\\|Date\\):\\(.*\\)$" - (1 'default) (2 mh-show-date-face)) - (mh-letter-header-font-lock (0 mh-show-header-face append t))) - "Additional expressions to highlight in MH-show mode.")) + (1 'default) + (2 'mh-show-date)) + (mh-letter-header-font-lock + (0 'mh-show-header append t))) + "Additional expressions to highlight in MH-Show buffers.")) (defvar mh-show-font-lock-keywords-with-cite (eval-when-compile @@ -432,11 +444,13 @@ (beginning-of-line) (end-of-line) (2 font-lock-constant-face nil t) (4 font-lock-comment-face nil t))))))) - "Additional expressions to highlight in MH-show mode.") + "Additional expressions to highlight in MH-Show buffers.") (defvar mh-letter-font-lock-keywords `(,@mh-show-font-lock-keywords-with-cite - (mh-font-lock-field-data (1 'mh-letter-header-field prepend t)))) + (mh-font-lock-field-data + (1 'mh-letter-header-field prepend t))) + "Additional expressions to highlight in MH-Letter buffers.") (defun mh-show-font-lock-fontify-region (beg end loudly) "Limit font-lock in `mh-show-mode' to the header. @@ -1229,6 +1243,32 @@ (mh-do-in-xemacs (defvar default-enable-multibyte-characters)) +(defmacro mh-face-foreground-compat (face &optional frame inherit) + "Return the foreground color name of FACE, or nil if unspecified. +See documentation for `face-foreground' for a description of the +arguments FACE, FRAME, and INHERIT. + +Calls `face-foreground' correctly in older environments. Versions +of Emacs prior to version 22 lacked an INHERIT argument which +when t tells `face-foreground' to consider an inherited value for +the foreground if the face does not define one itself." + (if (>= emacs-major-version 22) + `(face-foreground ,face ,frame ,inherit) + `(face-foreground ,face ,frame))) + +(defmacro mh-face-background-compat (face &optional frame inherit) + "Return the background color name of face, or nil if unspecified. +See documentation for `back-foreground' for a description of the +arguments FACE, FRAME, and INHERIT. + +Calls `face-background' correctly in older environments. Versions +of Emacs prior to version 22 lacked an INHERIT argument which +when t tells `face-background' to consider an inherited value for +the background if the face does not define one itself." + (if (>= emacs-major-version 22) + `(face-background ,face ,frame ,inherit) + `(face-background ,face ,frame))) + (defun mh-face-display-function () "Display a Face, X-Face, or X-Image-URL header field. If more than one of these are present, then the first one found @@ -1259,9 +1299,11 @@ (mh-funcall-if-exists insert-image (create-image raw type t - :foreground (face-foreground 'mh-show-xface) - :background (face-background 'mh-show-xface)) - " "))) + :foreground + (mh-face-foreground-compat 'mh-show-xface nil t) + :background + (mh-face-background-compat 'mh-show-xface nil t)) + " "))) ;; XEmacs (mh-do-in-xemacs (cond diff -r ff74a86c2b16 -r c69d44922688 lisp/mouse.el --- a/lisp/mouse.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/mouse.el Tue Jan 03 02:15:28 2006 +0000 @@ -355,14 +355,21 @@ (defun mouse-drag-window-above (window) "Return the (or a) window directly above WINDOW. That means one whose bottom edge is at the same height as WINDOW's top edge." - (let ((top (nth 1 (window-edges window))) + (let ((start-top (nth 1 (window-edges window))) + (start-left (nth 0 (window-edges window))) + (start-right (nth 2 (window-edges window))) (start-window window) above-window) (setq window (previous-window window 0)) (while (and (not above-window) (not (eq window start-window))) - (if (= (+ (window-height window) (nth 1 (window-edges window))) - top) - (setq above-window window)) + (let ((left (nth 0 (window-edges window))) + (right (nth 2 (window-edges window)))) + (when (and (= (+ (window-height window) (nth 1 (window-edges window))) + start-top) + (or (and (<= left start-left) (<= start-right right)) + (and (<= start-left left) (<= left start-right)) + (and (<= start-left right) (<= right start-right)))) + (setq above-window window))) (setq window (previous-window window))) above-window)) @@ -1025,7 +1032,11 @@ (select-window original-window) (if (or (vectorp on-link) (stringp on-link)) (setq event (aref on-link 0)) - (setcar event 'mouse-2))) + (setcar event 'mouse-2) + ;; If this mouse click has never been done by + ;; the user, it doesn't have the necessary + ;; property to be interpreted correctly. + (put 'mouse-2 'event-kind 'mouse-click))) (push event unread-command-events)))) ;; Case where the end-event is not a cons cell (it's just a boring diff -r ff74a86c2b16 -r c69d44922688 lisp/net/goto-addr.el --- a/lisp/net/goto-addr.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/net/goto-addr.el Tue Jan 03 02:15:28 2006 +0000 @@ -129,7 +129,7 @@ 'goto-address-at-point) (define-key m (kbd "C-c RET") 'goto-address-at-point) m) - "keymap to hold goto-addr's mouse key defs under highlighted URLs.") + "Keymap to hold goto-addr's mouse key defs under highlighted URLs.") (defcustom goto-address-url-face 'bold "Face to use for URLs." @@ -242,7 +242,8 @@ "Sets up goto-address functionality in the current buffer. Allows user to use mouse/keyboard command to click to go to a URL or to send e-mail. -By default, goto-address binds to mouse-2 and C-c RET. +By default, goto-address binds `goto-address-at-point' to mouse-2 and C-c RET +only on URLs and e-mail addresses. Also fontifies the buffer appropriately (see `goto-address-fontify-p' and `goto-address-highlight-p' for more information)." diff -r ff74a86c2b16 -r c69d44922688 lisp/net/webjump.el --- a/lisp/net/webjump.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/net/webjump.el Tue Jan 03 02:15:28 2006 +0000 @@ -72,104 +72,184 @@ (defvar webjump-sample-sites '( - ;; FSF, not including Emacs-specific. ("GNU Project FTP Archive" . + ;; GNU FTP Mirror List from http://www.gnu.org/order/ftp.html [mirrors "ftp://ftp.gnu.org/pub/gnu/" - ;; ASIA: - "ftp://ftp.cs.titech.ac.jp" - "ftp://tron.um.u-tokyo.ac.jp/pub/GNU/prep" - "ftp://cair-archive.kaist.ac.kr/pub/gnu" - "ftp://ftp.nectec.or.th/pub/mirrors/gnu" - ;; AUSTRALIA: - "ftp://archie.au/gnu" - "ftp://archie.oz/gnu" - "ftp://archie.oz.au/gnu" - ;; AFRICA: - "ftp://ftp.sun.ac.za/pub/gnu" - ;; MIDDLE-EAST: - "ftp://ftp.technion.ac.il/pub/unsupported/gnu" - ;; EUROPE: - "ftp://irisa.irisa.fr/pub/gnu" - "ftp://ftp.univ-lyon1.fr/pub/gnu" - "ftp://ftp.mcc.ac.uk" - "ftp://unix.hensa.ac.uk/mirrors/uunet/systems/gnu" - "ftp://src.doc.ic.ac.uk/gnu" - "ftp://ftp.ieunet.ie/pub/gnu" - "ftp://ftp.eunet.ch" - "ftp://nic.switch.ch/mirror/gnu" - "ftp://ftp.informatik.rwth-aachen.de/pub/gnu" - "ftp://ftp.informatik.tu-muenchen.de" + ;; United States + "ftp://mirrors.kernel.org/gnu" + "ftp://gatekeeper.dec.com/pub/GNU/" + "ftp://ftp.keystealth.org/pub/gnu/" + "ftp://mirrors.usc.edu/pub/gnu/" + "ftp://cudlug.cudenver.edu/pub/mirrors/ftp.gnu.org/" + "ftp://ftp.cise.ufl.edu/pub/mirrors/GNU/" + "ftp://uiarchive.cso.uiuc.edu/pub/ftp/ftp.gnu.org/gnu/" + "ftp://gnu.cs.lewisu.edu/gnu/" + "ftp://ftp.in-span.net/pub/mirrors/ftp.gnu.org/" + "ftp://gnu.ms.uky.edu/pub/mirrors/gnu/" + "ftp://ftp.algx.net/pub/gnu/" + "ftp://aeneas.mit.edu/pub/gnu/" + "ftp://ftp.egr.msu.edu/pub/gnu/" + "ftp://ftp.wayne.edu/pub/gnu/" + "ftp://wuarchive.wustl.edu/mirrors/gnu/" + "ftp://gnu.teleglobe.net/ftp.gnu.org/" + "ftp://ftp.cs.columbia.edu/archives/gnu/prep/" + "ftp://ftp.ece.cornell.edu/pub/mirrors/gnu/" + "ftp://ftp.ibiblio.org/pub/mirrors/gnu/" + "ftp://ftp.cis.ohio-state.edu/mirror/gnu/" + "ftp://ftp.club.cc.cmu.edu/gnu/" + "ftp://ftp.sunsite.utk.edu/pub/gnu/ftp/" + "ftp://thales.memphis.edu/pub/gnu/" + "ftp://gnu.wwc.edu" + "ftp://ftp.twtelecom.net/pub/GNU/" + ;; Africa + "ftp://ftp.sun.ac.za/mirrorsites/ftp.gnu.org" + ;; The Americas + "ftp://ftp.unicamp.br/pub/gnu/" + "ftp://master.softaplic.com.br/pub/gnu/" + "ftp://ftp.matrix.com.br/pub/gnu/" + "ftp://ftp.pucpr.br/gnu" + "ftp://ftp.linorg.usp.br/gnu" + "ftp://ftp.cs.ubc.ca/mirror2/gnu/" + "ftp://cs.ubishops.ca/pub/ftp.gnu.org/" + "ftp://ftp.inf.utfsm.cl/pub/gnu/" + "ftp://sunsite.ulatina.ac.cr/Mirrors/GNU/" + "ftp://www.gnu.unam.mx/pub/gnu/software/" + "ftp://gnu.cem.itesm.mx/pub/mirrors/gnu.org/" + "ftp://ftp.azc.uam.mx/mirrors/gnu/" + ;; Australia + "ftp://mirror.aarnet.edu.au/pub/gnu/" + "ftp://gnu.mirror.pacific.net.au/gnu/" + ;; Asia + "ftp://ftp.cs.cuhk.edu.hk/pub/gnu/gnu/" + "ftp://sunsite.ust.hk/pub/gnu/" + "ftp://ftp.gnupilgrims.org/pub/gnu" + "ftp://www.imtech.res.in/mirror/gnuftp/" + "ftp://kambing.vlsm.org/gnu" + "ftp://ftp.cs.huji.ac.il/mirror/GNU/" + "ftp://tron.um.u-tokyo.ac.jp/pub/GNU/" + "ftp://core.ring.gr.jp/pub/GNU/" + "ftp://ftp.ring.gr.jp/pub/GNU/" + "ftp://mirrors.hbi.co.jp/gnu/" + "ftp://ftp.cs.titech.ac.jp/pub/gnu/" + "ftp://ftpmirror.hanyang.ac.kr/GNU/" + "ftp://ftp.linux.sarang.net/mirror/gnu/gnu/" + "ftp://ftp.xgate.co.kr/pub/mirror/gnu/" + "ftp://ftp://gnu.xinicks.com/" + "ftp://ftp.isu.net.sa/pub/gnu/" + "ftp://ftp.nctu.edu.tw/UNIX/gnu/" + "ftp://coda.nctu.edu.tw/UNIX/gnu/" + "ftp://ftp1.sinica.edu.tw/pub3/GNU/gnu/" + "ftp://gnu.cdpa.nsysu.edu.tw/gnu" + "ftp://ftp.nectec.or.th/pub/mirrors/gnu/" + ;; Europe + "ftp://ftp.gnu.vbs.at/" + "ftp://ftp.univie.ac.at/packages/gnu/" + "ftp://gd.tuwien.ac.at/gnu/gnusrc/" + "ftp://ftp.belnet.be/mirror/ftp.gnu.org/" + "ftp://gnu.blic.net/pub/gnu/" + "ftp://ftp.fi.muni.cz/pub/gnu/" + "ftp://ftp.dkuug.dk/pub/gnu/" + "ftp://sunsite.dk/mirrors/gnu" + "ftp://ftp.funet.fi/pub/gnu/prep/" + "ftp://ftp.irisa.fr/pub/gnu/" + "ftp://ftp.cs.univ-paris8.fr/mirrors/ftp.gnu.org/" + "ftp://ftp.cs.tu-berlin.de/pub/gnu/" + "ftp://ftp.leo.org/pub/comp/os/unix/gnu/" + "ftp://ftp.informatik.rwth-aachen.de/pub/gnu/" + "ftp://ftp.de.uu.net/pub/gnu/" + "ftp://ftp.freenet.de/pub/ftp.gnu.org/gnu/" + "ftp://ftp.cs.uni-bonn.de/pub/gnu/" + "ftp://ftp-stud.fht-esslingen.de/pub/Mirrors/ftp.gnu.org/" + "ftp://ftp.stw-bonn.de/pub/mirror/ftp.gnu.org/" + "ftp://ftp.math.uni-bremen.de/pub/gnu" + "ftp://ftp.forthnet.gr/pub/gnu/" + "ftp://ftp.ntua.gr/pub/gnu/" + "ftp://ftp.duth.gr/pub/gnu/" + "ftp://ftp.physics.auth.gr/pub/gnu/" + "ftp://ftp.esat.net/pub/gnu/" + "ftp://ftp.heanet.ie/mirrors/ftp.gnu.org" + "ftp://ftp.lugroma2.org/pub/gnu/" + "ftp://ftp.gnu.inetcosmos.org/pub/gnu/" + "ftp://ftp.digitaltrust.it/pub/gnu" + "ftp://ftp://rm.mirror.garr.it/mirrors/gnuftp" + "ftp://ftp.nluug.nl/pub/gnu/" + "ftp://ftp.mirror.nl/pub/mirror/gnu/" + "ftp://ftp.nl.uu.net/pub/gnu/" + "ftp://mirror.widexs.nl/pub/gnu/" + "ftp://ftp.easynet.nl/mirror/GNU/" "ftp://ftp.win.tue.nl/pub/gnu" - "ftp://ftp.nl.net" - "ftp://ftp.etsimo.uniovi.es/pub/gnu" - "ftp://ftp.funet.fi/pub/gnu" - "ftp://ftp.denet.dk" - "ftp://ftp.stacken.kth.se" - "ftp://isy.liu.se" - "ftp://ftp.luth.se/pub/unix/gnu" - "ftp://ftp.sunet.se/pub/gnu" - "ftp://archive.eu.net" - ;; SOUTH AMERICA: - "ftp://ftp.inf.utfsm.cl/pub/gnu" - "ftp://ftp.unicamp.br/pub/gnu" - ;; WESTERN CANADA: - "ftp://ftp.cs.ubc.ca/mirror2/gnu" - ;; USA: - "ftp://wuarchive.wustl.edu/systems/gnu" - "ftp://labrea.stanford.edu" - "ftp://ftp.digex.net/pub/gnu" - "ftp://ftp.kpc.com/pub/mirror/gnu" - "ftp://f.ms.uky.edu/pub3/gnu" - "ftp://jaguar.utah.edu/gnustuff" - "ftp://ftp.hawaii.edu/mirrors/gnu" - "ftp://uiarchive.cso.uiuc.edu/pub/gnu" - "ftp://ftp.cs.columbia.edu/archives/gnu/prep" - "ftp://gatekeeper.dec.com/pub/GNU" - "ftp://ftp.uu.net/systems/gnu"]) + "ftp://gnu.mirror.vuurwerk.net/pub/GNU/" + "ftp://gnu.kookel.org/pub/ftp.gnu.org/" + "ftp://ftp.uninett.no/pub/gnu/" + "ftp://ftp.task.gda.pl/pub/gnu/" + "ftp://sunsite.icm.edu.pl/pub/gnu/" + "ftp://ftp.man.poznan.pl/pub/gnu" + "ftp://ftp.ist.utl.pt/pub/GNU/gnu/" + "ftp://ftp.telepac.pt/pub/gnu/" + "ftp://ftp.timisoara.roedu.net/mirrors/ftp.gnu.org/pub/gnu" + "ftp://ftp.chg.ru/pub/gnu/" + "ftp://gnuftp.axitel.ru/" + "ftp://ftp.arnes.si/software/gnu/" + "ftp://ftp.etsimo.uniovi.es/pub/gnu/" + "ftp://ftp.rediris.es/pub/gnu/" + "ftp://ftp.chl.chalmers.se/pub/gnu/" + "ftp://ftp.isy.liu.se/pub/gnu/" + "ftp://ftp.luth.se/pub/unix/gnu/" + "ftp://ftp.stacken.kth.se/pub/gnu/" + "ftp://ftp.sunet.se/pub/gnu/" + "ftp://sunsite.cnlab-switch.ch/mirror/gnu/" + "ftp://ftp.ulak.net.tr/gnu/" + "ftp://ftp.gnu.org.ua" + "ftp://ftp.mcc.ac.uk/pub/gnu/" + "ftp://ftp.mirror.ac.uk/sites/ftp.gnu.org/gnu/" + "ftp://ftp.warwick.ac.uk/pub/gnu/" + "ftp://ftp.hands.com/ftp.gnu.org/" + "ftp://gnu.teleglobe.net/ftp.gnu.org/"]) ("GNU Project Home Page" . "www.gnu.org") ;; Emacs. - ("Emacs Lisp Archive" . - "ftp://ftp.emacs.org/pub/") + ("Emacs Home Page" . + "www.gnu.org/software/emacs/emacs.html") + ("Savannah Emacs page" . + "savannah.gnu.org/projects/emacs") + ("Emacs Lisp List" . + "www.damtp.cam.ac.uk/user/eglen/emacs/ell.html") + ("Emacs Wiki" . + [simple-query "www.emacswiki.org" + "www.emacswiki.org/cgi-bin/wiki/" ""]) ;; Internet search engines. - ("AltaVista" . - [simple-query - "www.altavista.digital.com" - "www.altavista.digital.com/cgi-bin/query?pg=aq&what=web&fmt=.&q=" - "&r=&d0=&d1="]) - ("Archie" . - [simple-query "hoohoo.ncsa.uiuc.edu/cgi-bin/AA.pl" - "hoohoo.ncsa.uiuc.edu/cgi-bin/AA.pl?query=" ""]) - ("Lycos" . - [simple-query "www.lycos.com" - "www.lycos.com/cgi-bin/pursuit?cat=lycos&query=" ""]) + ("Google" . + [simple-query "www.google.com" + "www.google.com/search?q=" ""]) + ("Google Groups" . + [simple-query "groups.google.com" + "groups.google.com/groups?q=" ""]) ("Yahoo" . - [simple-query "www.yahoo.com" "search.yahoo.com/bin/search?p=" ""]) + [simple-query "www.yahoo.com" "search.yahoo.com/search?p=" ""]) + ("Yahoo: Reference" . "www.yahoo.com/Reference/") ;; Misc. general interest. ("Interactive Weather Information Network" . webjump-to-iwin) ("Usenet FAQs" . - [simple-query "www.cis.ohio-state.edu/hypertext/faq/usenet/FAQ-List.html" - "www.cis.ohio-state.edu/htbin/search-usenet-faqs/form?find=" - ""]) + "www.faqs.org/faqs/") ("RTFM Usenet FAQs by Group" . "ftp://rtfm.mit.edu/pub/usenet-by-group/") ("RTFM Usenet FAQs by Hierachy" . "ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/") ("X Consortium Archive" . "ftp.x.org") - ("Yahoo: Reference" . "www.yahoo.com/Reference/") ;; Computer social issues, privacy, professionalism. ("Association for Computing Machinery" . "www.acm.org") - ("Computer Professionals for Social Responsibility" . "www.cpsr.org/dox/") + ("Computer Professionals for Social Responsibility" . "www.cpsr.org") ("Electronic Frontier Foundation" . "www.eff.org") ("IEEE Computer Society" . "www.computer.org") ("Risks Digest" . webjump-to-risks) - ;; Fun. - ("Bastard Operator from Hell" . "www.replay.com/bofh/") + ;; More. + ("Supplemental Web site list for webjump" . + "www.neilvandyke.org/webjump/") ) "Sample hotlist for WebJump. See the documentation for the `webjump' diff -r ff74a86c2b16 -r c69d44922688 lisp/paren.el --- a/lisp/paren.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/paren.el Tue Jan 03 02:15:28 2006 +0000 @@ -72,8 +72,8 @@ :group 'paren-showing :version "20.3") -(defgroup paren-showing-faces () - "Group for faces of Show Paren mode" +(defgroup paren-showing-faces nil + "Group for faces of Show Paren mode." :group 'paren-showing :group 'faces :version "22.1") @@ -88,7 +88,7 @@ (t :background "gray")) "Show Paren mode face used for a matching paren." - :group 'show-paren-faces) + :group 'paren-showing-faces) ;; backward-compatibility alias (put 'show-paren-match-face 'face-alias 'show-paren-match) @@ -96,7 +96,7 @@ '((((class color)) (:foreground "white" :background "purple")) (t (:inverse-video t))) "Show Paren mode face used for a mismatching paren." - :group 'show-paren-faces) + :group 'paren-showing-faces) ;; backward-compatibility alias (put 'show-paren-mismatch-face 'face-alias 'show-paren-mismatch) diff -r ff74a86c2b16 -r c69d44922688 lisp/progmodes/cc-defs.el --- a/lisp/progmodes/cc-defs.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/progmodes/cc-defs.el Tue Jan 03 02:15:28 2006 +0000 @@ -72,7 +72,9 @@ (eval-after-load "font-lock" '(if (and (not (featurep 'cc-fix)) ; only load the file once. (let (font-lock-keywords) - (font-lock-compile-keywords '("\\<\\>")) + (condition-case nil + (font-lock-compile-keywords '("\\<\\>")) + (error nil)) font-lock-keywords)) ; did the previous call foul this up? (load "cc-fix"))) @@ -83,7 +85,9 @@ (progn (require 'font-lock) (let (font-lock-keywords) - (font-lock-compile-keywords '("\\<\\>")) + (condition-case nil + (font-lock-compile-keywords '("\\<\\>")) + (error nil)) font-lock-keywords))) (cc-load "cc-fix"))) diff -r ff74a86c2b16 -r c69d44922688 lisp/progmodes/delphi.el --- a/lisp/progmodes/delphi.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/progmodes/delphi.el Tue Jan 03 02:15:28 2006 +0000 @@ -177,7 +177,7 @@ (defcustom delphi-other-face nil "*Face used to color everything else." - :type '(choice face (const nil)) + :type '(choice (const :tag "None" nil) face) :group 'delphi) (defconst delphi-directives diff -r ff74a86c2b16 -r c69d44922688 lisp/progmodes/flymake.el --- a/lisp/progmodes/flymake.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/progmodes/flymake.el Tue Jan 03 02:15:28 2006 +0000 @@ -516,15 +516,11 @@ (defun flymake-copy-buffer-to-temp-buffer (buffer) "Copy contents of BUFFER into newly created temp buffer." - (let ((contents nil) - (temp-buffer nil)) - (with-current-buffer buffer - (setq contents (buffer-string)) - - (setq temp-buffer (get-buffer-create (generate-new-buffer-name (concat "flymake:" (buffer-name buffer))))) - (set-buffer temp-buffer) - (insert contents)) - temp-buffer)) + (with-current-buffer + (get-buffer-create (generate-new-buffer-name + (concat "flymake:" (buffer-name buffer)))) + (insert-buffer-substring buffer) + (current-buffer))) (defun flymake-check-include (source-file-name inc-path inc-name include-dirs) "Check if SOURCE-FILE-NAME can be found in include path. @@ -613,7 +609,8 @@ (flymake-log 3 "received %d byte(s) of output from process %d" (length output) pid) (when source-buffer - (flymake-parse-output-and-residual source-buffer output)))) + (with-current-buffer source-buffer + (flymake-parse-output-and-residual output))))) (defun flymake-process-sentinel (process event) "Sentinel for syntax check buffers." @@ -636,8 +633,8 @@ (when source-buffer (with-current-buffer source-buffer - (flymake-parse-residual source-buffer) - (flymake-post-syntax-check source-buffer exit-status command) + (flymake-parse-residual) + (flymake-post-syntax-check exit-status command) (setq flymake-is-running nil)))) (error (let ((err-str (format "Error in process sentinel for buffer %s: %s" @@ -646,60 +643,51 @@ (with-current-buffer source-buffer (setq flymake-is-running nil)))))))) -(defun flymake-post-syntax-check (source-buffer exit-status command) - (with-current-buffer source-buffer - (setq flymake-err-info flymake-new-err-info) - (setq flymake-new-err-info nil) - (setq flymake-err-info - (flymake-fix-line-numbers - flymake-err-info 1 (flymake-count-lines source-buffer)))) - (flymake-delete-own-overlays source-buffer) - (flymake-highlight-err-lines - source-buffer (with-current-buffer source-buffer flymake-err-info)) +(defun flymake-post-syntax-check (exit-status command) + (setq flymake-err-info flymake-new-err-info) + (setq flymake-new-err-info nil) + (setq flymake-err-info + (flymake-fix-line-numbers + flymake-err-info 1 (flymake-count-lines))) + (flymake-delete-own-overlays) + (flymake-highlight-err-lines flymake-err-info) (let (err-count warn-count) - (with-current-buffer source-buffer - (setq err-count (flymake-get-err-count flymake-err-info "e")) - (setq warn-count (flymake-get-err-count flymake-err-info "w")) - (flymake-log 2 "%s: %d error(s), %d warning(s) in %.2f second(s)" - (buffer-name source-buffer) err-count warn-count + (setq err-count (flymake-get-err-count flymake-err-info "e")) + (setq warn-count (flymake-get-err-count flymake-err-info "w")) + (flymake-log 2 "%s: %d error(s), %d warning(s) in %.2f second(s)" + (buffer-name) err-count warn-count (- (flymake-float-time) flymake-check-start-time)) - (setq flymake-check-start-time nil)) + (setq flymake-check-start-time nil) (if (and (equal 0 err-count) (equal 0 warn-count)) (if (equal 0 exit-status) - (flymake-report-status source-buffer "" "") ; PASSED - (if (not (with-current-buffer source-buffer - flymake-check-was-interrupted)) - (flymake-report-fatal-status (current-buffer) "CFGERR" + (flymake-report-status "" "") ; PASSED + (if (not flymake-check-was-interrupted) + (flymake-report-fatal-status "CFGERR" (format "Configuration error has occured while running %s" command)) - (flymake-report-status source-buffer nil ""))) ; "STOPPED" - (flymake-report-status source-buffer (format "%d/%d" err-count warn-count) "")))) + (flymake-report-status nil ""))) ; "STOPPED" + (flymake-report-status (format "%d/%d" err-count warn-count) "")))) -(defun flymake-parse-output-and-residual (source-buffer output) +(defun flymake-parse-output-and-residual (output) "Split OUTPUT into lines, merge in residual if necessary." - (with-current-buffer source-buffer - (let* ((buffer-residual flymake-output-residual) - (total-output (if buffer-residual (concat buffer-residual output) output)) - (lines-and-residual (flymake-split-output total-output)) - (lines (nth 0 lines-and-residual)) - (new-residual (nth 1 lines-and-residual))) - (with-current-buffer source-buffer - (setq flymake-output-residual new-residual) - (setq flymake-new-err-info - (flymake-parse-err-lines - flymake-new-err-info - source-buffer lines)))))) + (let* ((buffer-residual flymake-output-residual) + (total-output (if buffer-residual (concat buffer-residual output) output)) + (lines-and-residual (flymake-split-output total-output)) + (lines (nth 0 lines-and-residual)) + (new-residual (nth 1 lines-and-residual))) + (setq flymake-output-residual new-residual) + (setq flymake-new-err-info + (flymake-parse-err-lines + flymake-new-err-info lines)))) -(defun flymake-parse-residual (source-buffer) +(defun flymake-parse-residual () "Parse residual if it's non empty." - (with-current-buffer source-buffer - (when flymake-output-residual - (setq flymake-new-err-info - (flymake-parse-err-lines - flymake-new-err-info - source-buffer - (list flymake-output-residual))) - (setq flymake-output-residual nil)))) + (when flymake-output-residual + (setq flymake-new-err-info + (flymake-parse-err-lines + flymake-new-err-info + (list flymake-output-residual))) + (setq flymake-output-residual nil))) (defvar flymake-err-info nil "Sorted list of line numbers and lists of err info in the form (file, err-text).") @@ -803,16 +791,11 @@ (setq count (1- count)))) err-info-list) -(defun flymake-highlight-err-lines (buffer err-info-list) +(defun flymake-highlight-err-lines (err-info-list) "Highlight error lines in BUFFER using info from ERR-INFO-LIST." - (with-current-buffer buffer - (save-excursion - (let* ((idx 0) - (count (length err-info-list))) - (while (< idx count) - (flymake-highlight-line (car (nth idx err-info-list)) - (nth 1 (nth idx err-info-list))) - (setq idx (1+ idx))))))) + (save-excursion + (dolist (err err-info-list) + (flymake-highlight-line (car err) (nth 1 err))))) (defun flymake-overlay-p (ov) "Determine whether overlay OV was created by flymake." @@ -831,16 +814,13 @@ ov) (flymake-log 3 "created an overlay at (%d-%d)" beg end))) -(defun flymake-delete-own-overlays (buffer) +(defun flymake-delete-own-overlays () "Delete all flymake overlays in BUFFER." - (with-current-buffer buffer - (let ((ov (overlays-in (point-min) (point-max)))) - (while (consp ov) - (when (flymake-overlay-p (car ov)) - (delete-overlay (car ov)) - ;;+(flymake-log 3 "deleted overlay %s" ov) - ) - (setq ov (cdr ov)))))) + (dolist (ol (overlays-in (point-min) (point-max))) + (when (flymake-overlay-p ol) + (delete-overlay ol) + ;;+(flymake-log 3 "deleted overlay %s" ol) + ))) (defun flymake-region-has-flymake-overlays (beg end) "Check if region specified by BEG and END has overlay. @@ -905,19 +885,19 @@ (flymake-make-overlay beg end tooltip-text face nil))) -(defun flymake-parse-err-lines (err-info-list source-buffer lines) +(defun flymake-parse-err-lines (err-info-list lines) "Parse err LINES, store info in ERR-INFO-LIST." (let* ((count (length lines)) (idx 0) (line-err-info nil) (real-file-name nil) - (source-file-name (buffer-file-name source-buffer)) + (source-file-name buffer-file-name) (get-real-file-name-f (flymake-get-real-file-name-function source-file-name))) (while (< idx count) (setq line-err-info (flymake-parse-line (nth idx lines))) (when line-err-info - (setq real-file-name (funcall get-real-file-name-f source-buffer (flymake-ler-get-file line-err-info))) + (setq real-file-name (funcall get-real-file-name-f (current-buffer) (flymake-ler-get-file line-err-info))) (setq line-err-info (flymake-ler-set-full-file line-err-info real-file-name)) (if (flymake-same-files real-file-name source-file-name) @@ -1147,9 +1127,9 @@ (let* ((include-dirs (append '(".") (flymake-get-project-include-dirs base-dir) (flymake-get-system-include-dirs)))) include-dirs)) -(defun flymake-restore-formatting (source-buffer) - "Remove any formatting made by flymake." - ) +;; (defun flymake-restore-formatting () +;; "Remove any formatting made by flymake." +;; ) (defun flymake-get-program-dir (buffer) "Get dir to start program in." @@ -1176,38 +1156,36 @@ :group 'flymake :type 'boolean) -(defun flymake-start-syntax-check (buffer) - "Start syntax checking for buffer BUFFER." - (unless (bufferp buffer) - (error "Expected a buffer")) - (with-current-buffer buffer - (flymake-log 3 "flymake is running: %s" flymake-is-running) - (when (and (not flymake-is-running) - (flymake-can-syntax-check-file (buffer-file-name buffer))) - (when (or (not flymake-compilation-prevents-syntax-check) - (not (flymake-compilation-is-running))) ;+ (flymake-rep-ort-status buffer "COMP") - (flymake-clear-buildfile-cache) - (flymake-clear-project-include-dirs-cache) +(defun flymake-start-syntax-check () + "Start syntax checking for current buffer." + (interactive) + (flymake-log 3 "flymake is running: %s" flymake-is-running) + (when (and (not flymake-is-running) + (flymake-can-syntax-check-file buffer-file-name)) + (when (or (not flymake-compilation-prevents-syntax-check) + (not (flymake-compilation-is-running))) ;+ (flymake-rep-ort-status buffer "COMP") + (flymake-clear-buildfile-cache) + (flymake-clear-project-include-dirs-cache) - (setq flymake-check-was-interrupted nil) - (setq flymake-buffer-data (flymake-makehash 'equal)) + (setq flymake-check-was-interrupted nil) + (setq flymake-buffer-data (flymake-makehash 'equal)) - (let* ((source-file-name (buffer-file-name buffer)) - (init-f (flymake-get-init-function source-file-name)) - (cleanup-f (flymake-get-cleanup-function source-file-name)) - (cmd-and-args (funcall init-f buffer)) - (cmd (nth 0 cmd-and-args)) - (args (nth 1 cmd-and-args)) - (dir (nth 2 cmd-and-args))) - (if (not cmd-and-args) - (progn - (flymake-log 0 "init function %s for %s failed, cleaning up" init-f source-file-name) - (funcall cleanup-f buffer)) - (progn - (setq flymake-last-change-time nil) - (flymake-start-syntax-check-process buffer cmd args dir)))))))) + (let* ((source-file-name buffer-file-name) + (init-f (flymake-get-init-function source-file-name)) + (cleanup-f (flymake-get-cleanup-function source-file-name)) + (cmd-and-args (funcall init-f (current-buffer))) + (cmd (nth 0 cmd-and-args)) + (args (nth 1 cmd-and-args)) + (dir (nth 2 cmd-and-args))) + (if (not cmd-and-args) + (progn + (flymake-log 0 "init function %s for %s failed, cleaning up" init-f source-file-name) + (funcall cleanup-f (current-buffer))) + (progn + (setq flymake-last-change-time nil) + (flymake-start-syntax-check-process cmd args dir))))))) -(defun flymake-start-syntax-check-process (buffer cmd args dir) +(defun flymake-start-syntax-check-process (cmd args dir) "Start syntax check process." (let* ((process nil)) (condition-case err @@ -1219,25 +1197,24 @@ (set-process-sentinel process 'flymake-process-sentinel) (set-process-filter process 'flymake-process-filter) - (flymake-reg-names (process-id process) (buffer-name buffer)) + (flymake-reg-names (process-id process) (buffer-name)) - (with-current-buffer buffer - (setq flymake-is-running t) - (setq flymake-last-change-time nil) - (setq flymake-check-start-time (flymake-float-time))) + (setq flymake-is-running t) + (setq flymake-last-change-time nil) + (setq flymake-check-start-time (flymake-float-time)) - (flymake-report-status buffer nil "*") + (flymake-report-status nil "*") (flymake-log 2 "started process %d, command=%s, dir=%s" (process-id process) (process-command process) default-directory) process) (error (let* ((err-str (format "Failed to launch syntax check process '%s' with args %s: %s" cmd args (error-message-string err))) - (source-file-name (buffer-file-name buffer)) + (source-file-name buffer-file-name) (cleanup-f (flymake-get-cleanup-function source-file-name))) (flymake-log 0 err-str) - (funcall cleanup-f buffer) - (flymake-report-fatal-status buffer "PROCERR" err-str)))))) + (funcall cleanup-f (current-buffer)) + (flymake-report-fatal-status "PROCERR" err-str)))))) (defun flymake-kill-process (pid &optional rest) "Kill process PID." @@ -1304,12 +1281,7 @@ (setq flymake-last-change-time nil) (flymake-log 3 "starting syntax check as more than 1 second passed since last change") - (flymake-start-syntax-check buffer))))) - -(defun flymake-start-syntax-check-for-current-buffer () - "Run `flymake-start-syntax-check' for current buffer if it isn't already running." - (interactive) - (flymake-start-syntax-check (current-buffer))) + (flymake-start-syntax-check))))) (defun flymake-current-line-no () "Return number of current line in current buffer." @@ -1318,10 +1290,9 @@ (end (if (= (point) (point-max)) (point) (1+ (point))))) (count-lines beg end))) -(defun flymake-count-lines (buffer) +(defun flymake-count-lines () "Return number of lines in buffer BUFFER." - (with-current-buffer buffer - (count-lines (point-min) (point-max)))) + (count-lines (point-min) (point-max))) (defun flymake-get-point-pixel-pos () "Return point position in pixels: (x, y)." @@ -1346,7 +1317,6 @@ (line-err-info-list (nth 0 (flymake-find-err-info flymake-err-info line-no))) (menu-data (flymake-make-err-menu-data line-no line-err-info-list)) (choice nil) - (mouse-pos (flymake-get-point-pixel-pos)) (menu-pos (list (flymake-get-point-pixel-pos) (selected-window)))) (if menu-data (progn @@ -1402,20 +1372,18 @@ (make-variable-buffer-local 'flymake-mode-line-status) -(defun flymake-report-status (buffer e-w &optional status) +(defun flymake-report-status (e-w &optional status) "Show status in mode line." - (when (bufferp buffer) - (with-current-buffer buffer - (when e-w - (setq flymake-mode-line-e-w e-w)) - (when status - (setq flymake-mode-line-status status)) - (let* ((mode-line " Flymake")) - (when (> (length flymake-mode-line-e-w) 0) - (setq mode-line (concat mode-line ":" flymake-mode-line-e-w))) - (setq mode-line (concat mode-line flymake-mode-line-status)) - (setq flymake-mode-line mode-line) - (force-mode-line-update))))) + (when e-w + (setq flymake-mode-line-e-w e-w)) + (when status + (setq flymake-mode-line-status status)) + (let* ((mode-line " Flymake")) + (when (> (length flymake-mode-line-e-w) 0) + (setq mode-line (concat mode-line ":" flymake-mode-line-e-w))) + (setq mode-line (concat mode-line flymake-mode-line-status)) + (setq flymake-mode-line mode-line) + (force-mode-line-update))) (defun flymake-display-warning (warning) "Display a warning to user." @@ -1426,15 +1394,14 @@ :group 'flymake :type 'boolean) -(defun flymake-report-fatal-status (buffer status warning) +(defun flymake-report-fatal-status (status warning) "Display a warning and switch flymake mode off." (when flymake-gui-warnings-enabled (flymake-display-warning (format "Flymake: %s. Flymake will be switched OFF" warning)) ) - (with-current-buffer buffer - (flymake-mode 0) - (flymake-log 0 "switched OFF Flymake mode for buffer %s due to fatal status %s, warning %s" - (buffer-name buffer) status warning))) + (flymake-mode 0) + (flymake-log 0 "switched OFF Flymake mode for buffer %s due to fatal status %s, warning %s" + (buffer-name) status warning)) (defcustom flymake-start-syntax-check-on-find-file t "Start syntax check on find file." @@ -1458,13 +1425,13 @@ (add-hook 'kill-buffer-hook 'flymake-kill-buffer-hook nil t) ;;+(add-hook 'find-file-hook 'flymake-find-file-hook) - (flymake-report-status (current-buffer) "" "") + (flymake-report-status "" "") (setq flymake-timer (run-at-time nil 1 'flymake-on-timer-event (current-buffer))) (when flymake-start-syntax-check-on-find-file - (flymake-start-syntax-check-for-current-buffer)))) + (flymake-start-syntax-check)))) ;; Turning the mode OFF. (t @@ -1473,7 +1440,7 @@ (remove-hook 'kill-buffer-hook 'flymake-kill-buffer-hook t) ;;+(remove-hook 'find-file-hook (function flymake-find-file-hook) t) - (flymake-delete-own-overlays (current-buffer)) + (flymake-delete-own-overlays) (when flymake-timer (cancel-timer flymake-timer) @@ -1504,14 +1471,14 @@ (let((new-text (buffer-substring start stop))) (when (and flymake-start-syntax-check-on-newline (equal new-text "\n")) (flymake-log 3 "starting syntax check as new-line has been seen") - (flymake-start-syntax-check-for-current-buffer)) + (flymake-start-syntax-check)) (setq flymake-last-change-time (flymake-float-time)))) (defun flymake-after-save-hook () (if (local-variable-p 'flymake-mode (current-buffer)) ; (???) other way to determine whether flymake is active in buffer being saved? (progn (flymake-log 3 "starting syntax check as buffer was saved") - (flymake-start-syntax-check-for-current-buffer)))) ; no more mode 3. cannot start check if mode 3 (to temp copies) is active - (???) + (flymake-start-syntax-check)))) ; no more mode 3. cannot start check if mode 3 (to temp copies) is active - (???) (defun flymake-kill-buffer-hook () (when flymake-timer @@ -1521,7 +1488,7 @@ (defun flymake-find-file-hook () ;;+(when flymake-start-syntax-check-on-find-file ;;+ (flymake-log 3 "starting syntax check on file open") - ;;+ (flymake-start-syntax-check-for-current-buffer) + ;;+ (flymake-start-syntax-check) ;;+) (when (and (not (local-variable-p 'flymake-mode (current-buffer))) (flymake-can-syntax-check-file buffer-file-name)) @@ -1728,7 +1695,8 @@ (if (not buildfile-dir) (progn (flymake-log 1 "no buildfile (%s) for %s" buildfile-name source-file-name) - (flymake-report-fatal-status buffer "NOMK" (format "No buildfile (%s) found for %s" buildfile-name source-file-name)) + (with-current-buffer buffer + (flymake-report-fatal-status "NOMK" (format "No buildfile (%s) found for %s" buildfile-name source-file-name))) ) (progn (flymake-set-buffer-value buffer "base-dir" buildfile-dir))) @@ -1748,7 +1716,9 @@ (if (not master-and-temp-master) (progn (flymake-log 1 "cannot find master file for %s" source-file-name) - (flymake-report-status buffer "!" "") ; NOMASTER + (when (bufferp buffer) + (with-current-buffer buffer + (flymake-report-status "!" ""))) ; NOMASTER ) (progn (setq master-file-name (nth 0 master-and-temp-master)) diff -r ff74a86c2b16 -r c69d44922688 lisp/progmodes/glasses.el --- a/lisp/progmodes/glasses.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/progmodes/glasses.el Tue Jan 03 02:15:28 2006 +0000 @@ -82,7 +82,7 @@ `glasses-face' to `bold'. Then unreadable identifiers will have no separators, but will have their capitals in bold." :group 'glasses - :type '(choice face (const nil)) + :type '(choice (const :tag "None" nil) face) :set 'glasses-custom-set :initialize 'custom-initialize-default) diff -r ff74a86c2b16 -r c69d44922688 lisp/progmodes/gud.el --- a/lisp/progmodes/gud.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/progmodes/gud.el Tue Jan 03 02:15:28 2006 +0000 @@ -2735,6 +2735,7 @@ (window (and buffer (or (get-buffer-window buffer) (display-buffer buffer)))) (pos)) + (message "%s %s" (current-buffer) buffer) (if buffer (progn (with-current-buffer buffer @@ -2750,7 +2751,15 @@ (setq pos (point)) (or gud-overlay-arrow-position (setq gud-overlay-arrow-position (make-marker))) - (set-marker gud-overlay-arrow-position (point) (current-buffer))) + (set-marker gud-overlay-arrow-position (point) (current-buffer)) + ;; If they turned on hl-line, move the hl-line highlight to + ;; the arrow's line. + (when (featurep 'hl-line) + (cond + (global-hl-line-mode + (global-hl-line-highlight)) + ((and hl-line-mode hl-line-sticky-flag) + (hl-line-highlight))))) (cond ((or (< pos (point-min)) (> pos (point-max))) (widen) (goto-char pos)))) diff -r ff74a86c2b16 -r c69d44922688 lisp/subr.el --- a/lisp/subr.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/subr.el Tue Jan 03 02:15:28 2006 +0000 @@ -42,17 +42,15 @@ (defalias 'not 'null) (defmacro noreturn (form) - "Evaluates FORM, with the expectation that the evaluation will signal an error -instead of returning to its caller. If FORM does return, an error is -signaled." + "Evaluate FORM, expecting it not to return. +If FORM does return, signal an error." `(prog1 ,form (error "Form marked with `noreturn' did return"))) (defmacro 1value (form) - "Evaluates FORM, with the expectation that the same value will be returned -from all evaluations of FORM. This is the global do-nothing -version of `1value'. There is also `testcover-1value' that -complains if FORM ever does return differing values." + "Evaluate FORM, expecting a constant return value. +This is the global do-nothing version. There is also `testcover-1value' +that complains if FORM ever does return differing values." form) (defmacro lambda (&rest cdr) @@ -1686,7 +1684,7 @@ (when (and (consp elt) (not (eq elt (last pending-undo-list)))) (error "Undoing to some unrelated state")) ;; Undo it all. - (while pending-undo-list (undo-more 1)) + (while (listp pending-undo-list) (undo-more 1)) ;; Reset the modified cons cell ELT to its original content. (when (consp elt) (setcar elt old-car) diff -r ff74a86c2b16 -r c69d44922688 lisp/textmodes/bibtex.el --- a/lisp/textmodes/bibtex.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/textmodes/bibtex.el Tue Jan 03 02:15:28 2006 +0000 @@ -853,7 +853,7 @@ :group 'bibtex :type 'boolean) -;; `bibtex-font-lock-keywords' is a user option as well, but since the +;; `bibtex-font-lock-keywords' is a user option, too. But since the ;; patterns used to define this variable are defined in a later ;; section of this file, it is defined later. @@ -1091,7 +1091,7 @@ "Regexp matching the name of a BibTeX field.") (defconst bibtex-name-part - (concat ",[ \t\n]*\\(" bibtex-field-name "\\)[ \t\n]*=") + (concat ",[ \t\n]*\\(" bibtex-field-name "\\)") "Regexp matching the name part of a BibTeX field.") (defconst bibtex-reference-key "[][[:alnum:].:;?!`'/*@+|()<>&_^$-]+" @@ -1105,16 +1105,6 @@ (regexp-opt (mapcar 'car bibtex-entry-field-alist)) "\\)") "Regexp matching the name of a BibTeX entry.") -(defvar bibtex-entry-type-whitespace - (concat "[ \t]*" bibtex-entry-type) - "Regexp matching the name of a BibTeX entry preceded by whitespace.") - -(defvar bibtex-entry-type-str - (concat "@[ \t]*\\(?:" - (regexp-opt (append '("String") - (mapcar 'car bibtex-entry-field-alist))) "\\)") - "Regexp matching the name of a BibTeX entry (including @String).") - (defvar bibtex-entry-head (concat "^[ \t]*\\(" bibtex-entry-type @@ -1132,15 +1122,18 @@ bibtex-reference-key "\\)?") "Regexp matching the header line of any BibTeX entry (possibly without key).") +(defvar bibtex-any-valid-entry-type + (concat "^[ \t]*@[ \t]*\\(?:" + (regexp-opt (append '("String" "Preamble") + (mapcar 'car bibtex-entry-field-alist))) "\\)") + "Regexp matching any valid BibTeX entry (including String and Preamble).") + (defconst bibtex-type-in-head 1 "Regexp subexpression number of the type part in `bibtex-entry-head'.") (defconst bibtex-key-in-head 2 "Regexp subexpression number of the key part in `bibtex-entry-head'.") -(defconst bibtex-empty-field-re "\\`\\(\"\"\\|{}\\)\\'" - "Regexp matching the text part (as a string) of an empty field.") - (defconst bibtex-string-type "^[ \t]*\\(@[ \t]*String\\)[ \t]*[({][ \t\n]*" "Regexp matching the name of a BibTeX String entry.") @@ -1148,8 +1141,9 @@ (concat bibtex-string-type "\\(" bibtex-reference-key "\\)?") "Regexp matching the header line of a BibTeX String entry.") -(defconst bibtex-preamble-prefix "[ \t]*@[ \t]*Preamble[ \t]*" - "Regexp matching the prefix part of a preamble.") +(defconst bibtex-preamble-prefix + "[ \t]*\\(@[ \t]*Preamble\\)[ \t]*[({][ \t\n]*" + "Regexp matching the prefix part of a BibTeX Preamble entry.") (defconst bibtex-font-lock-syntactic-keywords `((,(concat "^[ \t]*\\(" (substring bibtex-comment-start 0 1) "\\)" @@ -1229,12 +1223,9 @@ part and end position of the match. Move point to end of field name. If `bibtex-autoadd-commas' is non-nil add missing comma at end of preceding BibTeX field as necessary." - (cond ((looking-at ",[ \t\n]*") - (let ((start (point))) - (goto-char (match-end 0)) - (when (looking-at bibtex-field-name) - (goto-char (match-end 0)) - (list start (match-beginning 0) (match-end 0))))) + (cond ((looking-at bibtex-name-part) + (goto-char (match-end 0)) + (list (match-beginning 0) (match-beginning 1) (match-end 0))) ;; Maybe add a missing comma. ((and bibtex-autoadd-commas (looking-at (concat "[ \t\n]*\\(?:" bibtex-field-name @@ -1334,60 +1325,71 @@ "Search forward to find a BibTeX field of name NAME. If a syntactically correct field is found, return a pair containing the boundaries of the name and text parts of the field. The search -is limited by optional arg BOUND or if nil by the end of the current -entry. Do not move point." +is limited by optional arg BOUND. If BOUND is t the search is limited +by the end of the current entry. Do not move point." (save-match-data (save-excursion - (if bound - ;; If the search is bounded we need not worry we could overshoot. - ;; This is indeed the case when `bibtex-search-forward-field' is - ;; called many times. So we optimize this part of this function. - (let ((name-part (concat ",[ \t\n]*\\(" name "\\)[ \t\n]*=[ \t\n]*")) - (case-fold-search t) left right) - (while (and (not right) - (re-search-forward name-part bound t)) - (setq left (list (match-beginning 0) (match-beginning 1) - (match-end 1)) - ;; Don't worry that the field text could be past bound. - right (bibtex-parse-field-text))) - (if right (cons left right))) - (let ((regexp (concat bibtex-name-part "\\|" - bibtex-any-entry-maybe-empty-head)) - (case-fold-search t) bounds) - (catch 'done - (if (looking-at "[ \t]*@") (goto-char (match-end 0))) - (while (and (not bounds) - (re-search-forward regexp nil t)) - (if (match-beginning 2) - ;; We found a new entry - (throw 'done nil) - ;; We found a field - (goto-char (match-beginning 0)) - (setq bounds (bibtex-parse-field)))) - ;; Step through all fields so that we cannot overshoot. - (while bounds - (goto-char (bibtex-start-of-name-in-field bounds)) - (if (looking-at name) (throw 'done bounds)) - (goto-char (bibtex-end-of-field bounds)) - (setq bounds (bibtex-parse-field))))))))) + (if (eq bound t) + (let ((regexp (concat bibtex-name-part "[ \t\n]*=\\|" + bibtex-any-entry-maybe-empty-head)) + (case-fold-search t) bounds) + (catch 'done + (if (looking-at "[ \t]*@") (goto-char (match-end 0))) + (while (and (not bounds) + (re-search-forward regexp nil t)) + (if (match-beginning 2) + ;; We found a new entry + (throw 'done nil) + ;; We found a field + (goto-char (match-beginning 0)) + (setq bounds (bibtex-parse-field)))) + ;; Step through all fields so that we cannot overshoot. + (while bounds + (goto-char (bibtex-start-of-name-in-field bounds)) + (if (looking-at name) (throw 'done bounds)) + (goto-char (bibtex-end-of-field bounds)) + (setq bounds (bibtex-parse-field))))) + ;; Bounded search or bound is nil (i.e. we cannot overshoot). + ;; Indeed, the search is bounded when `bibtex-search-forward-field' + ;; is called many times. So we optimize this part of this function. + (let ((name-part (concat ",[ \t\n]*\\(" name "\\)[ \t\n]*=[ \t\n]*")) + (case-fold-search t) left right) + (while (and (not right) + (re-search-forward name-part bound t)) + (setq left (list (match-beginning 0) (match-beginning 1) + (match-end 1)) + ;; Don't worry that the field text could be past bound. + right (bibtex-parse-field-text))) + (if right (cons left right))))))) (defun bibtex-search-backward-field (name &optional bound) "Search backward to find a BibTeX field of name NAME. If a syntactically correct field is found, return a pair containing the boundaries of the name and text parts of the field. The search -is limited by the optional arg BOUND. If BOUND is nil the search is +is limited by the optional arg BOUND. If BOUND is t the search is limited by the beginning of the current entry. Do not move point." (save-match-data - (save-excursion - (let ((name-part (concat ",[ \t\n]*\\(?:" name "\\)[ \t\n]*=")) - (case-fold-search t) - bounds) - (unless bound (setq bound (save-excursion (bibtex-beginning-of-entry)))) - (while (and (not bounds) - (search-backward "," bound t) - (looking-at name-part)) - (setq bounds (bibtex-parse-field))) - bounds)))) + (if (eq bound t) + (setq bound (save-excursion (bibtex-beginning-of-entry)))) + (let ((name-part (concat ",[ \t\n]*\\(" name "\\)[ \t\n]*=[ \t\n]*")) + (case-fold-search t) left right) + (save-excursion + ;; the parsing functions are not designed for parsing backwards :-( + (when (search-backward "," bound t) + (or (save-excursion + (when (looking-at name-part) + (setq left (list (match-beginning 0) (match-beginning 1) + (match-end 1))) + (goto-char (match-end 0)) + (setq right (bibtex-parse-field-text)))) + (while (and (not right) + (re-search-backward name-part bound t)) + (setq left (list (match-beginning 0) (match-beginning 1) + (match-end 1))) + (save-excursion + (goto-char (match-end 0)) + (setq right (bibtex-parse-field-text))))) + (if right (cons left right))))))) (defun bibtex-name-in-field (bounds &optional remove-opt-alt) "Get content of name in BibTeX field defined via BOUNDS. @@ -1407,25 +1409,22 @@ If `bibtex-expand-strings' is non-nil, also expand BibTeX strings." (if content (save-excursion + (goto-char (bibtex-start-of-text-in-field bounds)) (let ((epoint (bibtex-end-of-text-in-field bounds)) - content opoint temp) - (goto-char (bibtex-start-of-text-in-field bounds)) + content opoint) (while (< (setq opoint (point)) epoint) - (cond ((looking-at bibtex-field-const) - (let ((mtch (match-string-no-properties 0))) - (goto-char (match-end 0)) - (setq temp (if bibtex-expand-strings - (cdr (assoc-string mtch (bibtex-strings) t))) - content (concat content (or temp mtch))))) - - ((setq temp (bibtex-parse-field-string)) - (setq content (concat content (buffer-substring-no-properties - (1+ (car temp)) - (1- (cdr temp))))) - (goto-char (cdr temp))) - (t (error "Malformed text field"))) + (if (looking-at bibtex-field-const) + (let ((mtch (match-string-no-properties 0))) + (push (or (if bibtex-expand-strings + (cdr (assoc-string mtch (bibtex-strings) t))) + mtch) content) + (goto-char (match-end 0))) + (let ((bounds (bibtex-parse-field-string))) + (push (buffer-substring-no-properties + (1+ (car bounds)) (1- (cdr bounds))) content) + (goto-char (cdr bounds)))) (re-search-forward "\\=[ \t\n]*#[ \t\n]*" nil t)) - content)) + (apply 'concat (nreverse content)))) (buffer-substring-no-properties (bibtex-start-of-text-in-field bounds) (bibtex-end-of-text-in-field bounds)))) @@ -1434,19 +1433,15 @@ Return nil if not found. If optional arg FOLLOW-CROSSREF is non-nil, follow crossref." (save-excursion - (save-restriction - ;; We want to jump back and forth while searching FIELD - (bibtex-narrow-to-entry) - (goto-char (point-min)) - (let ((bounds (bibtex-search-forward-field field (point-max))) - crossref-field) - (cond (bounds (bibtex-text-in-field-bounds bounds t)) - ((and follow-crossref - (progn (goto-char (point-min)) - (setq bounds (bibtex-search-forward-field - "\\(OPT\\)?crossref" (point-max))))) - (setq crossref-field (bibtex-text-in-field-bounds bounds t)) - (widen) + (let* ((end (if follow-crossref (bibtex-end-of-entry) t)) + (beg (bibtex-beginning-of-entry)) ; move point + (bounds (bibtex-search-forward-field field end))) + (cond (bounds (bibtex-text-in-field-bounds bounds t)) + ((and follow-crossref + (progn (goto-char beg) + (setq bounds (bibtex-search-forward-field + "\\(OPT\\)?crossref" end)))) + (let ((crossref-field (bibtex-text-in-field-bounds bounds t))) (if (bibtex-find-crossref crossref-field) ;; Do not pass FOLLOW-CROSSREF because we want ;; to follow crossrefs only one level of recursion. @@ -1487,42 +1482,28 @@ (nth 1 bounds) (match-end 0)))))) -(defun bibtex-parse-string () +(defun bibtex-parse-string (&optional empty-key) "Parse a BibTeX string entry beginning at the position of point. If a syntactically correct entry is found, return a cons pair containing the boundaries of the reference key and text parts of the entry. -Do not move point." - (bibtex-parse-association 'bibtex-parse-string-prefix - 'bibtex-parse-string-postfix)) - -(defun bibtex-search-forward-string () +If EMPTY-KEY is non-nil, key may be empty. Do not move point." + (let ((bibtex-string-empty-key empty-key)) + (bibtex-parse-association 'bibtex-parse-string-prefix + 'bibtex-parse-string-postfix))) + +(defun bibtex-search-forward-string (&optional empty-key) "Search forward to find a BibTeX string entry. If a syntactically correct entry is found, a pair containing the boundaries of -the reference key and text parts of the string is returned. Do not move point." +the reference key and text parts of the string is returned. +If EMPTY-KEY is non-nil, key may be empty. Do not move point." (save-excursion (save-match-data - (let ((case-fold-search t) - boundaries) - (while (and (not boundaries) + (let ((case-fold-search t) bounds) + (while (and (not bounds) (search-forward-regexp bibtex-string-type nil t)) - (goto-char (match-beginning 0)) - (unless (setq boundaries (bibtex-parse-string)) - (forward-char 1))) - boundaries)))) - -(defun bibtex-search-backward-string () - "Search backward to find a BibTeX string entry. -If a syntactically correct entry is found, a pair containing the boundaries of -the reference key and text parts of the field is returned. Do not move point." - (save-excursion - (save-match-data - (let ((case-fold-search t) - boundaries) - (while (and (not boundaries) - (search-backward-regexp bibtex-string-type nil t)) - (goto-char (match-beginning 0)) - (setq boundaries (bibtex-parse-string))) - boundaries)))) + (save-excursion (goto-char (match-beginning 0)) + (setq bounds (bibtex-parse-string empty-key)))) + bounds)))) (defun bibtex-reference-key-in-string (bounds) "Return the key part of a BibTeX string defined via BOUNDS" @@ -1554,14 +1535,15 @@ (or (match-string-no-properties bibtex-key-in-head) empty)) -(defun bibtex-preamble-prefix (&optional delim) - "Parse the prefix part of a BibTeX Preamble. -Point must be at beginning of prefix part. If prefix is found move point -to its end and return position of point. If optional arg DELIM is non-nil, -move past the opening delimiter. If no preamble is found return nil." +(defun bibtex-parse-preamble () + "Parse BibTeX preamble. +Point must be at beginning of preamble. Do not move point." (let ((case-fold-search t)) - (re-search-forward (concat "\\=" bibtex-preamble-prefix - (if delim "[({][ \t\n]*")) nil t))) + (when (looking-at bibtex-preamble-prefix) + (let ((start (match-beginning 0)) (pref-start (match-beginning 1)) + (bounds (save-excursion (goto-char (match-end 0)) + (bibtex-parse-string-postfix)))) + (if bounds (cons (list start pref-start) bounds)))))) ;; Helper Functions @@ -1579,6 +1561,35 @@ (+ (count-lines 1 (point)) (if (bolp) 1 0))) +(defun bibtex-valid-entry (&optional empty-key) + "Parse a valid BibTeX entry (maybe without key if EMPTY-KEY is t). +A valid entry is a syntactical correct one with type contained in +`bibtex-entry-field-alist'. Ignore @String and @Preamble entries. +Return a cons pair with buffer positions of beginning and end of entry +if a valid entry is found, nil otherwise. Do not move point. +After a call to this function `match-data' corresponds to the header +of the entry, see regexp `bibtex-entry-head'." + (let ((case-fold-search t) end) + (if (looking-at (if empty-key bibtex-entry-maybe-empty-head + bibtex-entry-head)) + (save-excursion + (save-match-data + (goto-char (match-end 0)) + (let ((entry-closer + (if (save-excursion + (goto-char (match-end bibtex-type-in-head)) + (looking-at "[ \t]*(")) + ",?[ \t\n]*)" ;; entry opened with `(' + ",?[ \t\n]*}")) ;; entry opened with `{' + bounds) + (skip-chars-forward " \t\n") + ;; loop over all BibTeX fields + (while (setq bounds (bibtex-parse-field)) + (goto-char (bibtex-end-of-field bounds))) + ;; This matches the infix* part. + (if (looking-at entry-closer) (setq end (match-end 0))))) + (if end (cons (match-beginning 0) end)))))) + (defun bibtex-skip-to-valid-entry (&optional backward) "Move point to beginning of the next valid BibTeX entry. Do not move if we are already at beginning of a valid BibTeX entry. @@ -1590,32 +1601,27 @@ entry is found, nil otherwise." (interactive "P") (let ((case-fold-search t) - found) + found bounds) (beginning-of-line) ;; Loop till we look at a valid entry. (while (not (or found (if backward (bobp) (eobp)))) - (let ((pnt (point)) - bounds) - (cond ((or (and (looking-at bibtex-entry-type-whitespace) - (setq found (bibtex-search-entry nil nil t)) - (equal (match-beginning 0) pnt)) - (and (not bibtex-sort-ignore-string-entries) - (setq bounds (bibtex-parse-string)) - (setq found (cons (bibtex-start-of-field bounds) - (bibtex-end-of-string bounds))))) - (goto-char pnt)) - (backward (re-search-backward "^[ \t]*@" nil 'move)) - (t (re-search-forward "\\=[ \t]*@" nil t) ;; don't be stuck - (if (re-search-forward "^[ \t]*@" nil 'move) - (goto-char (match-beginning 0))))))) + (cond ((setq found (or (bibtex-valid-entry) + (and (not bibtex-sort-ignore-string-entries) + (setq bounds (bibtex-parse-string)) + (cons (bibtex-start-of-field bounds) + (bibtex-end-of-string bounds)))))) + (backward (re-search-backward "^[ \t]*@" nil 'move)) + (t (if (re-search-forward "\n\\([ \t]*@\\)" nil 'move) + (goto-char (match-beginning 1)))))) found)) (defun bibtex-map-entries (fun) "Call FUN for each BibTeX entry in buffer (possibly narrowed). FUN is called with three arguments, the key of the entry and the buffer -positions (marker) of beginning and end of entry. Point is inside the entry. -If `bibtex-sort-ignore-string-entries' is non-nil, FUN is not called for -@String entries." +positions of beginning and end of entry. Also, point is at beginning of +entry and `match-data' corresponds to the header of the entry, +see regexp `bibtex-entry-head'. If `bibtex-sort-ignore-string-entries' +is non-nil, FUN is not called for @String entries." (let ((case-fold-search t) found) (save-excursion @@ -1673,75 +1679,19 @@ "}" ")")) -(defun bibtex-search-entry (empty-head &optional bound noerror backward) - "Search for a BibTeX entry (maybe without reference key if EMPTY-HEAD is t). -BOUND and NOERROR are exactly as in `re-search-forward'. If BACKWARD -is non-nil, search in reverse direction. Move point past the closing -delimiter (at the beginning of entry if BACKWARD is non-nil). -Return a cons pair with buffer positions of beginning and end of entry. -After a call to this function `match-data' corresponds to the head part -of the entry, see regexp `bibtex-entry-head'. -Ignore @String and @Preamble entries." - (let ((pnt (point)) - (entry-head-re (if empty-head - bibtex-entry-maybe-empty-head - bibtex-entry-head))) - (if backward - (let (found) - (while (and (not found) - (re-search-backward entry-head-re bound noerror)) - (setq found (bibtex-search-entry empty-head pnt t))) - (cond (found - (goto-char (match-beginning 0)) - found) - ((not noerror) ;; yell - (error "Backward search of BibTeX entry failed")) - (t (if (eq noerror t) (goto-char pnt)) ;; don't move - nil))) - (let (found) - (unless bound (setq bound (point-max))) - (while (and (not found) - (re-search-forward entry-head-re bound noerror)) - (save-match-data - (let ((entry-closer - (if (save-excursion - (goto-char (match-end bibtex-type-in-head)) - (looking-at "[ \t]*(")) - ",?[ \t\n]*)" ;; entry opened with `(' - ",?[ \t\n]*}")) ;; entry opened with `{' - bounds) - (skip-chars-forward " \t\n" bound) - ;; loop over all BibTeX fields - (while (and (setq bounds (bibtex-parse-field)) - (<= (bibtex-end-of-field bounds) bound)) - (goto-char (bibtex-end-of-field bounds))) - ;; This matches the infix* part. - (when (and (looking-at entry-closer) - (<= (match-end 0) bound)) - (goto-char (match-end 0)) - (setq found t))))) - (cond (found - (cons (match-beginning 0) (point))) - ((not noerror) ;; yell - (error "Search of BibTeX entry failed")) - (t (if (eq noerror t) (goto-char pnt)) ;; don't move - nil)))))) - -(defun bibtex-flash-head () +(defun bibtex-flash-head (prompt) "Flash at BibTeX entry head before point, if exists." (let ((case-fold-search t) - (pnt (point)) - flash) + (pnt (point))) (save-excursion (bibtex-beginning-of-entry) (when (and (looking-at bibtex-any-entry-maybe-empty-head) (< (point) pnt)) (goto-char (match-beginning bibtex-type-in-head)) - (setq flash (match-end bibtex-key-in-head)) (if (pos-visible-in-window-p (point)) (sit-for 1) - (message "From: %s" - (buffer-substring (point) flash))))))) + (message "%s%s" prompt (buffer-substring-no-properties + (point) (match-end bibtex-key-in-head)))))))) (defun bibtex-make-optional-field (field) "Make an optional field named FIELD in current BibTeX entry." @@ -1772,66 +1722,55 @@ (bibtex-skip-to-valid-entry) (point)) -(defun bibtex-inside-field () - "Try to avoid point being at end of a BibTeX field." - (end-of-line) - (skip-chars-backward " \t") - (if (= (preceding-char) ?,) - (forward-char -2)) - (if (or (= (preceding-char) ?}) - (= (preceding-char) ?\")) - (forward-char -1))) - -(defun bibtex-enclosing-field (&optional noerr) +(defun bibtex-enclosing-field (&optional comma noerr) "Search for BibTeX field enclosing point. +For `bibtex-mode''s internal algorithms, a field begins at the comma +following the preceding field. Usually, this is not what the user expects. +Thus if COMMA is non-nil, the \"current field\" includes the terminating comma. Unless NOERR is non-nil, signal an error if no enclosing field is found. On success return bounds, nil otherwise. Do not move point." - (let ((bounds (bibtex-search-backward-field bibtex-field-name))) - (if (and bounds - (<= (bibtex-start-of-field bounds) (point)) - (>= (bibtex-end-of-field bounds) (point))) - bounds - (unless noerr - (error "Can't find enclosing BibTeX field"))))) - -(defun bibtex-enclosing-entry-maybe-empty-head () - "Search for BibTeX entry enclosing point. Move point to end of entry. -Beginning (but not end) of entry is given by (`match-beginning' 0)." - (let ((case-fold-search t) - (old-point (point))) - (unless (re-search-backward bibtex-entry-maybe-empty-head nil t) - (goto-char old-point) - (error "Can't find beginning of enclosing BibTeX entry")) - (goto-char (match-beginning bibtex-type-in-head)) - (unless (bibtex-search-entry t nil t) - (goto-char old-point) - (error "Can't find end of enclosing BibTeX entry")))) - -(defun bibtex-insert-kill (n) - "Reinsert the Nth stretch of killed BibTeX text." - (if (not bibtex-last-kill-command) - (error "BibTeX kill ring is empty") - (let* ((kr (if (eq bibtex-last-kill-command 'field) - 'bibtex-field-kill-ring - 'bibtex-entry-kill-ring)) - (kryp (if (eq bibtex-last-kill-command 'field) - 'bibtex-field-kill-ring-yank-pointer - 'bibtex-entry-kill-ring-yank-pointer)) - (current (car (set kryp (nthcdr (mod (- n (length (eval kryp))) - (length (eval kr))) - (eval kr)))))) - (if (eq bibtex-last-kill-command 'field) - (progn - (bibtex-find-text) - (if (looking-at "[}\"]") - (forward-char)) - (set-mark (point)) - (message "Mark set") - (bibtex-make-field current t)) - (unless (eobp) (bibtex-beginning-of-entry)) - (set-mark (point)) - (message "Mark set") - (insert current))))) + (save-excursion + (when comma + (end-of-line) + (skip-chars-backward " \t") + (if (= (preceding-char) ?,) (forward-char -1))) + + (let ((bounds (bibtex-search-backward-field bibtex-field-name t))) + (cond ((and bounds + (<= (bibtex-start-of-field bounds) (point)) + (>= (bibtex-end-of-field bounds) (point))) + bounds) + ((not noerr) + (error "Can't find enclosing BibTeX field")))))) + +(defun bibtex-beginning-first-field (&optional beg) + "Move point to beginning of first field. +Optional arg BEG is beginning of entry." + (if beg (goto-char beg) (bibtex-beginning-of-entry)) + (looking-at bibtex-any-entry-maybe-empty-head) + (goto-char (match-end 0))) + +(defun bibtex-insert-kill (n &optional comma) + "Reinsert the Nth stretch of killed BibTeX text (field or entry). +Optional arg COMMA is as in `bibtex-enclosing-field'." + (unless bibtex-last-kill-command (error "BibTeX kill ring is empty")) + (let ((fun (lambda (kryp kr) ;; adapted from `current-kill' + (car (set kryp (nthcdr (mod (- n (length (eval kryp))) + (length kr)) kr)))))) + (if (eq bibtex-last-kill-command 'field) + (progn + ;; insert past the current field + (goto-char (bibtex-end-of-field (bibtex-enclosing-field comma))) + (set-mark (point)) + (message "Mark set") + (bibtex-make-field (funcall fun 'bibtex-field-kill-ring-yank-pointer + bibtex-field-kill-ring) t)) + ;; insert past the current entry + (bibtex-skip-to-valid-entry) + (set-mark (point)) + (message "Mark set") + (insert (funcall fun 'bibtex-entry-kill-ring-yank-pointer + bibtex-entry-kill-ring))))) (defun bibtex-format-entry () "Helper function for `bibtex-clean-entry'. @@ -1900,9 +1839,8 @@ (error "All alternatives are empty")) ;; process all fields - (goto-char (point-min)) - (while (setq bounds (bibtex-search-forward-field - bibtex-field-name (point-max))) + (bibtex-beginning-first-field (point-min)) + (while (setq bounds (bibtex-parse-field)) (let* ((beg-field (copy-marker (bibtex-start-of-field bounds))) (end-field (copy-marker (bibtex-end-of-field bounds) t)) (beg-name (copy-marker (bibtex-start-of-name-in-field bounds))) @@ -2040,10 +1978,6 @@ (error "Alternative fields `%s' are defined %s times" altlist found)))))) - ;; update point - (if (looking-at (bibtex-field-right-delimiter)) - (forward-char)) - ;; update comma after last field (if (memq 'last-comma format) (cond ((and bibtex-comma-after-last-field @@ -2536,6 +2470,7 @@ "Complete word fragment before point to longest prefix of COMPLETIONS. COMPLETIONS is an alist of strings. If point is not after the part of a word, all strings are listed. Return completion." + ;; Return value is used by cleanup functions. (let* ((case-fold-search t) (beg (save-excursion (re-search-backward "[ \t{\"]") @@ -2558,13 +2493,13 @@ (display-completion-list (all-completions part-of-word completions) part-of-word)) (message "Making completion list...done") - ;; return value is handled by choose-completion-string-functions nil)))) (defun bibtex-complete-string-cleanup (str compl) "Cleanup after inserting string STR. Remove enclosing field delimiters for STR. Display message with expansion of STR using expansion list COMPL." + ;; point is at position inside field where completion was requested (save-excursion (let ((abbr (cdr (if (stringp str) (assoc-string str compl t))))) @@ -2624,50 +2559,52 @@ (defun bibtex-pop (arg direction) "Fill current field from the ARGth same field's text in DIRECTION. Generic function used by `bibtex-pop-previous' and `bibtex-pop-next'." - (bibtex-find-text) - (save-excursion - ;; parse current field - (bibtex-inside-field) - (let* ((case-fold-search t) - (bounds (bibtex-enclosing-field)) - (start-old-text (bibtex-start-of-text-in-field bounds)) - (stop-old-text (bibtex-end-of-text-in-field bounds)) - (field-name (bibtex-name-in-field bounds t))) + ;; parse current field + (let* ((bounds (bibtex-enclosing-field t)) + (start-old-field (bibtex-start-of-field bounds)) + (start-old-text (bibtex-start-of-text-in-field bounds)) + (end-old-text (bibtex-end-of-text-in-field bounds)) + (field-name (bibtex-name-in-field bounds t)) + failure) + (save-excursion ;; if executed several times in a row, start each search where ;; the last one was finished - (unless (eq last-command 'bibtex-pop) - (bibtex-enclosing-entry-maybe-empty-head) - (setq bibtex-pop-previous-search-point (match-beginning 0) - bibtex-pop-next-search-point (point))) - (if (eq direction 'previous) - (goto-char bibtex-pop-previous-search-point) - (goto-char bibtex-pop-next-search-point)) - ;; Now search for arg'th previous/next similar field - (let (bounds failure new-text) - (while (and (not failure) - (> arg 0)) - (cond ((eq direction 'previous) - (if (setq bounds (bibtex-search-backward-field field-name)) - (goto-char (bibtex-start-of-field bounds)) - (setq failure t))) - ((eq direction 'next) - (if (setq bounds (bibtex-search-forward-field field-name)) - (goto-char (bibtex-end-of-field bounds)) - (setq failure t)))) - (setq arg (- arg 1))) - (if failure - (error "No %s matching BibTeX field" - (if (eq direction 'previous) "previous" "next")) - ;; Found a matching field. Remember boundaries. - (setq bibtex-pop-previous-search-point (bibtex-start-of-field bounds) - bibtex-pop-next-search-point (bibtex-end-of-field bounds) - new-text (bibtex-text-in-field-bounds bounds)) - (bibtex-flash-head) + (cond ((eq last-command 'bibtex-pop) + (goto-char (if (eq direction 'previous) + bibtex-pop-previous-search-point + bibtex-pop-next-search-point))) + ((eq direction 'previous) + (bibtex-beginning-of-entry)) + (t (bibtex-end-of-entry))) + ;; Search for arg'th previous/next similar field + (while (and (not failure) + (>= (setq arg (1- arg)) 0)) + ;; The search of BibTeX fields is not bounded by entry boundaries + (if (eq direction 'previous) + (if (setq bounds (bibtex-search-backward-field field-name)) + (goto-char (bibtex-start-of-field bounds)) + (setq failure t)) + (if (setq bounds (bibtex-search-forward-field field-name)) + (goto-char (bibtex-end-of-field bounds)) + (setq failure t)))) + (if failure + (error "No %s matching BibTeX field" + (if (eq direction 'previous) "previous" "next")) + ;; Found a matching field. Remember boundaries. + (let ((new-text (bibtex-text-in-field-bounds bounds)) + (nbeg (copy-marker (bibtex-start-of-field bounds))) + (nend (copy-marker (bibtex-end-of-field bounds)))) + (bibtex-flash-head "From: ") ;; Go back to where we started, delete old text, and pop new. - (goto-char stop-old-text) - (delete-region start-old-text stop-old-text) - (insert new-text))))) - (bibtex-find-text) + (goto-char end-old-text) + (delete-region start-old-text end-old-text) + (if (= nbeg start-old-field) + (insert (bibtex-field-left-delimiter) + (bibtex-field-right-delimiter)) + (insert new-text)) + (setq bibtex-pop-previous-search-point (marker-position nbeg) + bibtex-pop-next-search-point (marker-position nend)))))) + (bibtex-find-text nil nil nil t) (setq this-command 'bibtex-pop)) (defun bibtex-beginning-of-field () @@ -2846,6 +2783,7 @@ (list (list nil bibtex-entry-head bibtex-key-in-head)) imenu-case-fold-search t) (make-local-variable 'choose-completion-string-functions) + (make-local-variable 'completion-ignore-case) ;; XEmacs needs easy-menu-add, Emacs does not care (easy-menu-add bibtex-edit-menu) (easy-menu-add bibtex-entry-menu) @@ -2861,7 +2799,7 @@ (let ((e (assoc-string entry-type bibtex-entry-field-alist t)) required optional) (unless e - (error "BibTeX entry type %s not defined" entry-type)) + (error "Fields for BibTeX entry type %s not defined" entry-type)) (if (and (member-ignore-case entry-type bibtex-include-OPTcrossref) (nth 2 e)) (setq required (nth 0 (nth 2 e)) @@ -2918,10 +2856,11 @@ (save-excursion (bibtex-beginning-of-entry) ;; For inserting new fields, we use the fact that - ;; bibtex-parse-entry moves point to the end of the last field. + ;; `bibtex-parse-entry' moves point to the end of the last field. (let* ((fields-alist (bibtex-parse-entry)) (field-list (bibtex-field-list (cdr (assoc "=type=" fields-alist))))) + (skip-chars-backward " \t\n") (dolist (field (car field-list)) (unless (assoc-string (car field) fields-alist t) (bibtex-make-field field))) @@ -2964,6 +2903,7 @@ (key (bibtex-key-in-head)) (key-end (match-end bibtex-key-in-head)) (case-fold-search t) + (bibtex-sort-ignore-string-entries t) tmp other-key other bounds) ;; The fields we want to change start right after the key. (goto-char key-end) @@ -3016,28 +2956,28 @@ (while (re-search-backward (regexp-quote other-suffix) key-end 'move) (replace-match suffix))))))) -(defun bibtex-print-help-message () - "Print helpful information about current field in current BibTeX entry." - (interactive) - (let* ((case-fold-search t) - (type (save-excursion - (bibtex-beginning-of-entry) - (looking-at bibtex-any-entry-maybe-empty-head) - (bibtex-type-in-head))) - comment field-list) - (cond ((bibtex-string= type "string") - (message "String definition")) - ((bibtex-string= type "preamble") - (message "Preamble definition")) - (t - (setq field-list (bibtex-field-list type) - comment - (assoc-string (bibtex-name-in-field (bibtex-enclosing-field) t) - (append (car field-list) (cdr field-list)) - t)) - (if comment - (message "%s" (nth 1 comment)) - (message "No comment available")))))) +(defun bibtex-print-help-message (&optional field comma) + "Print helpful information about current FIELD in current BibTeX entry. +Optional arg COMMA is as in `bibtex-enclosing-field'. It is t for +interactive calls." + (interactive (list nil t)) + (unless field (setq field (car (bibtex-find-text-internal nil nil comma)))) + (if (string-match "@" field) + (cond ((bibtex-string= field "@string") + (message "String definition")) + ((bibtex-string= field "@preamble") + (message "Preamble definition")) + (t (message "Entry key"))) + (let* ((case-fold-search t) + (type (save-excursion + (bibtex-beginning-of-entry) + (looking-at bibtex-entry-maybe-empty-head) + (bibtex-type-in-head))) + (field-list (bibtex-field-list type)) + (comment (assoc-string field (append (car field-list) + (cdr field-list)) t))) + (if comment (message "%s" (nth 1 comment)) + (message "No comment available"))))) (defun bibtex-make-field (field &optional move interactive) "Make a field named FIELD in current BibTeX entry. @@ -3052,7 +2992,8 @@ (list (let ((completion-ignore-case t) (field-list (bibtex-field-list (save-excursion - (bibtex-enclosing-entry-maybe-empty-head) + (bibtex-beginning-of-entry) + (looking-at bibtex-any-entry-maybe-empty-head) (bibtex-type-in-head))))) (completing-read "BibTeX field name: " (append (car field-list) (cdr field-list)) @@ -3081,8 +3022,9 @@ (t (concat (bibtex-field-left-delimiter) (bibtex-field-right-delimiter)))))) (when interactive - (forward-char -1) - (bibtex-print-help-message))) + ;; (bibtex-find-text nil nil bibtex-help-message) + (if (memq (preceding-char) '(?} ?\")) (forward-char -1)) + (if bibtex-help-message (bibtex-print-help-message (car field))))) (defun bibtex-beginning-of-entry () "Move to beginning of BibTeX entry (beginning of line). @@ -3103,28 +3045,19 @@ Return the new location of point." (interactive) (let ((case-fold-search t) - (org (point)) - (pnt (bibtex-beginning-of-entry)) - err bounds) - (cond ((looking-at bibtex-entry-type-whitespace) - (bibtex-search-entry t nil t) - (unless (equal (match-beginning 0) pnt) - (setq err t))) - ;; @String - ((setq bounds (bibtex-parse-string)) + (pnt (point)) + (_ (bibtex-beginning-of-entry)) + (bounds (bibtex-valid-entry t))) + (cond (bounds (goto-char (cdr bounds))) ; regular entry + ;; @String or @Preamble + ((setq bounds (or (bibtex-parse-string t) (bibtex-parse-preamble))) (goto-char (bibtex-end-of-string bounds))) - ;; @Preamble - ((bibtex-preamble-prefix t) - (unless (bibtex-parse-string-postfix) ;; @String postfix OK - (setq err t))) - (t - (if (interactive-p) - (message "Not on a known BibTeX entry.")) - (goto-char org))) - (when err - (goto-char pnt) - (error "Syntactically incorrect BibTeX entry starts here"))) - (point)) + ((looking-at bibtex-any-valid-entry-type) + ;; Parsing of entry failed + (error "Syntactically incorrect BibTeX entry starts here.")) + (t (if (interactive-p) (message "Not on a known BibTeX entry.")) + (goto-char pnt))) + (point))) (defun bibtex-goto-line (arg) "Goto line ARG, counting from beginning of (narrowed) buffer." @@ -3188,7 +3121,7 @@ (interactive) (let ((bounds (save-excursion (bibtex-beginning-of-entry) - (bibtex-search-forward-field "abstract")))) + (bibtex-search-forward-field "abstract" t)))) (if bounds (ispell-region (bibtex-start-of-text-in-field bounds) (bibtex-end-of-text-in-field bounds)) @@ -3216,7 +3149,7 @@ ;; Don't search CROSSREF-KEY if we don't need it. (if (eq bibtex-maintain-sorted-entries 'crossref) (let ((bounds (bibtex-search-forward-field - "\\(OPT\\)?crossref"))) + "\\(OPT\\)?crossref" t))) (list key (if bounds (bibtex-text-in-field-bounds bounds t)) entry-name)) @@ -3283,7 +3216,7 @@ (let ((crossref-key (save-excursion (bibtex-beginning-of-entry) - (let ((bounds (bibtex-search-forward-field "crossref"))) + (let ((bounds (bibtex-search-forward-field "crossref" t))) (if bounds (bibtex-text-in-field-bounds bounds t)))))) (list (bibtex-read-key "Find crossref key: " crossref-key t) @@ -3429,40 +3362,38 @@ error-list syntax-error) (save-excursion (save-restriction - (if mark-active - (narrow-to-region (region-beginning) (region-end))) - - ;; looking if entries fit syntactical structure + (if mark-active (narrow-to-region (region-beginning) (region-end))) + + ;; Check syntactical structure of entries (goto-char (point-min)) (bibtex-progress-message "Checking syntactical structure") - (let (bibtex-sort-ignore-string-entries) - (while (re-search-forward "^[ \t]*@" nil t) + (let (bounds end) + (while (setq end (re-search-forward "^[ \t]*@" nil t)) (bibtex-progress-message) - (forward-char -1) - (let ((pnt (point))) - (if (not (looking-at bibtex-entry-type-str)) - (forward-char) - (bibtex-skip-to-valid-entry) - (if (equal (point) pnt) - (forward-char) - (goto-char pnt) - (push (cons (bibtex-current-line) - "Syntax error (check esp. commas, braces, and quotes)") - error-list) - (forward-char)))))) + (goto-char (match-beginning 0)) + (cond ((setq bounds (bibtex-valid-entry)) + (goto-char (cdr bounds))) + ((setq bounds (or (bibtex-parse-string) + (bibtex-parse-preamble))) + (goto-char (bibtex-end-of-string bounds))) + ((looking-at bibtex-any-valid-entry-type) + (push (cons (bibtex-current-line) + "Syntax error (check esp. commas, braces, and quotes)") + error-list) + (goto-char (match-end 0))) + (t (goto-char end))))) (bibtex-progress-message 'done) (if error-list - ;; proceed only if there were no syntax errors. + ;; Continue only if there were no syntax errors. (setq syntax-error t) - ;; looking for duplicate keys and correct sort order + ;; Check for duplicate keys and correct sort order (let (previous current key-list) (bibtex-progress-message "Checking for duplicate keys") (bibtex-map-entries (lambda (key beg end) (bibtex-progress-message) - (goto-char beg) (setq current (bibtex-entry-index)) (cond ((not previous)) ((member key key-list) @@ -3498,18 +3429,13 @@ (bibtex-map-entries (lambda (key beg end) (bibtex-progress-message) - (let* ((entry-list (progn - (goto-char beg) - (bibtex-search-entry nil end) - (assoc-string (bibtex-type-in-head) - bibtex-entry-field-alist t))) + (let* ((entry-list (assoc-string (bibtex-type-in-head) + bibtex-entry-field-alist t)) (req (copy-sequence (elt (elt entry-list 1) 0))) (creq (copy-sequence (elt (elt entry-list 2) 0))) crossref-there bounds alt-there field) - (goto-char beg) - (while (setq bounds (bibtex-search-forward-field - bibtex-field-name end)) - (goto-char (bibtex-start-of-text-in-field bounds)) + (bibtex-beginning-first-field beg) + (while (setq bounds (bibtex-parse-field)) (let ((field-name (bibtex-name-in-field bounds))) (if (and (bibtex-string= field-name "month") ;; Check only abbreviated month fields. @@ -3521,18 +3447,19 @@ (push (cons (bibtex-current-line) "Questionable month field") error-list)) - (setq field (assoc-string field-name req t)) + (setq field (assoc-string field-name req t) + req (delete field req) + creq (delete (assoc-string field-name creq t) creq)) (if (nth 3 field) - (if alt-there (push (cons (bibtex-current-line) - "More than one non-empty alternative") - error-list) + (if alt-there + (push (cons (bibtex-current-line) + "More than one non-empty alternative") + error-list) (setq alt-there t))) - (setq req (delete field req) - creq (delete (assoc-string field-name creq t) creq)) (if (bibtex-string= field-name "crossref") - (setq crossref-there t)))) - (if crossref-there - (setq req creq)) + (setq crossref-there t))) + (goto-char (bibtex-end-of-field bounds))) + (if crossref-there (setq req creq)) (let (alt) (dolist (field req) (if (nth 3 field) @@ -3573,11 +3500,10 @@ (toggle-read-only 1) (goto-line 3)) ; first error message (display-buffer err-buf) - ;; return nil - nil) + nil) ; return `nil' (i.e., buffer is invalid) (message "%s is syntactically correct" (if mark-active "Region" "Buffer")) - t))) + t))) ; return `t' (i.e., buffer is valid) (defun bibtex-validate-globally (&optional strings) "Check for duplicate keys in `bibtex-files'. @@ -3631,37 +3557,41 @@ (toggle-read-only 1) (goto-line 3)) ; first error message (display-buffer err-buf) - ;; return nil - nil) + nil) ; return `nil' (i.e., buffer is invalid) (message "No duplicate keys.") - t))) - -(defun bibtex-next-field (begin) - "Move point to end of text of next BibTeX field. -With prefix BEGIN non-nil, move point to its beginning." - (interactive "P") - (bibtex-inside-field) - (let ((start (point))) - (condition-case () - (let ((bounds (bibtex-enclosing-field))) - (goto-char (bibtex-end-of-field bounds)) - (forward-char 2)) - (error - (goto-char start) - (end-of-line) - (forward-char)))) - (bibtex-find-text begin nil bibtex-help-message)) - -(defun bibtex-find-text (&optional begin noerror help) - "Move point to end of text of current BibTeX field. + t))) ; return `t' (i.e., buffer is valid) + +(defun bibtex-next-field (begin &optional comma) + "Move point to end of text of next BibTeX field or entry head. +With prefix BEGIN non-nil, move point to its beginning. Optional arg COMMA +is as in `bibtex-enclosing-field'. It is t for interactive calls." + (interactive (list current-prefix-arg t)) + (let ((bounds (bibtex-find-text-internal t nil comma)) + end-of-entry) + (if (not bounds) + (setq end-of-entry t) + (goto-char (nth 3 bounds)) + (if (assoc-string (car bounds) '("@String" "@Preamble") t) + (setq end-of-entry t) + ;; BibTeX key or field + (if (looking-at ",[ \t\n]*") (goto-char (match-end 0))) + ;; end of entry + (if (looking-at "[)}][ \t\n]*") (setq end-of-entry t)))) + (if (and end-of-entry + (re-search-forward bibtex-any-entry-maybe-empty-head nil t)) + (goto-char (match-beginning 0))) + (bibtex-find-text begin nil bibtex-help-message))) + +(defun bibtex-find-text (&optional begin noerror help comma) + "Move point to end of text of current BibTeX field or entry head. With optional prefix BEGIN non-nil, move point to its beginning. Unless NOERROR is non-nil, an error is signaled if point is not on a BibTeX field. If optional arg HELP is non-nil print help message. -When called interactively, the value of HELP is `bibtex-help-message'." - (interactive (list current-prefix-arg nil bibtex-help-message)) - (let ((pnt (point)) - (bounds (bibtex-find-text-internal))) - (beginning-of-line) +When called interactively, the value of HELP is `bibtex-help-message'. +Optional arg COMMA is as in `bibtex-enclosing-field'. It is t for +interactive calls." + (interactive (list current-prefix-arg nil bibtex-help-message t)) + (let ((bounds (bibtex-find-text-internal t nil comma))) (cond (bounds (if begin (progn (goto-char (nth 1 bounds)) @@ -3670,72 +3600,88 @@ (goto-char (nth 2 bounds)) (if (memq (preceding-char) '(?} ?\")) (forward-char -1))) - (if help (bibtex-print-help-message))) - ((looking-at bibtex-entry-maybe-empty-head) - (goto-char (if begin - (match-beginning bibtex-key-in-head) - (match-end 0)))) - (t - (goto-char pnt) - (unless noerror (error "Not on BibTeX field")))))) - -(defun bibtex-find-text-internal (&optional noerror subfield) - "Find text part of current BibTeX field, @String or @Preamble. -Return list (NAME START END) with field name, start and end of text -or nil if not found. + (if help (bibtex-print-help-message (car bounds)))) + ((not noerror) (error "Not on BibTeX field"))))) + +(defun bibtex-find-text-internal (&optional noerror subfield comma) + "Find text part of current BibTeX field or entry head. +Return list (NAME START-TEXT END-TEXT END) with field or entry name, +start and end of text and end of field or entry head, or nil if not found. If optional arg NOERROR is non-nil, an error message is suppressed if text -is not found. If optional arg SUBFIELD is non-nil START and END correspond -to the current subfield delimited by #." +is not found. If optional arg SUBFIELD is non-nil START-TEXT and END-TEXT +correspond to the current subfield delimited by #. +Optional arg COMMA is as in `bibtex-enclosing-field'." (save-excursion (let ((pnt (point)) - (_ (bibtex-inside-field)) - (bounds (bibtex-enclosing-field t)) + (bounds (bibtex-enclosing-field comma t)) (case-fold-search t) - (bibtex-string-empty-key t) - name start end) + name start-text end-text end failure done no-sub) (bibtex-beginning-of-entry) (cond (bounds (setq name (bibtex-name-in-field bounds t) - start (bibtex-start-of-text-in-field bounds) - end (bibtex-end-of-text-in-field bounds))) + start-text (bibtex-start-of-text-in-field bounds) + end-text (bibtex-end-of-text-in-field bounds) + end (bibtex-end-of-field bounds))) ;; @String - ((setq bounds (bibtex-parse-string)) - (setq name "@String" ;; not a field name! - start (bibtex-start-of-text-in-string bounds) - end (bibtex-end-of-text-in-string bounds))) + ((setq bounds (bibtex-parse-string t)) + (if (<= pnt (bibtex-end-of-string bounds)) + (setq name "@String" ;; not a field name! + start-text (bibtex-start-of-text-in-string bounds) + end-text (bibtex-end-of-text-in-string bounds) + end (bibtex-end-of-string bounds)) + (setq failure t))) ;; @Preamble - ((and (bibtex-preamble-prefix t) - (setq bounds (bibtex-parse-field-text))) - (setq name "@Preamble" ;; not a field name! - start (car bounds) - end (nth 1 bounds))) - (t (unless noerror (error "Not on BibTeX field")))) - (when (and start end subfield) - (goto-char start) - (let (done) + ((setq bounds (bibtex-parse-preamble)) + (if (<= pnt (bibtex-end-of-string bounds)) + (setq name "@Preamble" ;; not a field name! + start-text (bibtex-start-of-text-in-string bounds) + end-text (bibtex-end-of-text-in-string bounds) + end (bibtex-end-of-string bounds)) + (setq failure t))) + ;; BibTeX head + ((looking-at bibtex-entry-maybe-empty-head) + (goto-char (match-end 0)) + (if comma (save-match-data + (re-search-forward "\\=[ \t\n]*," nil t))) + (if (<= pnt (point)) + (setq name (match-string-no-properties bibtex-type-in-head) + start-text (or (match-beginning bibtex-key-in-head) + (match-end 0)) + end-text (or (match-end bibtex-key-in-head) + (match-end 0)) + end end-text + no-sub t) ;; subfields do not make sense + (setq failure t))) + (t (setq failure t))) + (when (and subfield (not failure)) + (setq failure no-sub) + (unless failure + (goto-char start-text) (while (not done) (if (or (prog1 (looking-at bibtex-field-const) - (setq end (match-end 0))) + (setq end-text (match-end 0))) (prog1 (setq bounds (bibtex-parse-field-string)) - (setq end (cdr bounds)))) + (setq end-text (cdr bounds)))) (progn - (if (and (<= start pnt) (<= pnt end)) + (if (and (<= start-text pnt) (<= pnt end-text)) (setq done t) - (goto-char end)) + (goto-char end-text)) (if (looking-at "[ \t\n]*#[ \t\n]*") - (setq start (goto-char (match-end 0))))) - (unless noerror (error "Not on text part of BibTeX field")) - (setq done t start nil end nil))))) - (if (and start end) - (list name start end))))) - -(defun bibtex-remove-OPT-or-ALT () + (setq start-text (goto-char (match-end 0))))) + (setq done t failure t))))) + (cond ((not failure) + (list name start-text end-text end)) + ((and no-sub (not noerror)) + (error "Not on text part of BibTeX field")) + ((not noerror) (error "Not on BibTeX field")))))) + +(defun bibtex-remove-OPT-or-ALT (&optional comma) "Remove the string starting optional/alternative fields. -Align text and go thereafter to end of text." - (interactive) - (bibtex-inside-field) +Align text and go thereafter to end of text. Optional arg COMMA +is as in `bibtex-enclosing-field'. It is t for interactive calls." + (interactive (list t)) (let ((case-fold-search t) - (bounds (bibtex-enclosing-field))) + (bounds (bibtex-enclosing-field comma))) (save-excursion (goto-char (bibtex-start-of-name-in-field bounds)) (when (looking-at "OPT\\|ALT") @@ -3751,14 +3697,14 @@ (delete-horizontal-space) (if bibtex-align-at-equal-sign (insert " ") - (indent-to-column bibtex-text-indentation)))) - (bibtex-inside-field))) - -(defun bibtex-remove-delimiters () - "Remove \"\" or {} around current BibTeX field text." - (interactive) - ;; `bibtex-find-text-internal' issues an error message if bounds is nil. - (let* ((bounds (bibtex-find-text-internal nil t)) + (indent-to-column bibtex-text-indentation)))))) + +(defun bibtex-remove-delimiters (&optional comma) + "Remove \"\" or {} around current BibTeX field text. +Optional arg COMMA is as in `bibtex-enclosing-field'. It is t for +interactive calls." + (interactive (list t)) + (let* ((bounds (bibtex-find-text-internal nil t comma)) (start (nth 1 bounds)) (end (nth 2 bounds))) (if (memq (char-before end) '(?\} ?\")) @@ -3766,15 +3712,15 @@ (if (memq (char-after start) '(?\{ ?\")) (delete-region start (1+ start))))) -(defun bibtex-kill-field (&optional copy-only) +(defun bibtex-kill-field (&optional copy-only comma) "Kill the entire enclosing BibTeX field. With prefix arg COPY-ONLY, copy the current field to `bibtex-field-kill-ring', -but do not actually kill it." - (interactive "P") +but do not actually kill it. Optional arg COMMA is as in +`bibtex-enclosing-field'. It is t for interactive calls." + (interactive (list current-prefix-arg t)) (save-excursion - (bibtex-inside-field) (let* ((case-fold-search t) - (bounds (bibtex-enclosing-field)) + (bounds (bibtex-enclosing-field comma)) (end (bibtex-end-of-field bounds)) (beg (bibtex-start-of-field bounds))) (goto-char end) @@ -3791,10 +3737,12 @@ (delete-region beg end)))) (setq bibtex-last-kill-command 'field)) -(defun bibtex-copy-field-as-kill () - "Copy the BibTeX field at point to the kill ring." - (interactive) - (bibtex-kill-field t)) +(defun bibtex-copy-field-as-kill (&optional comma) + "Copy the BibTeX field at point to the kill ring. +Optional arg COMMA is as in `bibtex-enclosing-field'. It is t for +interactive calls." + (interactive (list t)) + (bibtex-kill-field t comma)) (defun bibtex-kill-entry (&optional copy-only) "Kill the entire enclosing BibTeX entry. @@ -3806,7 +3754,7 @@ (beg (bibtex-beginning-of-entry)) (end (progn (bibtex-end-of-entry) (if (re-search-forward - bibtex-entry-maybe-empty-head nil 'move) + bibtex-any-entry-maybe-empty-head nil 'move) (goto-char (match-beginning 0))) (point)))) (push (buffer-substring-no-properties beg end) @@ -3831,13 +3779,13 @@ With argument N, reinsert the Nth most recently killed BibTeX item. See also the command \\[bibtex-yank-pop]." (interactive "*p") - (bibtex-insert-kill (1- n)) + (bibtex-insert-kill (1- n) t) (setq this-command 'bibtex-yank)) (defun bibtex-yank-pop (n) "Replace just-yanked killed BibTeX item with a different item. This command is allowed only immediately after a `bibtex-yank' or a -`bibtex-yank-pop'. At such a time, the region contains a reinserted +`bibtex-yank-pop'. In this case, the region contains a reinserted previously killed BibTeX item. `bibtex-yank-pop' deletes that item and inserts in its place a different killed BibTeX item. @@ -3853,13 +3801,14 @@ (setq this-command 'bibtex-yank) (let ((inhibit-read-only t)) (delete-region (point) (mark t)) - (bibtex-insert-kill n))) - -(defun bibtex-empty-field () - "Delete the text part of the current field, replace with empty text." - (interactive) - (bibtex-inside-field) - (let ((bounds (bibtex-enclosing-field))) + (bibtex-insert-kill n t))) + +(defun bibtex-empty-field (&optional comma) + "Delete the text part of the current field, replace with empty text. +Optional arg COMMA is as in `bibtex-enclosing-field'. It is t for +interactive calls." + (interactive (list t)) + (let ((bounds (bibtex-enclosing-field comma))) (goto-char (bibtex-start-of-text-in-field bounds)) (delete-region (point) (bibtex-end-of-text-in-field bounds)) (insert (bibtex-field-left-delimiter) @@ -3960,7 +3909,7 @@ (if (and (listp bibtex-strings) (not (assoc key bibtex-strings))) (push (cons key (bibtex-text-in-string - (save-excursion (bibtex-parse-string)) t)) + (bibtex-parse-string) t)) bibtex-strings))) ;; We have a normal entry. ((listp bibtex-reference-keys) @@ -3988,28 +3937,27 @@ If JUSTIFY is non-nil justify as well. If optional arg MOVE is non-nil move point to end of field." (let ((end-field (copy-marker (bibtex-end-of-field bounds)))) - (goto-char (bibtex-start-of-field bounds)) - (if justify - (progn - (forward-char) - (bibtex-delete-whitespace) - (open-line 1) - (forward-char) - (indent-to-column (+ bibtex-entry-offset - bibtex-field-indentation)) - (re-search-forward "[ \t\n]*=" end-field) - (replace-match "=") - (forward-char -1) - (if bibtex-align-at-equal-sign - (indent-to-column - (+ bibtex-entry-offset (- bibtex-text-indentation 2))) - (insert " ")) - (forward-char) - (bibtex-delete-whitespace) - (if bibtex-align-at-equal-sign - (insert " ") - (indent-to-column bibtex-text-indentation))) - (re-search-forward "[ \t\n]*=[ \t\n]*" end-field)) + (if (not justify) + (goto-char (bibtex-start-of-text-in-field bounds)) + (goto-char (bibtex-start-of-field bounds)) + (forward-char) ;; leading comma + (bibtex-delete-whitespace) + (open-line 1) + (forward-char) + (indent-to-column (+ bibtex-entry-offset + bibtex-field-indentation)) + (re-search-forward "[ \t\n]*=" end-field) + (replace-match "=") + (forward-char -1) + (if bibtex-align-at-equal-sign + (indent-to-column + (+ bibtex-entry-offset (- bibtex-text-indentation 2))) + (insert " ")) + (forward-char) + (bibtex-delete-whitespace) + (if bibtex-align-at-equal-sign + (insert " ") + (indent-to-column bibtex-text-indentation))) ;; Paragraphs within fields are not preserved. Bother? (fill-region-as-paragraph (line-beginning-position) end-field default-justification nil (point)) @@ -4017,14 +3965,13 @@ (defun bibtex-fill-field (&optional justify) "Like \\[fill-paragraph], but fill current BibTeX field. -Optional prefix arg JUSTIFY non-nil means justify as well. +If optional prefix JUSTIFY is non-nil justify as well. In BibTeX mode this function is bound to `fill-paragraph-function'." (interactive "*P") (let ((pnt (copy-marker (point))) - (bounds (bibtex-enclosing-field))) - (when bounds - (bibtex-fill-field-bounds bounds justify) - (goto-char pnt)))) + (bounds (bibtex-enclosing-field t))) + (bibtex-fill-field-bounds bounds justify) + (goto-char pnt))) (defun bibtex-fill-entry () "Fill current BibTeX entry. @@ -4035,14 +3982,16 @@ (interactive "*") (let ((pnt (copy-marker (point))) (end (copy-marker (bibtex-end-of-entry))) + (beg (bibtex-beginning-of-entry)) ; move point bounds) - (bibtex-beginning-of-entry) (bibtex-delete-whitespace) (indent-to-column bibtex-entry-offset) - (while (setq bounds (bibtex-search-forward-field bibtex-field-name end)) + (bibtex-beginning-first-field beg) + (while (setq bounds (bibtex-parse-field)) (bibtex-fill-field-bounds bounds t t)) (if (looking-at ",") (forward-char)) + (skip-chars-backward " \t\n") (bibtex-delete-whitespace) (open-line 1) (forward-char) @@ -4115,8 +4064,7 @@ bibtex-autokey-edit-before-use) (save-restriction - (narrow-to-region (if mark-active (region-beginning) (point-min)) - (if mark-active (region-end) (point-max))) + (if mark-active (narrow-to-region (region-beginning) (region-end))) (if (memq 'realign bibtex-entry-format) (bibtex-realign)) (bibtex-progress-message "Formatting" 1) @@ -4143,12 +4091,10 @@ (message "Starting to validate buffer...") (sit-for 1 nil t) (bibtex-realign) - (message - "If errors occur, correct them and call `bibtex-convert-alien' again") - (sit-for 5 nil t) (deactivate-mark) ; So bibtex-validate works on the whole buffer. - (when (let (bibtex-maintain-sorted-entries) - (bibtex-validate)) + (if (not (let (bibtex-maintain-sorted-entries) + (bibtex-validate))) + (message "Correct errors and call `bibtex-convert-alien' again") (message "Starting to reformat entries...") (sit-for 2 nil t) (bibtex-reformat read-options) @@ -4166,10 +4112,9 @@ (interactive) (let ((pnt (point)) (case-fold-search t) - (bibtex-string-empty-key t) bounds name compl) (save-excursion - (if (and (setq bounds (bibtex-enclosing-field t)) + (if (and (setq bounds (bibtex-enclosing-field nil t)) (>= pnt (bibtex-start-of-text-in-field bounds)) (<= pnt (bibtex-end-of-text-in-field bounds))) (setq name (bibtex-name-in-field bounds t) @@ -4182,7 +4127,7 @@ ;; point is in other field (t (bibtex-strings)))) (bibtex-beginning-of-entry) - (cond ((setq bounds (bibtex-parse-string)) + (cond ((setq bounds (bibtex-parse-string t)) ;; point is inside a @String key (cond ((and (>= pnt (nth 1 (car bounds))) (<= pnt (nth 2 (car bounds)))) @@ -4192,11 +4137,10 @@ (<= pnt (bibtex-end-of-text-in-string bounds))) (setq compl (bibtex-strings))))) ;; point is inside a @Preamble field - ((and (bibtex-preamble-prefix t) - (setq bounds (bibtex-parse-field-text)) - (>= pnt (car bounds)) - (<= pnt (nth 1 bounds))) - (setq compl (bibtex-strings))) + ((setq bounds (bibtex-parse-preamble)) + (if (and (>= pnt (bibtex-start-of-text-in-string bounds)) + (<= pnt (bibtex-end-of-text-in-string bounds))) + (setq compl (bibtex-strings)))) ((and (looking-at bibtex-entry-maybe-empty-head) ;; point is inside a key (or (and (match-beginning bibtex-key-in-head) @@ -4209,41 +4153,53 @@ (cond ((eq compl 'key) ;; key completion: no cleanup needed - (let (completion-ignore-case) - (bibtex-complete-internal (bibtex-global-key-alist)))) + (setq choose-completion-string-functions nil + completion-ignore-case nil) + (bibtex-complete-internal (bibtex-global-key-alist))) ((eq compl 'crossref-key) ;; crossref key completion - (let (completion-ignore-case) - (setq choose-completion-string-functions - (lambda (choice buffer mini-p base-size) - (let ((choose-completion-string-functions nil)) - (choose-completion-string choice buffer base-size)) - (bibtex-complete-crossref-cleanup choice) - ;; return t (needed by choose-completion-string-functions) - t)) - (bibtex-complete-crossref-cleanup (bibtex-complete-internal - (bibtex-global-key-alist))))) + ;; + ;; If we quit the *Completions* buffer without requesting + ;; a completion, `choose-completion-string-functions' is still + ;; non-nil. Therefore, `choose-completion-string-functions' is + ;; always set (either to non-nil or nil) when a new completion + ;; is requested. + ;; Also, `choose-completion-delete-max-match' requires + ;; that we set `completion-ignore-case' (i.e., binding via `let' + ;; is not sufficient). + (setq completion-ignore-case nil + choose-completion-string-functions + (lambda (choice buffer mini-p base-size) + (setq choose-completion-string-functions nil) + (choose-completion-string choice buffer base-size) + (bibtex-complete-crossref-cleanup choice) + t)) ; needed by choose-completion-string-functions + + (bibtex-complete-crossref-cleanup (bibtex-complete-internal + (bibtex-global-key-alist)))) ((eq compl 'string) ;; string key completion: no cleanup needed - (let ((completion-ignore-case t)) - (bibtex-complete-internal bibtex-strings))) + (setq choose-completion-string-functions nil + completion-ignore-case t) + (bibtex-complete-internal bibtex-strings)) (compl ;; string completion - (let ((completion-ignore-case t)) - (setq choose-completion-string-functions - `(lambda (choice buffer mini-p base-size) - (let ((choose-completion-string-functions nil)) - (choose-completion-string choice buffer base-size)) - (bibtex-complete-string-cleanup choice ',compl) - ;; return t (needed by choose-completion-string-functions) - t)) - (bibtex-complete-string-cleanup (bibtex-complete-internal compl) - compl))) - - (t (error "Point outside key or BibTeX field"))))) + (setq completion-ignore-case t + choose-completion-string-functions + `(lambda (choice buffer mini-p base-size) + (setq choose-completion-string-functions nil) + (choose-completion-string choice buffer base-size) + (bibtex-complete-string-cleanup choice ',compl) + t)) ; needed by choose-completion-string-functions + (bibtex-complete-string-cleanup (bibtex-complete-internal compl) + compl)) + + (t (setq choose-completion-string-functions nil + completion-ignore-case nil) ; default + (error "Point outside key or BibTeX field"))))) (defun bibtex-Article () "Insert a new BibTeX @Article entry; see also `bibtex-entry'." diff -r ff74a86c2b16 -r c69d44922688 lisp/textmodes/fill.el --- a/lisp/textmodes/fill.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/textmodes/fill.el Tue Jan 03 02:15:28 2006 +0000 @@ -291,12 +291,13 @@ (defun fill-single-word-nobreak-p () "Don't break a line after the first or before the last word of a sentence." - (or (looking-at "[ \t]*\\sw+[ \t]*[.?!:][ \t]*$") + (or (looking-at (concat "[ \t]*\\sw+" "\\(?:" (sentence-end) "\\)")) (save-excursion (skip-chars-backward " \t") (and (/= (skip-syntax-backward "w") 0) (/= (skip-chars-backward " \t") 0) - (/= (skip-chars-backward ".?!:") 0))))) + (/= (skip-chars-backward ".?!:") 0) + (looking-at (sentence-end)))))) (defun fill-french-nobreak-p () "Return nil if French style allows breaking the line at point. diff -r ff74a86c2b16 -r c69d44922688 lisp/url/ChangeLog --- a/lisp/url/ChangeLog Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/url/ChangeLog Tue Jan 03 02:15:28 2006 +0000 @@ -1,3 +1,11 @@ +2006-01-02 Stefan Monnier + + * url-handlers.el (url-retrieve-synchronously): Don't autoload. + + * url.el (url-retrieve, url-retrieve-synchronously): Autoload. + + * url-cache.el: Require `url'. + 2005-12-27 Stefan Monnier * url-cache.el (url-store-in-cache): Use save-current-buffer. diff -r ff74a86c2b16 -r c69d44922688 lisp/url/url-cache.el --- a/lisp/url/url-cache.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/url/url-cache.el Tue Jan 03 02:15:28 2006 +0000 @@ -1,7 +1,7 @@ ;;; url-cache.el --- Uniform Resource Locator retrieval tool ;; Copyright (C) 1996, 1997, 1998, 1999, 2004, -;; 2005 Free Software Foundation, Inc. +;; 2005, 2006 Free Software Foundation, Inc. ;; Keywords: comm, data, processes, hypermedia @@ -26,6 +26,7 @@ (require 'url-parse) (require 'url-util) +(require 'url) ;E.g. for url-configuration-directory. (defcustom url-cache-directory (expand-file-name "cache" url-configuration-directory) diff -r ff74a86c2b16 -r c69d44922688 lisp/url/url-handlers.el --- a/lisp/url/url-handlers.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/url/url-handlers.el Tue Jan 03 02:15:28 2006 +0000 @@ -1,7 +1,7 @@ ;;; url-handlers.el --- file-name-handler stuff for URL loading ;; Copyright (C) 1996, 1997, 1998, 1999, 2004, -;; 2005 Free Software Foundation, Inc. +;; 2005, 2006 Free Software Foundation, Inc. ;; Keywords: comm, data, processes, hypermedia @@ -37,7 +37,6 @@ ;; after mm-dissect-buffer and defined in the same file. ;; The following are autoloaded instead of `require'd to avoid eagerly ;; loading all of URL when turning on url-handler-mode in the .emacs. -(autoload 'url-retrieve-synchronously "url" "Retrieve url synchronously.") (autoload 'url-expand-file-name "url-expand" "Convert url to a fully specified url, and canonicalize it.") (autoload 'mm-dissect-buffer "mm-decode" "Dissect the current buffer and return a list of MIME handles.") (autoload 'url-scheme-get-property "url-methods" "Get property of a URL SCHEME.") diff -r ff74a86c2b16 -r c69d44922688 lisp/url/url.el --- a/lisp/url/url.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/url/url.el Tue Jan 03 02:15:28 2006 +0000 @@ -1,7 +1,7 @@ ;;; url.el --- Uniform Resource Locator retrieval tool ;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, -;; 2005 Free Software Foundation, Inc. +;; 2005, 2006 Free Software Foundation, Inc. ;; Author: Bill Perry ;; Keywords: comm, data, processes, hypermedia @@ -114,6 +114,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Retrieval functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;###autoload (defun url-retrieve (url callback &optional cbargs) "Retrieve URL asynchronously and call CALLBACK with CBARGS when finished. URL is either a string or a parsed URL. @@ -155,6 +156,7 @@ (url-history-update-url url (current-time))) buffer)) +;;;###autoload (defun url-retrieve-synchronously (url) "Retrieve URL synchronously. Return the buffer containing the data, or nil if there are no data diff -r ff74a86c2b16 -r c69d44922688 lisp/xt-mouse.el --- a/lisp/xt-mouse.el Tue Jan 03 01:50:46 2006 +0000 +++ b/lisp/xt-mouse.el Tue Jan 03 02:15:28 2006 +0000 @@ -39,9 +39,6 @@ ;;; Todo: -;; The xterm mouse escape codes are supposedly also supported by the -;; Linux console, but I have not been able to verify this. - ;; Support multi-click -- somehow. ;;; Code: diff -r ff74a86c2b16 -r c69d44922688 lispref/ChangeLog --- a/lispref/ChangeLog Tue Jan 03 01:50:46 2006 +0000 +++ b/lispref/ChangeLog Tue Jan 03 02:15:28 2006 +0000 @@ -1,3 +1,22 @@ +2005-12-30 Richard M. Stallman + + * text.texi (Changing Properties): + Don't use return value of set-text-properties. + +2005-12-29 Luc Teirlinck + + * modes.texi (Mode Line Format): Correct typo in menu. + +2005-12-29 Richard M. Stallman + + * modes.texi (Mode Line Top): New node. + (Mode Line Data): Some text moved to new node. + Explain the data structure more concretely. + (Mode Line Basics): Clarifications. + (Mode Line Variables): Clarify intro paragraph. + (%-Constructs): Clarify intro paragraph. + (Mode Line Format): Update menu. + 2005-12-28 Luc Teirlinck * minibuf.texi (Basic Completion): Update lazy-completion-table diff -r ff74a86c2b16 -r c69d44922688 lispref/modes.texi --- a/lispref/modes.texi Tue Jan 03 01:50:46 2006 +0000 +++ b/lispref/modes.texi Tue Jan 03 02:15:28 2006 +0000 @@ -1520,8 +1520,9 @@ minor modes. @menu -* Mode Line Basics:: -* Mode Line Data:: The data structure that controls the mode line. +* Base: Mode Line Basics. Basic ideas of mode line control. +* Data: Mode Line Data. The data structure that controls the mode line. +* Top: Mode Line Top. The top level variable, mode-line-format. * Mode Line Variables:: Variables used in that data structure. * %-Constructs:: Putting information into a mode line. * Properties in Mode:: Using text properties in the mode line. @@ -1533,12 +1534,13 @@ @subsection Mode Line Basics @code{mode-line-format} is a buffer-local variable that holds a -template used to display the mode line of the current buffer. All -windows for the same buffer use the same @code{mode-line-format}, so -their mode lines appear the same---except for scrolling percentages, and -line and column numbers, since those depend on point and on how the -window is scrolled. @code{header-line-format} is used likewise for -header lines. +@dfn{mode line construct}, a kind of template, which controls the +display the mode line of the current buffer. All windows for the same +buffer use the same @code{mode-line-format}, so their mode lines +appear the same---except for scrolling percentages, and line and +column numbers, since those depend on point and on how the window is +scrolled. The value of @code{header-line-format} specifies the +buffer's header line in the same way, with a mode line construct. For efficiency, Emacs does not recompute the mode line and header line of a window in every redisplay. It does so when circumstances @@ -1567,61 +1569,36 @@ color using the face @code{mode-line}. Other windows' mode lines appear in the face @code{mode-line-inactive} instead. @xref{Faces}. - A window that is just one line tall does not display either a mode -line or a header line, even if the variables call for one. A window -that is two lines tall cannot display both a mode line and a header -line at once; if the variables call for both, only the mode line -actually appears. - @node Mode Line Data @subsection The Data Structure of the Mode Line @cindex mode-line construct - The mode-line contents are controlled by a data structure of lists, -strings, symbols, and numbers kept in buffer-local variables. The data -structure is called a @dfn{mode-line construct}, and it is built in -recursive fashion out of simpler mode-line constructs. The same data -structure is used for constructing frame titles (@pxref{Frame Titles}) -and header lines (@pxref{Header Lines}). - -@defvar mode-line-format -The value of this variable is a mode-line construct with overall -responsibility for the mode-line format. The value of this variable -controls which other variables are used to form the mode-line text, and -where they appear. - -If you set this variable to @code{nil} in a buffer, that buffer does not -have a mode line. -@end defvar - - A mode-line construct may be as simple as a fixed string of text, but -it usually specifies how to use other variables to construct the text. -Many of these variables are themselves defined to have mode-line -constructs as their values. - - The default value of @code{mode-line-format} incorporates the values -of variables such as @code{mode-line-position} and -@code{mode-line-modes} (which in turn incorporates the values of the -variables @code{mode-name} and @code{minor-mode-alist}). Because of -this, very few modes need to alter @code{mode-line-format} itself. For -most purposes, it is sufficient to alter some of the variables that -@code{mode-line-format} either directly or indirectly refers to. - - A mode-line construct may be a list, a symbol, or a string. If the -value is a list, each element may be a list, a symbol, or a string. - - The mode line can display various faces, if the strings that control -it have the @code{face} property. @xref{Properties in Mode}. In -addition, the face @code{mode-line} is used as a default for the whole -mode line (@pxref{Standard Faces,,, emacs, The GNU Emacs Manual}). + The mode-line contents are controlled by a data structure called a +@dfn{mode-line construct}, made up of lists, strings, symbols, and +numbers kept in buffer-local variables. Each data type has a specific +meaning for the mode-line appearance, as described below. The same +data structure is used for constructing frame titles (@pxref{Frame +Titles}) and header lines (@pxref{Header Lines}). + + A mode-line construct may be as simple as a fixed string of text, +but it usually specifies how to combine fixed strings with variables' +values to construct the text. Many of these variables are themselves +defined to have mode-line constructs as their values. + + Here are the meanings of various data types as mode-line constructs: @table @code @cindex percent symbol in mode line @item @var{string} -A string as a mode-line construct is displayed verbatim in the mode line -except for @dfn{@code{%}-constructs}. Decimal digits after the @samp{%} -specify the field width for space filling on the right (i.e., the data -is left justified). @xref{%-Constructs}. +A string as a mode-line construct appears verbatim in the mode line +except for @dfn{@code{%}-constructs} in it. These stand for +substitution of other data; see @ref{%-Constructs}. + +If the string has @code{face} properties, they are copied into the +mode line contents too (@pxref{Properties in Mode}). Any characters +in the mode line which have no @code{face} properties are displayed, +by default, in the face @code{mode-line} or @code{mode-line-inactive} +(@pxref{Standard Faces,,, emacs, The GNU Emacs Manual}). @item @var{symbol} A symbol as a mode-line construct stands for its value. The value of @@ -1633,11 +1610,13 @@ displayed verbatim: the @code{%}-constructs are not recognized. Unless @var{symbol} is marked as ``risky'' (i.e., it has a -non-@code{nil} @code{risky-local-variable} property), all properties in -any strings, as well as all @code{:eval} and @code{:propertize} forms in -the value of that symbol will be ignored. - -@item (@var{string} @var{rest}@dots{}) @r{or} (@var{list} @var{rest}@dots{}) +non-@code{nil} @code{risky-local-variable} property), all text +properties specified in @var{symbol}'s value are ignored. This +includes the text properties of strings in @var{symbol}'s value, as +well as all @code{:eval} and @code{:propertize} forms in it. + +@item (@var{string} @var{rest}@dots{}) +@itemx (@var{list} @var{rest}@dots{}) A list whose first element is a string or list means to process all the elements recursively and concatenate the results. This is the most common form of mode-line construct. @@ -1650,7 +1629,7 @@ @item (:propertize @var{elt} @var{props}@dots{}) A list whose first element is the symbol @code{:propertize} says to -process the mode-line construct @var{elt} recursively and add the text +process the mode-line construct @var{elt} recursively, then add the text properties specified by @var{props} to the result. The argument @var{props} should consist of zero or more pairs @var{text-property} @var{value}. (This feature is new as of Emacs 22.1.) @@ -1677,6 +1656,29 @@ the top of the window is to use a list like this: @code{(-3 "%p")}. @end table +@node Mode Line Top +@subsection The Top Level of Mode Line Control + + The variable in overall control of the mode line is +@code{mode-line-format}. + +@defvar mode-line-format +The value of this variable is a mode-line construct that controls the +contents of the mode-line. It is always buffer-local in all buffers. + +If you set this variable to @code{nil} in a buffer, that buffer does +not have a mode line. (A window that is just one line tall never +displays a mode line.) +@end defvar + + The default value of @code{mode-line-format} is designed to use the +values of other variables such as @code{mode-line-position} and +@code{mode-line-modes} (which in turn incorporates the values of the +variables @code{mode-name} and @code{minor-mode-alist}). Very few +modes need to alter @code{mode-line-format} itself. For most +purposes, it is sufficient to alter some of the variables that +@code{mode-line-format} either directly or indirectly refers to. + If you do alter @code{mode-line-format} itself, the new value should use the same variables that appear in the default value (@pxref{Mode Line Variables}), rather than duplicating their contents or displaying @@ -1730,11 +1732,14 @@ @node Mode Line Variables @subsection Variables Used in the Mode Line - This section describes variables incorporated by the -standard value of @code{mode-line-format} into the text of the mode -line. There is nothing inherently special about these variables; any -other variables could have the same effects on the mode line if -@code{mode-line-format} were changed to use them. + This section describes variables incorporated by the standard value +of @code{mode-line-format} into the text of the mode line. There is +nothing inherently special about these variables; any other variables +could have the same effects on the mode line if +@code{mode-line-format}'s value were changed to use them. However, +various parts of Emacs set these variables on the understanding that +they will control parts of the mode line; therefore, practically +speaking, it is essential for the mode line to use them. @defvar mode-line-mule-info This variable holds the value of the mode-line construct that displays @@ -1907,10 +1912,12 @@ @node %-Constructs @subsection @code{%}-Constructs in the Mode Line - The following table lists the recognized @code{%}-constructs and what -they mean. In any construct except @samp{%%}, you can add a decimal -integer after the @samp{%} to specify a minimum field width. If the -width is less, the field is padded with spaces to the right. + Strings used as mode-line constructs can use certain +@code{%}-constructs to substitute various kinds of data. Here is a +list of the defined @code{%}-constructs, and what they mean. In any +construct except @samp{%%}, you can add a decimal integer after the +@samp{%} to specify a minimum field width. If the width is less, the +field is padded with spaces to the right. @table @code @item %b @@ -2078,6 +2085,11 @@ It is normally @code{nil}, so that ordinary buffers have no header line. @end defvar + A window that is just one line tall never displays a header line. A +window that is two lines tall cannot display both a mode line and a +header line at once; if it has a mode line, then it does not display a +header line. + @node Emulating Mode Line @subsection Emulating Mode-Line Formatting diff -r ff74a86c2b16 -r c69d44922688 lispref/text.texi --- a/lispref/text.texi Tue Jan 03 01:50:46 2006 +0000 +++ b/lispref/text.texi Tue Jan 03 02:15:28 2006 +0000 @@ -2735,6 +2735,8 @@ @example (set-text-properties @var{start} @var{end} nil) @end example + +Do not rely on the return value of this function. @end defun The easiest way to make a string with text properties diff -r ff74a86c2b16 -r c69d44922688 man/ChangeLog --- a/man/ChangeLog Tue Jan 03 01:50:46 2006 +0000 +++ b/man/ChangeLog Tue Jan 03 02:15:28 2006 +0000 @@ -1,3 +1,11 @@ +2005-12-30 Juri Linkov + + * basic.texi (Position Info): Update example. + +2005-12-29 Romain Francoise + + * faq.texi (Using Customize): New node. + 2005-12-28 Luc Teirlinck * org.texi: Remove blank line in @direntry. It is non-standard diff -r ff74a86c2b16 -r c69d44922688 man/basic.texi --- a/man/basic.texi Tue Jan 03 01:50:46 2006 +0000 +++ b/man/basic.texi Tue Jan 03 02:15:28 2006 +0000 @@ -717,14 +717,14 @@ @smallexample character: @`A (2240, #o4300, #x8c0, U+00C0) - charset: [latin-iso8859-1] + charset: latin-iso8859-1 (Right-Hand Part of Latin Alphabet 1@dots{} - code point: [64] + code point: #x40 syntax: w which means: word category: l:Latin - to input: type "`A" with [latin-1-prefix] + to input: type "`A" with latin-1-prefix buffer code: #x81 #xC0 - file code: ESC #x2C #x41 #x40 (encoded by coding system iso-2022-7bit) + file code: #xC0 (encoded by coding system iso-latin-1) display: terminal code #xC0 There are text properties here: diff -r ff74a86c2b16 -r c69d44922688 man/display.texi --- a/man/display.texi Tue Jan 03 01:50:46 2006 +0000 +++ b/man/display.texi Tue Jan 03 02:15:28 2006 +0000 @@ -1014,6 +1014,13 @@ You can control how the cursor appears when it blinks off by setting the variable @code{blink-cursor-alist}. +@vindex visible-cursor + Some text terminals offer two different cursors: the normal cursor +and the very visible cursor, where the latter may be e.g. bigger or +blinking. By default Emacs uses the very visible cursor. Setting the +variable @code{visible-cursor} to @code{nil} makes it use the +normal cursor. + @cindex cursor in non-selected windows @vindex cursor-in-non-selected-windows Normally, the cursor appears in non-selected windows in the ``off'' diff -r ff74a86c2b16 -r c69d44922688 man/faq.texi --- a/man/faq.texi Tue Jan 03 01:50:46 2006 +0000 +++ b/man/faq.texi Tue Jan 03 02:15:28 2006 +0000 @@ -1161,6 +1161,7 @@ @menu * Setting up a customization file:: +* Using Customize:: * Debugging a customization file:: * Colors on a TTY:: * Displaying the current line or column:: @@ -1211,7 +1212,7 @@ * Escape sequences in shell output:: @end menu -@node Setting up a customization file, Colors on a TTY, Common requests, Common requests +@node Setting up a customization file, Using Customize, Common requests, Common requests @section How do I set up a @file{.emacs} file properly? @cindex @file{.emacs} file, setting up @cindex @file{.emacs} file, locating @@ -1225,11 +1226,11 @@ @email{help-gnu-emacs@@gnu.org} asking why Emacs isn't behaving as documented. -Beginning with version 20.1, Emacs includes the new Customize facility, -which can be invoked using @kbd{M-x customize @key{RET}}. This allows -users who are unfamiliar with Emacs Lisp to modify their @file{.emacs} -files in a relatively straightforward way, using menus rather than Lisp -code. Most packages support Customize as of this writing. +Beginning with version 20.1, Emacs includes the new Customize facility +(@pxref{Using Customize}). This allows users who are unfamiliar with +Emacs Lisp to modify their @file{.emacs} files in a relatively +straightforward way, using menus rather than Lisp code. Most packages +support Customize as of this writing. While Customize might indeed make it easier to configure Emacs, consider taking a bit of time to learn Emacs Lisp and modifying your @@ -1241,7 +1242,26 @@ be found. Visiting the file as @file{~/.emacs} from Emacs will find the correct file. -@node Colors on a TTY, Debugging a customization file, Setting up a customization file, Common requests +@node Using Customize, Colors on a TTY, Setting up a customization file, Common requests +@section How do I start using Customize? +@cindex Customize groups +@cindex Customizing variables +@cindex Customizing faces + +The main Customize entry point is @kbd{M-x customize @key{RET}}. This +command takes you to a buffer listing all the available Customize +groups. From there, you can access all customizable options and faces, +change their values, and save your changes to your init file. +@inforef{Easy Customization, Easy Customization, emacs}. + +If you know the name of the group in advance (e.g. ``shell''), use +@kbd{M-x customize-group @key{RET}}. + +If you wish to customize a single option, use @kbd{M-x customize-option +@key{RET}}. This command prompts you for the name of the option to +customize, with completion. + +@node Colors on a TTY, Debugging a customization file, Using Customize, Common requests @section How do I get colors and syntax highlighting on a TTY? @cindex Colors on a TTY @cindex Syntax highlighting on a TTY diff -r ff74a86c2b16 -r c69d44922688 src/.gdbinit --- a/src/.gdbinit Tue Jan 03 01:50:46 2006 +0000 +++ b/src/.gdbinit Tue Jan 03 02:15:28 2006 +0000 @@ -764,6 +764,12 @@ show environment TERM #set args -geometry 80x40+0+0 +# People get bothered when they see messages about non-existent functions... +echo \n +echo If you see messages below about functions not being defined,\n +echo don\'t worry about them. Nothing is wrong.\n +echo \n + # Don't let abort actually run, as it will make # stdio stop working and therefore the `pr' command above as well. break abort diff -r ff74a86c2b16 -r c69d44922688 src/ChangeLog --- a/src/ChangeLog Tue Jan 03 01:50:46 2006 +0000 +++ b/src/ChangeLog Tue Jan 03 02:15:28 2006 +0000 @@ -1,3 +1,51 @@ +2006-01-01 Ken Raeburn + + * callproc.c (Fcall_process_region): Bind file-name-handler-alist + to nil for the call to Fwrite_region. + +2005-12-31 Richard M. Stallman + + * minibuf.c (read_minibuf): Clear out all other minibuffer windows. + +2005-12-31 Eli Zaretskii + + * emacs.c (gdb_pvec_type): A dummy variable for GDB's sake. + +2005-12-30 Luc Teirlinck + + * textprop.c (set_text_properties): Reword description of return value. + Return Qnil if caller wants to remove all text properties from a + string and the string already has no intervals. + +2005-12-30 Stefan Monnier + + * term.c (visible_cursor): New boolean var. + (set_terminal_modes, tty_show_cursor): Use "vs" or "ve" depending on + visible_cursor. + (syms_of_term): Export the new var as "visible-cursor". + +2005-12-30 Eli Zaretskii + + * .gdbinit: Tell users not to worry about GDB warnings that some + functions do not exist in the binary. + +2005-12-30 Andreas Schwab + + * process.c (Fnetwork_interface_info): Correctly terminate the + loop over ifflag_table. + +2005-12-29 Richard M. Stallman + + * lread.c (readevalloop): Test for reading a whole buffer + before actually reading anything. Handle all cases, including + START = END = nil and an already-narrowed buffer. + Convert END to a marker if it is a number. + + * keymap.c (describe_map): Put sparse map elements into an array, + sort them, then output a sequence of identical bindings on one line. + (struct describe_map_elt): New data type. + (describe_map_compare): New function. + 2005-12-28 Jan Dj,Ad(Brv * gtkutil.c (xg_get_file_with_chooser): Changed message shown diff -r ff74a86c2b16 -r c69d44922688 src/callproc.c --- a/src/callproc.c Tue Jan 03 01:50:46 2006 +0000 +++ b/src/callproc.c Tue Jan 03 02:15:28 2006 +0000 @@ -1133,6 +1133,9 @@ int count1 = SPECPDL_INDEX (); specbind (intern ("coding-system-for-write"), val); + /* POSIX lets mk[s]temp use "."; don't invoke jka-compr if we + happen to get a ".Z" suffix. */ + specbind (intern ("file-name-handler-alist"), Qnil); Fwrite_region (start, end, filename_string, Qnil, Qlambda, Qnil, Qnil); unbind_to (count1, Qnil); diff -r ff74a86c2b16 -r c69d44922688 src/emacs.c --- a/src/emacs.c Tue Jan 03 01:50:46 2006 +0000 +++ b/src/emacs.c Tue Jan 03 02:15:28 2006 +0000 @@ -113,6 +113,9 @@ #endif EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG; EMACS_INT gdb_array_mark_flag = ARRAY_MARK_FLAG; +/* GDB might say "No enum type named pvec_type" if we don't have at + least one symbol with that type, and then xbacktrace could fail. */ +enum pvec_type gdb_pvec_type = PVEC_TYPE_MASK; /* Command line args from shell, as list of strings. */ Lisp_Object Vcommand_line_args; diff -r ff74a86c2b16 -r c69d44922688 src/keymap.c --- a/src/keymap.c Tue Jan 03 01:50:46 2006 +0000 +++ b/src/keymap.c Tue Jan 03 02:15:28 2006 +0000 @@ -3167,6 +3167,34 @@ insert_string ("??\n"); } +/* describe_map puts all the usable elements of a sparse keymap + into an array of `struct describe_map_elt', + then sorts them by the events. */ + +struct describe_map_elt { Lisp_Object event; Lisp_Object definition; int shadowed; }; + +/* qsort comparison function for sorting `struct describe_map_elt' by + the event field. */ + +static int +describe_map_compare (aa, bb) + const void *aa, *bb; +{ + const struct describe_map_elt *a = aa, *b = bb; + if (INTEGERP (a->event) && INTEGERP (b->event)) + return ((XINT (a->event) > XINT (b->event)) + - (XINT (a->event) < XINT (b->event))); + if (!INTEGERP (a->event) && INTEGERP (b->event)) + return 1; + if (INTEGERP (a->event) && !INTEGERP (b->event)) + return -1; + if (SYMBOLP (a->event) && SYMBOLP (b->event)) + return (Fstring_lessp (a->event, b->event) ? -1 + : Fstring_lessp (b->event, a->event) ? 1 + : 0); + return 0; +} + /* Describe the contents of map MAP, assuming that this map itself is reached by the sequence of prefix keys PREFIX (a string or vector). PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above. */ @@ -3190,6 +3218,13 @@ int first = 1; struct gcpro gcpro1, gcpro2, gcpro3; + /* These accumulate the values from sparse keymap bindings, + so we can sort them and handle them in order. */ + int length_needed = 0; + struct describe_map_elt *vect; + int slots_used = 0; + int i; + suppress = Qnil; if (partial) @@ -3201,6 +3236,12 @@ kludge = Fmake_vector (make_number (1), Qnil); definition = Qnil; + for (tail = map; CONSP (tail); tail = XCDR (tail)) + length_needed++; + + vect = ((struct describe_map_elt *) + alloca (sizeof (struct describe_map_elt) * length_needed)); + GCPRO3 (prefix, definition, kludge); for (tail = map; CONSP (tail); tail = XCDR (tail)) @@ -3215,6 +3256,7 @@ else if (CONSP (XCAR (tail))) { int this_shadowed = 0; + event = XCAR (XCAR (tail)); /* Ignore bindings whose "prefix" are not really valid events. @@ -3255,27 +3297,10 @@ tem = Flookup_key (map, kludge, Qt); if (!EQ (tem, definition)) continue; - if (first) - { - previous_description_column = 0; - insert ("\n", 1); - first = 0; - } - - /* THIS gets the string to describe the character EVENT. */ - insert1 (Fkey_description (kludge, prefix)); - - /* Print a description of the definition of this character. - elt_describer will take care of spacing out far enough - for alignment purposes. */ - (*elt_describer) (definition, Qnil); - - if (this_shadowed) - { - SET_PT (PT - 1); - insert_string (" (binding currently shadowed)"); - SET_PT (PT + 1); - } + vect[slots_used].event = event; + vect[slots_used].definition = definition; + vect[slots_used].shadowed = this_shadowed; + slots_used++; } else if (EQ (XCAR (tail), Qkeymap)) { @@ -3289,6 +3314,68 @@ } } + /* If we found some sparse map events, sort them. */ + + qsort (vect, slots_used, sizeof (struct describe_map_elt), + describe_map_compare); + + /* Now output them in sorted order. */ + + for (i = 0; i < slots_used; i++) + { + Lisp_Object start, end; + + if (first) + { + previous_description_column = 0; + insert ("\n", 1); + first = 0; + } + + ASET (kludge, 0, vect[i].event); + start = vect[i].event; + end = start; + + definition = vect[i].definition; + + /* Find consecutive chars that are identically defined. */ + if (INTEGERP (vect[i].event)) + { + while (i + 1 < slots_used + && XINT (vect[i + 1].event) == XINT (vect[i].event) + 1 + && !NILP (Fequal (vect[i + 1].definition, definition)) + && vect[i].shadowed == vect[i + 1].shadowed) + i++; + end = vect[i].event; + } + + /* Now START .. END is the range to describe next. */ + + /* Insert the string to describe the event START. */ + insert1 (Fkey_description (kludge, prefix)); + + if (!EQ (start, end)) + { + insert (" .. ", 4); + + ASET (kludge, 0, end); + /* Insert the string to describe the character END. */ + insert1 (Fkey_description (kludge, prefix)); + } + + /* Print a description of the definition of this character. + elt_describer will take care of spacing out far enough + for alignment purposes. */ + (*elt_describer) (vect[i].definition, Qnil); + + if (vect[i].shadowed) + { + SET_PT (PT - 1); + insert_string (" (binding currently shadowed)"); + SET_PT (PT + 1); + } + } + UNGCPRO; } diff -r ff74a86c2b16 -r c69d44922688 src/lread.c --- a/src/lread.c Tue Jan 03 01:50:46 2006 +0000 +++ b/src/lread.c Tue Jan 03 02:15:28 2006 +0000 @@ -1323,7 +1323,18 @@ int count = SPECPDL_INDEX (); struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; struct buffer *b = 0; + int bpos; int continue_reading_p; + /* Nonzero if reading an entire buffer. */ + int whole_buffer = 0; + /* 1 on the first time around. */ + int first_sexp = 1; + + if (MARKERP (readcharfun)) + { + if (NILP (start)) + start = readcharfun; + } if (BUFFERP (readcharfun)) b = XBUFFER (readcharfun); @@ -1349,7 +1360,6 @@ if (b != 0 && NILP (b->name)) error ("Reading from killed buffer"); - if (!NILP (start)) { /* Switch to the buffer we are reading from. */ @@ -1364,9 +1374,20 @@ /* Set point and ZV around stuff to be read. */ Fgoto_char (start); - Fnarrow_to_region (make_number (BEGV), end); + if (!NILP (end)) + Fnarrow_to_region (make_number (BEGV), end); + + /* Just for cleanliness, convert END to a marker + if it is an integer. */ + if (INTEGERP (end)) + end = Fpoint_max_marker (); } + /* On the first cycle, we can easily test here + whether we are reading the whole buffer. */ + if (b && first_sexp) + whole_buffer = (PT == BEG && ZV == Z); + instream = stream; read_next: c = READCHAR; @@ -1416,8 +1437,11 @@ if (!NILP (start) && continue_reading_p) start = Fpoint_marker (); + + /* Restore saved point and BEGV. */ unbind_to (count1, Qnil); + /* Now eval what we just read. */ val = (*evalfun) (val); if (printflag) @@ -1428,11 +1452,12 @@ else Fprint (val, Qnil); } + + first_sexp = 0; } build_load_history (sourcename, - stream || (INTEGERP (start) && INTEGERP (end) - && XINT (start) == BEG && XINT (end) == Z)); + stream || whole_buffer); UNGCPRO; diff -r ff74a86c2b16 -r c69d44922688 src/minibuf.c --- a/src/minibuf.c Tue Jan 03 01:50:46 2006 +0000 +++ b/src/minibuf.c Tue Jan 03 02:15:28 2006 +0000 @@ -464,6 +464,9 @@ /* String to add to the history. */ Lisp_Object histstring; + Lisp_Object empty_minibuf; + Lisp_Object dummy, frame; + extern Lisp_Object Qfront_sticky; extern Lisp_Object Qrear_nonsticky; @@ -641,6 +644,22 @@ Vminibuf_scroll_window = selected_window; if (minibuf_level == 1 || !EQ (minibuf_window, selected_window)) minibuf_selected_window = selected_window; + + /* Empty out the minibuffers of all frames other than the one + where we are going to display one now. + Set them to point to ` *Minibuf-0*', which is always empty. */ + empty_minibuf = Fget_buffer (build_string (" *Minibuf-0*")); + + FOR_EACH_FRAME (dummy, frame) + { + Lisp_Object root_window = Fframe_root_window (frame); + Lisp_Object mini_window = XWINDOW (root_window)->next; + + if (! NILP (mini_window) && !NILP (Fwindow_minibuffer_p (mini_window))) + Fset_window_buffer (mini_window, empty_minibuf, Qnil); + } + + /* Display this minibuffer in the proper window. */ Fset_window_buffer (minibuf_window, Fcurrent_buffer (), Qnil); Fselect_window (minibuf_window, Qnil); XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0); diff -r ff74a86c2b16 -r c69d44922688 src/process.c --- a/src/process.c Tue Jan 03 01:50:46 2006 +0000 +++ b/src/process.c Tue Jan 03 02:15:28 2006 +0000 @@ -3558,7 +3558,7 @@ int fnum; any++; - for (fp = ifflag_table; flags != 0 && fp; fp++) + for (fp = ifflag_table; flags != 0 && fp->flag_sym; fp++) { if (flags & fp->flag_bit) { diff -r ff74a86c2b16 -r c69d44922688 src/term.c --- a/src/term.c Tue Jan 03 01:50:46 2006 +0000 +++ b/src/term.c Tue Jan 03 02:15:28 2006 +0000 @@ -109,6 +109,10 @@ #define OUTPUT1_IF(tty, a) do { if (a) emacs_tputs ((tty), a, 1, cmputc); } while (0) +/* If true, use "vs", otherwise use "ve" to make the cursor visible. */ + +static int visible_cursor; + /* Display space properties */ extern Lisp_Object Qspace, QCalign_to, QCwidth; @@ -217,7 +221,7 @@ } OUTPUT_IF (tty, tty->TS_termcap_modes); - OUTPUT_IF (tty, tty->TS_cursor_visible); + OUTPUT_IF (tty, visible_cursor ? tty->TS_cursor_visible : tty->TS_cursor_normal); OUTPUT_IF (tty, tty->TS_keypad_mode); losecursor (tty); fflush (tty->output); @@ -359,7 +363,8 @@ { tty->cursor_hidden = 0; OUTPUT_IF (tty, tty->TS_cursor_normal); - OUTPUT_IF (tty, tty->TS_cursor_visible); + if (visible_cursor) + OUTPUT_IF (tty, tty->TS_cursor_visible); } } @@ -3031,6 +3036,13 @@ See `resume-tty'. */); Vresume_tty_functions = Qnil; + DEFVAR_BOOL ("visible-cursor", &visible_cursor, + doc: /* Non-nil means to make the cursor very visible. +This only has an effect when running in a text terminal. +What means \"very visible\" is up to your terminal. It may make the cursor +bigger, or it may make it blink, or it may do nothing at all. */); + visible_cursor = 1; + defsubr (&Stty_display_color_p); defsubr (&Stty_display_color_cells); defsubr (&Stty_no_underline); diff -r ff74a86c2b16 -r c69d44922688 src/textprop.c --- a/src/textprop.c Tue Jan 03 01:50:46 2006 +0000 +++ b/src/textprop.c Tue Jan 03 02:15:28 2006 +0000 @@ -1316,8 +1316,8 @@ properties PROPERTIES. OBJECT is the buffer or string containing the text. OBJECT nil means use the current buffer. SIGNAL_AFTER_CHANGE_P nil means don't signal after changes. Value - is non-nil if properties were replaced; it is nil if there weren't - any properties to replace. */ + is nil if the function _detected_ that it did not replace any + properties, non-nil otherwise. */ Lisp_Object set_text_properties (start, end, properties, object, signal_after_change_p) @@ -1341,7 +1341,7 @@ && XFASTINT (end) == SCHARS (object)) { if (! STRING_INTERVALS (object)) - return Qt; + return Qnil; STRING_SET_INTERVALS (object, NULL_INTERVAL); return Qt;