Mercurial > emacs
changeset 83542:2d56e13fd23d
Merged from emacs@sv.gnu.org
Patches applied:
* emacs@sv.gnu.org/emacs--devo--0--patch-413
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-414
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-415
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-416
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-417
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-418
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-419
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-420
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-421
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-422
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-423
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-424
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-425
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-426
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-427
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-428
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-429
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-430
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-431
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-432
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-433
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-434
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-435
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-436
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-437
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-438
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-439
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-440
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-441
lisp/url/url-methods.el: Fix format error when http_proxy is empty string
* emacs@sv.gnu.org/emacs--devo--0--patch-442
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-443
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-444
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-445
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-446
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-447
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-448
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-449
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-450
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-451
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-452
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-453
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-454
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-455
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-456
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-457
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-458
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-459
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-460
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-461
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-462
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-463
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-464
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-465
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-466
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-467
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-468
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-469
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-470
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-471
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-472
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-473
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-128
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-129
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-130
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-131
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-132
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-133
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-134
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-135
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-136
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-137
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-138
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-139
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-140
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-141
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-142
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-143
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-144
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-145
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-146
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-147
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-148
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-149
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-582
line wrap: on
line diff
--- a/AUTHORS Sat Oct 14 16:56:21 2006 +0000 +++ b/AUTHORS Sat Oct 14 17:36:28 2006 +0000 @@ -12,7 +12,7 @@ Abramo Bagnara: changed term.c Adrian Aichner: changed erc-log.el erc.el erc-autojoin.el erc-backend.el - erc-dcc.el erc-members.el erc-nets.el erc-sound.el + erc-dcc.el erc-members.el erc-nets.el erc-sound.el etags.c Adrian Colley: changed aix3-2.h @@ -46,7 +46,7 @@ Alex Coventry: changed files.el -Alex Ott: changed TUTORIAL.ru ispell.el ru-refcard.ps ru-refcard.tex +Alex Ott: changed TUTORIAL.ru ru-refcard.tex ispell.el ru-refcard.ps Alex Rezinsky: wrote which-func.el @@ -56,8 +56,8 @@ and changed erc.el erc-track.el erc-button.el erc-stamp.el erc-match.el erc-autoaway.el erc-nickserv.el Makefile erc-autojoin.el erc-fill.el erc-pcomplete.el erc-complete.el erc-ibuffer.el erc-members.el - comint.el custom.el erc-bbdb.el erc-chess.el erc-ezbounce.el - erc-imenu.el erc-page.el and 24 other files + rcirc.texi comint.el custom.el erc-bbdb.el erc-chess.el erc-ezbounce.el + erc-imenu.el and 24 other files Alexander Klimov: changed man.el @@ -80,6 +80,8 @@ Alfred M. Szmidt: changed compile.el html2text.el +Alfredo Finelli: changed TUTORIAL.it + Ami Fischman: changed calendar.el diary-lib.el Anders Holst: wrote hippie-exp.el @@ -110,11 +112,12 @@ Andreas Luik: changed xfns.c xterm.c Andreas Schwab: changed Makefile.in files.el lisp.h xdisp.c alloc.c - configure.in fns.c coding.c dired.el editfns.c info.el eval.c fileio.c - print.c simple.el buffer.c minibuf.c xterm.c emacs.c keyboard.c - process.c and 443 other files - -Andreas Seltenreich: changed nnweb.el gnus-art.el gnus-ml.el gnus.texi + configure.in fns.c print.c coding.c dired.el editfns.c info.el eval.c + fileio.c simple.el buffer.c minibuf.c xterm.c emacs.c keyboard.c + process.c and 444 other files + +Andreas Seltenreich: changed nnweb.el gnus-art.el gnus-ml.el gnus-srvr.el + gnus-start.el gnus-util.el gnus.el gnus.texi mm-url.el nnslashdot.el url-cookie.el url-http.el Andrew Choi: wrote mac-win.el @@ -189,6 +192,8 @@ Benjamin Rutt: changed vc.el diff-mode.el ffap.el nnmbox.el simple.el vc-cvs.el +Bill Atkins: changed wdired.el + Bill Burton: changed ptx.h sequent-ptx.h Bill Carpenter: wrote feedmail.el (public domain) @@ -231,6 +236,8 @@ Bob Halley: changed esh-io.el +Bob Rogers: changed ffap.el + Bob Weiner: changed info.el quail.el Boris Goldowsky: wrote avoid.el descr-text.el enriched.el facemenu.el @@ -304,17 +311,18 @@ Cheng Gao: changed MORE.STUFF flymake.el tips.texi url-dired.el url-file.el url-handlers.el url-http.el url-nfs.el -Chong Yidong: changed custom.el cus-edit.el longlines.el display.texi - files.el files.texi simple.el text.texi custom.texi cus-theme.el - wid-edit.el xterm.c frames.texi info.el misc.texi mouse.el xfns.c - anti.texi dired.texi image.c keymaps.texi and 131 other files +Chong Yidong: changed cus-edit.el custom.el simple.el display.texi + longlines.el files.el text.texi custom.texi files.texi wid-edit.el + cus-theme.el info.el keyboard.c xterm.c compile.el frames.texi + image-mode.el keymaps.texi misc.texi mouse.el sendmail.el + and 156 other files Chris Hanson: changed xscheme.el scheme.el xterm.c hpux.h x11term.c hp9000s300.h keyboard.c process.c texinfmt.el emacsclient.c sort.el syntax.c texnfo-upd.el x11fns.c xfns.c dired.el fileio.c hp9000s800.h indent.c info.el man.el and 17 other files -Chris Moore: changed wdired.el +Chris Moore: changed dired.el wdired.el Chris Prince: changed w32term.c @@ -378,10 +386,10 @@ gnus-group.el gnus-score.el nnmail.el Dan Nicolaescu: wrote iris-ansi.el romanian.el -and changed term.el hideshow.el xterm.el isearch.el icon.el cus-edit.el - font-lock.el lisp.h sh-script.el eterm-color.ti faces.el rxvt.el - vhdl-mode.el bindings.el compile.el dabbrev.el grep.el ibuffer.el - imenu.el outline.el replace.el and 153 other files +and changed term.el xterm.el hideshow.el isearch.el icon.el lisp.h + cus-edit.el font-lock.el sh-script.el eterm-color.ti faces.el + ibuffer.el rxvt.el vhdl-mode.el xterm.c bindings.el compile.el + dabbrev.el grep.el imenu.el outline.el and 159 other files Daniel Brockman: changed cus-start.el format-spec.el ibuffer.el rcirc.el @@ -425,7 +433,7 @@ welsh.el and changed configure.in Makefile.in help.el fortran.el browse-url.el mule-cmds.el simple.el xterm.c cus-edit.el files.el info.el mule.el - wid-edit.el vc.el fns.c rfc2047.el bindings.el cus-start.el buffer.c + wid-edit.el fns.c vc.el rfc2047.el bindings.el cus-start.el buffer.c byte-opt.el bytecomp.el and 729 other files Dave Pearson: wrote 5x5.el quickurl.el @@ -470,10 +478,9 @@ etags-vmslib.c fortran.el hexl.c isearch.el and 12 other files David Kastrup: changed greek.el replace.el search.c ange-ftp.el faq.texi - calc.el meta-mode.el process.c search.texi DEBUG MAILINGLISTS - Makefile.in autoload.el browse-url.el buffer.c building.texi - calc-alg.el configure.in cus-theme.el desktop.el dispnew.c - and 21 other files + help.el mouse.el Makefile.in calc.el desktop.el keymaps.texi + meta-mode.el process.c search.texi DEBUG MAILINGLISTS autoload.el + browse-url.el buffer.c building.texi calc-alg.el and 30 other files David K,Ae(Bgedal: wrote tempo.el and changed sendmail.el xmenu.c @@ -530,6 +537,8 @@ Denis Howe: wrote browse-url.el +Denis St,A|(Bnkel: changed ibuf-ext.el + Derek Atkins: changed pgg-pgp.el Derek L. Davies: changed gud.el @@ -542,7 +551,7 @@ erc-track.el erc-nets.el erc-backend.el erc-list.el erc-nickserv.el erc-autoaway.el erc-stamp.el erc-compat.el erc-goodies.el erc-log.el Makefile erc-fill.el erc-ibuffer.el erc-notify.el erc-ring.el - erc-speak.el erc-speedbar.el and 22 other files + erc-speak.el erc-speedbar.el and 25 other files Dick King: wrote uniquify.el @@ -584,8 +593,8 @@ Edward O'connor: changed erc.el erc-viper.el erc-log.el erc-track.el viper.el erc-backend.el erc-chess.el erc-dcc.el erc-ezbounce.el - erc-list.el erc-macs.el erc-match.el erc-ring.el erc-stamp.el - goto-addr.el + erc-goodies.el erc-list.el erc-macs.el erc-match.el erc-ring.el + erc-stamp.el goto-addr.el Edwin Steiner: changed gnus-nocem.el @@ -601,8 +610,8 @@ Eli Zaretskii: wrote codepage.el rxvt.el tty-colors.el and changed msdos.c Makefile.in files.el makefile.w32-in info.el fileio.c startup.el mainmake.v2 config.bat menu-bar.el pc-win.el simple.el - internal.el msdos.h xfaces.c rmail.el dosfns.c frame.c faces.el emacs.c - frame.el and 512 other files + internal.el msdos.h xfaces.c frame.c rmail.el dosfns.c faces.el + frame.el emacs.c and 517 other files Emanuele Giaquinta: changed rxvt.el configure.in etags.c frame.el sh-script.el text.texi @@ -628,8 +637,8 @@ Eric Ding: wrote goto-addr.el and changed mh-utils.el mh-e.el mh-comp.el mh-mime.el -Eric Hanchrow: changed TUTORIAL.es abbrev.el autorevert.el dired.el - emacsclient.c ispell.el make-dist +Eric Hanchrow: changed TUTORIAL.es abbrev.el autorevert.el delphi.el + dired.el emacsclient.c ispell.el make-dist Eric M. Ludlam: wrote checkdoc.el dframe.el ezimage.el sb-image.el speedbar.el @@ -686,6 +695,8 @@ Florian Weimer: changed message.el coding.c gnus-art.el gnus.el gnus.texi mm-util.el +Francesc Rocher: changed cus-start.el macterm.c w32term.c xdisp.c xterm.c + Francesco Potort,Al(B: wrote cmacexp.el and changed etags.c man.el delta.h undigest.el comint.el configure.in uniquify.el etags.1 latin-post.el rmail.el etags.el latin-alt.el @@ -699,7 +710,7 @@ erc-button.el erc-goodies.el erc-nets.el erc-ring.el Makefile erc-pcomplete.el erc-backend.el erc-ibuffer.el erc-match.el erc-nickserv.el erc-page.el erc-speedbar.el keymaps.texi message.el - os.texi saveplace.el xterm.c xterm.h + os.texi saveplace.el w32term.c and 3 other files Francois Felix Ingrand: changed gnus-salt.el @@ -795,7 +806,7 @@ calendar.texi appt.el sh-script.el timeclock.el cal-menu.el cal-hebrew.el cal-islam.el files.el holidays.el programs.texi scroll-all.el startup.el cal-coptic.el cal-julian.el cal-move.el - cal-tex.el cal-x.el and 36 other files + cal-tex.el cal-x.el and 37 other files Glynn Clements: wrote gamegrid.el snake.el tetris.el @@ -824,7 +835,7 @@ Gunnar Horrigmo: changed gnus-sum.el -Gustav H,Ae(Bllberg: changed compile.el +Gustav H,Ae(Bllberg: changed compile.el rect.el Guy Geens: changed gnus-score.el @@ -959,9 +970,9 @@ Jan Dj,Ad(Brv: wrote dnd.el x-dnd.el and changed gtkutil.c xterm.c xfns.c xmenu.c xterm.h gtkutil.h - configure.in Makefile.in config.in configure frames.texi keyboard.c - emacs.c x-win.el xselect.c xlwmenu.c alloc.c startup.el xdisp.c - xresources.texi fileio.c and 168 other files + configure.in keyboard.c Makefile.in config.in frames.texi configure + x-win.el emacs.c xselect.c alloc.c xlwmenu.c startup.el xdisp.c + xresources.texi cus-start.el and 172 other files Jan Nieuwenhuizen: changed info.el TUTORIAL.nl emacs.c emacsclient.c gnus-start.el gud.el nnmh.el server.el startup.el @@ -983,13 +994,13 @@ and changed w32fns.c w32term.c w32menu.c w32-win.el w32term.h makefile.w32-in w32.c w32bdf.c w32-fns.el w32select.c w32console.c w32gui.h w32proc.c keyboard.c mule-cmds.el emacs.c fileio.c w32bdf.h - w32inevt.c config.nt configure.bat and 77 other files + w32inevt.c config.nt configure.bat and 79 other files Jay Belanger: changed calc.texi calc.el calc-ext.el calc-embed.el calc-aent.el calc-prog.el calc-arith.el calc-help.el calc-lang.el - calcalg2.el calc-graph.el calc-store.el calc-units.el calc-misc.el - calc-yank.el calc-alg.el calc-poly.el calccomp.el calc-mode.el - calc-vec.el calc-forms.el and 26 other files + calcalg2.el COPYING calc-graph.el calc-store.el calc-units.el + calc-misc.el calc-yank.el calc-alg.el calc-poly.el calccomp.el + calc-mode.el calc-rewr.el and 34 other files Jay K. Adams: wrote jka-cmpr-hook.el jka-compr.el @@ -999,6 +1010,8 @@ Jeff Dwork: changed ehelp.el facemenu.el +Jeff Miller: changed appt.el + Jeff Morgenthaler: changed flow-ctrl.el vt200.el vt201.el vt220.el vt240.el @@ -1056,6 +1069,8 @@ Jim Wilson: changed Makefile.in alloca.c +Jindrich Makovicka: changed eval.c fns.c + Jirka Kosek: changed mule.el Joakim Hove: wrote html2text.el @@ -1092,10 +1107,10 @@ Joev Dubach: changed nntp.el Johan Bockg,Ae(Brd: changed erc.el erc-backend.el cl-macs.el erc-match.el - erc-nickserv.el erc-ring.el erc-speak.el erc-track.el align.el - calendar.el cl.texi custom.el dired-aux.el display.texi erc-bbdb.el - erc-button.el erc-compat.el erc-dcc.el erc-list.el erc-log.el - erc-nicklist.el and 9 other files + erc-nickserv.el erc-ring.el erc-speak.el erc-track.el simple.el + align.el calendar.el cl.texi custom.el dired-aux.el display.texi + erc-bbdb.el erc-button.el erc-compat.el erc-dcc.el erc-list.el + erc-log.el and 10 other files Johan Vromans: wrote forms-d2.el forms.el iso-acc.el and changed complete.el @@ -1110,7 +1125,7 @@ John H. Palmieri: changed gnus-fun.el -John Heidemann: wrote mouse-copy.el mouse-drag.el zone-mode.el +John Heidemann: wrote mouse-copy.el mouse-drag.el John Hughes: changed term.c @@ -1118,8 +1133,8 @@ John Paul Wallington: changed ibuffer.el ibuf-ext.el subr.el files.el help-fns.el thumbs.el fns.c rmail.el bindings.el bytecomp.el - cus-theme.el info.el re-builder.el startup.el xfns.c apropos.el - arc-mode.el browse-url.el comint.el cus-start.el display.texi + cus-theme.el info.el re-builder.el simple.el startup.el xfns.c + apropos.el arc-mode.el browse-url.el comint.el cus-start.el and 115 other files John Robinson: wrote bg-mouse.el @@ -1166,7 +1181,7 @@ erc-button.el erc-fill.el erc-truncate.el erc-compat.el erc-members.el Makefile erc-dcc.el erc-ibuffer.el erc-page.el erc-pcomplete.el erc-sound.el erc-bbdb.el erc-imenu.el erc-lang.el erc-list.el - erc-macs.el and 8 other files + erc-macs.el and 9 other files Jose E. Marchesi: changed smtpmail.el @@ -1194,7 +1209,7 @@ Juanma Barranquero: changed makefile.w32-in help-fns.el subr.el faces.el files.el w32fns.c cperl-mode.el replace.el simple.el eval.c sh-script.el vhdl-mode.el comint.el org.el xdisp.c allout.el bs.el - desktop.el idlwave.el keyboard.c process.c and 549 other files + desktop.el idlwave.el keyboard.c process.c and 550 other files Juergen Hoetzel: changed url-handlers.el @@ -1208,8 +1223,8 @@ Juri Linkov: changed info.el simple.el isearch.el replace.el compile.el faces.el display.texi grep.el descr-text.el cus-edit.el dired.el - dired-aux.el edebug.el files.el lisp-mode.el lisp.el mule.el - compare-w.el desktop.el files.texi font-lock.el and 218 other files + dired-aux.el edebug.el files.el lisp-mode.el lisp.el modes.texi mule.el + compare-w.el desktop.el files.texi and 220 other files Justin Sheehy: changed gnus-sum.el nntp.el @@ -1236,10 +1251,10 @@ knd-util.el loadup.el makefile.w32-in Karl Berry: changed info.texi emacs.texi elisp.texi emacs-xtra.texi - filelock.c building.texi cmdargs.texi copyright.el dired.c faq.texi - gnu.texi help.texi macos.texi msdog.texi mule.texi sending.texi - texinfo.el texinfo.tex abbrevs.texi ada-mode.texi anti.texi - and 54 other files + filelock.c anti.texi building.texi cmdargs.texi copyright.el + custom.texi customize.texi dired.c display.texi faq.texi frames.texi + gnu.texi help.texi macos.texi minibuf.texi msdog.texi mule.texi + and 65 other files Karl Chen: changed files.el align.el cc-vars.el gnus-art.el help-mode.el jka-cmpr-hook.el make-mode.el perl-mode.el python.el tex-mode.el @@ -1249,8 +1264,8 @@ dired.el info.el menu-bar.el midnight.el po.el Karl Fogel: wrote bookmark.el mail-hist.el saveplace.el -and changed isearch.el menu-bar.el autogen.sh editfns.c vc-svn.el - window.c +and changed isearch.el menu-bar.el autogen.sh editfns.c nnmail.el + vc-svn.el window.c Karl Heuer: changed keyboard.c lisp.h xdisp.c buffer.c xfns.c xterm.c alloc.c files.el frame.c configure.in window.c data.c minibuf.c @@ -1269,8 +1284,8 @@ Katsumi Yamaoka: wrote canlock.el and changed gnus-art.el message.el gnus-sum.el gnus.texi mm-decode.el mm-view.el gnus-util.el gnus-msg.el gnus.el mm-util.el lpath.el - gnus-start.el gnus-group.el mm-uu.el dgnushack.el gnus-agent.el nntp.el - mml.el nnrss.el rfc2047.el rfc2231.el and 69 other files + gnus-start.el rfc2047.el gnus-group.el mm-uu.el dgnushack.el + gnus-agent.el nntp.el mml.el nnrss.el nnheader.el and 71 other files Kaveh R. Ghazi: changed delta88k.h xterm.c @@ -1307,9 +1322,9 @@ Kenichi Handa: wrote cyrillic.el isearch-x.el py-punct.el pypunct-b5.el quail.el thai-word.el and changed coding.c mule-cmds.el mule.el charset.c fileio.c xterm.c - fns.c ccl.c mule-conf.el Makefile.in fontset.c charset.h coding.h + fns.c ccl.c Makefile.in mule-conf.el fontset.c charset.h coding.h fontset.el mule-diag.el xdisp.c editfns.c process.c insdel.c - japanese.el characters.el and 276 other files + japanese.el characters.el and 277 other files Kenneth Stailey: changed alpha.h configure.in ns32000.h openbsd.h pmax.h sparc.h unexalpha.c unexelf.c @@ -1345,17 +1360,17 @@ Kevin Ryde: wrote info-xref.el and changed info-look.el info.el gnus-art.el gnus-sum.el mailcap.el - text.texi MORE.STUFF cc-align.el cmdargs.texi compile.texi display.texi - em-alias.el em-dirs.el em-hist.el em-unix.el emacs-lisp-intro.texi - ffap.el frames.texi glossary.texi gnus.texi makeinfo.el + os.texi text.texi MORE.STUFF cc-align.el cmdargs.texi compile.texi + display.texi em-alias.el em-dirs.el em-hist.el em-unix.el + emacs-lisp-intro.texi ffap.el frames.texi glossary.texi gnus.texi and 12 other files -Kim F. Storm: wrote animage.el bindat.el cua-base.el cua-gmrk.el - cua-rect.el ido.el keypad.el kmacro.el -and changed xdisp.c dispextern.h simple.el xterm.c process.c window.c - keyboard.c w32term.c subr.el dispnew.c fringe.c lisp.h macterm.c - display.texi fns.c xfaces.c alloc.c xterm.h info.el xfns.c .gdbinit - and 226 other files +Kim F. Storm: wrote bindat.el cua-base.el cua-gmrk.el cua-rect.el + ido.el keypad.el kmacro.el +and changed xdisp.c dispextern.h simple.el window.c xterm.c keyboard.c + process.c w32term.c dispnew.c subr.el lisp.h fringe.c macterm.c + display.texi fns.c alloc.c xfaces.c xfns.c xterm.h keymap.c .gdbinit + and 238 other files Kim-Minh Kaplan: changed gnus-picon.el gnus-sum.el gnus-start.el gnus-win.el gnus-xmas.el gnus.texi message.el nndraft.el nnml.el @@ -1389,7 +1404,9 @@ Kyotaro Horiguchi: changed coding.c indent.c -K,Aa(Broly L$,1 q(Brentey: changed keyboard.c coding.c xfns.c xterm.c xterm.h +K,Aa(Broly L$,1 q(Brentey: changed xfns.c bindings.el keyboard.c HELLO authors.el + buff-menu.el buffer.c buffers.texi cmds.c coding.c editfns.c frame.el + menu-bar.el print.c simple.el xdisp.c xterm.c xterm.h Larry Kolodney: wrote cvtmail.c @@ -1440,8 +1457,8 @@ Leigh Stoller: changed emacsclient.c emacsserver.c server.el -Lennart Borgman: changed mouse.el recentf.el texinfmt.el w32term.c - w32term.h window.el +Lennart Borgman: changed window.el mouse.el recentf.el texinfmt.el + w32term.c w32term.h Lennart Staflin: changed dired.el diary-ins.el diary-lib.el tq.el xdisp.c @@ -1461,17 +1478,13 @@ mailabbrev.el select.el xfaces.c xselect.c Lute Kamstra: changed modes.texi generic.el debug.el generic-x.el - font-lock.el subr.el debugging.texi easy-mmode.el elisp.texi hl-line.el - simple.el Makefile.in battery.el bindings.el calc.el cmdargs.texi - edebug.texi emacs.texi info.el make-tarball.txt octave-inf.el - and 217 other files + font-lock.el subr.el Makefile.in debugging.texi easy-mmode.el + elisp.texi hl-line.el simple.el battery.el bindings.el calc.el + cmdargs.texi edebug.texi emacs.texi info.el make-tarball.txt + octave-inf.el and 217 other files Lynn Slater: wrote help-macro.el -L$,1 q(Brentey K,Aa(Broly: changed bindings.el xfns.c buff-menu.el buffer.c - buffers.texi cmds.c editfns.c frame.el menu-bar.el print.c simple.el - xdisp.c - MCC: wrote xmenu.c and changed emacsclient.c emacsserver.c etags.c lisp.h movemail.c rmail.el rmailedit.el rmailkwd.el rmailmsc.el rmailout.el rmailsum.el @@ -1479,7 +1492,7 @@ Maciek Pasternacki: changed nnrss.el -Magnus Henoch: changed ispell.el +Magnus Henoch: changed ispell.el rcirc.el Manuel Serrano: wrote flyspell.el @@ -1577,9 +1590,10 @@ Martin Neitzel: changed sc.el -Martin Rudalics: changed cus-edit.el wid-edit.el font-lock.el syntax.c - custom.el fileio.c files.el find-func.el hideif.el info.el insdel.c - lisp-mode.el midnight.el mouse.el mwheel.el re-builder.el widget.el +Martin Rudalics: changed cus-edit.el wid-edit.el cus-start.el files.el + font-lock.el insdel.c syntax.c buffer.c buffer.h casefiddle.c custom.el + dispextern.h editfns.c eldoc.el fileio.c find-func.el hideif.el info.el + jit-lock.el lisp-mode.el lisp.h and 13 other files Martin Stjernholm: wrote cc-bytecomp.el and changed cc-engine.el cc-cmds.el cc-langs.el cc-defs.el cc-mode.el @@ -1596,9 +1610,9 @@ Masatake Yamato: wrote cc-subword.el ld-script.el and changed etags.el asm-mode.el xdisp.c bindings.el hexl.el man.el - simple.el wid-edit.el compile.el faces.el pcvs.el register.el - ruler-mode.el add-log.el buffer.c cus-face.el dired-x.el display.texi - font-lock.el gdb-ui.el gud.el and 56 other files + simple.el wid-edit.el add-log.el compile.el faces.el pcvs.el + register.el ruler-mode.el buffer.c cus-face.el dired-x.el display.texi + etags.c font-lock.el gdb-ui.el and 57 other files Masayuki Ataka: changed texinfmt.el texinfo.el characters.el make-mode.el @@ -1679,18 +1693,18 @@ viper-utils.el appt.el desktop.el ediff-meta.el ediff-nult.el ediff.texi viper-mouse.el viper.texi -Michael Olson: changed erc.el erc-backend.el Makefile erc-stamp.el - erc-track.el erc-dcc.el erc-identd.el erc-match.el erc-notify.el - erc.texi erc-ibuffer.el erc-list.el erc-autoaway.el erc-bbdb.el - erc-compat.el erc-goodies.el erc-log.el erc-nicklist.el - erc-pcomplete.el erc-spelling.el erc-*.el and 39 other files +Michael Olson: changed erc.el erc-backend.el Makefile erc.texi + erc-stamp.el erc-log.el erc-autoaway.el erc-identd.el erc-track.el + erc-match.el erc-dcc.el erc-notify.el erc-goodies.el erc-ibuffer.el + erc-list.el erc-pcomplete.el erc-spelling.el erc-bbdb.el erc-compat.el + erc-nicklist.el and 42 other files Michael Piotrowski: changed ps-print.el Michael R. Cook: changed gnus-topic.el gnus-art.el gnus-sum.el -Michael R. Mauger: changed sql.el cua-base.el facemenu.el recentf.el - replace.el tramp.el w32fns.c +Michael R. Mauger: changed sql.el cua-base.el custom.el facemenu.el + recentf.el replace.el tramp.el w32fns.c Michael R. Wolf: changed ange-ftp.el @@ -1705,14 +1719,17 @@ Michael Staats: wrote pc-select.el -Michael Welsh Duggan: changed lisp.h w32term.c buffer.c gnus-spec.el - keyboard.c nnmail.el termhooks.h url-http.el w32-win.el w32fns.c - w32menu.c w32term.h xdisp.c xterm.c +Michael Welsh Duggan: changed lisp.h sh-script.el w32term.c buffer.c + gnus-spec.el keyboard.c nnmail.el termhooks.h url-http.el w32-win.el + w32fns.c w32menu.c w32term.h xdisp.c xterm.c Michal Jankowski: changed insdel.c keyboard.c -Micha,Ak(Bl Cadilhac: changed ispell.el dispnew.c make-mode.el pong.el - print.c process.c +Michal Nazarewicz: changed ispell.el + +Micha,Ak(Bl Cadilhac: changed ispell.el cus-edit.el dispnew.c ido.el info.el + life.el lpr.el make-mode.el pong.el print.c process.c startup.el + uni-input.el Michelangelo Grigni: wrote ffap.el and changed gnus-score.el @@ -1742,8 +1759,8 @@ Milan Zamazal: wrote czech.el glasses.el tildify.el and changed slovak.el abbrev.el compile.el filecache.el files.el -Miles Bader: wrote button.el image-file.el macroexp.el mb-depth.el - minibuf-eldef.el rfn-eshadow.el +Miles Bader: wrote button.el image-file.el macroexp.el minibuf-eldef.el + rfn-eshadow.el and changed comint.el faces.el simple.el editfns.c xfaces.c info.el xdisp.c minibuf.c wid-edit.el xterm.c subr.el window.el cus-edit.el diff-mode.el dispextern.h xfns.c help.el lisp.h quick-install-emacs @@ -1752,7 +1769,7 @@ Miyashita Hisashi: changed ccl.c coding.c coding.h mule-cmds.el mule-conf.el mule.el pop3.el -Miyoshi Masanori: changed mouse.el xdisp.c +Miyoshi Masanori: changed mouse.el smtpmail.el xdisp.c Morioka Tomohiko: changed rmail.el rmailout.el rmailsum.el fns.c message.el nnheader.el nnmail.el rmailkwd.el smiley.el @@ -1779,6 +1796,8 @@ Nagy Andras: wrote gnus-sieve.el and changed imap.el +Nakaji Hiroyuki: changed mm-util.el + Nakamura Toshikazu: changed w32fns.c NeXT, Inc.: wrote unexnext.c @@ -1799,10 +1818,10 @@ Niall Mansfield: changed etags.c Nick Roberts: wrote gdb-ui.el -and changed gud.el building.texi tooltip.el speedbar.el thumbs.el - cc-mode.el DEBUG subr.el xt-mouse.el .gdbinit comint.el frames.texi - bindings.el descr-text.el display.texi gud-display.pbm help-mode.el - speedbar.texi tumme.el xdisp.c byte-run.el and 105 other files +and changed gud.el building.texi tooltip.el speedbar.el thumbs.el DEBUG + cc-mode.el frames.texi subr.el xt-mouse.el .gdbinit bindings.el + comint.el display.texi help-mode.el descr-text.el gud-display.pbm + speedbar.texi tumme.el xdisp.c byte-run.el and 112 other files Nico Francois: changed w32fns.c w32inevt.c w32menu.c @@ -1848,6 +1867,8 @@ Olli Savia: changed etags.c syssignal.h +Osamu Yamane: changed smtpmail.el + Oscar Figueiredo: wrote eudc-bob.el eudc-export.el eudc-hotlist.el eudc-vars.el eudc.el eudcb-bbdb.el eudcb-ldap.el eudcb-ph.el ldap.el and changed ph.el @@ -1869,7 +1890,7 @@ and changed editfns.c vc.el Makefile.in configure.in vc-hooks.el data.c emacs.c gnus.el calendar.el config.in floatfns.c process.c sysdep.c dired.el xterm.c callproc.c fileio.c filelock.c lread.c print.c - rmail.el and 287 other files + rmail.el and 290 other files Paul Fisher: changed fns.c @@ -1976,6 +1997,8 @@ Pmr-Sav: changed mail-utils.el rmail.el +Primoz Peterlin: changed TUTORIAL.sl + R. Bernstein: changed gud.el Rafael Sep,Az(Blveda: changed TUTORIAL.es @@ -1993,8 +2016,9 @@ and changed ffap.el Ralf Angeli: wrote scroll-lock.el -and changed tex-mode.el comint.el flow-fill.el gnus-art.el killing.texi - mm-view.el pcl-cvs.texi smtpmail.el w32fns.c w32term.c window.c +and changed w32fns.c tex-mode.el comint.el flow-fill.el frame.el + gnus-art.el killing.texi mm-view.el pcl-cvs.texi smtpmail.el w32term.c + window.c Ralf Fassel: changed dabbrev.el files.el fill.el iso-acc.el tar-mode.el @@ -2015,11 +2039,11 @@ and changed gnus-art.el gnus-msg.el gnus.texi message.el nnmail.el Reiner Steib: wrote gmm-utils.el -and changed message.el gnus-art.el gnus.texi gnus-sum.el gnus.el +and changed gnus-art.el message.el gnus.texi gnus-sum.el gnus.el gnus-group.el mml.el gnus-faq.texi gnus-score.el gnus-start.el - gnus-util.el gnus-msg.el message.texi gnus-agent.el files.el mm-util.el + gnus-util.el gnus-msg.el message.texi gnus-agent.el mm-util.el files.el spam-report.el nnweb.el spam.el deuglify.el mm-decode.el - and 155 other files + and 161 other files Remek Trzaska: changed gnus-ems.el @@ -2029,6 +2053,8 @@ Reto Zimmermann: changed vhdl-mode.el +Richard Bielawski: changed modes.texi + Richard Dawe: changed Makefile.in config.in Richard G Bielawski: changed paren.el @@ -2045,8 +2071,8 @@ easymenu.el font-lock.el image-mode.el menu-bar.el paren.el and changed keyboard.c files.el simple.el xterm.c xdisp.c rmail.el fileio.c process.c sysdep.c xfns.c buffer.c Makefile.in window.c - configure.in subr.el emacs.c sendmail.el startup.el editfns.c info.el - dispnew.c and 1322 other files + configure.in subr.el startup.el emacs.c editfns.c sendmail.el info.el + dispnew.c and 1334 other files Richard Mlynarik: wrote cl-indent.el ebuff-menu.el ehelp.el env.c rfc822.el terminal.el yow.el @@ -2075,11 +2101,12 @@ Robert Fenk: changed desktop.el Robert J. Chassell: wrote makeinfo.el texinfo.el texnfo-upd.el -and changed texinfmt.el page-ext.el emacs.tex info.el loaddefs.el - texinfo-update.el INSTALL case-table.el cl.texinfo - emacs-lisp-intro.texi history.el informat.el latin-1.el latin-2.el - latin-3.el latin-4.el page.el tex-mode.el texinfo.tex texinfo.texinfo - vip.texinfo +and changed texinfmt.el page-ext.el emacs.tex emacs-lisp-intro.texi + info.el loaddefs.el texinfo-update.el texinfo.tex INSTALL case-table.el + cl.texinfo history.el informat.el latin-1.el latin-2.el latin-3.el + latin-4.el page.el tex-mode.el texinfo.texinfo vip.texinfo + +Robert Thorpe: changed cus-start.el Roderick Schertler: changed dgux.h dgux4.h gud.el sysdep.c @@ -2106,11 +2133,11 @@ Rolf Ebert: wrote ada-mode.el and changed files.el find-file.el -Romain Francoise: changed faq.texi ibuf-ext.el compile.el dired-x.el +Romain Francoise: changed faq.texi dired-x.el ibuf-ext.el compile.el message.el puresize.h replace.el files.texi gnus-fun.el gnus.texi help-fns.el make-dist rcirc.el subr.el Makefile.in antlr-mode.el bookmark.el buffer.c comint.el diary-lib.el dired.el - and 109 other files + and 121 other files Roman Belenov: changed which-func.el @@ -2158,8 +2185,8 @@ and changed mh-e.el mh-utils.el mh-seq.el mh-index.el mh-comp.el mh-mime.el mh-customize.el mh-loaddefs.el mh-funcs.el Makefile mh-alias.el mh-pick.el mh-unit.el mh-init.el mh-identity.el mh-make.el - mh-xemacs-toolbar.el mh-xemacs-compat.el mh-inc.el highlight.xpm - mh-func.el and 7 other files + mh-xemacs-toolbar.el mh-xemacs-compat.el pgg-gpg.el mh-inc.el + highlight.xpm and 7 other files Schlumberger Technology Corporation: changed gud.el @@ -2208,8 +2235,8 @@ mml-sec.el mml-smime.el nnfolder.el nnimap.el nnml.el rfc2104.el sieve-manage.el sieve-mode.el sieve.el smime.el starttls.el tls.el url-imap.el -and changed message.el gnus-sum.el gnus-art.el smtpmail.el pgg-gpg.el - pgg.el gnus-agent.el mml2015.el mml.el mm-decode.el mml1991.el +and changed message.el gnus-sum.el gnus-art.el smtpmail.el pgg.el + pgg-gpg.el gnus-agent.el mml2015.el mml.el mm-decode.el mml1991.el gnus-group.el gnus-msg.el gnus.el pgg-pgp5.el gnus-cache.el gnus-sieve.el browse-url.el gnus-int.el mail-source.el pgg-parse.el and 91 other files @@ -2226,7 +2253,8 @@ Skip Collins: changed w32fns.c w32term.c w32term.h -Slawomir Nowaczyk: changed TUTORIAL.pl flyspell.el ls-lisp.el +Slawomir Nowaczyk: changed python.el TUTORIAL.pl emacs.py flyspell.el + ls-lisp.el Spencer Thomas: changed dabbrev.el emacsclient.c emacsserver.c gnus.texi server.el tcp.c unexec.c @@ -2237,15 +2265,17 @@ log-view.el pcvs-defs.el pcvs-info.el pcvs-parse.el pcvs-util.el reveal.el smerge-mode.el and changed vc.el font-lock.el pcvs.el newcomment.el subr.el lisp.h - keyboard.c tex-mode.el fill.el keymap.c alloc.c compile.el - easy-mmode.el simple.el info.el regex.c syntax.c files.el vc-hooks.el - xdisp.c bytecomp.el and 505 other files + keyboard.c keymap.c tex-mode.el fill.el alloc.c compile.el files.el + regex.c easy-mmode.el simple.el info.el syntax.c xdisp.c vc-hooks.el + sh-script.el and 511 other files Stephan Stahl: changed which-func.el buff-menu.el buffer.c dired-x.texi ediff-mult.el Stephen A. Wood: changed fortran.el +Stephen Berman: changed allout.el + Stephen Eglen: wrote iswitchb.el mspools.el and changed diary-lib.el locate.el octave-inf.el replace.el hexl.el info-look.el sendmail.el spell.el uce.el MORE.STUFF add-log.el @@ -2253,8 +2283,9 @@ bib-mode.el bruce.el c-mode.el ccl.el and 71 other files Stephen Gildea: wrote mh-funcs.el mh-pick.el refcard.tex -and changed time-stamp.el mh-e.el mh-utils.el mh-comp.el mh-customize.el - fileio.c files.el fortran.el mh-e.texi mh-mime.el mwheel.el tex-mode.el +and changed time-stamp.el mh-e.el mh-comp.el mh-utils.el mh-customize.el + fileio.c files.el fortran.el mh-e.texi mh-junk.el mh-mime.el mwheel.el + tex-mode.el Stephen J. Turnbull: changed ediff-init.el strings.texi subr.el @@ -2286,6 +2317,8 @@ Stewart M. Clamen: wrote cal-mayan.el +Stuart D. Herring: changed minibuf.c + Stuart Herring: changed isearch.el align.el allout.el comint.el edebug.el files.el @@ -2300,7 +2333,7 @@ Sundar Narasimhan: changed rnews.el rnewspost.el Sven Joachim: changed arc-mode.el de-refcard.tex files.el files.texi - help.el sed3v2.inp sh-script.el + help.el mule.texi sed3v2.inp sh-script.el Svend Tollak Munkejord: changed deuglify.el @@ -2342,9 +2375,9 @@ Thien-Thi Nguyen: wrote hideshow.el make-mms-derivative.el and changed ewoc.el info.el processes.texi zone.el Makefile.in vc.el - fileio.c lisp-mode.el scheme.el dcl-mode.el display.texi files.el - pcvs.el sysdep.c MORE.STUFF TUTORIAL.it TUTORIAL.ja bindat.el - diary-lib.el diff-mode.el dired.el and 121 other files + fileio.c lisp-mode.el scheme.el text.texi bindat.el dcl-mode.el + display.texi files.el pcvs.el sysdep.c MORE.STUFF TUTORIAL.it + TUTORIAL.ja diary-lib.el diff-mode.el and 125 other files Thierry Emery: changed kinsoku.el timezone.el url-http.el wid-edit.el @@ -2378,7 +2411,7 @@ Tobias C. Rittweiler: changed font-lock.el -Toby Allsopp: changed eudc.el +Toby Allsopp: changed ldap.el eudc.el Toby Speight: changed window.el @@ -2476,7 +2509,7 @@ Werner Benger: changed keyboard.c Werner Lemberg: wrote sisheng.el vntelex.el -and changed Makefile.in TUTORIAL.de calc.texi chinese.el czech.el +and changed TUTORIAL.de Makefile.in calc.texi chinese.el czech.el european.el idlwave.el reftex-vars.el reftex.el reftex.texi slovak.el supercite.el .cvsignore advice.el calc-forms.el calc-sel.el calendar.el china-util.el cl-macs.el cl.texi complete.el and 43 other files @@ -2509,7 +2542,7 @@ Wolfgang Glas: changed unexsgi.c -Wolfgang Jenkner: changed pcvs.el +Wolfgang Jenkner: changed conf-mode.el pcvs.el Wolfgang Rupprecht: wrote float-sup.el floatfns.c sup-mouse.el and changed process.c alloc.c callint.c config.h.in config.in @@ -2527,14 +2560,16 @@ Yagi Tatsuya: changed gnus-art.el gnus-start.el Yamamoto Mitsuharu: changed macterm.c macfns.c mac-win.el mac.c macterm.h - macgui.h image.c macmenu.c macselect.c keyboard.c xdisp.c makefile.MPW - emacs.c macos.texi xfaces.c Makefile.in config.h darwin.h dispextern.h - w32term.c Info.plist and 58 other files + macgui.h image.c macmenu.c macselect.c keyboard.c makefile.MPW xdisp.c + emacs.c config.h macos.texi xfaces.c Makefile.in darwin.h dispextern.h + w32term.c INSTALL and 66 other files Yann Dirson: changed imenu.el Yoichi Nakayama: changed browse-url.el finder.el man.el rfc2368.el +Yoni Rabkin Katzenell: changed whitespace.el + Yoshiki Hayashi: changed texinfmt.el nnheader.el Yoshinori Koseki: changed fontset.el
--- a/CONTRIBUTE Sat Oct 14 16:56:21 2006 +0000 +++ b/CONTRIBUTE Sat Oct 14 17:36:28 2006 +0000 @@ -147,13 +147,13 @@ Discussion about Emacs development takes place on emacs-devel@gnu.org. -Bug reports for released versions are sent to emacs-bugs@gnu.org. +Bug reports for released versions are sent to bug-gnu-emacs@gnu.org. Bug reports for development versions are sent to emacs-pretest-bug@gnu.org. You can subscribe to the mailing lists at savannah.gnu.org/projects/emacs. -You can find the mailing lists archives at mail.gnu.org or gmane.org. +You can find the mailing lists archives at lists.gnu.org or gmane.org. ** Document your changes. @@ -189,7 +189,7 @@ It's sufficient that *Emacs* was changed in those years (and it was!). ** For those files that have been added since then, we should add -the year it was added to Emacs, and all subsequent years." +the year it was added to Emacs, and all subsequent years. ** For the refcards under etc/, it's ok to simply use the latest year (typically in a `\def\year{YEAR}' expression) for the rendered copyright
--- a/COPYING Sat Oct 14 16:56:21 2006 +0000 +++ b/COPYING Sat Oct 14 17:36:28 2006 +0000 @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -15,7 +15,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,7 +55,7 @@ The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest @@ -303,10 +303,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. @@ -336,5 +335,5 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
--- a/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,30 @@ +2006-10-03 Kim F. Storm <storm@cua.dk> + + * AUTHORS: Regenerate. + +2006-09-30 Eli Zaretskii <eliz@gnu.org> + + * configure: Regenerated. + +2006-09-28 Kenichi Handa <handa@m17n.org> + + * configure.in (locallisppath): Don't include leim dir. + (lisppath): Include leim dir. + +2006-09-15 Jay Belanger <belanger@truman.edu> + + * COPYING: Replace "Library Public License" by "Lesser Public + License" throughout. + +2006-09-11 Paul Eggert <eggert@cs.ucla.edu> + + * make-dist (EMACS): Exit and fail if the EMACS environment + variable is set to something other than an absolute file name. + +2006-09-07 Kim F. Storm <storm@cua.dk> + + * AUTHORS: Regenerate. + 2006-08-16 Andreas Schwab <schwab@suse.de> * configure.in (PKG_CHECK_MODULES): Use AS_MESSAGE_LOG_FD instead
--- a/INSTALL.CVS Sat Oct 14 16:56:21 2006 +0000 +++ b/INSTALL.CVS Sat Oct 14 17:36:28 2006 +0000 @@ -60,8 +60,8 @@ If you execute cvs commands inside Emacs, specifically if you use pcl-cvs, output from CVS may be lost due to a problem in the -interface between ssh, cvs, and libc. Corrupted checkins have -also been rumored to have happened. +interface between ssh, cvs, and libc. Corrupted checkins are +also known to have happened. To fix the problem, save the following script into a file, make it executable, and set CVS_RSH to the file name of the script:
--- a/admin/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/admin/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,7 @@ +2006-10-03 Kenichi Handa <handa@m17n.org> + + * FOR-RELEASE (BUGS): "An iso-8859-6 cannot be saved" fixed. + 2006-08-13 Chong Yidong <cyd@stupidchicken.com> * FOR-RELEASE: Elisp manual checking completed.
--- a/admin/FOR-RELEASE Sat Oct 14 16:56:21 2006 +0000 +++ b/admin/FOR-RELEASE Sat Oct 14 17:36:28 2006 +0000 @@ -2,12 +2,13 @@ * TO BE DONE SHORTLY BEFORE RELEASE -** Update release dates of manuals. - ** Check for widow and orphan lines in manuals; make sure all the pages really look ok in the manual as formatted. +** Check for text in manuals that assumes current version is 21. + ** Update AUTHORS. +[Done 2006-10-03] ** Regenerate the postscript files of the reference cards in etc. @@ -33,38 +34,26 @@ These don't need to be fixed to start pretest, but we call the attention of Windows users to fixing them. -** Markus Gritsch's report about Emacs looping on Windoze with the following -.emacs file, and then reduce Emacs frame width to "something quite narrow": - (setq-default truncate-lines t) - (custom-set-variables - '(hscroll-margin 20) - '(hscroll-step 1) - ) +** Drew Adams 12 Aug bug rpt: overlay display artifact: trace left behind +Windows only bug. Bug appears only when Cleartype enabled, probably related +to the hack introduced on 2005-07-01 to fix some other Cleartype problem. -** Drew Adams 12 Aug bug rpt: overlay display artifact: trace left behind -Windows only bug. +** henman@it.to-be.co.jp 09 Aug 2006: ispell.el problem on Cygwin. + (Did we decide that is unreproducible?) * BUGS -** Milan Zamazal's Aug 23 bug report about crashes with certain fonts. - -** C-g fails to interrupt accept-process-output in Gnus. - -** Implement buffer-chars-modified-tick. - -** henman@it.to-be.co.jp 09 Aug 2006: ispell.el problem. - -** Make key-binding use the maps specified by positions given in the events. - +** hashiz@tomba.meridiani.jp, Oct 6: bootstrap failure on FreeBSD 6.2 +Can't be reproduced on GNU/Linux. * DOCUMENTATION ** Check the Emacs Tutorial. -The first line of every tutorial must begin with text ending in a period -(".", ASCII 0x2E) saying "Emacs Tutorial" in the respective language. -This should be followed by "See end for copying conditions", likewise -in the respective language. +The first line of every tutorial must begin with text ending in a +period (".", ASCII 0x2E) saying "Emacs Tutorial" in the respective +language. This should be followed by "See end for copying +conditions", likewise in the respective language. After each file name, on the same line or the following line, come the names of the people who have checked it.
--- a/admin/make-tarball.txt Sat Oct 14 16:56:21 2006 +0000 +++ b/admin/make-tarball.txt Sat Oct 14 17:36:28 2006 +0000 @@ -62,8 +62,11 @@ echo directory: emacs/pretest > FILE.directive (for a pretest) echo directory: emacs > FILE.directive (for a release) gpg --clearsign FILE.directive - Upload by anonymous ftp to ftp://ftp-upload.gnu.org/incoming/ftp/ - the files FILE, FILE.sig, FILE.directive.asc + Upload by anonymous ftp to ftp://ftp-upload.gnu.org/ the files FILE, + FILE.sig, FILE.directive.asc. + For a release, place the files in the /incoming/ftp directory. + For a pretest, place the files in /incoming/alpha instead, so that + they appear on ftp://alpha.gnu.org/. 13. After five minutes, verify that the files are visible at ftp://alpha.gnu.org/gnu/emacs/pretest/ for a pretest, at
--- a/configure Sat Oct 14 16:56:21 2006 +0000 +++ b/configure Sat Oct 14 17:36:28 2006 +0000 @@ -1354,8 +1354,8 @@ lispdir='${datadir}/emacs/${version}/lisp' locallisppath='${datadir}/emacs/${version}/site-lisp:'\ -'${datadir}/emacs/site-lisp:${datadir}/emacs/${version}/leim' -lisppath='${locallisppath}:${lispdir}' +'${datadir}/emacs/site-lisp' +lisppath='${locallisppath}:${lispdir}:${datadir}/emacs/${version}/leim' etcdir='${datadir}/emacs/${version}/etc' archlibdir='${libexecdir}/emacs/${version}/${configuration}' docdir='${datadir}/emacs/${version}/etc'
--- a/configure.in Sat Oct 14 16:56:21 2006 +0000 +++ b/configure.in Sat Oct 14 17:36:28 2006 +0000 @@ -33,8 +33,8 @@ lispdir='${datadir}/emacs/${version}/lisp' locallisppath='${datadir}/emacs/${version}/site-lisp:'\ -'${datadir}/emacs/site-lisp:${datadir}/emacs/${version}/leim' -lisppath='${locallisppath}:${lispdir}' +'${datadir}/emacs/site-lisp' +lisppath='${locallisppath}:${lispdir}:${datadir}/emacs/${version}/leim' etcdir='${datadir}/emacs/${version}/etc' archlibdir='${libexecdir}/emacs/${version}/${configuration}' docdir='${datadir}/emacs/${version}/etc'
--- a/etc/COPYING Sat Oct 14 16:56:21 2006 +0000 +++ b/etc/COPYING Sat Oct 14 17:36:28 2006 +0000 @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -15,7 +15,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,7 +55,7 @@ The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest @@ -303,10 +303,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. @@ -336,5 +335,5 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
--- a/etc/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/etc/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,63 @@ +2006-10-09 David Kastrup <dak@gnu.org> + + * DEVEL.HUMOR: Add the topic line for last entry since that was + what the joke was about. + +2006-10-07 Ognyan Kulev <ogi@fmi.uni-sofia.bg> + + * TUTORIAL.bg: Synchronize with TUTORIAL. + +2006-10-06 Juanma Barranquero <lekktu@gmail.com> + + * DEVEL.HUMOR: New file. + +2006-09-30 Chong Yidong <cyd@stupidchicken.com> + + * PROBLEMS: Document Emacs/XIM/gnome-settings-terminal clash. + +2006-09-26 Vinicius Jose Latorre <viniciusjl@ig.com.br> + + * NEWS: ebnf2ps changes. + +2006-09-26 Reiner Steib <Reiner.Steib@gmx.de> + + * refcard.ps: Regenerate. + +2006-09-18 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * NEWS: Rename x-use-old-gtk-file-dialog to x-gtk-use-old-file-dialog. + +2006-09-15 Jay Belanger <belanger@truman.edu> + + * COPYING: Replace "Library Public License" by "Lesser Public + License" throughout. + +2006-09-15 Richard Stallman <rms@gnu.org> + + * THE-GNU-PROJECT: Update with the latest footnotes + from www.gnu.org/gnu/the-gnu-project.html + +2006-09-15 David Kastrup <dak@gnu.org> + + * NEWS: Explain new behavior and arguments of `key-binding' and + `command-remapping'. + +2006-09-11 Paul Eggert <eggert@cs.ucla.edu> + + * NEWS: In terminal-oriented subshells, the EMACS environment + variable now defaults to Emacs's absolute file name, instead of + to "t". + * PROBLEMS: Adjust tcsh advice for this. + +2006-09-10 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * PROBLEMS (are): Emacs compiled with Gtk+ crashes when closing a + display (x-close-connection). + +2006-09-02 Juri Linkov <juri@jurta.org> + + * HELLO: Regroup Europe Non-ASCII examples by similar scripts. + 2006-08-25 Richard Stallman <rms@gnu.org> * TUTORIAL: Give priority to graphical terminals over text terminals @@ -86,7 +146,7 @@ * PROBLEMS: Emacs now requires ws2_32.dll on Windows. -2006-07-14 K,Aa(Broly L,Bu(Brentey <lorentey@elte.hu> +2006-07-14 K,Aa(Broly L$,1 q(Brentey <lorentey@elte.hu> * HELLO: Update Hungarian sample. @@ -169,8 +229,7 @@ 2006-06-19 Carsten Dominik <dominik@science.uva.nl> - * orgcard.tex (section{Clocking Time}): Add new clocking - commands. + * orgcard.tex (section{Clocking Time}): Add new clocking commands. (section{Structure Editing}): Add global archiving command. 2006-06-14 Thien-Thi Nguyen <ttn@gnu.org> @@ -257,8 +316,7 @@ 2006-05-24 Carsten Dominik <dominik@science.uva.nl> - * orgcard.tex: (section{Motion}): Added the item navigation - commands. + * orgcard.tex (section{Motion}): Added the item navigation commands. (section{Publishing}): New section. (section{Links}): Documented elisp and shell links. @@ -270,8 +328,7 @@ * pl-refcard.tex (Local variables): Add compile-command. - * ru-refcard.tex (Local variables): Add compile-command and - coding. + * ru-refcard.tex (Local variables): Add compile-command and coding. * pt-br-refcard.tex: Don't \input psfig. @@ -285,7 +342,7 @@ * pl-refcard.tex (section{Info}): Ditto. Translation suggested by Slawomir Nowaczyk <slawomir.nowaczyk.847@student.lu.se>. - * cs-refcard.tex (section{Info}): Use `s' instead of `M-s'. Entry + * cs-refcard.tex (section{Info}): Use `s' instead of `M-s'. Entry for `i' is not translated yet. * pt-br-refcard.tex (section{Info}): Ditto. @@ -366,7 +423,7 @@ 2006-04-11 Carsten Dominik <dominik@science.uva.nl> - * orgcard.tex: (section{Tables}): Document column narrowing. + * orgcard.tex (section{Tables}): Document column narrowing. (section{Links}): Document bracket links. 2006-04-11 Kenichi Handa <handa@m17n.org> @@ -395,11 +452,11 @@ New bitmaps for new images. * images/refresh.xpm, images/sort-ascending.xpm, - * images/sort-descending.xpm: Update with GTK 2.x images. Note + * images/sort-descending.xpm: Update with GTK 2.x images. Note that the default GTK icons are not overridden by the GNOME theme - due to a bug which was fixed in GNOME 2.15. Once GNOME 2.16 is in + due to a bug which was fixed in GNOME 2.15. Once GNOME 2.16 is in wide circulation, then the GTK icons should be replaced with the - equivalent GNOME icons. Until then, we should be consistent with + equivalent GNOME icons. Until then, we should be consistent with GTK first, then GNOME. * images/mail/repack.xpm, images/mail/reply-from.xpm: @@ -457,9 +514,9 @@ 2006-03-11 Bill Wohler <wohler@newt.com> - * NEWS: Document `image-load-path-for-library'. Note that all + * NEWS: Document `image-load-path-for-library'. Note that all images have been moved from lisp into etc/images in `find-image' - item. Fix typo in `copy-tree'. + item. Fix typo in `copy-tree'. 2006-03-09 Reiner Steib <Reiner.Steib@gmx.de> @@ -481,7 +538,7 @@ 2006-02-22 Carsten Dominik <dominik@science.uva.nl> - * orgcard.tex: (section{Links}): Rewritten to cover the modified + * orgcard.tex (section{Links}): Rewritten to cover the modified link system. 2006-02-18 Bill Wohler <wohler@newt.com> @@ -555,11 +612,11 @@ 2006-01-23 Michael Albinus <michael.albinus@gmx.de> - * NEWS: tramp can be removed by M-x tramp-unload-tramp. + * NEWS: Tramp can be removed by M-x tramp-unload-tramp. 2006-01-15 Dan Nicolaescu <dann@ics.uci.edu> - * e/eterm-color.ti: Re-enable the ri entry. Add kich1. + * e/eterm-color.ti: Re-enable the ri entry. Add kich1. 2006-01-13 Richard M. Stallman <rms@gnu.org> @@ -664,7 +721,7 @@ 2005-10-27 Dan Nicolaescu <dann@ics.uci.edu> * e/eterm-color.ti (el1): Undo 2005-10-23 change. - Add some comments on how to update this file. Add ri + Add some comments on how to update this file. Add ri capability that has long been supported by term.el. 2005-10-25 Nick Roberts <nickrob@snap.net.nz> @@ -691,7 +748,7 @@ 2005-10-17 Bill Wohler <wohler@newt.com> - Moved all remaining images from lisp/toolbar to etc/images. The + Moved all remaining images from lisp/toolbar to etc/images. The low resolution images were placed in their own directory (low-color). * images/attach.*, images/cancel.*, images/close.*: @@ -838,7 +895,7 @@ * GNUS-NEWS: Fix IDNA notes. -2005-09-27 Jay Belanger <belanger@truman.edu> +2005-09-27 Jay Belanger <belanger@truman.edu> * calccard.tex: Update `versionnumber', remove `versiondate'. (Error Recovery): Refer to "initial state" rather than "default state". @@ -1245,7 +1302,7 @@ 2004-09-26 Dan Nicolaescu <dann@ics.uci.edu> - * e/eterm.ti: Comment out smcup, rmcup. Add kbs, kdch1, rc, sc. + * e/eterm.ti: Comment out smcup, rmcup. Add kbs, kdch1, rc, sc. Reformat. * e/eterm: Regenerate. @@ -1356,7 +1413,7 @@ 2004-06-10 Lars Hansen <larsh@math.ku.dk> - * NEWS: Describe dired-omit-mode. Describe desktop package changes. + * NEWS: Describe dired-omit-mode. Describe desktop package changes. 2004-05-29 Steven Tamm <steventamm@mac.com> @@ -1379,7 +1436,7 @@ 2004-04-13 Marcelo Toledo <marcelo@gnu.org> - * TUTORIAL.pt_BR: initial check-in. + * TUTORIAL.pt_BR: Initial check-in. 2004-05-06 Dave Love <fx@gnu.org> @@ -1743,7 +1800,7 @@ 2001-08-05 Pavel Jan,Am(Bk <Pavel@Janik.cz> - * TUTORIAL.cs, TUTORIAL.sk, cs-refcard.tex, sk-refcard.tex: e-mail + * TUTORIAL.cs, TUTORIAL.sk, cs-refcard.tex, sk-refcard.tex: E-mail address of Milan Zamazal changed. 2001-08-04 Pavel Jan,Am(Bk <Pavel@Janik.cz> @@ -1857,7 +1914,7 @@ 2001-01-08 Kevin Gallagher <kevingal@onramp.net> * edt-user.doc: Updated to reflect EDT Emulation version 4.0 - enhancements. + enhancements. 2000-12-29 Gerd Moellmann <gerd@gnu.org> @@ -2182,7 +2239,7 @@ 1995-06-28 Eric S. Raymond <esr@spiff.gnu.ai.mit.edu> - * termcap.dat, termcap.ucb: deleted and replaced. + * termcap.dat, termcap.ucb: Deleted and replaced. * termcap: New termcap file from the ncurses project; bigger, better, brighter, does away with waxy yellow buildup. Email @@ -2275,7 +2332,7 @@ 1993-06-16 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu) - Bring mumbleclean targets into conformance with GNU coding standards. + Bring mumbleclean targets into conformance with GNU coding standards. * Makefile (distclean): Don't remove backup and autosave files. These are easy to get rid of in other ways, and a pain to lose. (mostlyclean, realclean): New targets. @@ -2298,7 +2355,7 @@ 1993-05-22 Jim Blandy (jimb@geech.gnu.ai.mit.edu) - * Version 19.7 released. + * Version 19.7 released. 1993-05-19 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu) @@ -2319,7 +2376,7 @@ out of date. This file referenced LNEWS when it should have said news.texi; fixed. - news.texi: invocation-name now exists. + * news.texi: invocation-name now exists. 1993-03-27 Eric S. Raymond (eric@geech.gnu.ai.mit.edu) @@ -2339,7 +2396,7 @@ 1993-03-19 Eric S. Raymond (eric@geech.gnu.ai.mit.edu) - * MACHINES: Deleted some VMS caveats. If the src and lisp + * MACHINES: Deleted some VMS caveats. If the src and lisp ChangeLogs are correct, dired and mail and process control are now fully supported. @@ -2361,7 +2418,7 @@ I nuked it. Let the file mod date serve. Merged in APOLLO and SUNBUG files. Changed references to 18.* to past tense. - * emacs.names: merged into JOKES. I faked a mail header from the + * emacs.names: Merged into JOKES. I faked a mail header from the Unknown User to delimit the first (unheaded) bit. * Makefile (relock, unlock): New productions. @@ -2373,30 +2430,30 @@ the Emacs distribution, I have the following changes in the etc directory: - * CHARACTERS: merged into TO-DO file under the heading "Long Range:" - - * DIFF, CCADIFF and GOSDIFF: merged into a new outline file titled + * CHARACTERS: Merged into TO-DO file under the heading "Long Range:" + + * DIFF, CCADIFF, GOSDIFF: Merged into a new outline file titled OTHER.EMACSES. The present names don't really convey anything. Various key bindings and feature descriptions have been updated. - * NICKLES.WORTH. Nuked. This is copyrighted material that could land + * NICKLES.WORTH: Nuked. This is copyrighted material that could land FSF in hot water. - * INTERVAL.IDEAS: Nuked. RMS's thinking, and indeed the + * INTERVAL.IDEAS: Nuked. RMS's thinking, and indeed the implementation of intervals, have progressed way beyond this. - * RCP: Nuked. It no longer said anything but "Ooops, sorry!" - - * ED.WORSHIP, GNU.JOKES: merged into a mailbox called JOKES. + * RCP: Nuked. It no longer said anything but "Ooops, sorry!" + + * ED.WORSHIP, GNU.JOKES: Merged into a mailbox called JOKES. Future jokes can accumulate there. - * DISTRIB: the actual domestic order form is now ORDERS.USA. + * DISTRIB: The actual domestic order form is now ORDERS.USA. The DISTRIB text now mentions 19. - * ORDERS.USA: created. This is just the order form. DISTRIB + * ORDERS.USA: Created. This is just the order form. DISTRIB has a pointer to it at the beginning. - * EUROPE: renamed to ORDERS.EUROPE. DISTRIB now has a pointer + * EUROPE: Renamed to ORDERS.EUROPE. DISTRIB now has a pointer to it at the beginning. * OOOONEWS, OOOONEWS: Nuked. It's version 19 --- nobody needs the @@ -2408,7 +2465,7 @@ 1993-03-17 Eric S. Raymond (eric@mole.gnu.ai.mit.edu) - * XENIX: nuked (moved to =XENIX). The hackery it describes is + * XENIX: Nuked (moved to =XENIX). The hackery it describes is no longer necessary in the presence of 19's function-key-map feature; I've added an explanation to the beginning of the file. @@ -2513,7 +2570,7 @@ 1992-03-31 Jim Blandy (jimb@pogo.cs.oberlin.edu) - * lib-src/Makefile, etc/MACHINES, etc/NEWS: Changed references to + * lib-src/Makefile, etc/MACHINES, etc/NEWS: Changed references to `config.emacs' to `configure'. * lib-src/Makefile: Adjusted for renaming of share-lib to etc. @@ -2609,7 +2666,7 @@ * etags.c (C_entries): Process token before handling end of line. When inner loops reach end of line, just back up. Let the real end of line processing happen in just one place. - (consider_token): Likewise. + (consider_token): Likewise. 1991-04-11 Jim Blandy (jimb@geech.gnu.ai.mit.edu) @@ -2680,7 +2737,7 @@ 1990-08-30 David Lawrence (tale@pogo.ai.mit.edu) - * emacs.1: Add break before -nw option. + * emacs.1: Add break before -nw option. 1990-08-19 David J. MacKenzie (djm@apple-gunkies) @@ -2722,7 +2779,7 @@ 1990-03-14 Joseph Arceneaux (jla@churchy.ai.mit.edu) - * etags.c (getit): Recognize '$' as beginning identifiers. + * etags.c (getit): Recognize '$' as beginning identifiers. 1990-02-22 David Lawrence (tale@pogo.ai.mit.edu) @@ -2844,15 +2901,15 @@ 1989-04-18 Richard Stallman (rms@sugar-bombs.ai.mit.edu) - * loadst.c: on bsd4.3, use gettimeofday instead of CPUSTATES. + * loadst.c: On bsd4.3, use gettimeofday instead of CPUSTATES. 1989-03-15 Jeff Peck (rms@sugar-bombs.ai.mit.edu) * emacstool.c: setenv IN_EMACSTOOL=t, TERM=sun, TERMCAP=. - * emacsstool.1: update to document environment variables. - -1989-02-21 Mosur Mohan (email@notavailable) + * emacsstool.1: Update to document environment variables. + +1989-02-21 Mosur Mohan (email@notavailable) * etags.c (PAS_funcs): New function. @@ -2866,7 +2923,7 @@ 1989-02-15 Richard Stallman (rms@sugar-bombs.ai.mit.edu) - * etags.c: Prolog support from Sunichirou Sugou + * etags.c: Prolog support from Sunichirou Sugou. 1989-02-03 Richard Stallman (rms@sugar-bombs.ai.mit.edu) @@ -2879,7 +2936,7 @@ 1989-01-19 Sam Kendall (email@notavailable) * etags.c: Greatly rewritten for C++ support and for multiple tags - per line. + per line. 1989-01-03 Richard Stallman (rms@sugar-bombs.ai.mit.edu) @@ -2889,8 +2946,8 @@ 1988-12-31 Richard Mlynarik (mly@rice-chex.ai.mit.edu) - * env.c: Add decl for my-index - * etags.c (file-entries): .oak => scheme + * env.c: Add decl for my-index. + * etags.c (file-entries): .oak => scheme 1988-12-30 Richard Stallman (rms@sugar-bombs.ai.mit.edu) @@ -2934,8 +2991,8 @@ 1988-11-29 Richard Mlynarik (mly@pickled-brain.ai.mit.edu) - * movemail.c: Better error message when can't create tempname. - This file needs a great deal of extra error-checking and lucid reporting... + * movemail.c: Better error message when can't create tempname. + This file needs a great deal of extra error-checking and lucid reporting... 1988-11-16 Richard Stallman (rms@sugar-bombs.ai.mit.edu) @@ -2953,7 +3010,7 @@ 1988-09-24 Richard Stallman (rms@gluteus.ai.mit.edu) - * etags.c (main): default setting of eflag was backwards. + * etags.c (main): Default setting of eflag was backwards. 1988-09-23 Richard Stallman (rms@sugar-bombs.ai.mit.edu) @@ -3018,8 +3075,8 @@ 1988-05-13 Chris Hanson (cph@kleph) - * emacsclient.c: Delete references to unused variable `out'. This - caused a bus error when used under hp-ux. + * emacsclient.c: Delete references to unused variable `out'. + This caused a bus error when used under hp-ux. 1988-05-06 Richard Stallman (rms@frosted-flakes.ai.mit.edu) @@ -3036,7 +3093,7 @@ 1988-04-28 Richard Stallman (rms@frosted-flakes.ai.mit.edu) * movemail.c: #undef close, since config can #define it on V.3. - * emacsclient.c, fakemail.c, loadst.c, server.c: likewise. + * emacsclient.c, fakemail.c, loadst.c, server.c: Likewise. 1988-04-26 Richard Stallman (rms@lucky-charms.ai.mit.edu) @@ -3047,9 +3104,9 @@ 1988-03-20 Richard M. Stallman (rms@wilson) - * server.c [not BSD and not HAVE_SYSVIPC]: fix error message. - - * loadst.c (main) [XENIX]: use /usr/spool/mail, not /usr/mail. + * server.c [not BSD and not HAVE_SYSVIPC]: Fix error message. + + * loadst.c (main) [XENIX]: Use /usr/spool/mail, not /usr/mail. ;; Local Variables: ;; coding: iso-2022-7bit
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/DEVEL.HUMOR Sat Oct 14 17:36:28 2006 +0000 @@ -0,0 +1,138 @@ +---------------- -*- mode: text; coding: utf-8; fill-column: 70 -*- -- +-- -- +-- Humor (sometimes unintended) on the Emacs developer's list -- +-- -- +---------------------------------------------------------------------- + + "Is it legal for a `struct interval' to have a total_length field of +zero?" + "We can't be arrested for it as far as I know, but it is definitely +invalid for an interval to have zero length." + -- Miles Bader and RMS + +---------------------------------------------------------------------- + +Re: lost argument and doc string + +I remember when I lost an argument. Boy did that hurt! ;-). + -- RMS + +---------------------------------------------------------------------- + + "'Cowardly' is not an adverb, although it looks like one. It is an +adjective. It makes a statement about general temperament, rather +than a specific occasion. I don't think Emacs has a general +temperament." + "Mine does." + -- RMS and Eli Zaretskii + +---------------------------------------------------------------------- + + "In order to bring the user's attention to the minibuffer when an +item such as 'Edit -> Search' is activated from the menu, I was just +thinking that we could draw a big rectangle around the minibuffer, +blinking (or zooming in-and-out) until some input is typed in." + "How about dancing elephants?" + "They don't fit in my office." + "Well once the elephants are done, your office will be much... +bigger." + -- Stefan Monnier, Miles Bader and Kai Grossjohann + +---------------------------------------------------------------------- + +I remember these versions as yard-rocks (is that between inch-pebbles +and mile-stones?). + -- Kai Grossjohann + +---------------------------------------------------------------------- + + "I think it depends on video drivers. I cannot reproduce it on my +home PC, but I can at work." + "Can you try to find a workaround at work? (I guess you don't need +a homearound at home. ;-)" + -- Jason Rumney and RMS + +---------------------------------------------------------------------- + +By the way, I also really really hate this unibyte/multibyte problem. +Sometimes I think I should have opposed to the introduction of such a +concept more strongly. + + imagine there's no unibyte + it's easy if you try + no bytes below us + above us only chars + imagine all the people living in multibyte + + -- Kenichi Handa + +---------------------------------------------------------------------- + +I try to uphold the ideals that I was taught to value as an American, +but every year I get less and less help from the United States. + -- RMS + +---------------------------------------------------------------------- + + "If the terminfo entry is most likely wrong, and we know it, then it +doesn't make sense to follow it." + "Nevertheless, until now, we always did." + "So.... should we not fix old bugs?" + "Why fix an old bug if you can write three new ones in the same +time?" + -- Miles Bader, Eli Zaretskii and David Kastrup + +---------------------------------------------------------------------- + + [...] As is well known, people who speak American English tend to +be more resource-conscious and try to avoid wasting precious bits +transferring those redundant "u"s. + Think of the number of occurrences of "color" and "behavior" in the +Emacs tarball, multiply that by the number of times it'll be +downloaded, stored on hard disks, archived, ...that's a substantial +saving. + -- Stefan Monnier + +---------------------------------------------------------------------- + +Re: Parent of a derived mode's keymap. + + "I can't decide whether the title of this thread is more fitting for +a blues song or a pulp fiction booklet. It certainly projects drama." + "Hey, it says derived, not deprived." + "Actually, for some keymaps 'depraved' would fit better." + "I knew it! You're one of them vi lovers! There is nothing wrong +with Emacs using escape, meta, alt, control, and shift!" + -- David Kastrup and Lute Kamstra + +---------------------------------------------------------------------- + + "Aren't user-defined constants useful in other languages?" + "The only user-defined constant is ignorance. (With programmers, +this is a variable concept ;-)" + -- Juanma Barranquero and Thien-Thi Nguyen + +---------------------------------------------------------------------- + + "Uh, 'archaic' and 'alive' is not a contradiction." + "Yes it is. 'Archaic' does not mean 'old' or 'early'. It means +'obsolete'." + "'He arche' in Greek means 'the beginning'. John 1 starts off with +'En arche en ho Logos': in the beginning, there was the word. Now of +course we all know that Emacs was there before Word, but this might +have escaped John's notice." + -- David Kastrup and RMS + +---------------------------------------------------------------------- + +Re: patch for woman (woman-topic-at-point) + + "Sorry for the long message. I wanted to make the problem clear +also for people not familiar with `woman'." + "Most hackers, I take? + For a moment there I thought you had a patch that you could put on +a woman, and it would make her come right to the topic at point +without attempting any course of action that requires an advance +course in divination. + There'd be quite a sensational market for that, you know." + -- Emilio Lopes and David Kastrup
--- a/etc/HELLO Sat Oct 14 16:56:21 2006 +0000 +++ b/etc/HELLO Sat Oct 14 17:36:28 2006 +0000 @@ -1,8 +1,8 @@ This is a list of ways to say hello in various languages. Non-ASCII examples: - Europe: ,A!(BHola!, Hyv,Add(B p,Ad(Biv,Add(B, Gr,A|_(B Gott, Bon,Cu(Bu, Dobr,B}(B den, Tere p,Ad(Bevast - Cze,B6f(B!, ,FCei\(B ,Fsar(B, ,L7T`PRabRcYbU(B!, $,1J2J0J;J0J@JOJ=J1J0(B + Europe: ,A!(BHola!, Gr,A|_(B Gott, Hyv,Add(B p,Ad(Biv,Add(B, Tere ,Au(Bhtust, Bon,Cu(Bu + Cze,B6f(B!, Dobr,B}(B den, ,L7T`PRabRcYbU(B!, ,FCei\(B ,Fsar(B, $,1J2J0J;J0J@JOJ=J1J0(B Africa: $(3!A!,!>(B Middle/Near East: ,Hylem(B, (38R(47d(3T!JSa(4W(3W(B South Asia: 4$,4!8v#")0$,15h14$,4!hv#")0$,15n14$,4!zv#!)v#")v#"D0$,15x6-5d6'1(B, 4$,44Kv#4z0$,1?(14$,44hv#4zv#40$,1?.14$,44qv#4{v#3Q0$,1?8?M>u?>14$,44av#4z0$,1?01(B, 4$,46<0$,1@H14$,46A0$,1@N14$,46Kv#6Vv#6)v#6M0$,1@X@m@5@^14$,46Cv#6W0$,1@P@"1(B, 4$,4*U0$,1<U14$,4*M0$,1<C14$,4*Hv#)b0$,1<5<m14$,4*H0$,1<514$,4*Qv#)b0$,1<N<m1(B, 4$(7"70"714$P0"!#C"Q1!;4"Er'"S0"E"S14"G0"G1!;4"70"714"2r'"[0"2"[1!;4"Dr'"[0"D"[14"#0"#14"G0"G1!>(B
--- a/etc/NEWS Sat Oct 14 16:56:21 2006 +0000 +++ b/etc/NEWS Sat Oct 14 17:36:28 2006 +0000 @@ -336,6 +336,10 @@ too. If you want to use just plain `*' as a wildcard, type `*""'; the doublequotes make no difference in the shell, but they prevent special treatment in `dired-do-shell-command'. + +** Adaptive filling misfeature removed. +It no longer treats `NNN.' or `(NNN)' as a prefix. + * Editing Changes in Emacs 22.1 @@ -904,6 +908,12 @@ horizontally or vertically, a saved window configuration is restored, or when the frame is resized. ++++ +*** The %c and %l constructs are now ignored in frame-title-format. +Due to technical limitations in how Emacs interacts with windowing +systems, these constructs often failed to render properly, and could +even cause Emacs to crash. + ** Cursor display changes: +++ @@ -953,6 +963,19 @@ +++ *** `vertical-border' face is used for the vertical divider between windows. +** ebnf2ps changes: + ++++ +*** New option `ebnf-arrow-extra-width' which specify extra width for arrow +shape drawing. +The extra width is used to avoid that the arrowhead and the terminal border +overlap. It depens on `ebnf-arrow-shape' and `ebnf-line-width'. + ++++ +*** New option `ebnf-arrow-scale' which specify the arrow scale. +Values lower than 1.0, shrink the arrow. +Values greater than 1.0, expand the arrow. + ** Font-Lock changes: +++ @@ -969,11 +992,12 @@ `Info-mode-hook'. +++ -*** font-lock: in modes like C and Lisp where the fontification assumes that -an open-paren in column 0 is always outside of any string or comment, -font-lock now highlights any such open-paren-in-column-zero in bold-red -if it is inside a string or a comment, to indicate that it can cause -trouble with fontification and/or indentation. +*** Font-Lock mode: in major modes such as Lisp mode, where some Emacs +features assume that an open-paren in column 0 is always outside of +any string or comment, Font-Lock now highlights any such open-paren in +bold-red if it is inside a string or a comment, to indicate that it +can cause trouble. You should rewrite the string or comment so that +the open-paren is not in column 0. +++ *** New standard font-lock face `font-lock-preprocessor-face'. @@ -1054,7 +1078,7 @@ +++ *** For the Gtk+ version, you can make Emacs use the old file dialog -by setting the variable `x-use-old-gtk-file-dialog' to t. Default is to use +by setting the variable `x-gtk-use-old-file-dialog' to t. Default is to use the new dialog. ** Mouse changes: @@ -1429,6 +1453,10 @@ `comint-use-prompt-regexp'. The old name has been kept as an alias, but declared obsolete. ++++ +*** The EMACS environment variable now defaults to Emacs's absolute +file name, instead of to "t". + ** M-x Compile changes: --- @@ -1485,6 +1513,10 @@ no arrow is displayed and a value of nil means display the message at the top of the window. ++++ +*** The EMACS environment variable now defaults to Emacs's absolute +file name, instead of to "t". + ** Occur mode changes: +++ @@ -2003,6 +2035,34 @@ --- ** Changes in Allout +*** Some previously rough topic-header format edge cases are reconciled. +Level 1 topics use the mode's comment format, and lines starting with the +asterisk - for instance, the comment close of some languages (eg, c's "*/" +or mathematica's "*)") - at the beginning of line are no longer are +interpreted as level 1 topics in those modes. + +*** Many or most commonly occuring "accidental" topics are disqualified. +Text in item bodies that looks like a low-depth topic is no longer mistaken +for one unless its first offspring (or that of its next sibling with +offspring) is only one level deeper. + +For example, pasting some text with a bunch of leading asterisks into a +topic that's followed by a level 3 or deeper topic will not cause the +pasted text to be mistaken for outline structure. + +The same constraint is applied to any level 2 or 3 topics. + +This settles an old issue where typed or pasted text needed to be carefully +reviewed, and sometimes doctored, to avoid accidentally disrupting the +outline structure. Now that should be generally unnecessary, as the most +prone-to-occur accidents are disqualified. + +*** Allout now refuses to create "containment discontinuities", where a +topic is shifted deeper than the offspring-depth of its container. On the +other hand, allout now operates gracefully with existing containment +discontinuities, revealing excessively contained topics rather than either +leaving them hidden or raising an error. + *** Topic cryptography added, enabling easy gpg topic encryption and decryption. Per-topic basis enables interspersing encrypted-text and clear-text within a single file to your heart's content, using symmetric @@ -2012,56 +2072,52 @@ powerful ways. Encryption behavior customization is collected in the allout-encryption customization group. -*** `allout-view-change-hook' marked as being deprecated - use -`allout-exposure-change-hook' instead. Both are still invoked, but -`allout-view-change-hook' will eventually be ignored. The new -`allout-exposure-change-hook' is called with args that were passed to -`allout-flag-region', making it easier to use. - -*** Other allout functions which change the outline structure also have -hooks, enabling cooperative allout enhancements. See -`allout-structure-added-hook', `allout-structure-deleted-hook', and -`allout-structure-shifted-hook'. - -*** Default command prefix changed to "\C-c " (control-c space), to avoid -intruding on user's keybinding space. Customize the +*** Navigation within an item is easier. Repeated beginning-of-line and +end-of-line key commands (usually, ^A and ^E) cycle through the +beginning/end-of-line and then beginning/end of topic, etc. See new +customization vars `allout-beginning-of-line-cycles' and +`allout-end-of-line-cycles'. + +*** New or revised allout-mode activity hooks enable creation of +cooperative enhancements to allout mode without changes to the mode, +itself. + +See `allout-exposure-change-hook', `allout-structure-added-hook', +`allout-structure-deleted-hook', and `allout-structure-shifted-hook'. + +`allout-exposure-change-hook' replaces the existing +`allout-view-change-hook', which is being deprecated. Both are still +invoked, but `allout-view-change-hook' will eventually be ignored. +`allout-exposure-change-hook' is called with explicit arguments detailing +the specifics of each change (as are the other new hooks), making it easier +to use than the old version. + +There is a new mode deactivation hook, `allout-mode-deactivate-hook', for +coordinating with deactivation of allout-mode. Both that and the mode +activation hook, `allout-mode-hook' are now run after the `allout-mode' +variable is changed, rather than before. + +*** Default command prefix was changed to "\C-c " (control-c space), to +avoid intruding on user's keybinding space. Customize the `allout-command-prefix' variable to your preference. -*** Allout now uses text overlay's `invisible' property (and others) for -concealed text, instead of selective-display. This simplifies the code, in -particular avoiding the need for kludges for isearch dynamic-display, -discretionary handling of edits of concealed text, undo concerns, etc. - -*** Some previously rough topic-header format edge cases are reconciled. -Level 1 topics use the mode's comment format, and lines starting with the -asterisk - for instance, the comment close of some languages (eg, c's "*/" -or mathematica's "*)") - at the beginning of line are no longer are -interpreted as level 1 topics in those modes. (Yay!) - -*** Many substantial fixes and refinements, including: - - - repaired regexp-quoting of custom header prefixes, so any literals - will now work (for instance, mathematica's "(*" is now properly - accepted). - - repaired inhibition of inadvertent edits to concealed text. - - refuse to create "containment discontinuities", where a - topic is shifted deeper than the offspring-depth of its' container +*** Allout now uses text overlay's `invisible' property for concealed text, +instead of selective-display. This simplifies the code, in particular +avoiding the need for kludges for isearch dynamic-display, discretionary +handling of edits of concealed text, undo concerns, etc. + +*** There are many other fixes and refinements, including: + + - repaired inhibition of inadvertent edits to concealed text, without + inhibiting undo; we now reveal undo changes within concealed text. - auto-fill-mode is now left inactive when allout-mode starts, if it already was inactive. also, `allout-inhibit-auto-fill' custom configuration variable makes it easy to disable auto fill in allout outlines in general or on a per-buffer basis. - - mode hook changes: new hook `allout-mode-deactivate-hook', for - coordinating with deactivation of allout-mode. `allout-mode-hook' is - now run after the `allout-mode' variable is changed, as is the new - `allout-mode-deactivate-hook'. - allout now tolerates fielded text in outlines without disruption. - hot-spot navigation now is modularized with a new function, - `allout-hotspot-key-handler', enabling easier articulation and - enhancement of the functionality by allout addons. - - topic body navigation is easier, where repeated beginning of line and - end of line key commands cycle through the actually beginning/end of - line and then beginning/end of topic, etc. see new customization vars - `allout-beginning-of-line-cycles' and `allout-end-of-line-cycles'. + `allout-hotspot-key-handler', enabling easier use and enhancement of + the functionality in allout addons. - repaired retention of topic body hanging indent upon topic depth shifts - bulleting variation is simpler and more accommodating, both in the default behavior and in ability to vary when creating new topics @@ -2072,8 +2128,7 @@ - included a few unit-tests for interior functionality. developers can have them automatically run at the end of module load by customizing the option `allout-run-unit-tests-on-load'. - - many, many minor tweaks and fixes. many internal fixes and - refinements of docstrings. + - many, many other, more minor tweaks, fixes, and refinements. - version number incremented to 2.2 ** The variable `woman-topic-at-point' was renamed @@ -3750,6 +3805,10 @@ *** The function `eql' is now available without requiring the CL package. +++ +*** The new function `memql' is like `memq', but uses `eql' for comparison, +that is, floats are compared by value and other elements with `eq'. + ++++ *** `makehash' is now obsolete. Use `make-hash-table' instead. +++ @@ -4076,6 +4135,11 @@ arg is non-nil. +++ +*** New function `window-line-height' is an efficient way to get +information about a specific text line in a window provided that the +window's display is up-to-date. + ++++ *** New functions `posn-at-point' and `posn-at-x-y' return click-event-style position information for a given visible buffer position or for a given window pixel coordinate. @@ -4083,6 +4147,13 @@ ** Text modification: +++ +*** The new function `buffer-chars-modified-tick' returns a buffer's +tick counter for changes to characters. Each time text in that buffer +is inserted or deleted, the character-change counter is updated to the +tick counter (`buffer-modified-tick'). Text property changes leave it +unchanged. + ++++ *** The new function `insert-for-yank' normally works like `insert', but removes the text properties in the `yank-excluded-properties' list and handles the `yank-handler' text property. @@ -4646,6 +4717,12 @@ text properties, according to their stickiness. This also means that it works with empty overlays. The same hold for the `local-map' property. +*** `key-binding' will now look up mouse-specific bindings. The +keymaps consulted by `key-binding' will get adapted if the key +sequence is started with a mouse event. Instead of letting the click +position be determined from the key sequence itself, it is also +possible to specify it with an optional argument explicitly. + *** Dense keymaps now handle inheritance correctly. Previously a dense keymap would hide all of the simple-char key @@ -4899,9 +4976,6 @@ *** New function `define-fringe-bitmap' can now be used to create new fringe bitmaps, as well as change the built-in fringe bitmaps. -To change a built-in bitmap, do (require 'fringe) and use the symbol -identifying the bitmap such as `left-truncation' or `continued-line'. - *** New function `destroy-fringe-bitmap' deletes a fringe bitmap or restores a built-in one to its default value. @@ -5190,6 +5264,11 @@ *** The new variable `max-image-size' defines the maximum size of images that Emacs will load and display. ++++ +*** The new variable `display-mm-dimensions-alist' can be used to +override incorrect graphical display dimensions returned by functions +`display-mm-height' and `display-mm-width'. + ** Mouse pointer features: +++ (lispref)
--- a/etc/PROBLEMS Sat Oct 14 16:56:21 2006 +0000 +++ b/etc/PROBLEMS Sat Oct 14 17:36:28 2006 +0000 @@ -202,6 +202,11 @@ On platforms such as Solaris, you can also work around this problem by configuring your compiler to use the native linker instead of GNU ld. +** Emacs compiled with Gtk+ crashes when closing a display (x-close-connection). + +This happens because of bugs in Gtk+. Gtk+ 2.10 seems to be OK. See bug +http://bugzilla.gnome.org/show_bug.cgi?id=85715. + * General runtime problems ** Lisp problems @@ -535,7 +540,7 @@ problem by adding this to your .cshrc file: if ($?EMACS) then - if ($EMACS == "t") then + if ("$EMACS" =~ /*) then unset edit stty -icrnl -onlcr -echo susp ^Z endif @@ -828,6 +833,11 @@ * Internationalization problems +** M-{ does not work on a Spanish PC keyboard. + +Many Spanish keyboards seem to ignore that combination. Emacs can't +do anything about it. + ** Characters from the mule-unicode charsets aren't displayed under X. XFree86 4 contains many fonts in iso10646-1 encoding which have @@ -1081,6 +1091,15 @@ ** Window-manager and toolkit-related problems +*** Gnome: Emacs receives input directly from the keyboard, bypassing XIM. + +This seems to happen when gnome-settings-daemon version 2.12 or later +is running. If gnome-settings-daemon is not running, Emacs receives +input through XIM without any problem. Furthermore, this seems only +to happen in *.UTF-8 locales; zh_CN.GB2312 and zh_CN.GBK locales, for +example, work fine. A bug report has been filed in the Gnome +bugzilla: http://bugzilla.gnome.org/show_bug.cgi?id=357032 + *** Gnome: Emacs' xterm-mouse-mode doesn't work on the Gnome terminal. A symptom of this bug is that double-clicks insert a control sequence
--- a/etc/THE-GNU-PROJECT Sat Oct 14 16:56:21 2006 +0000 +++ b/etc/THE-GNU-PROJECT Sat Oct 14 17:36:28 2006 +0000 @@ -7,163 +7,160 @@ The first software-sharing community When I started working at the MIT Artificial Intelligence Lab in 1971, - I became part of a software-sharing community that had existed for - many years. Sharing of software was not limited to our particular - community; it is as old as computers, just as sharing of recipes is as - old as cooking. But we did it more than most. + I became part of a software-sharing community that had existed for many + years. Sharing of software was not limited to our particular community; + it is as old as computers, just as sharing of recipes is as old as + cooking. But we did it more than most. The AI Lab used a timesharing operating system called ITS (the Incompatible Timesharing System) that the lab's staff hackers (1) had designed and written in assembler language for the Digital PDP-10, one - of the large computers of the era. As a member of this community, an - AI lab staff system hacker, my job was to improve this system. + of the large computers of the era. As a member of this community, an AI + lab staff system hacker, my job was to improve this system. - We did not call our software "free software", because that term did - not yet exist; but that is what it was. Whenever people from another - university or a company wanted to port and use a program, we gladly - let them. If you saw someone using an unfamiliar and interesting - program, you could always ask to see the source code, so that you - could read it, change it, or cannibalize parts of it to make a new - program. + We did not call our software "free software", because that term did not + yet exist; but that is what it was. Whenever people from another + university or a company wanted to port and use a program, we gladly let + them. If you saw someone using an unfamiliar and interesting program, + you could always ask to see the source code, so that you could read it, + change it, or cannibalize parts of it to make a new program. (1) The use of "hacker" to mean "security breaker" is a confusion on - the part of the mass media. We hackers refuse to recognize that + the part of the mass media. We hackers refuse to recognize that meaning, and continue using the word to mean, "Someone who loves to program and enjoys being clever about it." The collapse of the community The situation changed drastically in the early 1980s when Digital - discontinued the PDP-10 series. Its architecture, elegant and powerful + discontinued the PDP-10 series. Its architecture, elegant and powerful in the 60s, could not extend naturally to the larger address spaces - that were becoming feasible in the 80s. This meant that nearly all of + that were becoming feasible in the 80s. This meant that nearly all of the programs composing ITS were obsolete. - The AI lab hacker community had already collapsed, not long before. In + The AI lab hacker community had already collapsed, not long before. In 1981, the spin-off company Symbolics had hired away nearly all of the hackers from the AI lab, and the depopulated community was unable to - maintain itself. (The book Hackers, by Steve Levy, describes these + maintain itself. (The book Hackers, by Steve Levy, describes these events, as well as giving a clear picture of this community in its - prime.) When the AI lab bought a new PDP-10 in 1982, its - administrators decided to use Digital's non-free timesharing system - instead of ITS. + prime.) When the AI lab bought a new PDP-10 in 1982, its administrators + decided to use Digital's non-free timesharing system instead of ITS. The modern computers of the era, such as the VAX or the 68020, had their own operating systems, but none of them were free software: you had to sign a nondisclosure agreement even to get an executable copy. This meant that the first step in using a computer was to promise not - to help your neighbor. A cooperating community was forbidden. The rule - made by the owners of proprietary software was, "If you share with - your neighbor, you are a pirate. If you want any changes, beg us to - make them." + to help your neighbor. A cooperating community was forbidden. The rule + made by the owners of proprietary software was, "If you share with your + neighbor, you are a pirate. If you want any changes, beg us to make + them." - The idea that the proprietary software social system--the system that + The idea that the proprietary-software social system--the system that says you are not allowed to share or change software--is antisocial, that it is unethical, that it is simply wrong, may come as a surprise - to some readers. But what else could we say about a system based on + to some readers. But what else could we say about a system based on dividing the public and keeping users helpless? Readers who find the - idea surprising may have taken proprietary social system as given, or - judged it on the terms suggested by proprietary software businesses. - Software publishers have worked long and hard to convince people that - there is only one way to look at the issue. + idea surprising may have taken proprietary-software social system as + given, or judged it on the terms suggested by proprietary software + businesses. Software publishers have worked long and hard to convince + people that there is only one way to look at the issue. When software publishers talk about "enforcing" their "rights" or - "stopping piracy", what they actually *say* is secondary. The real + "stopping piracy", what they actually *say* is secondary. The real message of these statements is in the unstated assumptions they take - for granted; the public is supposed to accept them uncritically. So + for granted; the public is supposed to accept them uncritically. So let's examine them. One assumption is that software companies have an unquestionable natural right to own software and thus have power over all its users. (If this were a natural right, then no matter how much harm it does to - the public, we could not object.) Interestingly, the US Constitution - and legal tradition reject this view; copyright is not a natural - right, but an artificial government-imposed monopoly that limits the - users' natural right to copy. + the public, we could not object.) Interestingly, the US Constitution + and legal tradition reject this view; copyright is not a natural right, + but an artificial government-imposed monopoly that limits the users' + natural right to copy. Another unstated assumption is that the only important thing about software is what jobs it allows you to do--that we computer users should not care what kind of society we are allowed to have. - A third assumption is that we would have no usable software (or, would + A third assumption is that we would have no usable software (or would never have a program to do this or that particular job) if we did not - offer a company power over the users of the program. This assumption + offer a company power over the users of the program. This assumption may have seemed plausible, before the free software movement - demonstrated that we can make plenty of useful software without - putting chains on it. + demonstrated that we can make plenty of useful software without putting + chains on it. - If we decline to accept these assumptions, and judge these issues - based on ordinary common-sense morality while placing the users first, - we arrive at very different conclusions. Computer users should be free - to modify programs to fit their needs, and free to share software, - because helping other people is the basis of society. + If we decline to accept these assumptions, and judge these issues based + on ordinary common-sense morality while placing the users first, we + arrive at very different conclusions. Computer users should be free to + modify programs to fit their needs, and free to share software, because + helping other people is the basis of society. There is no room here for an extensive statement of the reasoning behind this conclusion, so I refer the reader to the web page, - <http://www.gnu.org/philosophy/why-free.html>. + http://www.gnu.org/philosophy/why-free.html. A stark moral choice. - With my community gone, to continue as before was impossible. Instead, + With my community gone, to continue as before was impossible. Instead, I faced a stark moral choice. The easy choice was to join the proprietary software world, signing nondisclosure agreements and promising not to help my fellow hacker. - Most likely I would also be developing software that was released - under nondisclosure agreements, thus adding to the pressure on other - people to betray their fellows too. + Most likely I would also be developing software that was released under + nondisclosure agreements, thus adding to the pressure on other people + to betray their fellows too. I could have made money this way, and perhaps amused myself writing - code. But I knew that at the end of my career, I would look back on + code. But I knew that at the end of my career, I would look back on years of building walls to divide people, and feel I had spent my life making the world a worse place. - I had already experienced being on the receiving end of a - nondisclosure agreement, when someone refused to give me and the MIT - AI lab the source code for the control program for our printer. (The - lack of certain features in this program made use of the printer - extremely frustrating.) So I could not tell myself that nondisclosure - agreements were innocent. I was very angry when he refused to share - with us; I could not turn around and do the same thing to everyone - else. + I had already experienced being on the receiving end of a nondisclosure + agreement, when someone refused to give me and the MIT AI lab the + source code for the control program for our printer. (The lack of + certain features in this program made use of the printer extremely + frustrating.) So I could not tell myself that nondisclosure agreements + were innocent. I was very angry when he refused to share with us; I + could not turn around and do the same thing to everyone else. Another choice, straightforward but unpleasant, was to leave the - computer field. That way my skills would not be misused, but they - would still be wasted. I would not be culpable for dividing and - restricting computer users, but it would happen nonetheless. + computer field. That way my skills would not be misused, but they would + still be wasted. I would not be culpable for dividing and restricting + computer users, but it would happen nonetheless. So I looked for a way that a programmer could do something for the - good. I asked myself, was there a program or programs that I could + good. I asked myself, was there a program or programs that I could write, so as to make a community possible once again? The answer was clear: what was needed first was an operating system. - That is the crucial software for starting to use a computer. With an + That is the crucial software for starting to use a computer. With an operating system, you can do many things; without one, you cannot run - the computer at all. With a free operating system, we could again have - a community of cooperating hackers--and invite anyone to join. And + the computer at all. With a free operating system, we could again have + a community of cooperating hackers--and invite anyone to join. And anyone would be able to use a computer without starting out by conspiring to deprive his or her friends. As an operating system developer, I had the right skills for this job. So even though I could not take success for granted, I realized that I - was elected to do the job. I chose to make the system compatible with + was elected to do the job. I chose to make the system compatible with Unix so that it would be portable, and so that Unix users could easily - switch to it. The name GNU was chosen following a hacker tradition, as + switch to it. The name GNU was chosen following a hacker tradition, as a recursive acronym for "GNU's Not Unix." An operating system does not mean just a kernel, barely enough to run - other programs. In the 1970s, every operating system worthy of the - name included command processors, assemblers, compilers, interpreters, - debuggers, text editors, mailers, and much more. ITS had them, Multics - had them, VMS had them, and Unix had them. The GNU operating system + other programs. In the 1970s, every operating system worthy of the name + included command processors, assemblers, compilers, interpreters, + debuggers, text editors, mailers, and much more. ITS had them, Multics + had them, VMS had them, and Unix had them. The GNU operating system would include them too. Later I heard these words, attributed to Hillel (1): - If I am not for myself, who will be for me? - If I am only for myself, what am I? - If not now, when? + If I am not for myself, who will be for me? + If I am only for myself, what am I? + If not now, when? The decision to start the GNU project was based on a similar spirit. @@ -173,47 +170,46 @@ Free as in freedom The term "free software" is sometimes misunderstood--it has nothing to - do with price. It is about freedom. Here, therefore, is the definition + do with price. It is about freedom. Here, therefore, is the definition of free software: a program is free software, for you, a particular user, if: - * You have the freedom to run the program, for any purpose. - * You have the freedom to modify the program to suit your needs. (To + * You have the freedom to modify the program to suit your needs. (To make this freedom effective in practice, you must have access to the source code, since making changes in a program without having the source code is exceedingly difficult.) - * You have the freedom to redistribute copies, either gratis or for - a fee. + * You have the freedom to redistribute copies, either gratis or for a + fee. * You have the freedom to distribute modified versions of the program, so that the community can benefit from your improvements. - Since "free" refers to freedom, not to price, there is no - contradiction between selling copies and free software. In fact, the - freedom to sell copies is crucial: collections of free software sold - on CD-ROMs are important for the community, and selling them is an - important way to raise funds for free software development. Therefore, - a program which people are not free to include on these collections is - not free software. + Since "free" refers to freedom, not to price, there is no contradiction + between selling copies and free software. In fact, the freedom to sell + copies is crucial: collections of free software sold on CD-ROMs are + important for the community, and selling them is an important way to + raise funds for free software development. Therefore, a program which + people are not free to include on these collections is not free + software. Because of the ambiguity of "free", people have long looked for - alternatives, but no one has found a suitable alternative. The English + alternatives, but no one has found a suitable alternative. The English Language has more words and nuances than any other, but it lacks a - simple, unambiguous, word that means "free," as in - freedom--"unfettered," being the word that comes closest in meaning. - Such alternatives as "liberated", "freedom" and "open" have either the + simple, unambiguous, word that means "free", as in + freedom--"unfettered" being the word that comes closest in meaning. + Such alternatives as "liberated", "freedom", and "open" have either the wrong meaning or some other disadvantage. GNU software and the GNU system - Developing a whole system is a very large project. To bring it into + Developing a whole system is a very large project. To bring it into reach, I decided to adapt and use existing pieces of free software - wherever that was possible. For example, I decided at the very + wherever that was possible. For example, I decided at the very beginning to use TeX as the principal text formatter; a few years - later, I decided to use the X Window System rather than writing - another window system for GNU. + later, I decided to use the X Window System rather than writing another + window system for GNU. Because of this decision, the GNU system is not the same as the - collection of all GNU software. The GNU system includes programs that + collection of all GNU software. The GNU system includes programs that are not GNU software, programs that were developed by other people and projects for their own purposes, but which we can use because they are free software. @@ -222,12 +218,12 @@ In January 1984 I quit my job at MIT and began writing GNU software. Leaving MIT was necessary so that MIT would not be able to interfere - with distributing GNU as free software. If I had remained on the - staff, MIT could have claimed to own the work, and could have imposed - their own distribution terms, or even turned the work into a - proprietary software package. I had no intention of doing a large - amount of work only to see it become useless for its intended purpose: - creating a new software-sharing community. + with distributing GNU as free software. If I had remained on the staff, + MIT could have claimed to own the work, and could have imposed their + own distribution terms, or even turned the work into a proprietary + software package. I had no intention of doing a large amount of work + only to see it become useless for its intended purpose: creating a new + software-sharing community. However, Professor Winston, then the head of the MIT AI Lab, kindly invited me to keep using the lab's facilities. @@ -235,78 +231,78 @@ The first steps Shortly before beginning the GNU project, I heard about the Free - University Compiler Kit, also known as VUCK. (The Dutch word for - "free" is written with a V.) This was a compiler designed to handle - multiple languages, including C and Pascal, and to support multiple - target machines. I wrote to its author asking if GNU could use it. + University Compiler Kit, also known as VUCK. (The Dutch word for "free" + is written with a V.) This was a compiler designed to handle multiple + languages, including C and Pascal, and to support multiple target + machines. I wrote to its author asking if GNU could use it. He responded derisively, stating that the university was free but the - compiler was not. I therefore decided that my first program for the - GNU project would be a multi-language, multi-platform compiler. + compiler was not. I therefore decided that my first program for the GNU + project would be a multi-language, multi-platform compiler. - Hoping to avoid the need to write the whole compiler myself, I - obtained the source code for the Pastel compiler, which was a - multi-platform compiler developed at Lawrence Livermore Lab. It - supported, and was written in, an extended version of Pascal, designed - to be a system-programming language. I added a C front end, and began - porting it to the Motorola 68000 computer. But I had to give that up - when I discovered that the compiler needed many megabytes of stack - space, and the available 68000 Unix system would only allow 64k. + Hoping to avoid the need to write the whole compiler myself, I obtained + the source code for the Pastel compiler, which was a multi-platform + compiler developed at Lawrence Livermore Lab. It supported, and was + written in, an extended version of Pascal, designed to be a + system-programming language. I added a C front end, and began porting + it to the Motorola 68000 computer. But I had to give that up when I + discovered that the compiler needed many megabytes of stack space, and + the available 68000 Unix system would only allow 64k. I then realized that the Pastel compiler functioned by parsing the entire input file into a syntax tree, converting the whole syntax tree into a chain of "instructions", and then generating the whole output - file, without ever freeing any storage. At this point, I concluded I - would have to write a new compiler from scratch. That new compiler is + file, without ever freeing any storage. At this point, I concluded I + would have to write a new compiler from scratch. That new compiler is now known as GCC; none of the Pastel compiler is used in it, but I - managed to adapt and use the C front end that I had written. But that + managed to adapt and use the C front end that I had written. But that was some years later; first, I worked on GNU Emacs. GNU Emacs I began work on GNU Emacs in September 1984, and in early 1985 it was - beginning to be usable. This enabled me to begin using Unix systems to + beginning to be usable. This enabled me to begin using Unix systems to do editing; having no interest in learning to use vi or ed, I had done my editing on other kinds of machines until then. At this point, people began wanting to use GNU Emacs, which raised the - question of how to distribute it. Of course, I put it on the anonymous - ftp server on the MIT computer that I used. (This computer, + question of how to distribute it. Of course, I put it on the anonymous + ftp server on the MIT computer that I used. (This computer, prep.ai.mit.edu, thus became the principal GNU ftp distribution site; when it was decommissioned a few years later, we transferred the name - to our new ftp server.) But at that time, many of the interested - people were not on the Internet and could not get a copy by ftp. So - the question was, what would I say to them? + to our new ftp server.) But at that time, many of the interested people + were not on the Internet and could not get a copy by ftp. So the + question was, what would I say to them? - I could have said, "Find a friend who is on the net and who will make - a copy for you." Or I could have done what I did with the original - PDP-10 Emacs: tell them, "Mail me a tape and a SASE, and I will mail - it back with Emacs on it." But I had no job, and I was looking for - ways to make money from free software. So I announced that I would - mail a tape to whoever wanted one, for a fee of $150. In this way, I - started a free software distribution business, the precursor of the - companies that today distribute entire Linux-based GNU systems. + I could have said, "Find a friend who is on the net and who will make a + copy for you." Or I could have done what I did with the original PDP-10 + Emacs: tell them, "Mail me a tape and a SASE, and I will mail it back + with Emacs on it." But I had no job, and I was looking for ways to make + money from free software. So I announced that I would mail a tape to + whoever wanted one, for a fee of $150. In this way, I started a free + software distribution business, the precursor of the companies that + today distribute entire Linux-based GNU systems. Is a program free for every user? If a program is free software when it leaves the hands of its author, this does not necessarily mean it will be free software for everyone - who has a copy of it. For example, public domain software (software + who has a copy of it. For example, public domain software (software that is not copyrighted) is free software; but anyone can make a - proprietary modified version of it. Likewise, many free programs are + proprietary modified version of it. Likewise, many free programs are copyrighted but distributed under simple permissive licenses which allow proprietary modified versions. The paradigmatic example of this problem is the X Window System. Developed at MIT, and released as free software with a permissive - license, it was soon adopted by various computer companies. They added + license, it was soon adopted by various computer companies. They added X to their proprietary Unix systems, in binary form only, and covered - by the same nondisclosure agreement. These copies of X were no more + by the same nondisclosure agreement. These copies of X were no more free software than Unix was. The developers of the X Window System did not consider this a - problem--they expected and intended this to happen. Their goal was not - freedom, just "success", defined as "having many users." They did not + problem--they expected and intended this to happen. Their goal was not + freedom, just "success", defined as "having many users." They did not care whether these users had freedom, only that they should be numerous. @@ -314,93 +310,94 @@ counting the amount of freedom gave different answers to the question, "Is this program free?" If you judged based on the freedom provided by the distribution terms of the MIT release, you would say that X was - free software. But if you measured the freedom of the average user of - X, you would have to say it was proprietary software. Most X users - were running the proprietary versions that came with Unix systems, not - the free version. + free software. But if you measured the freedom of the average user of + X, you would have to say it was proprietary software. Most X users were + running the proprietary versions that came with Unix systems, not the + free version. Copyleft and the GNU GPL - The goal of GNU was to give users freedom, not just to be popular. So + The goal of GNU was to give users freedom, not just to be popular. So we needed to use distribution terms that would prevent GNU software - from being turned into proprietary software. The method we use is + from being turned into proprietary software. The method we use is called "copyleft".(1) - Copyleft uses copyright law, but flips it over to serve the opposite - of its usual purpose: instead of a means of privatizing software, it + Copyleft uses copyright law, but flips it over to serve the opposite of + its usual purpose: instead of a means of privatizing software, it becomes a means of keeping software free. - The central idea of copyleft is that we give everyone permission to - run the program, copy the program, modify the program, and distribute - modified versions--but not permission to add restrictions of their - own. Thus, the crucial freedoms that define "free software" are - guaranteed to everyone who has a copy; they become inalienable rights. + The central idea of copyleft is that we give everyone permission to run + the program, copy the program, modify the program, and distribute + modified versions--but not permission to add restrictions of their own. + Thus, the crucial freedoms that define "free software" are guaranteed + to everyone who has a copy; they become inalienable rights. - For an effective copyleft, modified versions must also be free. This + For an effective copyleft, modified versions must also be free. This ensures that work based on ours becomes available to our community if - it is published. When programmers who have jobs as programmers + it is published. When programmers who have jobs as programmers volunteer to improve GNU software, it is copyleft that prevents their employers from saying, "You can't share those changes, because we are going to use them to make our proprietary version of the program." The requirement that changes must be free is essential if we want to - ensure freedom for every user of the program. The companies that + ensure freedom for every user of the program. The companies that privatized the X Window System usually made some changes to port it to - their systems and hardware. These changes were small compared with the - great extent of X, but they were not trivial. If making changes were - an excuse to deny the users freedom, it would be easy for anyone to - take advantage of the excuse. + their systems and hardware. These changes were small compared with the + great extent of X, but they were not trivial. If making changes were an + excuse to deny the users freedom, it would be easy for anyone to take + advantage of the excuse. A related issue concerns combining a free program with non-free code. - Such a combination would inevitably be non-free; whichever freedoms - are lacking for the non-free part would be lacking for the whole as - well. To permit such combinations would open a hole big enough to sink - a ship. Therefore, a crucial requirement for copyleft is to plug this + Such a combination would inevitably be non-free; whichever freedoms are + lacking for the non-free part would be lacking for the whole as well. + To permit such combinations would open a hole big enough to sink a + ship. Therefore, a crucial requirement for copyleft is to plug this hole: anything added to or combined with a copylefted program must be such that the larger combined version is also free and copylefted. The specific implementation of copyleft that we use for most GNU - software is the GNU General Public License, or GNU GPL for short. We + software is the GNU General Public License, or GNU GPL for short. We have other kinds of copyleft that are used in specific circumstances. GNU manuals are copylefted also, but use a much simpler kind of copyleft, because the complexity of the GNU GPL is not necessary for - manuals. + manuals.(2) (1) In 1984 or 1985, Don Hopkins (a very imaginative fellow) mailed me - a letter. On the envelope he had written several amusing sayings, + a letter. On the envelope he had written several amusing sayings, including this one: "Copyleft--all rights reversed." I used the word "copyleft" to name the distribution concept I was developing at the time. + (2) We now use the GNU Free Documentation License for documentation. + The Free Software Foundation - As interest in using Emacs was growing, other people became involved - in the GNU project, and we decided that it was time to seek funding - once again. So in 1985 we created the Free Software Foundation, a - tax-exempt charity for free software development. The FSF also took - over the Emacs tape distribution business; later it extended this by - adding other free software (both GNU and non-GNU) to the tape, and by - selling free manuals as well. + As interest in using Emacs was growing, other people became involved in + the GNU project, and we decided that it was time to seek funding once + again. So in 1985 we created the Free Software Foundation, a tax-exempt + charity for free software development. The FSF also took over the Emacs + tape distribution business; later it extended this by adding other free + software (both GNU and non-GNU) to the tape, and by selling free + manuals as well. The FSF accepts donations, but most of its income has always come from - sales--of copies of free software, and of other related services. - Today it sells CD-ROMs of source code, CD-ROMs with binaries, nicely - printed manuals (all with freedom to redistribute and modify), and - Deluxe Distributions (where we build the whole collection of software - for your choice of platform). + sales--of copies of free software, and of other related services. Today + it sells CD-ROMs of source code, CD-ROMs with binaries, nicely printed + manuals (all with freedom to redistribute and modify), and Deluxe + Distributions (where we build the whole collection of software for your + choice of platform). - Free Software Foundation employees have written and maintained a - number of GNU software packages. Two notable ones are the C library - and the shell. The GNU C library is what every program running on a - GNU/Linux system uses to communicate with Linux. It was developed by a - member of the Free Software Foundation staff, Roland McGrath. The - shell used on most GNU/Linux systems is BASH, the Bourne Again - Shell(1), which was developed by FSF employee Brian Fox. + Free Software Foundation employees have written and maintained a number + of GNU software packages. Two notable ones are the C library and the + shell. The GNU C library is what every program running on a GNU/Linux + system uses to communicate with Linux. It was developed by a member of + the Free Software Foundation staff, Roland McGrath. The shell used on + most GNU/Linux systems is BASH, the Bourne Again Shell(1), which was + developed by FSF employee Brian Fox. - We funded development of these programs because the GNU project was - not just about tools or a development environment. Our goal was a - complete operating system, and these programs were needed for that - goal. + We funded development of these programs because the GNU project was not + just about tools or a development environment. Our goal was a complete + operating system, and these programs were needed for that goal. (1) "Bourne again Shell" is a joke on the name ``Bourne Shell'', which was the usual shell on Unix. @@ -408,41 +405,41 @@ Free software support The free software philosophy rejects a specific widespread business - practice, but it is not against business. When businesses respect the + practice, but it is not against business. When businesses respect the users' freedom, we wish them success. Selling copies of Emacs demonstrates one kind of free software - business. When the FSF took over that business, I needed another way - to make a living. I found it in selling services relating to the free - software I had developed. This included teaching, for subjects such as + business. When the FSF took over that business, I needed another way to + make a living. I found it in selling services relating to the free + software I had developed. This included teaching, for subjects such as how to program GNU Emacs and how to customize GCC, and software development, mostly porting GCC to new platforms. Today each of these kinds of free software business is practiced by a - number of corporations. Some distribute free software collections on + number of corporations. Some distribute free software collections on CD-ROM; others sell support at levels ranging from answering user - questions, to fixing bugs, to adding major new features. We are even + questions, to fixing bugs, to adding major new features. We are even beginning to see free software companies based on launching new free software products. - Watch out, though--a number of companies that associate themselves - with the term "open source" actually base their business on non-free - software that works with free software. These are not free software - companies, they are proprietary software companies whose products - tempt users away from freedom. They call these "value added", which - reflects the values they would like us to adopt: convenience above - freedom. If we value freedom more, we should call them "freedom - subtracted" products. + Watch out, though--a number of companies that associate themselves with + the term "open source" actually base their business on non-free + software that works with free software. These are not free software + companies, they are proprietary software companies whose products tempt + users away from freedom. They call these "value added", which reflects + the values they would like us to adopt: convenience above freedom. If + we value freedom more, we should call them "freedom subtracted" + products. Technical goals - The principal goal of GNU was to be free software. Even if GNU had no + The principal goal of GNU was to be free software. Even if GNU had no technical advantage over Unix, it would have a social advantage, allowing users to cooperate, and an ethical advantage, respecting the user's freedom. - But it was natural to apply the known standards of good practice to - the work--for example, dynamically allocating data structures to avoid + But it was natural to apply the known standards of good practice to the + work--for example, dynamically allocating data structures to avoid arbitrary fixed size limits, and handling all the possible 8-bit codes wherever that made sense. @@ -450,7 +447,7 @@ deciding not to support 16-bit machines (it was clear that 32-bit machines would be the norm by the time the GNU system was finished), and to make no effort to reduce memory usage unless it exceeded a - megabyte. In programs for which handling very large files was not + megabyte. In programs for which handling very large files was not crucial, we encouraged programmers to read an entire input file into core, then scan its contents without having to worry about I/O. @@ -460,193 +457,197 @@ Donated computers As the GNU project's reputation grew, people began offering to donate - machines running UNIX to the project. These were very useful, because + machines running UNIX to the project. These were very useful, because the easiest way to develop components of GNU was to do it on a UNIX - system, and replace the components of that system one by one. But they + system, and replace the components of that system one by one. But they raised an ethical issue: whether it was right for us to have a copy of UNIX at all. UNIX was (and is) proprietary software, and the GNU project's - philosophy said that we should not use proprietary software. But, + philosophy said that we should not use proprietary software. But, applying the same reasoning that leads to the conclusion that violence - in self defense is justified, I concluded that it was legitimate to - use a proprietary package when that was crucial for developing free + in self defense is justified, I concluded that it was legitimate to use + a proprietary package when that was crucial for developing a free replacement that would help others stop using the proprietary package. - But, even if this was a justifiable evil, it was still an evil. Today + But, even if this was a justifiable evil, it was still an evil. Today we no longer have any copies of Unix, because we have replaced them - with free operating systems. If we could not replace a machine's + with free operating systems. If we could not replace a machine's operating system with a free one, we replaced the machine instead. The GNU Task List As the GNU project proceeded, and increasing numbers of system - components were found or developed, eventually it became useful to - make a list of the remaining gaps. We used it to recruit developers to - write the missing pieces. This list became known as the GNU task list. - In addition to missing Unix components, we listed added various other + components were found or developed, eventually it became useful to make + a list of the remaining gaps. We used it to recruit developers to write + the missing pieces. This list became known as the GNU task list. In + addition to missing Unix components, we listed added various other useful software and documentation projects that, we thought, a truly complete system ought to have. Today, hardly any Unix components are left in the GNU task list--those - jobs have been done, aside from a few inessential ones. But the list - is full of projects that some might call "applications". Any program - that appeals to more than a narrow class of users would be a useful - thing to add to an operating system. + jobs have been done, aside from a few inessential ones. But the list is + full of projects that some might call "applications". Any program that + appeals to more than a narrow class of users would be a useful thing to + add to an operating system. Even games are included in the task list--and have been since the - beginning. Unix included games, so naturally GNU should too. But - compatibility was not an issue for games, so we did not follow the - list of games that Unix had. Instead, we listed a spectrum of - different kinds of games that users might like. + beginning. Unix included games, so naturally GNU should too. But + compatibility was not an issue for games, so we did not follow the list + of games that Unix had. Instead, we listed a spectrum of different + kinds of games that users might like. The GNU Library GPL The GNU C library uses a special kind of copyleft called the GNU - Library General Public License, which gives permission to link - proprietary software with the library. Why make this exception? + Library General Public License(1), which gives permission to link + proprietary software with the library. Why make this exception? It is not a matter of principle; there is no principle that says - proprietary software products are entitled to include our code. (Why - contribute to a project predicated on refusing to share with us?) - Using the LGPL for the C library, or for any library, is a matter of + proprietary software products are entitled to include our code. (Why + contribute to a project predicated on refusing to share with us?) Using + the LGPL for the C library, or for any library, is a matter of strategy. The C library does a generic job; every proprietary system or compiler - comes with a C library. Therefore, to make our C library available - only to free software would not have given free software any - advantage--it would only have discouraged use of our library. + comes with a C library. Therefore, to make our C library available only + to free software would not have given free software any advantage--it + would only have discouraged use of our library. One system is an exception to this: on the GNU system (and this - includes GNU/Linux), the GNU C library is the only C library. So the + includes GNU/Linux), the GNU C library is the only C library. So the distribution terms of the GNU C library determine whether it is - possible to compile a proprietary program for the GNU system. There is + possible to compile a proprietary program for the GNU system. There is no ethical reason to allow proprietary applications on the GNU system, but strategically it seems that disallowing them would do more to discourage use of the GNU system than to encourage development of free applications. - That is why using the Library GPL is a good strategy for the C - library. For other libraries, the strategic decision needs to be - considered on a case-by-case basis. When a library does a special job - that can help write certain kinds of programs, then releasing it under - the GPL, limiting it to free programs only, is a way of helping other - free software developers, giving them an advantage against proprietary + That is why using the Library GPL is a good strategy for the C library. + For other libraries, the strategic decision needs to be considered on a + case-by-case basis. When a library does a special job that can help + write certain kinds of programs, then releasing it under the GPL, + limiting it to free programs only, is a way of helping other free + software developers, giving them an advantage against proprietary software. Consider GNU Readline, a library that was developed to provide - command-line editing for BASH. Readline is released under the ordinary - GNU GPL, not the Library GPL. This probably does reduce the amount - Readline is used, but that is no loss for us. Meanwhile, at least one - useful application has been made free software specifically so it - could use Readline, and that is a real gain for the community. + command-line editing for BASH. Readline is released under the ordinary + GNU GPL, not the Library GPL. This probably does reduce the amount + Readline is used, but that is no loss for us. Meanwhile, at least one + useful application has been made free software specifically so it could + use Readline, and that is a real gain for the community. Proprietary software developers have the advantages money provides; - free software developers need to make advantages for each other. I - hope some day we will have a large collection of GPL-covered libraries - that have no parallel available to proprietary software, providing - useful modules to serve as building blocks in new free software, and - adding up to a major advantage for further free software development. + free software developers need to make advantages for each other. I hope + some day we will have a large collection of GPL-covered libraries that + have no parallel available to proprietary software, providing useful + modules to serve as building blocks in new free software, and adding up + to a major advantage for further free software development. + + (1) This license is now called the GNU Lesser General Public License, + to avoid giving the idea that all libraries ought to use it. + See http://www.gnu.org/philosophy/why-not-lgpl.html. Scratching an itch? Eric Raymond says that "Every good work of software starts by - scratching a developer's personal itch." Maybe that happens sometimes, + scratching a developer's personal itch." Maybe that happens sometimes, but many essential pieces of GNU software were developed in order to - have a complete free operating system. They come from a vision and a + have a complete free operating system. They come from a vision and a plan, not from impulse. For example, we developed the GNU C library because a Unix-like system needs a C library, the Bourne-Again Shell (bash) because a Unix-like system needs a shell, and GNU tar because a Unix-like system needs a - tar program. The same is true for my own programs--the GNU C compiler, + tar program. The same is true for my own programs--the GNU C compiler, GNU Emacs, GDB and GNU Make. Some GNU programs were developed to cope with specific threats to our - freedom. Thus, we developed gzip to replace the Compress program, - which had been lost to the community because of the LZW patents. We - found people to develop LessTif, and more recently started GNOME and - Harmony, to address the problems caused by certain proprietary - libraries (see below). We are developing the GNU Privacy Guard to - replace popular non-free encryption software, because users should not - have to choose between privacy and freedom. + freedom. Thus, we developed gzip to replace the Compress program, which + had been lost to the community because of the LZW patents. We found + people to develop LessTif, and more recently started GNOME and Harmony, + to address the problems caused by certain proprietary libraries (see + below). We are developing the GNU Privacy Guard to replace popular + non-free encryption software, because users should not have to choose + between privacy and freedom. Of course, the people writing these programs became interested in the work, and many features were added to them by various people for the - sake of their own needs and interests. But that is not why the - programs exist. + sake of their own needs and interests. But that is not why the programs + exist. Unexpected developments At the beginning of the GNU project, I imagined that we would develop - the whole GNU system, then release it as a whole. That is not how it + the whole GNU system, then release it as a whole. That is not how it happened. Since each component of the GNU system was implemented on a Unix system, each component could run on Unix systems, long before a - complete GNU system existed. Some of these programs became popular, - and users began extending them and porting them---to the various + complete GNU system existed. Some of these programs became popular, and + users began extending them and porting them---to the various incompatible versions of Unix, and sometimes to other systems as well. The process made these programs much more powerful, and attracted both - funds and contributors to the GNU project. But it probably also - delayed completion of a minimal working system by several years, as - GNU developers' time was put into maintaining these ports and adding - features to the existing components, rather than moving on to write - one missing component after another. + funds and contributors to the GNU project. But it probably also delayed + completion of a minimal working system by several years, as GNU + developers' time was put into maintaining these ports and adding + features to the existing components, rather than moving on to write one + missing component after another. The GNU Hurd By 1990, the GNU system was almost complete; the only major missing - component was the kernel. We had decided to implement our kernel as a - collection of server processes running on top of Mach. Mach is a + component was the kernel. We had decided to implement our kernel as a + collection of server processes running on top of Mach. Mach is a microkernel developed at Carnegie Mellon University and then at the University of Utah; the GNU HURD is a collection of servers (or ``herd - of gnus'') that run on top of Mach, and do the various jobs of the - Unix kernel. The start of development was delayed as we waited for - Mach to be released as free software, as had been promised. + of gnus'') that run on top of Mach, and do the various jobs of the Unix + kernel. The start of development was delayed as we waited for Mach to + be released as free software, as had been promised. One reason for choosing this design was to avoid what seemed to be the hardest part of the job: debugging a kernel program without a - source-level debugger to do it with. This part of the job had been - done already, in Mach, and we expected to debug the HURD servers as - user programs, with GDB. But it took a long time to make that - possible, and the multi-threaded servers that send messages to each - other have turned out to be very hard to debug. Making the HURD work - solidly has stretched on for many years. + source-level debugger to do it with. This part of the job had been done + already, in Mach, and we expected to debug the HURD servers as user + programs, with GDB. But it took a long time to make that possible, and + the multi-threaded servers that send messages to each other have turned + out to be very hard to debug. Making the HURD work solidly has + stretched on for many years. Alix - The GNU kernel was not originally supposed to be called the HURD. Its + The GNU kernel was not originally supposed to be called the HURD. Its original name was Alix--named after the woman who was my sweetheart at - the time. She, a Unix system administrator, had pointed out how her + the time. She, a Unix system administrator, had pointed out how her name would fit a common naming pattern for Unix system versions; as a - joke, she told her friends, "Someone should name a kernel after me." I + joke, she told her friends, "Someone should name a kernel after me." I said nothing, but decided to surprise her with a kernel named Alix. - It did not stay that way. Michael Bushnell (now Thomas), the main - developer of the kernel, preferred the name HURD, and redefined Alix - to refer to a certain part of the kernel--the part that would trap - system calls and handle them by sending messages to HURD servers. + It did not stay that way. Michael Bushnell (now Thomas), the main + developer of the kernel, preferred the name HURD, and redefined Alix to + refer to a certain part of the kernel--the part that would trap system + calls and handle them by sending messages to HURD servers. Ultimately, Alix and I broke up, and she changed her name; independently, the HURD design was changed so that the C library would send messages directly to servers, and this made the Alix component disappear from the design. - But before these things happened, a friend of hers came across the - name Alix in the HURD source code, and mentioned the name to her. So - the name did its job. + But before these things happened, a friend of hers came across the name + Alix in the HURD source code, and mentioned the name to her. So the + name did its job. Linux and GNU/Linux - The GNU Hurd is not ready for production use. Fortunately, another - kernel is available. In 1991, Linus Torvalds developed a - Unix-compatible kernel and called it Linux. Around 1992, combining + The GNU Hurd is not ready for production use. Fortunately, another + kernel is available. In 1991, Linus Torvalds developed a + Unix-compatible kernel and called it Linux. Around 1992, combining Linux with the not-quite-complete GNU system resulted in a complete - free operating system. (Combining them was a substantial job in - itself, of course.) It is due to Linux that we can actually run a - version of the GNU system today. + free operating system. (Combining them was a substantial job in itself, + of course.) It is due to Linux that we can actually run a version of + the GNU system today. We call this system version GNU/Linux, to express its composition as a combination of the GNU system with Linux as the kernel. @@ -654,89 +655,86 @@ Challenges in our future We have proved our ability to develop a broad spectrum of free - software. This does not mean we are invincible and unstoppable. - Several challenges make the future of free software uncertain; meeting - them will require steadfast effort and endurance, sometimes lasting - for years. It will require the kind of determination that people - display when they value their freedom and will not let anyone take it - away. + software. This does not mean we are invincible and unstoppable. Several + challenges make the future of free software uncertain; meeting them + will require steadfast effort and endurance, sometimes lasting for + years. It will require the kind of determination that people display + when they value their freedom and will not let anyone take it away. The following four sections discuss these challenges. Secret hardware Hardware manufacturers increasingly tend to keep hardware - specifications secret. This makes it difficult to write free drivers - so that Linux and XFree86 can support new hardware. We have complete - free systems today, but we will not have them tomorrow if we cannot - support tomorrow's computers. + specifications secret. This makes it difficult to write free drivers so + that Linux and XFree86 can support new hardware. We have complete free + systems today, but we will not have them tomorrow if we cannot support + tomorrow's computers. - There are two ways to cope with this problem. Programmers can do - reverse engineering to figure out how to support the hardware. The - rest of us can choose the hardware that is supported by free software; - as our numbers increase, secrecy of specifications will become a + There are two ways to cope with this problem. Programmers can do + reverse engineering to figure out how to support the hardware. The rest + of us can choose the hardware that is supported by free software; as + our numbers increase, secrecy of specifications will become a self-defeating policy. Reverse engineering is a big job; will we have programmers with sufficient determination to undertake it? Yes--if we have built up a strong feeling that free software is a matter of principle, and - non-free drivers are intolerable. And will large numbers of us spend + non-free drivers are intolerable. And will large numbers of us spend extra money, or even a little extra time, so we can use free drivers? Yes, if the determination to have freedom is widespread. Non-free libraries A non-free library that runs on free operating systems acts as a trap - for free software developers. The library's attractive features are - the bait; if you use the library, you fall into the trap, because your - program cannot usefully be part of a free operating system. (Strictly + for free software developers. The library's attractive features are the + bait; if you use the library, you fall into the trap, because your + program cannot usefully be part of a free operating system. (Strictly speaking, we could include your program, but it won't run with the library missing.) Even worse, if a program that uses the proprietary library becomes popular, it can lure other unsuspecting programmers into the trap. The first instance of this problem was the Motif toolkit, back in the - 80s. Although there were as yet no free operating systems, it was - clear what problem Motif would cause for them later on. The GNU - Project responded in two ways: by asking individual free software - projects to support the free X toolkit widgets as well as Motif, and - by asking for someone to write a free replacement for Motif. The job - took many years; LessTif, developed by the Hungry Programmers, became - powerful enough to support most Motif applications only in 1997. + 80s. Although there were as yet no free operating systems, it was clear + what problem Motif would cause for them later on. The GNU Project + responded in two ways: by asking individual free software projects to + support the free X toolkit widgets as well as Motif, and by asking for + someone to write a free replacement for Motif. The job took many years; + LessTif, developed by the Hungry Programmers, became powerful enough to + support most Motif applications only in 1997. - Between 1996 and 1998, another non-free GUI toolkit library, called - Qt, was used in a substantial collection of free software, the desktop - KDE. + Between 1996 and 1998, another non-free GUI toolkit library, called Qt, + was used in a substantial collection of free software, the desktop KDE. - Free GNU/Linux systems were unable to use KDE, because we could not - use the library. However, some commercial distributors of GNU/Linux - systems who were not strict about sticking with free software added - KDE to their systems--producing a system with more capabilities, but - less freedom. The KDE group was actively encouraging more programmers - to use Qt, and millions of new "Linux users" had never been exposed to - the idea that there was a problem in this. The situation appeared - grim. + Free GNU/Linux systems were unable to use KDE, because we could not use + the library. However, some commercial distributors of GNU/Linux systems + who were not strict about sticking with free software added KDE to + their systems--producing a system with more capabilities, but less + freedom. The KDE group was actively encouraging more programmers to use + Qt, and millions of new "Linux users" had never been exposed to the + idea that there was a problem in this. The situation appeared grim. - The free software community responded to the problem in two ways: - GNOME and Harmony. + The free software community responded to the problem in two ways: GNOME + and Harmony. GNOME, the GNU Network Object Model Environment, is GNU's desktop - project. Started in 1997 by Miguel de Icaza, and developed with the + project. Started in 1997 by Miguel de Icaza, and developed with the support of Red Hat Software, GNOME set out to provide similar desktop - facilities, but using free software exclusively. It has technical - advantages as well, such as supporting a variety of languages, not - just C++. But its main purpose was freedom: not to require the use of - any non-free software. + facilities, but using free software exclusively. It has technical + advantages as well, such as supporting a variety of languages, not just + C++. But its main purpose was freedom: not to require the use of any + non-free software. Harmony is a compatible replacement library, designed to make it possible to run KDE software without using Qt. In November 1998, the developers of Qt announced a change of license - which, when carried out, should make Qt free software. There is no way + which, when carried out, should make Qt free software. There is no way to be sure, but I think that this was partly due to the community's - firm response to the problem that Qt posed when it was non-free. (The - new license is inconvenient and inequitable, so it remains desirable - to avoid using Qt.) + firm response to the problem that Qt posed when it was non-free. (The + new license is inconvenient and inequitable, so it remains desirable to + avoid using Qt.) [Subsequent note: in September 2000, Qt was rereleased under the GNU GPL, which essentially solved this problem.] @@ -750,80 +748,82 @@ The worst threat we face comes from software patents, which can put algorithms and features off limits to free software for up to twenty - years. The LZW compression algorithm patents were applied for in 1983, + years. The LZW compression algorithm patents were applied for in 1983, and we still cannot release free software to produce proper compressed - GIFs. In 1998, a free program to produce MP3 compressed audio was + GIFs. In 1998, a free program to produce MP3 compressed audio was removed from distribution under threat of a patent suit. There are ways to cope with patents: we can search for evidence that a patent is invalid, and we can look for alternative ways to do a job. But each of these methods works only sometimes; when both fail, a patent may force all free software to lack some feature that users - want. What will we do when this happens? + want. What will we do when this happens? Those of us who value free software for freedom's sake will stay with - free software anyway. We will manage to get work done without the - patented features. But those who value free software because they + free software anyway. We will manage to get work done without the + patented features. But those who value free software because they expect it to be techically superior are likely to call it a failure - when a patent holds it back. Thus, while it is useful to talk about - the practical effectiveness of the "cathedral" model of development, + when a patent holds it back. Thus, while it is useful to talk about the + practical effectiveness of the "cathedral" model of development (1), and the reliability and power of some free software, we must not stop - there. We must talk about freedom and principle. + there. We must talk about freedom and principle. + + (1) It would have been clearer to write `of the "bazaar" model', since + that was the alternative that was new and initially controversial. Free documentation The biggest deficiency in our free operating systems is not in the software--it is the lack of good free manuals that we can include in - our systems. Documentation is an essential part of any software + our systems. Documentation is an essential part of any software package; when an important free software package does not come with a - good free manual, that is a major gap. We have many such gaps today. + good free manual, that is a major gap. We have many such gaps today. Free documentation, like free software, is a matter of freedom, not - price. The criterion for a free manual is pretty much the same as for + price. The criterion for a free manual is pretty much the same as for free software: it is a matter of giving all users certain freedoms. Redistribution (including commercial sale) must be permitted, on-line and on paper, so that the manual can accompany every copy of the program. - Permission for modification is crucial too. As a general rule, I don't + Permission for modification is crucial too. As a general rule, I don't believe that it is essential for people to have permission to modify - all sorts of articles and books. For example, I don't think you or I + all sorts of articles and books. For example, I don't think you or I are obliged to give permission to modify articles like this one, which describe our actions and our views. But there is a particular reason why the freedom to modify is crucial - for documentation for free software. When people exercise their right + for documentation for free software. When people exercise their right to modify the software, and add or change its features, if they are conscientious they will change the manual too--so they can provide - accurate and usable documentation with the modified program. A manual + accurate and usable documentation with the modified program. A manual which does not allow programmers to be conscientious and finish the job, does not fill our community's needs. - Some kinds of limits on how modifications are done pose no problem. - For example, requirements to preserve the original author's copyright - notice, the distribution terms, or the list of authors, are ok. It is + Some kinds of limits on how modifications are done pose no problem. For + example, requirements to preserve the original author's copyright + notice, the distribution terms, or the list of authors, are ok. It is also no problem to require modified versions to include notice that they were modified, even to have entire sections that may not be deleted or changed, as long as these sections deal with nontechnical - topics. These kinds of restrictions are not a problem because they - don't stop the conscientious programmer from adapting the manual to - fit the modified program. In other words, they don't block the free + topics. These kinds of restrictions are not a problem because they + don't stop the conscientious programmer from adapting the manual to fit + the modified program. In other words, they don't block the free software community from making full use of the manual. However, it must be possible to modify all the *technical* content of the manual, and then distribute the result in all the usual media, - through all the usual channels; otherwise, the restrictions do - obstruct the community, the manual is not free, and we need another - manual. + through all the usual channels; otherwise, the restrictions do obstruct + the community, the manual is not free, and we need another manual. Will free software developers have the awareness and determination to - produce a full spectrum of free manuals? Once again, our future - depends on philosophy. + produce a full spectrum of free manuals? Once again, our future depends + on philosophy. We must talk about freedom Estimates today are that there are ten million users of GNU/Linux - systems such as Debian GNU/Linux and Red Hat Linux. Free software has + systems such as Debian GNU/Linux and Red Hat Linux. Free software has developed such practical advantages that users are flocking to it for purely practical reasons. @@ -833,15 +833,15 @@ instead of proprietary software products. But interest in the software is growing faster than awareness of the - philosophy it is based on, and this leads to trouble. Our ability to + philosophy it is based on, and this leads to trouble. Our ability to meet the challenges and threats described above depends on the will to - stand firm for freedom. To make sure our community has this will, we + stand firm for freedom. To make sure our community has this will, we need to spread the idea to the new users as they come into the community. But we are failing to do so: the efforts to attract new users into our community are far outstripping the efforts to teach them the civics of - our community. We need to do both, and we need to keep the two efforts + our community. We need to do both, and we need to keep the two efforts in balance. "Open Source" @@ -851,50 +851,50 @@ and say "open source software" instead. Some who favored this term aimed to avoid the confusion of "free" with - "gratis"--a valid goal. Others, however, aimed to set aside the spirit + "gratis"--a valid goal. Others, however, aimed to set aside the spirit of principle that had motivated the free software movement and the GNU project, and to appeal instead to executives and business users, many of whom hold an ideology that places profit above freedom, above - community, above principle. Thus, the rhetoric of "open source" - focuses on the potential to make high quality, powerful software, but - shuns the ideas of freedom, community, and principle. + community, above principle. Thus, the rhetoric of "open source" focuses + on the potential to make high quality, powerful software, but shuns the + ideas of freedom, community, and principle. - The "Linux" magazines are a clear example of this--they are filled - with advertisements for proprietary software that works with - GNU/Linux. When the next Motif or Qt appears, will these magazines - warn programmers to stay away from it, or will they run ads for it? + The "Linux" magazines are a clear example of this--they are filled with + advertisements for proprietary software that works with GNU/Linux. When + the next Motif or Qt appears, will these magazines warn programmers to + stay away from it, or will they run ads for it? The support of business can contribute to the community in many ways; - all else being equal, it is useful. But winning their support by + all else being equal, it is useful. But winning their support by speaking even less about freedom and principle can be disastrous; it - makes the previous imbalance between outreach and civics education - even worse. + makes the previous imbalance between outreach and civics education even + worse. "Free software" and "open source" describe the same category of software, more or less, but say different things about the software, - and about values. The GNU Project continues to use the term "free + and about values. The GNU Project continues to use the term "free software", to express the idea that freedom, not just technology, is important. Try! Yoda's philosophy ("There is no `try'") sounds neat, but it doesn't - work for me. I have done most of my work while anxious about whether I + work for me. I have done most of my work while anxious about whether I could do the job, and unsure that it would be enough to achieve the - goal if I did. But I tried anyway, because there was no one but me - between the enemy and my city. Surprising myself, I have sometimes + goal if I did. But I tried anyway, because there was no one but me + between the enemy and my city. Surprising myself, I have sometimes succeeded. - Sometimes I failed; some of my cities have fallen. Then I found - another threatened city, and got ready for another battle. Over time, - I've learned to look for threats and put myself between them and my - city, calling on other hackers to come and join me. + Sometimes I failed; some of my cities have fallen. Then I found another + threatened city, and got ready for another battle. Over time, I've + learned to look for threats and put myself between them and my city, + calling on other hackers to come and join me. - Nowadays, often I'm not the only one. It is a relief and a joy when I + Nowadays, often I'm not the only one. It is a relief and a joy when I see a regiment of hackers digging in to hold the line, and I realize, - this city may survive--for now. But the dangers are greater each year, - and now Microsoft has explicitly targeted our community. We can't take - the future of freedom for granted. Don't take it for granted! If you + this city may survive--for now. But the dangers are greater each year, + and now Microsoft has explicitly targeted our community. We can't take + the future of freedom for granted. Don't take it for granted! If you want to keep your freedom, you must be prepared to defend it. Copyright (C) 1998 Richard Stallman
--- a/etc/TODO Sat Oct 14 16:56:21 2006 +0000 +++ b/etc/TODO Sat Oct 14 17:36:28 2006 +0000 @@ -48,6 +48,9 @@ It should not generate :require. Or :require in defcustom should not be recorded in the user's custom-set-variables call. +** Feature to change cursor shape when Emacs is idle (for more than + a specified time). + ** The buttons at the top of a custom buffer should not omit variables whose values are currently hidden.
--- a/etc/TUTORIAL.bg Sat Oct 14 16:56:21 2006 +0000 +++ b/etc/TUTORIAL.bg Sat Oct 14 17:36:28 2006 +0000 @@ -1,6 +1,6 @@ -Âúâåäåíèå â Emacs. Óñëîâèÿòà çà êîïèðàíå ñà â êðàÿ íà òåêñòà. +Âúâåäåíèåòî íà Åìàêñ. Óñëîâèÿòà çà êîïèðàíå ñà â êðàÿ íà òåêñòà. -Êîìàíäèòå íà Emacs íàé-÷åñòî âêëþ÷âàò êëàâèøèòå CONTROL (ïîíÿêîãà +Êîìàíäèòå íà Åìàêñ íàé-÷åñòî âêëþ÷âàò êëàâèøèòå CONTROL (ïîíÿêîãà îòáåëÿçâàí ñ CTRL èëè CTL) è META (ïîíÿêîãà îòáåëÿçâàí ñ EDIT èëè ALT). Âìåñòî äà ñå èçïèñâàò ñ ïúëíî èìå âñåêè ïúò, íèå ùå èçïîëçâàìå ñëåäíèòå ñúêðàùåíèÿ: @@ -14,7 +14,7 @@ êëàâèøà ESC è ñëåä òîâà âúâåäåòå <çíàê>. Íèå çàïèñâàìå <ESC>, çà äà îòáåëåæèì êëàâèøà ESC. -Âàæíà áåëåæêà: â êðàÿ íà Emacs ñåñèÿòà âúâåäåòå äâàòà çíàêà C-x C-c. +Âàæíà áåëåæêà: â êðàÿ íà Åìàêñ ñåñèÿòà âúâåäåòå äâàòà çíàêà C-x C-c. Çíàöèòå ">>" îòëÿâî âè äàâàò óêàçàíèå äà èçïúëíèòå êîìàíäà. Íàïðèìåð: <<Blank lines inserted here by startup of help-with-tutorial>> >> Ñåãà âúâåäåòå C-v (Ïîêàæè ñëåäâàùèÿ åêðàí), çà äà ñå ïðèäâèæèòå êúì @@ -92,7 +92,7 @@ Âñåêè ðåä îò òåêñò çàâúðøâà ñúñ çíàê çà íîâ ðåä, êîéòî ñëóæè çà îòäåëÿíåòî íà ðåäà îò ñëåäâàùèÿ ðåä. Ïîñëåäíèÿò ðåä âúâ âàøèÿ ôàéë -òðÿáâà äà èìà çíàê çà íîâ ðåä â êðàÿ (íî Emacs íå èçèñêâà òàêúâ, +òðÿáâà äà èìà çíàê çà íîâ ðåä â êðàÿ (íî Åìàêñ íå èçèñêâà òàêúâ, êîãàòî ïðî÷èòà ôàéëà). >> Îïèòàéòå C-b â íà÷àëîòî íà ðåä. Òîâà òðÿáâà äà âè ïðèäâèæè â êðàÿ @@ -108,7 +108,7 @@ Êîãàòî ñå ïðèäâèæâàòå ñëåä ãîðíèÿ èëè äîëíèÿ êðàé íà åêðàíà, òåêñòúò îòâúä êðàÿ ñå èçìåñòâà êúì åêðàíà. Òîâà ñå íàðè÷à "ñêðîëèðàíå". Òî -ïîçâîëÿâà íà Emacs äà ïðèäâèæâà êóðñîðà êúì çàäàäåíîòî ìÿñòî â òåêñòà, +ïîçâîëÿâà íà Åìàêñ äà ïðèäâèæâà êóðñîðà êúì çàäàäåíîòî ìÿñòî â òåêñòà, áåç äà ãî èçêàðâà èçâúí åêðàíà. >> Îïèòàéòå ñå äà ïðèäâèæèòå êóðñîðà ñëåä äîëíèÿ êðàé íà åêðàíà ñ C-n @@ -191,7 +191,7 @@ Âèå ìîæåòå ñúùî äà ñå ïðèäâèæâàòå ñ êëàâèøèòå-ñòðåëêè, àêî âàøèÿò òåðìèíàë èìà òàêèâà. Íèå ïðåïîðú÷âàìå äà íàó÷èòå C-b, C-f, C-n è C-p ïî òðè ïðè÷èíè. Ïúðâî, òå ðàáîòÿò íà âñè÷êè âèäîâå òåðìèíàëè. Âòîðî, -âåäíúæ ñëåä êàòî äîáèåòå ïðàêòèêà â èçïîëçâàíåòî íà Emacs, ùå +âåäíúæ ñëåä êàòî äîáèåòå ïðàêòèêà â èçïîëçâàíåòî íà Åìàêñ, ùå îòêðèåòå, ÷å âúâåæäàíåòî íà òåçè Control-çíàöè å ïî-áúðçî îò âúâåæäàíåòî íà êëàâèøèòå ñòðåëêè, çàùîòî íå òðÿáâà äà ïðåìåñòâàòå ðúêàòà ñè äàëå÷ îò îáëàñòòà íà êëàâèøèòå ñ áóêâè. Òðåòî, âåäíúæ ñëåä @@ -199,7 +199,7 @@ ìîæåòå ñúùî òàêà ëåñíî äà íàó÷èòå ïî-íàïðåäíàëèòå êîìàíäè çà äâèæåíèå íà êóðñîðà. -Ïîâå÷åòî Emacs êîìàíäè ïðèåìàò ÷èñëîâ àðãóìåíò; çà ïîâå÷åòî îò òÿõ òîé +Ïîâå÷åòî Åìàêñ êîìàíäè ïðèåìàò ÷èñëîâ àðãóìåíò; çà ïîâå÷åòî îò òÿõ òîé ñëóæè êàòî áðîÿ÷ íà ïîâòîðåíèÿ. Íà÷èíúò, ïî êîéòî äàâàòå ÷èñëîâ áðîÿ÷, å ñ âúâåæäàíå íà C-u, ïîñëåäâàíî îò âúâåæäàíå íà öèôðèòå, è âñè÷êî òîâà ïðåäè âúâåæäàíå íà ñàìàòà êîìàíäà. Àêî èìàòå êëàâèø META @@ -231,7 +231,7 @@ Àêî èçïîëçâàòå ãðàôè÷åí èíòåðôåéñ, êàòî X11 èëè MS-Windows, áè òðÿáâàëî äà èìà òúíêà ïðàâîúãúëíà îáëàñò, íàðå÷åíà ïëúçãà÷ (scroll -bar), â ëÿâàòà ñòðàíà íà ïðîçîðåöà íà Emacs. Âèå ìîæåòå äà ñêðîëèðàòå +bar), â ëÿâàòà ñòðàíà íà ïðîçîðåöà íà Åìàêñ. Âèå ìîæåòå äà ñêðîëèðàòå òåêñòà, ùðàêàéêè ñ ìèøêàòà â ïëúçãà÷à. >> Îïèòàéòå äà íàòèñíåòå ñðåäíèÿ áóòîí íà âúðõà íà îñâåòåíàòà îáëàñò @@ -243,10 +243,10 @@ íàãîðå è íàäîëó, êàòî äâèæèòå ìèøêàòà. -* ÊÎÃÀÒÎ EMACS Å ÁËÎÊÈÐÀË +* ÊÎÃÀÒÎ ÅÌÀÊÑ Å ÁËÎÊÈÐÀË ------------------------- -Àêî Emacs ñïðå äà îòãîâàðÿ íà âàøèòå êîìàíäè, âèå ìîæåòå äà ãî ñïðåòå +Àêî Åìàêñ ñïðå äà îòãîâàðÿ íà âàøèòå êîìàíäè, âèå ìîæåòå äà ãî ñïðåòå áåçîïàñíî, êàòî âúâåäåòå C-g. Ìîæå äà èçïîëçâàòå C-g, çà äà ñïðåòå êîìàíäà, êîÿòî ñå èçïúëíÿâà òâúðäå äúëãî. @@ -263,15 +263,15 @@ * ÇÀÁÐÀÍÅÍÈ ÊÎÌÀÍÄÈ ------------------- -Íÿêîè êîìàíäè íà Emacs ñà "çàáðàíåíè", òàêà ÷å íà÷èíàåùèòå ïîòðåáèòåëè +Íÿêîè êîìàíäè íà Åìàêñ ñà "çàáðàíåíè", òàêà ÷å íà÷èíàåùèòå ïîòðåáèòåëè äà íå ìîãàò äà ãè óïîòðåáÿò ïî ïîãðåøêà. -Àêî âúâåäåòå íÿêîÿ îò çàáðàíåíèòå êîìàíäè, Emacs èçâåæäà ñúîáùåíèå, +Àêî âúâåäåòå íÿêîÿ îò çàáðàíåíèòå êîìàíäè, Åìàêñ èçâåæäà ñúîáùåíèå, êàçâàéêè êàêâà å áèëà êîìàíäàòà è ïèòàéêè âè äàëè èñêàòå äà ïðîäúëæèòå íàïðåä è äà èçïúëíèòå êîìàíäàòà. -Àêî íàèñòèíà èñêàòå äà èçïðîáâàòå êîìàíäàòà, âúâåäåòå <SPC> (êëàâèøà -èíòåðâàë) â îòãîâîð íà âúïðîñà. Îáèêíîâåíî àêî íå èñêàòå äà èçïúëíèòå +Àêî íàèñòèíà èñêàòå äà èçïðîáâàòå êîìàíäàòà, âúâåäåòå êëàâèøà èíòåðâàë +â îòãîâîð íà âúïðîñà. Îáèêíîâåíî àêî íå èñêàòå äà èçïúëíèòå çàáðàíåíàòà êîìàíäà, îòãîâàðÿòå íà âúïðîñà ñ "n". >> Âúâåäåòå C-x C-l (êîÿòî å çàáðàíåíà êîìàíäà), è ñëåä òîâà âúâåäåòå @@ -281,7 +281,7 @@ * ÏÐÎÇÎÐÖÈ ---------- -Emacs ìîæå äà óïðàâëÿâà íÿêîëêî ïðîçîðåöà, âñåêè èçâåæäàéêè ñâîé +Åìàêñ ìîæå äà óïðàâëÿâà íÿêîëêî ïðîçîðåöà, âñåêè èçâåæäàéêè ñâîé ñîáñòâåí òåêñò. Íèå ùå îáÿñíèì ïî-êúñíî êàê äà èçïîëçâàòå íÿêîëêî ïðîçîðåöà. Òî÷íî ñåãà íèå èñêàìå äà îáÿñíèì êàê äà ñå îòúðâåòå îò äîïúëíèòåëíè ïðîçîðöè è äà ñå âúðíåòå êúì îñíîâíîòî ðåäàêòèðàíå ñ åäèí @@ -311,13 +311,13 @@ ---------------------- Àêî èñêàòå äà âìúêíåòå òåêñò, ïðîñòî ãî âúâåäåòå. Çíàöèòå, êîèòî -ìîãàò äà ñå âèæäàò, êàòî À, 7, * è ò.í., ñå âúçïðèåìàò îò Emacs êàòî +ìîãàò äà ñå âèæäàò, êàòî À, 7, * è ò.í., ñå âúçïðèåìàò îò Åìàêñ êàòî òåêñò è ñå âìúêâàò âåäíàãà. Âúâåäåòå <Return> (êëàâèøúò çà âðúùàíå â íà÷àëîòî íà ðåäà), çà äà âìúêíåòå çíàê çà íîâ ðåä. Ìîæå äà èçòðèåòå ïîñëåäíèÿ çíàê, êîéòî ñòå âúâåëè, ñ âúâåæäàíå íà <Delback>. <Delback> å êëàâèø îò êëàâèàòóðàòà -- ñúùèÿò, êîéòî -îáèêíîâåíî èçïîëçâàòå èçâúí Emacs, çà äà èçòðèåòå ïîñëåäíèÿ âúâåäåí îò +îáèêíîâåíî èçïîëçâàòå èçâúí Åìàêñ, çà äà èçòðèåòå ïîñëåäíèÿ âúâåäåí îò âàñ çíàê. Îáèêíîâåíî å ãîëÿì êëàâèø, íà íÿêîëêî ðåäà ðàçñòîÿíèå îò êëàâèøà <Return>, è îáèêíîâåíî å îòáåëÿçàí ñ "Delete", "Del" èëè "Backspace". @@ -357,24 +357,24 @@ >> Âúâåäåòå <Return>, çà äà âìúêíåòå íàíîâî çíàêà çà íîâ ðåä, êîéòî èçòðèõòå. -Çàïîìíåòå, ÷å íà ïîâå÷åòî êîìàíäè íà Emacs ìîæå äà áúäå çàäàäåí áðîÿ÷ +Çàïîìíåòå, ÷å íà ïîâå÷åòî êîìàíäè íà Åìàêñ ìîæå äà áúäå çàäàäåí áðîÿ÷ íà ïîâòîðåíèÿòà; òîâà âêëþ÷âà âìúêâàíåòî íà òåêñòîâè çíàöè. Ïîâòàðÿíåòî íà òåêñòîâ çíàê ãî âìúêâà íÿêîëêî ïúòè. >> Îïèòàéòå òîâà ñåãà -- âúâåäåòå C-u 8 *, çà äà âìúêíåòå ********. -Ñåãà âèå ñòå íàó÷èëè íàé-îñíîâíèòå íà÷èíè çà âúâåæäàíå íà íåùî â Emacs +Ñåãà âèå ñòå íàó÷èëè íàé-îñíîâíèòå íà÷èíè çà âúâåæäàíå íà íåùî â Åìàêñ è ïîïðàâÿíå íà ãðåøêè. Ìîæåòå ñúùî òàêà äà èçòðèâàòå äóìè èëè ðåäîâå. Åòî îáîáùåíèå íà èçòðèâàùèòå äåéñòâèÿ: - <Delback> Èçòðèâàíå íà çíàêà òî÷íî ïðåäè êóðñîðà - C-d Èçòðèâàíå íà çíàêà òî÷íî ñëåä êóðñîðà + <Delback> èçòðèâàíå íà çíàêà òî÷íî ïðåäè êóðñîðà + C-d èçòðèâàíå íà çíàêà òî÷íî ñëåä êóðñîðà - M-<Delback> Èçòðèâàíå íà äóìàòà íåïîñðåäñòâåíî ïðåäè êóðñîðà - M-d Èçòðèâàíå íà äóìàòà ñëåä êóðñîðà + M-<Delback> èçòðèâàíå íà äóìàòà íåïîñðåäñòâåíî ïðåäè êóðñîðà + M-d èçòðèâàíå íà äóìàòà ñëåä êóðñîðà - C-k Èçòðèâàíå îò ìÿñòîòî íà êóðñîðà äî êðàÿ íà ðåäà - M-k Èçòðèâàíå äî êðàÿ íà òåêóùîòî èçðå÷åíèå + C-k èçòðèâàíå îò ìÿñòîòî íà êóðñîðà äî êðàÿ íà ðåäà + M-k èçòðèâàíå äî êðàÿ íà òåêóùîòî èçðå÷åíèå Çàáåëåæåòå, ÷å <Delback> è C-d, ñðàâíåíè ñ M-<Delback> è M-d, ðàçøèðÿâàò ïîäîáèåòî, çàïî÷íàòî îò C-f è M-f (äîáðå, <Delback> íå å @@ -384,12 +384,12 @@ Ìîæåòå ñúùî äà ïðåìàõíåòå âñÿêà ÷àñò îò áóôåðà ñ åäèí óíèâåðñàëåí íà÷èí. Ïðèäâèæåòå ñå äî åäèíèÿ êðàé íà ÷àñòòà è âúâåäåòå C-@ èëè -C-<SPC> (êîåòî è äà å îò äâåòå). (<SPC> å êëàâèøúò èíòåðâàë.) -Ïðèäâèæåòå ñå äî äðóãèÿ êðàé íà ÷àñòòà è âúâåäåòå C-w. Òîâà ùå èçðåæå -öåëèÿ òåêñò ìåæäó òåçè äâà êðàÿ. +C-èíòåðâàë (êîåòî è äà å îò äâåòå). Ïðèäâèæåòå ñå äî äðóãèÿ êðàé íà +÷àñòòà è âúâåäåòå C-w. Òîâà ùå èçðåæå öåëèÿ òåêñò ìåæäó òåçè äâà +êðàÿ. >> Ïðèäâèæåòå êóðñîðà äî çíàêà "Ì" â íà÷àëîòî íà ïðåäèøíèÿ àáçàö. ->> Âúâåäåòå C-<SPC>. Emacs òðÿáâà äà èçâåäå ñúîáùåíèå "Mark set" â +>> Âúâåäåòå C-èíòåðâàë. Åìàêñ òðÿáâà äà èçâåäå ñúîáùåíèå "Mark set" â äîëíèÿ êðàé íà åêðàíà. >> Ïðèäâèæåòå êóðñîðà äî áóêâàòà "ð" â "êðàé" íà âòîðèÿ ðåä îò àáçàöà. >> Âúâåäåòå C-w. Òîâà ùå èçðåæå òåêñòà, çàïî÷âàù îò "Ì" è çàâúðøâàù @@ -419,9 +419,9 @@ Âðúùàíåòî îáðàòíî íà òåêñò ñå íàðè÷à "âìúêâàíå". (Ìèñëåòå çà íåãî êàòî çà èçâàæäàíå îáðàòíî, èëè äðúïâàíå îáðàòíî, íà òåêñò, êîéòî å áèë èçðÿçàí.) Ìîæåòå äà âìúêâàòå èçðÿçàíèÿ òåêñò èëè íà ñúùîòî ìÿñòî, -îòêúäåòî å áèë ïðåìàõíàò, èëè íà äðóãî ìÿñòî â ðåäàêòèðàíèÿ òåêñò, -äàæå è â ðàçëè÷åí ôàéë. Ìîæåòå äà âìúêâàòå åäèí è ñúù òåêñò íÿêîëêî -ïúòè; òîâà ïðàâè íÿêîëêî êîïèÿ îò íåãî. +îòêúäåòî å áèë ïðåìàõíàò, èëè íà äðóãî ìÿñòî â áóôåðà, äàæå è â +ðàçëè÷åí ôàéë. Ìîæåòå äà âìúêâàòå åäèí è ñúù òåêñò íÿêîëêî ïúòè; òîâà +ïðàâè íÿêîëêî êîïèÿ îò íåãî. Êîìàíäàòà çà âìúêâàíå å C-y. Òÿ âìúêâà íàíîâî ïîñëåäíèÿ èçðÿçàí òåêñò â òåêóùîòî ìÿñòî íà êóðñîðà. @@ -500,25 +500,25 @@ --------- Çà äà íàïðàâèòå òåêñòà, êîéòî ðåäàêòèðàòå, ïîñòîÿíåí, òðÿáâà äà ãî -ñëîæèòå âúâ ôàéë.  ïðîòèâåí ñëó÷àé òîé ùå èç÷åçíå, êîãàòî Emacs +ñëîæèòå âúâ ôàéë.  ïðîòèâåí ñëó÷àé òîé ùå èç÷åçíå, êîãàòî Åìàêñ ïðèêëþ÷è. Çà äà ñëîæèòå âàøèÿ òåêñò âúâ ôàéë, òðÿáâà äà "íàìåðèòå" ôàéëà ïðåäè äà âúâåæäàòå òåêñò. (Òîâà ñúùî ñå íàðè÷à "ïîñåùàâàíå" íà ôàéëà.) -Íàìèðàíå íà ôàéë îçíà÷àâà, ÷å âèæäàòå ñúäúðæàíèåòî ìó â Emacs.  +Íàìèðàíå íà ôàéë îçíà÷àâà, ÷å âèæäàòå ñúäúðæàíèåòî ìó â Åìàêñ.  ìíîãî ñëó÷àè òîâà å êàòî äà ðåäàêòèðàòå ñàìèÿ ôàéë. Îáà÷å ïðîìåíèòå, -êîèòî ïðàâèòå, èçïîëçâàéêè Emacs, íå îñòàâàò ïîñòîÿííè, äîêàòî íå +êîèòî ïðàâèòå, èçïîëçâàéêè Åìàêñ, íå îñòàâàò ïîñòîÿííè, äîêàòî íå "çàïèøåòå" ôàéëà. Òîâà å òàêà, çà äà ñå ïðåäîòâðàòè îñòàâÿíåòî íà ïîëóïðîìåíåí ôàéë â ñèñòåìàòà, êîãàòî íå èñêàòå òîâà. Äîðè êîãàòî -çàïèñâàòå, Emacs îñòàâÿ íà÷àëíèÿ ôàéë ïîä ïðîìåíåíî èìå, â ñëó÷àé, ÷å +çàïèñâàòå, Åìàêñ îñòàâÿ íà÷àëíèÿ ôàéë ïîä ïðîìåíåíî èìå, â ñëó÷àé, ÷å ïî-êúñíî ðåøèòå, ÷å âàøèòå ïðîìåíè ñà áèëè ãðåøêà. Àêî ïîãëåäíåòå â äúíîòî íà åêðàíà, ùå âèäèòå ðåä, êîéòî çàïî÷âà è -çàâúðøâà ñ òèðåòà è çàïî÷âà ñ "-R:-- TUTORIAL.bg" èëè íåùî ïîäîáíî. +çàâúðøâà ñ òèðåòà è çàïî÷âà ñ "-b:-- TUTORIAL.bg" èëè íåùî ïîäîáíî. Òàçè ÷àñò îò åêðàíà ïîêàçâà èìåòî íà ôàéëà, êîéòî ñòå ïîñåòèëè. Òî÷íî ñåãà âèå ñòå ïîñåòèëè ôàéë, íàðå÷åí "TUTORIAL.bg", êîéòî å âàøåòî -ëè÷íî êîïèå-÷åðíîâà íà Emacs âúâåäåíèåòî. Êîãàòî íàìåðèòå ôàéë â -Emacs, èìåòî íà òîçè ôàéë ùå ñå ïîÿâè íà ñúùîòî ìÿñòî. +ëè÷íî êîïèå-÷åðíîâà íà Åìàêñ âúâåäåíèåòî. Êîãàòî íàìåðèòå ôàéë â +Åìàêñ, èìåòî íà òîçè ôàéë ùå ñå ïîÿâè íà ñúùîòî ìÿñòî. Îñîáåíîñò íà êîìàíäàòà çà íàìèðàíå íà ôàéë å, ÷å òðÿáâà äà êàæåòå èìåòî íà ôàéëà, êîéòî èñêàòå. Íèå ãî íàðè÷àìå "÷åòåíå íà àðãóìåíò îò @@ -527,10 +527,10 @@ C-x C-f Íàìèðàíå íà ôàéë -Emacs âè ïîäêàíÿ äà âúâåäåòå èìåòî íà ôàéëà. Èìåòî íà ôàéëà, êîåòî +Åìàêñ âè ïîäêàíÿ äà âúâåäåòå èìåòî íà ôàéëà. Èìåòî íà ôàéëà, êîåòî íàïèøåòå, ñå ïîÿâÿâà â äúíîòî íà åêðàíà. Ðåäúò â äúíîòî íà åêðàíà ñå íàðè÷à ìèíèáóôåð, êîãàòî ñå èçïîëçâà çà òîçè âèä âõîä. Ìîæåòå äà -èçïîëçâàòå îáèêíîâåíèòå êîìàíäè çà ðåäàêòèðàíå íà Emacs, çà äà +èçïîëçâàòå îáèêíîâåíèòå êîìàíäè çà ðåäàêòèðàíå íà Åìàêñ, çà äà ðåäàêòèðàòå èìåòî íà ôàéëà. Êîãàòî âúâåæäàòå èìåòî íà ôàéëà (èëè êàêúâòî è äà å âõîä â @@ -551,12 +551,12 @@ C-x C-s Çàïàçâàíå íà ôàéëà -Òîâà êîïèðà òåêñòà îò Emacs âúâ ôàéëà. Ïúðâèÿ ïúò, êîãàòî òîâà ñå -íàïðàâè, Emacs ïðåèìåíóâà íà÷àëíèÿ ôàéë ñ íîâî èìå, òàêà ÷å òîé äà íå +Òîâà êîïèðà òåêñòà îò Åìàêñ âúâ ôàéëà. Ïúðâèÿ ïúò, êîãàòî òîâà ñå +íàïðàâè, Åìàêñ ïðåèìåíóâà íà÷àëíèÿ ôàéë ñ íîâî èìå, òàêà ÷å òîé äà íå ñå èçãóáè. Íîâîòî èìå ñå ïîñòðîÿâà ñ äîáàâÿíå íà "~" â êðàÿ íà èìåòî íà íà÷àëíèÿ ôàéë. -Êîãàòî çàïàçâàíåòî å ñâúðøèëî, Emacs èçâåæäà èìåòî íà ôàéëà, êîéòî å +Êîãàòî çàïàçâàíåòî å ñâúðøèëî, Åìàêñ èçâåæäà èìåòî íà ôàéëà, êîéòî å áèë çàïèñàí. Òðÿáâà äà çàïèñâàòå äîñòàòú÷íî ÷åñòî, òàêà ÷å äà íå èçãóáèòå ìíîãî ðàáîòà, àêî ñèñòåìàòà ñå ñðèíå ïî íÿêàêâà ïðè÷èíà. @@ -564,19 +564,19 @@ Òîâà òðÿáâà äà èçâåäå "Wrote ...TUTORIAL.bg" â äúíîòî íà åêðàíà. ÇÀÁÅËÅÆÊÀ: Íà íÿêîè ñèñòåìè âúâåæäàíåòî íà C-x C-s ùå çàìðúçè åêðàíà è -âèå íÿìà äà âèæäàòå ïîâå÷å èçõîä îò Emacs. Òîâà ïîêàçâà, ÷å åäíà +âèå íÿìà äà âèæäàòå ïîâå÷å èçõîä îò Åìàêñ. Òîâà ïîêàçâà, ÷å åäíà "ñïîñîáíîñò" íà îïåðàöèîííàòà ñèñòåìà, íàðè÷àíà "óïðàâëåíèå íà ïîòîêà" -(flow control), å ïðèõâàíàëà C-s è íå ãî ïðîïóñêà êúì Emacs. Çà äà +(flow control), å ïðèõâàíàëà C-s è íå ãî ïðîïóñêà êúì Åìàêñ. Çà äà ðàçìðàçèòå åêðàíà, âúâåäåòå C-q. Òîãàâà âèæòå ñåêöèÿòà "Ñïîíòàííî âêëþ÷âàíå íà ïîñòúïêîâî òúðñåíå" (Spontaneous Entry to Incremental -Search) â ðúêîâîäñòâîòî íà Emacs çà ñúâåò êàê äà ñå ñïðàâèòå ñ òàçè +Search) â ðúêîâîäñòâîòî íà Åìàêñ çà ñúâåò êàê äà ñå ñïðàâèòå ñ òàçè "ñïîñîáíîñò". Ìîæå äà íàìåðèòå ñúùåñòâóâàù ôàéë, äà ãî ðàçãëåäàòå è äà ãî ðåäàêòèðàòå. Ìîæåòå ñúùî äà íàìåðèòå ôàéë, êîéòî íå ñúùåñòâóâà. Òîâà -å íà÷èíúò çà ñúçäàâàíå íà íîâè ôàéëîâå â Emacs: íàìèðàòå ôàéëà, êîéòî +å íà÷èíúò çà ñúçäàâàíå íà íîâè ôàéëîâå â Åìàêñ: íàìèðàòå ôàéëà, êîéòî ùå áúäå â íà÷àëîòî ïðàçåí, è òîãàâà çàïî÷âàòå âìúêâàíåòî íà òåêñòà çà -ôàéëà. Êîãàòî ãîâîðèòå çà "çàïèñâàíå" íà ôàéë, Emacs âñúùíîñò ùå +ôàéëà. Êîãàòî ãîâîðèòå çà "çàïèñâàíå" íà ôàéë, Åìàêñ âñúùíîñò ùå ñúçäàäå ôàéëà ñ òåêñòà, êîéòî ñòå âúâåëè. Îòòàì íàòàòúê ìîæå äà ñ÷èòàòå, ÷å ðåäàêòèðàòå âå÷å ñúùåñòâóâàù ôàéë. @@ -584,9 +584,9 @@ * ÁÓÔÅÐÈ -------- -Àêî íàìåðèòå âòîðè ôàéë ñ C-x C-f, ïúðâèÿò ôàéë îñòàâà â Emacs. +Àêî íàìåðèòå âòîðè ôàéë ñ C-x C-f, ïúðâèÿò ôàéë îñòàâà â Åìàêñ. Ìîæåòå äà ïðåâêëþ÷èòå îáðàòíî êúì íåãî, êàòî ãî íàìåðèòå ïàê ñ C-x -C-f. Ïî òîçè íà÷èí ìîæå äà ïîëó÷èòå äîñòà íà áðîé ôàéëîâå â Emacs. +C-f. Ïî òîçè íà÷èí ìîæå äà ïîëó÷èòå äîñòà íà áðîé ôàéëîâå â Åìàêñ. >> Ñúçäàéòå ôàéë ñ èìå "foo", âúâåæäàéêè C-x C-f foo <Return>. Âìúêíåòå ìàëêî òåêñò, ðåäàêòèðàéòå ãî è çàïàçåòå "foo" ñ âúâåæäàíå @@ -594,16 +594,16 @@ Íàêðàÿ âúâåäåòå C-x C-f TUTORIAL.bg <Return>, çà äà ñå âúðíåòå îáðàòíî âúâ âúâåäåíèåòî. -Emacs çàïàçâà òåêñòà íà âñåêè ôàéë â îáåêò, íàðè÷àí "áóôåð". -Íàìèðàíåòî íà ôàéë ïðàâè íîâ áóôåð â Emacs. Çà äà âèäèòå ñïèñúê íà -áóôåðèòå, êîèòî â ìîìåíòà ñúùåñòâóâàò âúâ âàøèÿ Emacs, âúâåäåòå +Åìàêñ çàïàçâà òåêñòà íà âñåêè ôàéë â îáåêò, íàðè÷àí "áóôåð". +Íàìèðàíåòî íà ôàéë ïðàâè íîâ áóôåð â Åìàêñ. Çà äà âèäèòå ñïèñúê íà +áóôåðèòå, êîèòî â ìîìåíòà ñúùåñòâóâàò âúâ âàøèÿ Åìàêñ, âúâåäåòå C-x C-b Ïîêàçâàíå íà áóôåðèòå >> Îïèòàéòå C-x C-b ñåãà. Âèæòå êàê âñåêè áóôåð èìà èìå, à ïîíÿêîãà è èìå íà ôàéë çà ôàéëà, -÷èåòî ñúäúðæàíèå äúðæè. ÂÑÅÊÈ òåêñò, êîéòî âèæäàòå â Emacs ïðîçîðåö, +÷èåòî ñúäúðæàíèå äúðæè. ÂÑÅÊÈ òåêñò, êîéòî âèæäàòå â Åìàêñ ïðîçîðåö, å âèíàãè ÷àñò îò íÿêàêúâ áóôåð. >> Âúâåäåòå C-x 1, çà äà ìàõíåòå ñïèñúêà ñ áóôåðèòå. @@ -625,13 +625,13 @@ Ñïèñúêúò ñ áóôåðèòå, êîéòî ïðàâèòå ñ C-x C-b, âèíàãè âè ïîêàçâà èìåòî íà âñåêè áóôåð. -ÂÑÅÊÈ òåêñò, êîéòî âèæäàòå â Emacs ïðîçîðåö, å âèíàãè ÷àñò îò íÿêàêúâ +ÂÑÅÊÈ òåêñò, êîéòî âèæäàòå â Åìàêñ ïðîçîðåö, å âèíàãè ÷àñò îò íÿêàêúâ áóôåð. Íÿêîè áóôåðè íå ñúîòâåòñòâàò íà ôàéëîâå. Íàïðèìåð áóôåðúò, èìåíóâàí "*Buffer List*", íå ñúîòâåòñòâà íà ôàéë. Òîâà å áóôåðúò, êîéòî ñúäúðæà ñïèñúêà ñ áóôåðèòå, êîèòî ñòå íàïðàâèëè ñ C-x C-b. Áóôåðúò, èìåíóâàí "*Messages*", ñúùî íå ñúîòâåòñòâà íà ôàéë; òîé ñúäúðæà ñúîáùåíèÿòà, êîèòî ñå ïîÿâÿâàò â äúíîòî íà åêðàíà ïî âðåìå íà -Emacs ñåñèÿòà. +Åìàêñ ñåñèÿòà. >> Âúâåäåòå C-x b *Messages* <Return>, çà äà âèäèòå áóôåðà ñúñ ñúîáùåíèÿòà. Ñëåä òîâà âúâåäåòå C-x C-b TUTORIAL <Return>, çà äà @@ -639,7 +639,7 @@ Àêî íàïðàâèòå ïðîìåíè â òåêñòà íà åäèí ôàéë è òîãàâà íàìåðèòå äðóã ôàéë, òîâà íÿìà äà çàïèøå ïúðâèÿ ôàéë. Íåãîâèòå ïðîìåíè îñòàâàò âúòðå -â Emacs, â áóôåðà íà ôàéëà. Ñúçäàâàíåòî èëè ðåäàêòèðàíåòî íà áóôåðà +â Åìàêñ, â áóôåðà íà ôàéëà. Ñúçäàâàíåòî èëè ðåäàêòèðàíåòî íà áóôåðà íà âòîðèÿ ôàéë íÿìà åôåêò âúðõó áóôåðà íà ïúðâèÿ ôàéë. Òîâà å ìíîãî ïîëåçíî, íî ñúùî îçíà÷àâà, ÷å ñå íóæäàåòå îò óäîáåí íà÷èí äà çàïàçèòå áóôåðà íà ïúðâèÿ ôàéë. Ùå å íåóäîáíî äà ïðåâêëþ÷èòå îáðàòíî ñ C-x @@ -658,8 +658,8 @@ * ÐÀÇØÈÐßÂÀÍÅ ÍÀ ÍÀÁÎÐÀ ÊÎÌÀÍÄÈ ------------------------------- -Èìà ìíîãî, ìíîãî ïîâå÷å êîìàíäè íà Emacs, îòêîëêîòî ìîãàò äà ñå ñëîæàò -íà âñè÷êè êîíòðîëíè è ìåòà çíàöè. Emacs çàîáèêàëÿ òîâà ñ X (eXtended) +Èìà ìíîãî, ìíîãî ïîâå÷å êîìàíäè íà Åìàêñ, îòêîëêîòî ìîãàò äà ñå ñëîæàò +íà âñè÷êè êîíòðîëíè è ìåòà çíàöè. Åìàêñ çàîáèêàëÿ òîâà ñ X (eXtended) êîìàíäàòà. Òîâà ñòàâà ïî äâà íà÷èíà: C-x Çíàêîâî ðàçøèðÿâàíå. Ïîñëåäâàíî îò åäèí çíàê. @@ -667,49 +667,49 @@ èìå. Òåçè êîìàíäè ñà îáùî âçåòî ïîëåçíè, íî ïî-ìàëêî, îòêîëêîòî êîìàíäèòå, -êîèòî äîñåãà ñòå íàó÷èëè. Âå÷å âèäÿõòå íÿêîëêî îò òÿõ: íàïðèìåð -êîìàíäèòå âúðõó ôàéëîâå C-x C-f çà íàìèðàíå (Find) è C-x C-s çà -çàïàçâàíå (Save). Äðóã ïðèìåð å êîìàíäàòà çà êðàé íà Emacs ñåñèÿòà -- -òîâà å êîìàíäàòà C-x C-c. (Íå ñå áåçïîêîéòå, ÷å ìîæå äà èçãóáèòå -âñè÷êè ïðîìåíè, êîèòî ñòå íàïðàâèëè; C-x C-c ïðåäëàãà äà çàïàçè âñåêè -ïðîìåíåí ôàéë, ïðåäè äà ïðåìàõíå Emacs.) +êîèòî äîñåãà ñòå íàó÷èëè. Âå÷å âèäÿõòå äâå îò òÿõ: êîìàíäèòå âúðõó +ôàéëîâå C-x C-f çà íàìèðàíå (Find) è C-x C-s çà çàïàçâàíå (Save). +Äðóã ïðèìåð å êîìàíäàòà çà êðàé íà Åìàêñ ñåñèÿòà -- òîâà å êîìàíäàòà +C-x C-c. (Íå ñå áåçïîêîéòå, ÷å ìîæå äà èçãóáèòå âñè÷êè ïðîìåíè, êîèòî +ñòå íàïðàâèëè; C-x C-c ïðåäëàãà äà çàïàçè âñåêè ïðîìåíåí ôàéë, ïðåäè +äà ïðåìàõíå Åìàêñ.) -C-z å êîìàíäàòà çà èçëèçàíå îò Emacs *âðåìåííî* -- òàêà ÷å äà ìîæåòå -äà ñå âúðíåòå êúì ñúùàòà Emacs ñåñèÿ ïî-êúñíî. +C-z å êîìàíäàòà çà èçëèçàíå îò Åìàêñ *âðåìåííî* -- òàêà ÷å äà ìîæåòå +äà ñå âúðíåòå êúì ñúùàòà Åìàêñ ñåñèÿ ïî-êúñíî. -Íà ñèñòåìè, êîèòî ïîçâîëÿâàò òîâà, C-z "èçîñòàâÿ" (suspend) Emacs, -ò.å. âðúùà êúì îáâèâêàòà, íî íå ðàçðóøàâà Emacs.  ïîâå÷åòî îáâèâêè -ìîæåòå äà ïðîäúëæèòå Emacs ñåñèÿòà ñ êîìàíäàòà "fg" èëè ñ "%emacs". +Íà ñèñòåìè, êîèòî ïîçâîëÿâàò òîâà, C-z "èçîñòàâÿ" (suspend) Åìàêñ, +ò.å. âðúùà êúì îáâèâêàòà, íî íå ðàçðóøàâà Åìàêñ.  ïîâå÷åòî îáâèâêè +ìîæåòå äà ïðîäúëæèòå Åìàêñ ñåñèÿòà ñ êîìàíäàòà "fg" èëè ñ "%emacs". Íà ñèñòåìè, êîèòî íå ïîçâîëÿâàò èçîñòàâÿíå, C-z ñúçäàâà íîâà -ïîäîáâèâêà, êîÿòî âúðâè ïîä Emacs, çà äà âè äàäå øàíñ äà ñòàðòèðàòå -äðóãè ïðîãðàìè è äà ñå âúðíåòå êúì Emacs ñëåä òîâà; òîâà íå å èñòèíñêî -"èçëèçàíå" îò Emacs.  òîçè ñëó÷àé êîìàíäàòà íà îáâèâêàòà "exit" å -îáèêíîâåíèÿò íà÷èí äà ñå âúðíåòå îáðàòíî êúì Emacs îò ïîäîáâèâêàòà. +ïîäîáâèâêà, êîÿòî âúðâè ïîä Åìàêñ, çà äà âè äàäå øàíñ äà ñòàðòèðàòå +äðóãè ïðîãðàìè è äà ñå âúðíåòå êúì Åìàêñ ñëåä òîâà; òîâà íå å èñòèíñêî +"èçëèçàíå" îò Åìàêñ.  òîçè ñëó÷àé êîìàíäàòà íà îáâèâêàòà "exit" å +îáèêíîâåíèÿò íà÷èí äà ñå âúðíåòå îáðàòíî êúì Åìàêñ îò ïîäîáâèâêàòà. Ìîìåíòúò äà èçïîëçâàòå C-x C-c å, êîãàòî èñêàòå äà èçëåçåòå îò -ñèñòåìàòà. Òîâà å è ïðàâèëíàòà êîìàíäà çà èçëèçàíå, êîãàòî Emacs å +ñèñòåìàòà. Òîâà å è ïðàâèëíàòà êîìàíäà çà èçëèçàíå, êîãàòî Åìàêñ å èçâèêàí îò ïîùåíñêà ïðîãðàìà èëè äðóãè ñòðàíè÷íè ïðîãðàìè, òúé êàòî òå -ìîæå è äà íå çíàÿò êàê äà ñå ñïðàâÿò ñ èçîñòàâÿíåòî íà Emacs. Ïðè +ìîæå è äà íå çíàÿò êàê äà ñå ñïðàâÿò ñ èçîñòàâÿíåòî íà Åìàêñ. Ïðè îáèêíîâåíè îáñòîÿòåëñòâà, îáà÷å, àêî íå ñòå òðúãíàëè äà èçëèçàòå îò -ñèñòåìàòà, ïî-äîáðå å äà èçîñòàâèòå Emacs ñ C-z, âìåñòî äà èçëèçàòå îò -Emacs. +ñèñòåìàòà, ïî-äîáðå å äà èçîñòàâèòå Åìàêñ ñ C-z, âìåñòî äà èçëèçàòå îò +Åìàêñ. Èìà ìíîãî êîìàíäè C-x. Åòî ñïèñúê íà òåçè, êîèòî ñòå íàó÷èëè: - C-x C-f Íàìèðàíå íà ôàéë - C-x C-s Çàïàçâàíå íà ôàéë - C-x C-b Ñïèñúê íà áóôåðèòå - C-x C-c Èçëèçàíå îò Emacs - C-x 1 Èçòðèâàíå íà âñè÷êè ïðîçîðöè, îñâåí åäèí - C-x u Îòìÿíà + C-x C-f Íàìèðàíå íà ôàéë. + C-x C-s Çàïàçâàíå íà ôàéë. + C-x C-b Ñïèñúê íà áóôåðèòå. + C-x C-c Èçëèçàíå îò Åìàêñ. + C-x 1 Èçòðèâàíå íà âñè÷êè ïðîçîðöè îñâåí åäèí. + C-x u Îòìÿíà. Èìåíóâàíèòå ðàçøèðåíè êîìàíäè ñà êîìàíäè, êîèòî ñå èçïîëçâàò äàæå îùå ïî-ðÿäêî, èëè êîìàíäè, êîèòî ñå èçïîëçâàò ñàìî â îïðåäåëåíè ðåæèìè. Ïðèìåð å êîìàíäàòà replace-string, êîÿòî çàìåíÿ ãëîáàëíî åäèí íèç ñ -äðóã. Êîãàòî âúâåäåòå M-x, Emacs âè ïîäñêàçâà â äúíîòî íà åêðàíà ñ +äðóã. Êîãàòî âúâåäåòå M-x, Åìàêñ âè ïîäñêàçâà â äúíîòî íà åêðàíà ñ M-x è âèå òðÿáâà äà âúâåäåòå èìåòî íà êîìàíäàòà, â òîçè ñëó÷àé -"replace-string". Ïðîñòî âúâåäåòå "repl s<TAB>" è Emacs ùå çàâúðøè +"replace-string". Ïðîñòî âúâåäåòå "repl s<TAB>" è Åìàêñ ùå çàâúðøè èìåòî. (<TAB> å êëàâèøúò Tab, îáèêíîâåíî íàìèðàù ñå íàä êëàâèøà CapsLock èëè êëàâèøà Shift áëèçî äî ëåâèÿ êðàé íà êëàâèàòóðàòà.) Çàâúðøåòå èìåòî íà êîìàíäàòà ñ <Return>. @@ -733,11 +733,11 @@ Êîãàòî ñòå íàïðàâèëè ïðîìåíè âúâ ôàéë, íî îùå íå ñòå ãî çàïàçèëè, òå ìîãàò äà áúäàò çàãóáåíè, àêî êîìïþòúðúò âíåçàïíî ñå èçêëþ÷è. Çà äà âè -ïðåäïàçè îò òàêèâà ñèòóàöèè, Emacs ïåðèîäè÷íî çàïàçâà "àâòîìàòè÷íî +ïðåäïàçè îò òàêèâà ñèòóàöèè, Åìàêñ ïåðèîäè÷íî çàïàçâà "àâòîìàòè÷íî çàïàçâàí" ôàéë çà âñåêè ôàéë, êîéòî ðåäàêòèðàòå. Èìåòî íà àâòîìàòè÷íî çàïàçâàíèÿ ôàéë èìà # â íà÷àëîòî è â êðàÿ; íàïðèìåð, àêî âàøèÿò ôàéë å ñ èìå "hello.c", èìåòî íà íåãîâèÿ àâòîìàòè÷íî çàïàçâàí ôàéë ùå áúäå -"#hello.c#". Êîãàòî çàïàçâàòå ôàéë ïî îáèêíîâåíèÿ íà÷èí, Emacs +"#hello.c#". Êîãàòî çàïàçâàòå ôàéë ïî îáèêíîâåíèÿ íà÷èí, Åìàêñ èçòðèâà íåãîâèÿ àâòîìàòè÷íî çàïèñâàí ôàéë. Àêî êîìïþòúðúò çàâèñíå, ìîæå äà âúçñòàíîâèòå âàøàòà àâòîìàòè÷íî @@ -751,7 +751,7 @@ * ÅÕÎ ÎÁËÀÑÒÒÀ -------------- -Àêî Emacs âèäè, ÷å âúâåæäàòå ìíîãîçíàêîâè êîìàíäè áàâíî, ùå âè ãè +Àêî Åìàêñ âèäè, ÷å âúâåæäàòå ìíîãîçíàêîâè êîìàíäè áàâíî, ùå âè ãè ïîêàæå â äúíîòî íà åêðàíà, â îáëàñò, íàðè÷àíà "åõî îáëàñò". Åõî îáëàñòòà îáõâàùà ïîñëåäíèÿ ðåä îò åêðàíà. @@ -762,18 +762,18 @@ Ðåäúò òî÷íî íàä åõî îáëàñòòà ñå íàðè÷à "ðåä íà ðåæèìà" (mode line). Òîé ïîêàçâà íåùî êàòî: --D:** TUTORIAL.bg 63% L749 (Fundamental)--------------------- +-b:** TUTORIAL.bg (Fundamental)--L670--58%---------------- -Òîçè ðåä äàâà ïîëåçíà èíôîðìàöèÿ çà ñúñòîÿíèåòî íà Emacs è òåêñòà, +Òîçè ðåä äàâà ïîëåçíà èíôîðìàöèÿ çà ñúñòîÿíèåòî íà Åìàêñ è òåêñòà, êîéòî ðåäàêòèðàòå. Âå÷å çíàåòå êàêâî îçíà÷àâà èìåòî íà ôàéëà -- òîâà å ôàéëúò, êîéòî ñòå -íàìåðèëè. NN% ïîêàçâà âàøàòà òåêóùà ïîçèöèÿ â òåêñòà; òîâà îçíà÷àâà, -÷å NN ïðîöåíòà îò òåêñòà å íàä âúðõà íà åêðàíà. Àêî íà÷àëîòî íà ôàéëà -å íà åêðàíà, ùå ñå ïîêàçâà --Top-- (âðúõ) âìåñòî --00%--. Àêî êðàÿò -íà ôàéëà å íà åêðàíà, ùå ñå ïîêàçâà --Bot-- (äúíî). Àêî ãëåäàòå -òåêñò, êîéòî å òîëêîâà ìàëúê, ÷å ñå ïîêàçâà èçöÿëî íà åêðàíà, ðåäúò íà -ðåæèìà ùå èçâåäå --All--. +íàìåðèëè. -NN%-- ïîêàçâà âàøàòà òåêóùà ïîçèöèÿ â òåêñòà; òîâà +îçíà÷àâà, ÷å NN ïðîöåíòà îò òåêñòà å íàä âúðõà íà åêðàíà. Àêî +íà÷àëîòî íà ôàéëà å íà åêðàíà, ùå ñå ïîêàçâà --Top-- (âðúõ) âìåñòî +--00%--. Àêî êðàÿ íà ôàéëà å íà åêðàíà, ùå ñå ïîêàçâà --Bot-- (äúíî). +Àêî ãëåäàòå òåêñò, êîéòî å òîëêîâà ìàëúê, ÷å ñå ïîêàçâà èçöÿëî íà +åêðàíà, ðåäúò íà ðåæèìà ùå èçâåäå --All--. Çíàêúò L è öèôðèòå ïîêàçâàò ìÿñòîòî ïî äðóã íà÷èí: òîâà å íîìåðúò íà òåêóùèÿ ðåä íà òî÷êàòà. @@ -787,7 +787,7 @@ Fundamental (Îñíîâåí), êîéòî èçïîëçâàòå â ìîìåíòà. Òîâà å ïðèìåð çà "ãëàâåí ðåæèì" (major mode). -Emacs èìà ìíîãî ãëàâíè ðåæèìè. Íÿêîè îò òÿõ ñà ïðåäâèäåíè çà +Åìàêñ èìà ìíîãî ãëàâíè ðåæèìè. Íÿêîè îò òÿõ ñà ïðåäâèäåíè çà ðåäàêòèðàíå íà ðàçëè÷íè åçèöè è/èëè âèäîâå òåêñò, êàòî íàïðèìåð ðåæèì Ëèñï, ðåæèì Òåêñò è äðóãè. Âúâ âñåêè åäèí ìîìåíò îò âðåìå òî÷íî åäèí ãëàâåí ðåæèì å àêòèâåí è íåãîâîòî èìå ìîæå âèíàãè äà áúäå íàìåðåíî â @@ -806,7 +806,7 @@ >> Âúâåäåòå M-x text mode<Return>. -Íå ñå áåçïîêîéòå, íèêîÿ îò Emacs êîìàíäèòå, êîèòî ñòå íàó÷èëè, íÿìà äà +Íå ñå áåçïîêîéòå, íèêîÿ îò Åìàêñ êîìàíäèòå, êîèòî ñòå íàó÷èëè, íÿìà äà ñå ïðîìåíè ïî íÿêàêúâ ñúùåñòâåí íà÷èí. Íî ìîæå äà çàáåëåæèòå, ÷å M-f è M-b ñåãà âúçïðèåìàò àïîñòðîôèòå (') êàòî ÷àñò îò äóìèòå. Ïðåäè òîâà, â îñíîâíèÿ ðåæèì (Fundamental), M-f è M-b ñå âúçïðèåìàõà êàòî @@ -835,7 +835,7 @@ Åäèí ãëàâåí ðåæèì, êîéòî å ìíîãî ïîëåçåí, îñîáåíî çà ðåäàêòèðàíå íà òåêñò íà åñòåñòâåí åçèê, å ðåæèìúò íà àâòîìàòè÷íî çàïúëâàíå (Auto Fill -mode). Êîãàòî òîçè ðåæèì å âêëþ÷åí, Emacs àâòîìàòè÷íî ðàçäåëÿ ðåäà +mode). Êîãàòî òîçè ðåæèì å âêëþ÷åí, Åìàêñ àâòîìàòè÷íî ðàçäåëÿ ðåäà ïðè ìÿñòîòî ìåæäó äóìèòå, êîãàòî âìúêâàòå òåêñò è íàïðàâèòå ðåä, êîéòî å òâúðäå äúëúã. @@ -855,7 +855,7 @@ àðãóìåíò íà êîìàíäàòà. >> Âúâåäåòå C-x f ñ àðãóìåíò 20. (C-u 2 0 C-x f). - Ñåãà âúâåäåòå íÿêàêúâ òåêñò è âèæòå êàê Emacs çàïúëâà ðåäîâåòå ñ ïî + Ñåãà âúâåäåòå íÿêàêúâ òåêñò è âèæòå êàê Åìàêñ çàïúëâà ðåäîâåòå ñ ïî íå ïîâå÷å îò 20 çíàêà. Ïîñëå âúðíåòå îáðàòíî ãðàíèöàòà íà 70, èçïîëçâàéêè C-x f îòíîâî. @@ -870,12 +870,12 @@ * ÒÚÐÑÅÍÅ --------- -Emacs ìîæå äà èçâúðøâà òúðñåíèÿ íà íèçîâå (òîâà ñà ïîñëåäîâàòåëíîñòè +Åìàêñ ìîæå äà èçâúðøâà òúðñåíèÿ íà íèçîâå (òîâà ñà ïîñëåäîâàòåëíîñòè îò çíàöè èëè äóìè) èëè íàïðåä â òåêñòà, èëè íàçàä â íåãî. Òúðñåíåòî íà íèç å ïðèäâèæâàùà êóðñîðà êîìàíäà; òÿ ïðåìåñòâà êóðñîðà íà ñëåäâàùîòî ìÿñòî, êúäåòî ñå ñðåùà íèçúò. -Êîìàíäàòà çà òúðñåíå íà Emacs ñå ðàçëè÷àâà îò êîìàíäàòà çà òúðñåíå íà +Êîìàíäàòà çà òúðñåíå íà Åìàêñ ñå ðàçëè÷àâà îò êîìàíäàòà çà òúðñåíå íà ïîâå÷åòî ðåäàêòîðè ïî òîâà, ÷å òÿ å "ïîñòúïêîâà". Òîâà îçíà÷àâà, ÷å òúðñåíåòî ñå èçâúðøâà îùå äîêàòî âúâåæäàòå òåêñòà, êîéòî òúðñèòå. @@ -883,7 +883,7 @@ òúðñåíå íàçàä. ÍÎ ÏÎ×ÀÊÀÉÒÅ! Íå ãè ïðîáâàéòå ñåãà. Êîãàòî âúâåäåòå C-s, ùå çàáåëåæèòå, ÷å íèçúò "I-search" ñå ïîÿâÿâà -êàòî ïîäñêàçêà â åõî îáëàñòòà. Òîâà âè êàçâà, ÷å Emacs å â òîâà, +êàòî ïîäñêàçêà â åõî îáëàñòòà. Òîâà âè êàçâà, ÷å Åìàêñ å â òîâà, êîåòî ñå íàðè÷à ïîñòúïêîâî òúðñåíå, ÷àêàéêè âè äà âúâåæäàòå òåêñòà, êîéòî èñêàòå äà òúðñèòå. <Return> ïðèêëþ÷âà òúðñåíåòî. @@ -895,19 +895,19 @@ >> Ñåãà âúâåäåòå <Delback> òðè ïúòè è âèæòå êàê ñå ïðèäâèæâà êóðñîðà. >> Âúâåäåòå <Return>, çà äà ïðåêðàòèòå òúðñåíåòî. -Çàáåëÿçàõòå ëè êàêâî ñòàíà? Emacs, êîãàòî òúðñè ïîñòúïêîâî, ñå îïèòâà +Çàáåëÿçàõòå ëè êàêâî ñòàíà? Åìàêñ, êîãàòî òúðñè ïîñòúïêîâî, ñå îïèòâà äà íàìåðè ñëåäâàùîòî ñúâïàäåíèå íà íèçà, êîéòî ñå âúâåæäà. Çà äà îòèäåòå íà ñëåäâàùîòî ñúâïàäåíèå íà "òúðñíå", ïðîñòî îòíîâî âúâåäåòå -C-s. Àêî íÿìà òàêîâà ñúâïàäåíèå, Emacs áèáèïâà è âè êàçâà, ÷å +C-s. Àêî íÿìà òàêîâà ñúâïàäåíèå, Åìàêñ áèáèïâà è âè êàçâà, ÷å òúðñåíåòî å "ïðîâàëåíî" (failing). C-g ñúùî ïðåêðàòÿâà òúðñåíåòî. ÇÀÁÅËÅÆÊÀ: Íà íÿêîè ñèñòåìè âúâåæäàíåòî íà C-s ùå çàìðàçè åêðàíà è âèå -íÿìà äà ìîæå äà âèäèòå ïîâå÷å ðåàêöèÿ îò Emacs. Òîâà ïîêàçâà, ÷å +íÿìà äà ìîæå äà âèäèòå ïîâå÷å ðåàêöèÿ îò Åìàêñ. Òîâà ïîêàçâà, ÷å "ñïîñîáíîñò" íà îïåðàöèîííàòà ñèñòåìà, íàðå÷åíà "óïðàâëåíèå íà ïîòîêà" -(flow control), å ïðèõâàíàëà C-s è íå ãî ïðîïóñêà äî Emacs. Çà äà +(flow control), å ïðèõâàíàëà C-s è íå ãî ïðîïóñêà äî Åìàêñ. Çà äà ðàçìðàçèòå åêðàíà, âúâåäåòå C-q. Òîãàâà âèæòå ñåêöèÿòà "Ñïîíòàííî âêëþ÷âàíå íà ïîñòúïêîâîòî òúðñåíå" (Spontaneous Entry to Incremental -Search) â ðúêîâîäñòâîòî íà Emacs çà ñúâåò êàê äà ñå ñïðàâèòå ñ òàçè +Search) â ðúêîâîäñòâîòî íà Åìàêñ çà ñúâåò êàê äà ñå ñïðàâèòå ñ òàçè "ñïîñîáíîñò". Àêî ñòå â ñðåäàòà íà ïîñòúïêîâî òúðñåíå è âúâåäåòå <Delback>, ùå @@ -929,9 +929,9 @@ * ÌÍÎÆÅÑÒÂÎ ÏÐÎÇÎÐÖÈ --------------------- +---------------- -Åäíà îò ïðèâëåêàòåëíèòå ñïîñîáíîñòè íà Emacs å òàçè, ÷å ìîæå äà +Åäíà îò ïðèâëåêàòåëíèòå ñïîñîáíîñòè íà Åìàêñ å òàçè, ÷å ìîæå äà ãëåäàòå ïîâå÷å îò åäèí ïðîçîðåö íà åêðàíà â äàäåí ìîìåíò îò âðåìå. >> Ïðèäâèæåòå êóðñîðà äî òîçè ðåä è âúâåäåòå C-u 0 C-l (òîâà å @@ -942,7 +942,7 @@ îñòàâà íà ïî-ãîðíèÿ ïðîçîðåö. >> Âúâåäåòå C-M-v, çà äà ñêðîëèðàòå äîëíèÿ ïðîçîðåö. (Àêî íÿìàòå - èñòèíñêè êëàâèø META, âúâåäåòå <ESC> C-v.) + èñòèíñêè êëàâèø META, âúâåäåòå ESC C-v.) >> Âúâåäåòå C-x o ("o" îò "other" -- "äðóã"), çà äà ïðèäâèæèòå êóðñîðà â äîëíèÿ ïðîçîðåö. @@ -971,10 +971,10 @@ ïúðâè", çàùîòî è äâàòà êëàâèøà äåéñòâàò, ìîäèôèöèðàéêè çíàêà, êîéòî ñòå âúâåëè. -Àêî íÿìàòå èñòèíñêè êëàâèø META è èçïîëçâàòå <ESC> âìåñòî òîâà, ðåäúò -èìà çíà÷åíèå: òðÿáâà äà âúâåæäàòå <ESC>, ïîñëåäâàí îò CONTROL-v, -çàùîòî CONTROL-<ESC> v íÿìà äà ðàáîòè. Òîâà å òàêà, çàùîòî <ESC> å -ñîáñòâåí çíàê, à íå ìîäèôèêàòîð. +Àêî íÿìàòå èñòèíñêè êëàâèø META è èçïîëçâàòå ESC âìåñòî òîâà, ðåäúò +èìà çíà÷åíèå: òðÿáâà äà âúâåæäàòå ESC, ïîñëåäâàí îò CONTROL-v, çàùîòî +CONTROL-ESC v íÿìà äà ðàáîòè. Òîâà å òàêà, çàùîòî ESC å ñîáñòâåí +çíàê, à íå ìîäèôèêàòîð. >> Âúâåäåòå C-x 1 (â ãîðíèÿ ïðîçîðåö), çà äà ìàõíåòå äîëíèÿ ïðîçîðåö. @@ -1007,13 +1007,13 @@ íà ãëàâíèÿ ðåæèì. Íàïðèìåð, ìîæå äà âèäèòå [(Fundamental)] âìåñòî (Fundamental). -Çà äà ñå ìàõíåòå îò âëîæåíîòî íèâî íà ðåäàêòèðàíå, âúâåäåòå <ESC> -<ESC> <ESC>. Òîâà å îáùà êîìàíäà çà "èçëèçàíå". Ìîæå è äà ÿ -èçïîëçâàòå çà ìàõàíå (ñêðèâàíå) íà äîïúëíèòåëíè ïðîçîðöè, êàêòî è çà -äà ñå ìàõíåòå îò ìèíèáóôåðà. +Çà äà ñå ìàõíåòå îò âëîæåíîòî íèâî íà ðåäàêòèðàíå, âúâåäåòå ESC ESC +ESC. Òîâà å îáùà êîìàíäà çà "èçëèçàíå". Ìîæå è äà ÿ èçïîëçâàòå çà +ìàõàíå (ñêðèâàíå) íà äîïúëíèòåëíè ïðîçîðöè, êàêòî è çà äà ñå ìàõíåòå +îò ìèíèáóôåðà. ->> Âúâåäåòå M-x, çà äà âëåçåòå â ìèíèáóôåð; òîãàâà âúâåäåòå <ESC> <ESC> - <ESC>, çà äà èçëåçåòå. +>> Âúâåäåòå M-x, çà äà âëåçåòå â ìèíèáóôåð; òîãàâà âúâåäåòå ESC ESC + ESC, çà äà èçëåçåòå. Íå ìîæåòå äà èçïîëçâàòå C-g, çà äà èçëåçåòå îò âëîæåíî íèâî íà ðåäàêòèðàíå. Òîâà å òàêà, çàùîòî C-g ñå èçïîëçâà çà ïðåêðàòÿâàíå íà @@ -1024,16 +1024,16 @@ ----------------------------------  òîâà âúâåäåíèå ñå îïèòàõìå äà îñèãóðèì äîñòàòú÷íî èíôîðìàöèÿ, çà äà -çàïî÷íåòå äà èçïîëçâàòå Emacs. Èìà òîëêîâà ìíîãî îùå â Emacs, ÷å íå å +çàïî÷íåòå äà èçïîëçâàòå Åìàêñ. Èìà òîëêîâà ìíîãî îùå â Åìàêñ, ÷å íå å âúçìîæíî òî äà áúäå îáÿñíåíî âñè÷êîòî òóê. Îáà÷å ìîæå äà ïîèñêàòå äà -íàó÷èòå ïîâå÷å çà Emacs, òúé êàòî òîé ïðèòåæàâà îùå ìíîãî ïîëåçíè -ñïîñîáíîñòè. Emacs èìà êîìàíäè çà ÷åòåíå íà äîêóìåíòàöèÿòà íà Emacs +íàó÷èòå ïîâå÷å çà Åìàêñ, òúé êàòî òîé ïðèòåæàâà îùå ìíîãî ïîëåçíè +ñïîñîáíîñòè. Åìàêñ èìà êîìàíäè çà ÷åòåíå íà äîêóìåíòàöèÿòà íà Åìàêñ êîìàíäèòå. Òåçè "ïîìîùíè" êîìàíäè âñè÷êè çàïî÷âàò ñúñ çíàêà CONTROL-h, êîéòî ñå íàðè÷à "çíàêúò çà ïîìîù". Çà äà èçïîëçâàòå âúçìîæíîñòèòå íà òàçè ïîìîù, âúâåäåòå çíàêà C-h è ñëåä òîâà çíàêà, êàçâàù êàêúâ âèä ïîìîù èñêàòå. Àêî ÍÀÈÑÒÈÍÀ ñòå ñå -èçãóáèëè, âúâåäåòå C-h ? è Emacs ùå âè êàæå ñ êàêâî ìîæå äà âè +èçãóáèëè, âúâåäåòå C-h ? è Åìàêñ ùå âè êàæå ñ êàêâî ìîæå äà âè ïîìîãíå. Àêî ñòå âúâåëè C-h è ðåøèòå, ÷å íå ñå íóæäàåòå îò ïîìîù, ïðîñòî âúâåäåòå C-g, çà äà ÿ ïðåêðàòèòå. @@ -1045,7 +1045,7 @@ Íàé-îñíîâíîòî ïîìîùíî ñðåäñòâî å C-h c. Âúâåäåòå C-h, çíàêà c è êîìàíäåí çíàê èëè ïîñëåäîâàòåëíîñò îò çíàöè, îáðàçóâàùè êîìàíäà; -òîãàâà Emacs ùå èçâåäå ìíîãî êðàòêî îïèñàíèå íà êîìàíäàòà. +òîãàâà Åìàêñ ùå èçâåäå ìíîãî êðàòêî îïèñàíèå íà êîìàíäàòà. >> Type C-h c C-p. @@ -1055,7 +1055,7 @@ (C-p èçïúëíÿâà êîìàíäàòà ïðåäèøåí-ðåä) Òîâà âè êàçâà "èìåòî íà ôóíêöèÿòà". Èìåíàòà íà ôóíêöèèòå ñå èçïîëçâàò -íàé-âå÷å çà íàñòðîéâàíå è ðàçøèðÿâàíå íà Emacs. Íî òúé êàòî èìåíàòà +íàé-âå÷å çà íàñòðîéâàíå è ðàçøèðÿâàíå íà Åìàêñ. Íî òúé êàòî èìåíàòà íà ôóíêöèèòå ñà èçáðàíè òàêà, ÷å äà ïîêàçâàò êàêâî ïðàâè êîìàíäàòà, òå ìîãàò äà ñëóæàò è çà ìíîãî êðàòêà äîêóìåíòàöèÿ -- äîñòàòú÷íà, çà äà âè ïðèïîìíè êîìàíäè, êîèòî âå÷å ñòå ó÷èëè. @@ -1069,7 +1069,7 @@ >> Âúâåäåòå C-h k C-p. Òîâà èçâåæäà äîêóìåíòàöèÿòà íà ôóíêöèÿòà, êàêòî è íåéíîòî èìå, â -îòäåëåí Emacs ïðîçîðåö. Êîãàòî ÿ ïðî÷åòåòå, âúâåäåòå C-x 1, çà äà +îòäåëåí Åìàêñ ïðîçîðåö. Êîãàòî ÿ ïðî÷åòåòå, âúâåäåòå C-x 1, çà äà ìàõíåòå ïîìîùíèÿ òåêñò. Íå å íóæíî äà ïðàâèòå òîâà òî÷íî ñåãà. Ìîæå äà ðåäàêòèðàòå, äîêàòî ñå îáðúùàòå êúì ïîìîùíèÿ òåêñò çà ñïðàâêà, è ñëåä òîâà äà âúâåäåòå C-x 1. @@ -1080,14 +1080,14 @@ ôóíêöèÿòà. >> Îïèòàéòå ñ âúâåæäàíå íà C-h f previous-line<Return>. - Òîâà èçâåæäà öÿëàòà èíôîðìàöèÿ, êîÿòî Emacs çíàå çà ôóíêöèÿòà, + Òîâà èçâåæäà öÿëàòà èíôîðìàöèÿ, êîÿòî Åìàêñ çíàå çà ôóíêöèÿòà, êîÿòî îñúùåñòâÿâà êîìàíäàòà C-p. Ïîäîáíà êîìàíäà, C-h v, èçâåæäà äîêóìåíòàöèÿòà íà ïðîìåíëèâèòå, êîèòî -ìîæå äà ïðîìåíÿòå, çà äà íàñòðîéâàòå ïîâåäåíèåòî íà Emacs. Òðÿáâà äà -âúâåäåòå èìåòî íà ïðîìåíëèâàòà, êîãàòî Emacs âè ïîäñêàæå òîâà. +ìîæå äà ïðîìåíÿòå, çà äà íàñòðîéâàòå ïîâåäåíèåòî íà Åìàêñ. Òðÿáâà äà +âúâåäåòå èìåòî íà ïðîìåíëèâàòà, êîãàòî Åìàêñ âè ïîäñêàæå òîâà. - C-h a Êîìàíäà Àïðîïîñ. Âúâåäåòå êëþ÷îâà äóìà è Emacs ùå + C-h a Êîìàíäà Àïðîïîñ. Âúâåäåòå êëþ÷îâà äóìà è Åìàêñ ùå ïîêàæå ñïèñúê íà âñè÷êè êîìàíäè, ÷èåòî èìå ñúäúðæà òàçè êëþ÷îâà äóìà. Òåçè êîìàíäè ìîãàò âñè÷êè äà áúäàò èçâèêàíè ÷ðåç META-x. Çà íÿêîè êîìàíäè êîìàíäàòà @@ -1110,18 +1110,18 @@ ñïåöèàëåí áóôåð, íàðè÷àí "*info*", êúäåòî ìîæå äà ÷åòåòå ðúêîâîäñòâàòà íà èíñòàëèðàíèòå âúâ âàøàòà ñèñòåìà ïàêåòè. Âúâåäåòå m emacs <Return>, çà äà - ÷åòåòå ðúêîâîäñòâîòî íà Emacs. Àêî íèêîãà ïðåäè òîâà - íå ñòå èçïîëçâàëè Info, âúâåäåòå ? è Emacs ùå âêëþ÷è + ÷åòåòå ðúêîâîäñòâîòî íà Åìàêñ. Àêî íèêîãà ïðåäè òîâà + íå ñòå èçïîëçâàëè Info, âúâåäåòå ? è Åìàêñ ùå âêëþ÷è âúâåäåíèå âúâ âúçìîæíîñòèòå íà ðåæèìà Èíôî. Âåäíúæ ñëåä êàòî ñòå ïðåìèíàëè òîâà âúâåäåíèå, òðÿáâà äà ñå - êîíñóëòèðàòå ñ Emacs Èíôî ðúêîâîäñòâîòî êàòî âàøà + êîíñóëòèðàòå ñ Åìàêñ Èíôî ðúêîâîäñòâîòî êàòî âàøà îñíîâíà äîêóìåíòàöèÿ. * ÎÙÅ ÂÚÇÌÎÆÍÎÑÒÈ ----------------- -Ìîæå äà íàó÷èòå ïîâå÷å çà Emacs ñ ÷åòåíå íà íåãîâîòî ðúêîâîäñòâî, èëè +Ìîæå äà íàó÷èòå ïîâå÷å çà Åìàêñ ñ ÷åòåíå íà íåãîâîòî ðúêîâîäñòâî, èëè êàòî êíèãà, èëè â Èíôî (èçïîëçâàéòå ìåíþòî ïîìîù (Help) èëè âúâåäåòå F10 h r). Äâå âúçìîæíîñòè, êîèòî ìîæå äà æåëàåòå â íà÷àëîòî, ñà äîâúðøâàíå (completion), êîåòî ñïåñòÿâà ïèñàíå, è dired, êîéòî @@ -1129,26 +1129,26 @@ Äîâúðøâàíåòî å íà÷èí äà èçáÿãâàòå íåíóæíî ïèñàíå. Íàïðèìåð, àêî èñêàòå äà ïðåâêëþ÷èòå êúì áóôåðà *Messages*, ìîæå äà âúâåäåòå C-x b -*M<Tab> è Emacs ùå çàïúëíè îñòàíàëàòà ÷àñò îò èìåòî íà áóôåðà, +*M<Tab> è Åìàêñ ùå çàïúëíè îñòàíàëàòà ÷àñò îò èìåòî íà áóôåðà, äîêîëêîòî ìîæå äà ñå îïðåäåëè îò òîâà, êîåòî ñòå âúâåëè. Äîâúðøâàíåòî -å îïèñàíî â Èíôî-ðúêîâîäñòâîòî íà Emacs â ñòðàíèöàòà "Äîâúðøâàíå" +å îïèñàíî â Èíôî-ðúêîâîäñòâîòî íà Åìàêñ â ñòðàíèöàòà "Äîâúðøâàíå" ("Completion"). Dired âè ïîçâîëÿâà äà ãëåäàòå ñïèñúêà îò ôàéëîâå â äèðåêòîðèÿ (è êàòî âúçìîæíîñò: íåéíèòå ïîääèðåêòîðèè), äà ñå ïðèäâèæâàòå â òîçè ñïèñúê, äà ïîñåùàâàòå, ïðåèìåíóâàòå, èçòðèâàòå è èçîáùî äåéñòâàòå âúðõó -ôàéëîâåòå. Dired å îïèñàí â Èíôî-ðúêîâîäñòâîòî íà Emacs â ñòðàíèöàòà +ôàéëîâåòå. Dired å îïèñàí â Èíôî-ðúêîâîäñòâîòî íà Åìàêñ â ñòðàíèöàòà "Dired". -Ðúêîâîäñòâîòî íà Emacs îïèñâà îùå ìíîãî äðóãè âúçìîæíîñòè íà +Ðúêîâîäñòâîòî íà Åìàêñ îïèñâà îùå ìíîãî äðóãè âúçìîæíîñòè íà ðåäàêòîðà. * ÇÀÊËÞ×ÅÍÈÅ ------------ -Çàïîìíåòå: çà äà èçëåçåòå áåçâúçâðàòíî îò Emacs, èçïîëçâàéòå C-x C-c. -Çà äà èçëåçåòå âðåìåííî â îáâèâêà, òàêà ÷å äà ñå âúðíåòå â Emacs +Çàïîìíåòå: çà äà èçëåçåòå áåçâúçâðàòíî îò Åìàêñ, èçïîëçâàéòå C-x C-c. +Çà äà èçëåçåòå âðåìåííî â îáâèâêà, òàêà ÷å äà ñå âúðíåòå â Åìàêñ ïî-êúñíî, èçïîëçâàéòå C-z. Òîâà âúâåäåíèå å ïðåäâèäåíî äà áúäå ðàçáèðàåìî çà âñè÷êè íîâè @@ -1159,10 +1159,10 @@ * ÊÎÏÈÐÀÍÅ ---------- -Òîâà âúâåäåíèå ïðîèçëèçà îò äúëãà ïîðåäèöà âúâåäåíèÿ â Emacs, -çàïî÷âàéêè îò åäíî, íàïèñàíî îò Ñòþúðò Êðàêðàôò çà íà÷àëíèÿ Emacs. +Òîâà âúâåäåíèå ïðîèçëèçà îò äúëãà ïîðåäèöà âúâåäåíèÿ â Åìàêñ, +çàïî÷âàéêè îò åäíî, íàïèñàíî îò Ñòþúðò Êðàêðàôò çà íà÷àëíèÿ Åìàêñ. -Òàçè âåðñèÿ íà âúâåäåíèåòî, êàêòî è GNU Emacs, å çàùèòåíà ñ àâòîðñêè +Òàçè âåðñèÿ íà âúâåäåíèåòî, êàêòî è ÃÍÓ Åìàêñ, å çàùèòåíà ñ àâòîðñêè ïðàâà è èäâà ñ ðàçðåøåíèå äà ðàçïðîñòðàíÿâàòå êîïèÿ ïðè ñëåäíèòå óñëîâèÿ: @@ -1183,8 +1183,8 @@ under the above conditions, provided also that they carry prominent notices stating who last altered them. -Óñëîâèÿòà çà êîïèðàíå íà ñàìèÿ Emacs ñà ïî-ñëîæíè, íî â ñúùèÿ äóõ. -Ìîëÿ, ïðî÷åòåòå ôàéëà COPYING è òîãàâà äàâàéòå êîïèÿ íà GNU Emacs íà +Óñëîâèÿòà çà êîïèðàíå íà ñàìèÿ Åìàêñ ñà ïî-ñëîæíè, íî â ñúùèÿ äóõ. +Ìîëÿ, ïðî÷åòåòå ôàéëà COPYING è òîãàâà äàâàéòå êîïèÿ íà ÃÍÓ Åìàêñ íà ñâîè ïðèÿòåëè. Ïîìîãíåòå äà ñïðåì çàòâîðåíîñòòà íà ïðîãðàìèòå ("ïðèòåæàíèåòî"), êàòî èçïîëçâàìå, ïèøåì è ñïîäåëÿìå ñâîáîäåí ñîôòóåð!
--- a/etc/refcard.ps Sat Oct 14 16:56:21 2006 +0000 +++ b/etc/refcard.ps Sat Oct 14 17:36:28 2006 +0000 @@ -1,15 +1,18 @@ %!PS-Adobe-2.0 -%%Creator: dvips(k) 5.86d Copyright 1999 Radical Eye Software +%%Creator: dvips(k) 5.95a Copyright 2005 Radical Eye Software %%Title: refcard.dvi -%%Pages: 6 +%%Pages: 2 %%PageOrder: Ascend -%%BoundingBox: 0 0 596 842 +%%Orientation: Landscape +%%BoundingBox: 0 0 595 842 +%%DocumentFonts: CMBX10 CMR8 CMTT8 CMBX8 CMR6 CMSY6 CMTI8 CMMI8 +%%DocumentPaperSizes: a4 %%EndComments %DVIPSWebPage: (www.radicaleye.com) -%DVIPSCommandLine: dvips -o refcard.ps refcard.dvi -%DVIPSParameters: dpi=600, compressed -%DVIPSSource: TeX output 2002.02.12:1312 -%%BeginProcSet: texc.pro +%DVIPSCommandLine: dvips -t landscape refcard.dvi +%DVIPSParameters: dpi=600 +%DVIPSSource: TeX output 2006.09.26:2327 +%%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 @@ -28,22 +31,10 @@ definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr -1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 -1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx -0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx -sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ -rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp -gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B -/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ -/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ -A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy -get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} -ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp -fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 -{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add -chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ -1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} -forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S +/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy +setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask +restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A @@ -67,1199 +58,2449 @@ rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet -TeXDict begin 39158280 55380996 1000 600 600 (refcard.dvi) -@start -%DVIPSBitmapFont: Fa cmmi10 10 1 -/Fa 1 59 df<121C127FEAFF80A5EA7F00121C0909798817>58 D -E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fb cmti10 10 19 -/Fb 19 122 df<387FFFF8A2B5FCA214F0150579941E>45 D<14F8EB07FE90381F871C90 -383E03FE137CEBF801120148486C5A485A120FEBC001001F5CA2EA3F801403007F5C1300 -A21407485C5AA2140F5D48ECC1C0A2141F15831680143F1587007C017F1300ECFF076C48 -5B9038038F8E391F0F079E3907FE03FC3901F000F0222677A42A>97 -D<133FEA1FFFA3C67E137EA313FE5BA312015BA312035BA31207EBE0F8EBE7FE9038EF0F -80390FFC07C013F89038F003E013E0D81FC013F0A21380A2123F1300A214075A127EA214 -0F12FE4814E0A2141F15C05AEC3F80A215005C147E5C387801F8007C5B383C03E0383E07 -C0381E1F80D80FFEC7FCEA01F01C3B77B926>I<147F903803FFC090380FC1E090381F00 -70017E13784913383901F801F83803F003120713E0120FD81FC013F091C7FC485AA2127F -90C8FCA35A5AA45AA3153015381578007C14F0007EEB01E0003EEB03C0EC0F806CEB3E00 -380F81F83803FFE0C690C7FC1D2677A426>I<ED01F815FFA3150316F0A21507A216E0A2 -150FA216C0A2151FA21680A2153FA202F81300EB07FE90381F877F90383E03FF017C5BEB -F80112013803F00048485B120FEBC001121F5DEA3F801403127F01005BA214075A485CA2 -140FA248ECC1C0A2141F15C3ED8380143F1587007C017F1300ECFF076C485B9038038F8E -391F0F079E3907FE03FC3901F000F0253B77B92A>I<147F903803FFC090380FC1E09038 -3F00F0017E13785B485A485A485A120F4913F8001F14F0383F8001EC07E0EC1F80397F81 -FF00EBFFF891C7FC90C8FC5A5AA55AA21530007C14381578007E14F0003EEB01E0EC03C0 -6CEB0F806CEB3E00380781F83803FFE0C690C7FC1D2677A426>I<EC07C0EC3FF09138FC -38E0903901F01FF0EB03E0903807C00FEB0F80011F1307D93F0013E05B017E130F13FE49 -14C01201151F1203491480A2153F1207491400A25DA249137EA215FEA25D000313011403 -14076C6C485A0000131FEB787BEB3FF390380FC3F0EB00031407A25DA2140F5D121C007E -131F5D00FE49C7FC147E5C387801F8387C07E0381FFF80D803FEC8FC24367CA426>103 -D<EB03F0EA01FFA3EA00075CA3130F5CA3131F5CA3133F91C8FCA35B90387E07F0EC1FFC -EC783E9038FFE01F02C01380EC800F1400485A16C05B49EB1F8012035BA2153F00071500 -5BA25D000F147E5B15FE5D121FD98001131C15F8163C003F01031338010013F0A2167048 -14E0007E15F016E0EDE1C000FE903801E38048903800FF000038143C263B7BB92A>I<EB -01C0EB07E014F0130F14E01307EB038090C7FCAB13F0EA03FCEA071EEA0E1F121CA21238 -5B1270A25BEAF07E12E013FEC65AA212015B1203A25B12075BA2000F13E013C013C1001F -13C01381A2EB83801303EB0700A2130E6C5AEA07F8EA01E0143879B619>I<EB0FC0EA07 -FFA3EA001F1480A2133FA21400A25BA2137EA213FEA25BA21201A25BA21203A25BA21207 -A25BA2120FA25BA2121FA25BA2123FA290C7FCA25AA2EA7E0EA212FE131EEAFC1CA2133C -133812F81378EA7870EA7CE0121FEA0F80123B79B915>108 D<D801E001FEEB07F03C07 -F803FF801FFC3C0E3C0F07C0783E3C1E3E3C03E1E01F261C1F78D9F3C013803C383FF001 -F7800F02E01400007801C013FE007018C002805B4A4848EB1F80EAF07FD8E07E5CA20000 -0207143F01FE1700495CA2030F5C0001177E495C18FE031F5C120349DA8001131C18F803 -3F153C00070403133849020013F0A24B1570000F17E049017E15F019E003FEECE1C0001F -EE01E34949903800FF000007C70038143C3E2679A444>I<D801E013FE3A07F803FF803A -0E3C0F07C03A1E3E3C03E0261C1F787F39383FF00114E0007813C000708114804A485AEA -F07FEAE07EA20000140701FE5C5BA2150F00015D5B151F5E12034990383F838016031607 -0007027F130049137EA2160E000F147C49141E161C5E001FEC3C7849EB1FE00007C7EA07 -80292679A42F>I<147F903803FFC090380FC1F090381F00F8017E137C5B4848137E4848 -133E0007143F5B120F485AA2485A157F127F90C7FCA215FF5A4814FEA2140115FC5AEC03 -F8A2EC07F015E0140F007C14C0007EEB1F80003EEB3F00147E6C13F8380F83F03803FFC0 -C648C7FC202677A42A>I<9039078007C090391FE03FF090393CF0787C903938F8E03E90 -38787FC00170497EECFF00D9F0FE148013E05CEA01E113C15CA2D80003143FA25CA20107 -147FA24A1400A2010F5C5E5C4B5A131F5EEC80035E013F495A6E485A5E6E48C7FC017F13 -3EEC70FC90387E3FF0EC0F8001FEC9FCA25BA21201A25BA21203A25B1207B512C0A32935 -80A42A>I<3903C003F0390FF01FFC391E783C0F381C7C703A3C3EE03F8038383FC0EB7F -800078150000701300151CD8F07E90C7FCEAE0FE5BA2120012015BA312035BA312075BA3 -120F5BA3121F5BA3123F90C9FC120E212679A423>114 D<14FE903807FF8090380F83C0 -90383E00E04913F00178137001F813F00001130313F0A215E00003EB01C06DC7FC7FEBFF -C06C13F814FE6C7F6D13807F010F13C01300143F141F140F123E127E00FE1480A348EB1F -0012E06C133E00705B6C5B381E03E06CB45AD801FEC7FC1C267AA422>I<EB0380EB07C0 -130FA4131F1480A3133F1400A35B137E007FB5FCA2B6FC3800FC00A312015BA312035BA3 -12075BA3120F5BA3121FEB801CA2143C003F1338EB0078147014F014E0EB01C0EA3E0338 -1F0780380F0F00EA07FCEA01F0183579B31C>I<13F8D803FEEB01C0D8078FEB03E0390E -0F8007121E121C0038140F131F007815C01270013F131F00F0130000E015805BD8007E13 -3FA201FE14005B5D120149137EA215FE120349EBFC0EA20201131E161C15F813E0163CD9 -F003133814070001ECF07091381EF8F03A00F83C78E090393FF03FC090390FC00F002726 -79A42D>I<13F0D803FCEB01C0D8071EEB03E0D80E1F1307121C123C0038140F4914C012 -70A249131FD8F07E148012E013FEC648133F160012015B5D0003147E5BA215FE00075C5B -A214015DA314035D14070003130FEBF01F3901F87FE038007FF7EB1FC7EB000F5DA2141F -003F5C48133F92C7FC147E147C007E13FC387001F8EB03E06C485A383C1F80D80FFEC8FC -EA03F0233679A428>121 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fc cmsy7 7 1 -/Fc 1 14 df<913801FFC0021F13FC91B67E499038007FC0D907F0EB07F0D91F80EB00FC -49C8127E017C151F01F0ED078048486F7E48486F7E48486F7E90CA1270481778001E8300 -1C171C003C171E0038170E0078170F007083A200F01880481703A96C170700701800A200 -785F0038170E003C171E001C171C001E173C6C5F6C17706D16F06C6C4B5A6C6C4B5A6C6C -4B5A017C031FC7FC013F157E6D6C5CD907F0EB07F0D901FFEB7FC06D90B55A021F01FCC8 -FC020113C039357CA842>13 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fd cmr7 7 45 -/Fd 45 122 df<1238127C12FE12FFA2127F123B1203A31206A3120C1218123812701220 -08127B8613>44 D<B5FCA410047F8E16>I<1238127C12FEA3127C123807077B8613>I<EB -3F803801FFF03803E0F83807803C48487E001E7F003E1480A2003C1307007C14C0A400FC -14E0AE007C14C0A36CEB0F80A36CEB1F006C131E6C6C5A3803E0F86CB45A38003F801B27 -7EA521>48 D<13381378EA01F8121F12FE12E01200B3AB487EB512F8A215267BA521>I< -13FF000313E0380E03F0381800F848137C48137E00787F12FC6CEB1F80A4127CC7FC1500 -5C143E147E147C5C495A495A5C495A010EC7FC5B5B903870018013E0EA01803903000300 -12065A001FB5FC5A485BB5FCA219267DA521>I<13FF000313E0380F01F8381C007C0030 -137E003C133E007E133FA4123CC7123E147E147C5C495AEB07E03801FF8091C7FC380001 -E06D7E147C80143F801580A21238127C12FEA21500485B0078133E00705B6C5B381F01F0 -3807FFC0C690C7FC19277DA521>I<0018130C001F137CEBFFF85C5C1480D819FCC7FC00 -18C8FCA7137F3819FFE0381F81F0381E0078001C7F0018133EC7FC80A21580A21230127C -12FCA3150012F00060133E127000305B001C5B380F03E03803FFC0C648C7FC19277DA521 ->53 D<1230123C003FB512E0A215C0481480A239700007000060130E140C48131C5C5CC7 -5A5C1301495AA249C7FC5B130E131EA3133E133CA2137CA413FCA813781B287DA621>55 -D<137F3801FFC03807C1E0380F0070001E1378003E7F003C133E007C131EA200FC131FA4 -1580A4007C133FA2123C003E137F001E135F380F01DF3807FF9F3801FE1FD80010130013 -00A2143E123C007E133CA25C5C007C5B383003C0381C0780D80FFFC7FCEA03F819277DA5 -21>57 D<140EA2141FA34A7EA3EC6FC0A2ECEFE014C7A290380183F0A390380301F8A201 -067F1400A249137EA2011C137F01187FA24980013FB5FCA2903960000FC0A201E0804913 -07A248486D7EA200038115011207D81FC0497ED8FFF890383FFFE0A22B2A7EA931>65 -D<B612E015FC3907F0003F0003EC0FC0ED07E01503ED01F016F8A6ED03F016E01507ED1F -C0ED7F0090B512FC819039F0003F80ED07E0ED03F0ED01F8ED00FCA2167EA616FCA2ED01 -F8ED03F0ED07E00007EC3FC0B7120015F827287EA72E>I<91387FC002903903FFF80690 -390FE01E0E90383F0007017CEB019ED801F0EB00FE4848147E4848143E5B000F151E48C8 -FC48150E123EA2007E1506A2127C00FC1500A8127C007E1506A2123EA2003F150C7E6C7E -000715186D14386C6C14306C6C1460D8007CEB01C0013FEB038090390FE01E00903803FF -F89038007FC0272A7DA82F>I<B712F0A23907F000070003EC00F816781638A21618A316 -0C1560A21600A215E0A2140390B5FCA2EBF0031400A21560A21606A2ED000CA4161C1618 -1638A21678ED01F80007EC07F0B7FCA227287EA72D>69 D<B712C0A23907F0001F0003EC -03E015011500A21660A31630A215C01600A31401A2140790B5FCA2EBF0071401A21400A4 -92C7FCA9487EB512E0A224287EA72B>I<91387FC002903903FFF80690390FE01E0E9038 -3F0007017CEB019ED801F0EB00FE4848147E4848143E5B000F151E48C8FC48150E123EA2 -007E1506A2127C00FC92C7FCA792387FFFE0127C007E02001300167E123EA2123F7E6C7E -6C7EA26C7ED801F814FEEA007C013FEB039E90390FE00F0E903903FFFC029026007FE0C7 -FC2B2A7DA833>I<B512C0A23807F8006C5AB3B0487EB512C0A212287EA718>73 -D<D8FFF0EDFFF06D5C0007EEFE0000035E017CEC037CA26D1406A26D140CA36D6C1318A2 -6D6C1330A36D6C1360A26D6C13C0A3903900F80180A291387C0300A2EC3E06A36E5AA2EC -0F98A3EC07F0A26E5AEA0780D80FC015FE3CFFFC01C01FFFF0A234287DA73C>77 -D<D8FFF0903807FFE07FD803FC9038007E006D143C1618137F6D7E6D7EA26D7E6D7E6D7E -A26D7E6D7E147FA2EC3F80EC1FC0EC0FE015F01407EC03F8EC01FCEC00FEA2157FED3F98 -ED1FD8A2ED0FF815071503A215011500486C1478487ED8FFFC143816182B287EA731>I< -B612E015FC3907F0003F0003EC0FC0ED03E0ED01F016F8150016FCA616F8150116F0ED03 -E0ED0FC0ED3F0090B512FC15E001F0C8FCAF487EB512C0A226287EA72D>80 -D<90387F80203903FFF06039078078E0380E000E481307481303007813010070130012F0 -A21560A27E1500127C127FEA3FE013FF6C13F06C13FC000313FFC61480010F13C0010013 -E0EC0FF014031401EC00F8A200C01478A46C1470A26C14F06C14E06CEB01C000EFEB0780 -39E3E01F0038C0FFFC38801FF01D2A7DA825>83 D<007FB7FCA23A7E003F003F0078150F -007081006081A200E01680481501A5C791C7FCB3A64A7E013FB5FCA229287EA72F>I<B5 -39C007FFE0A2D807F8C7EA7E006C48143C1618B3A816386C6C143016706C6C1460017C14 -E0017E495A6D495A90260F8007C7FC903807E03E903801FFF89038003FC02B297EA731> -I<13FE3807FFC0380F03E0381C00F0003E1378003F137C143C143E121EC7FCA3EB3FFEEA -01FF3807F03EEA1FC0EA3F00127EA2481418A3147E127EECDF38393F838FF0390FFE0FE0 -3903F807C01D1C7E9A21>97 D<EA0F8012FFA2121F120FAAEB81FCEB8FFF9038BC0FC090 -38F003E09038C001F0EB800015F815FC157CA2157EA7157CA215FC15F89038C001F015E0 -90387003C0390E3C0F80390C0FFF00380003F81F297EA725>I<EB3FC0EBFFF83803E03C -3807C00E380F801F381F003F123EA2007E131E007C1300A212FCA7127C127E1403123E6C -1306EA0F803807C00C3803F0383800FFE0EB3F80181C7E9A1E>I<EC03E0143FA2140714 -03AAEB3F833801FFE33803E03B3807800F380F0007481303123E127E127CA212FCA7127C -A2127E123E001E1307001F130F390F801FF03903E073FE3801FFE339007F03E01F297EA7 -25>I<133F3801FFE03803E1F0380F80F8381F007C143E123E007E131E141F127C12FCA2 -B6FCA200FCC7FCA4127C127E1403123E6C1307380F800E3807C01C3803E0783800FFE0EB -3F80181C7E9A1E>I<EB07E0EB3FF0EB7C78EBF0FCEA01E01203EBC078000713301400A8 -B51280A23807C000B3A2487EEA7FFEA216297FA815>I<90387E03E03901FF9FF03807C3 -FC380F00F048EBF800001E1378003E137CA6001E1378001F13F86C5BEBC3E0380DFF80D8 -1C7EC7FC90C8FCA3121E380FFFF014FC6C13FF001F1480393E001FC000781307EC03E048 -1301A40078EB03C0007C13076CEB0F80390FC07E003803FFF838007FC01C277E9921>I< -EA0F8012FFA2121F120FAAEB81FCEB8FFF90389C0F809038B007C013E09038C003E0A313 -80AF391FC007F039FFF83FFEA21F287EA725>I<120EEA3F80A5EA0E00C7FCA7EA078012 -FFA2121F120FB3121FEAFFF8A20D287EA713>I<EA0F8012FFA2121F120FABEC3FF8A2EC -1FC01500143C5C14E0EB81C0EB8380018FC7FCEB9F8013BFEBF7C0EBC3E0EB81F0801380 -147C80143FEC1F80EC0FC0D81FC013E039FFF83FFCA21E287EA723>107 -D<EA0F8012FFA2121F120FB3AFEA1FC0EAFFF8A20D287EA713>I<260F81FC137F3BFF8F -FF03FFC0903A9C0F8703E03B1FB007CC01F0D80FE013D8903AC003F000F8A301805BAF48 -6C486C487E3CFFF83FFE0FFF80A2311A7E9937>I<380F81FC38FF8FFF90389C0F80391F -B007C0EA0FE09038C003E0A31380AF391FC007F039FFF83FFEA21F1A7E9925>I<EB3F80 -EBFFE03803E0F83807803C48487E001E7F003E1480A248EB07C0A300FC14E0A7007C14C0 -A2007E130F003E1480001E1400001F5B380F803E3803E0F86CB45A38003F801B1C7E9A21 ->I<380F81FC38FF8FFF9038BC0FC0391FF007E0390FC003F0EB800115F8EC00FCA2157C -157EA7157C15FCA2EC01F801C013F0EC03E09038F007C09038BC1F8090388FFF00EB83F8 -0180C7FCA7487EEAFFF8A21F257E9925>I<380F07C038FF1FF0EB38F8EA1F71EA0F6113 -C1EBC0F014005BAF487EEAFFFCA2151A7E991A>114 D<3803F840380FFEC0EA3C07EA78 -03EA7001EAF000A37E6C1300EA7FC013FC6CB4FC6C1380000713C0C613E0130738C003F0 -130113007EA26C13E0130100F813C038EE078038C7FF00EA81FC141C7E9A1A>I<13C0A4 -1201A312031207120F121FB512E0A23807C000AC1430A73803E060A23801F0C03800FF80 -EB3F0014257FA31A>I<390F8003E000FF133FA2001F1307000F1303B01407A20007130F -9038C01BF03903E073FE3801FFE339007F83E01F1B7E9925>I<39FFF807FEA2390FE001 -F001C013E0000714C013E000031480EBF00300011400A23800F806A2EB7C0CA2EB7E1CEB -3E18A26D5AA2EB0FE0A36D5AA26D5AA21F1A7F9823>I<3BFFF8FFF07FE0A23B1FC01FC0 -1F80000F90390F800E00A20007150CEC1FC02603E01B5B15E0143B2601F0315B15F0D9F8 -6013700000156015F89039FCC078E0017CEB7CC0137D90393F803D80153FEC001F6D91C7 -FCA2011E7F010E130EA22B1A7F982F>I<39FFF807FEA2390FE001F001C013E0000714C0 -EA03E01580EBF003000114006D5A0000130613FCEB7C0CA26D5AA26D5AA214F06D5AA26D -5AA26D5AA291C7FCA213061230EA780EEAFC0C131C1318485AEA70E0EA3FC06CC8FC1F25 -7F9823>121 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fe cmbx10 10 25 -/Fe 25 122 df<913A03FF8007FE027F9039F07FFF800103B500FDB512E0010F903A00FF -FE0FF0D93FF8ECF81F90267FE0019038F03FF849485A4816E014804816C00200ED1FF081 -F007C06F91C7FCA8B912E0A4000390C701C0C7FCB3ABB5D8FC3FEBFF80A43D3A7EB938> -11 D<EB3FFE0003B512E0000F14F8391FF00FFE003FEB03FF6D6C7F6E7FA26F7EA26C5A -6C5AEA0380C8FCA2EC3FFF010FB5FC137F3901FFF87F00071380380FFE00EA3FF85B485A -12FF5BA415FF6D5A127F263FF00713F83B1FFC1FBFFFC0390FFFFE1F0003EBF80F39003F -E0032A257DA42E>97 D<13FFB5FCA412077EAF4AB47E020F13F0023F13FC9138FE03FFDA -F00013804AEB7FC00280EB3FE091C713F0EE1FF8A217FC160FA217FEAA17FCA3EE1FF8A2 -17F06E133F6EEB7FE06E14C0903AFDF001FF80903AF8FC07FE009039F03FFFF8D9E00F13 -E0D9C00390C7FC2F3A7EB935>I<903801FFC0010F13FC017F13FFD9FF8013802603FE00 -13C048485AEA0FF8121F13F0123F6E13804848EB7F00151C92C7FC12FFA9127FA27F123F -ED01E06C7E15036C6CEB07C06C6C14806C6C131FC69038C07E006DB45A010F13F0010113 -8023257DA42A>I<EE7F80ED7FFFA4150381AF903801FF81010F13F1013F13FD9038FFC0 -7F0003EB001FD807FC1307000F8048487F5B123FA2485AA312FFAA127FA27F123FA26C6C -5B000F5C6C6C5B6C6C4913C02701FF80FD13FE39007FFFF9011F13E1010313012F3A7DB9 -35>I<903803FF80011F13F0017F13FC3901FF83FE3A03FE007F804848133F484814C000 -1FEC1FE05B003FEC0FF0A2485A16F8150712FFA290B6FCA301E0C8FCA4127FA36C7E1678 -121F6C6C14F86D14F000071403D801FFEB0FE06C9038C07FC06DB51200010F13FC010113 -E025257DA42C>I<EC1FF0903801FFFC010713FF90391FF87F8090383FE0FFD9FFC113C0 -A2481381A24813016E1380A2ED3E0092C7FCA8B6FCA4000390C8FCB3ABB512FEA4223A7D -B91D>I<161FD907FEEBFFC090387FFFE348B6EAEFE02607FE07138F260FF801131F4848 -6C138F003F15CF4990387FC7C0EEC000007F81A6003F5DA26D13FF001F5D6C6C4890C7FC -3907FE07FE48B512F86D13E0261E07FEC8FC90CAFCA2123E123F7F6C7E90B512F8EDFF80 -16E06C15F86C816C815A001F81393FC0000F48C8138048157F5A163FA36C157F6C16006D -5C6C6C495AD81FF0EB07FCD807FEEB3FF00001B612C06C6C91C7FC010713F02B377DA530 ->I<13FFB5FCA412077EAFED7FC0913803FFF8020F13FE91381F03FFDA3C01138014784A -7E4A14C05CA25CA291C7FCB3A3B5D8FC3F13FFA4303A7DB935>I<EA01F0EA07FC487EA2 -487EA56C5AA26C5AEA01F0C8FCA913FF127FA412077EB3A9B512F8A4153B7DBA1B>I<13 -FFB5FCA412077EAF92380FFFE0A4923803FC0016F0ED0FE0ED1F804BC7FC157E5DEC03F8 -EC07E04A5A141FEC7FE04A7E8181A2ECCFFEEC0FFF496C7F806E7F6E7F82157F6F7E6F7E -82150F82B5D8F83F13F8A42D3A7EB932>107 D<13FFB5FCA412077EB3B3ACB512FCA416 -3A7DB91B>I<01FED97FE0EB0FFC00FF902601FFFC90383FFF80020701FF90B512E0DA1F -81903983F03FF0DA3C00903887801F000749DACF007F00034914DE6D48D97FFC6D7E4A5C -A24A5CA291C75BB3A3B5D8FC1FB50083B512F0A44C257DA451>I<01FEEB7FC000FF9038 -03FFF8020F13FE91381F03FFDA3C011380000713780003497E6D4814C05CA25CA291C7FC -B3A3B5D8FC3F13FFA430257DA435>I<903801FFC0010F13F8017F13FFD9FF807F3A03FE -003FE048486D7E48486D7E48486D7EA2003F81491303007F81A300FF1680A9007F1600A3 -003F5D6D1307001F5DA26C6C495A6C6C495A6C6C495A6C6C6CB45A6C6CB5C7FC011F13FC -010113C029257DA430>I<9039FF01FF80B5000F13F0023F13FC9138FE07FFDAF0011380 -0007496C13C06C0180EB7FE091C713F0EE3FF8A2EE1FFCA3EE0FFEAA17FC161FA217F816 -3F17F06E137F6E14E06EEBFFC0DAF00313809139FC07FE0091383FFFF8020F13E0020390 -C7FC91C9FCACB512FCA42F357EA435>I<49B4EB0780010FEBE00F013FEBF81F9039FFC0 -7C3F0003EB803E3A07FE000F7F4848EB07FF121F497F123F497F127FA25B12FFAA6C7EA3 -6C7E5D6C7E000F5C6C6C5B6C6C133F6CEBC0FD39007FFFF1011F13C10101130190C7FCAC -037F13FEA42F357DA432>I<9038FE03F000FFEB0FFEEC3FFF91387C7F809138F8FFC000 -075B6C6C5A5CA29138807F80ED3F00150C92C7FC91C8FCB3A2B512FEA422257EA427>I< -90383FF0383903FFFEF8000F13FF381FC00F383F0003007E1301007C130012FC15787E7E -6D130013FCEBFFE06C13FCECFF806C14C06C14F06C14F81203C614FC131F9038007FFE14 -0700F0130114007E157E7E157C6C14FC6C14F8EB80019038F007F090B512C000F8140038 -E01FF81F257DA426>I<130FA55BA45BA25B5BA25A1207001FEBFFE0B6FCA3000390C7FC -B21578A815F86CEB80F014816CEBC3E090383FFFC06D1380903803FE001D357EB425>I< -01FFEC3FC0B5EB3FFFA4000714016C80B3A35DA25DA26C5C6E4813E06CD9C03E13FF9038 -7FFFFC011F13F00103138030257DA435>I<B539F001FFF8A4000390C7EA3F00161E6E13 -3E6C153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5CEC -FE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA22D25 -7EA432>I<B500F1B538803FFFA43D07FE000FF80003E06C6C010715C082028015076C6E -6C148015076C01C0ED0F00826E485C017FED801E5D90273FF01E7F5B17C0DAF83E147C01 -1F90393C3FE078037C14F8903B0FFC781FF0F0A29139FEF00FF10107EDF9E002FF14FB6D -496CB45AA24B7E6D5EA26D496C90C7FCA292C7FC6E5CA2023E147C023C143C40257EA445 ->I<B539F01FFFF0A4000390398003F8006C01C013E06C1407D97FE05B6D6C485A6E48C7 -FC90381FFC3E010F5B903807FEFC6D6C5A5D6D5B6D5B6E7E6E7E814A7EA24A7E903801F3 -FFD903E37FD907C17FEB0FC049486C7E4A6C7E013E80496D7E49130F00016E7EB590383F -FFF8A42D257EA432>I<B539F001FFF8A4000390C7EA3F00161E6E133E6C153C6E137C6C -15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5CECFE0F010791C7FC6E -5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA292C8FCA25C141E003F13 -3E387F803C38FFC07C147814F8EBC1F0EBC3E06C485A387D1F80D83FFFC9FCEA1FFCEA07 -F02D357EA432>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Ff cmtt10 10 74 -/Ff 74 126 df<121C127FEAFF80B1EA7F00AF123EC7FCA8121C127FA2EAFF80A3EA7F00 -A2121C09346FB32C>33 D<003C131E007F137F481480A66C1400A6007E7FA6003E133EA3 -003C131E001C131C191977B32C>I<010F133C90381F807EA8013F13FE4A5AA4007FB612 -F0B712F8A4003F15F03A007E01F800A5EBFE0301FC5BA6003FB612F0B712F8A46C15F03A -01F807E000A30003130F01F05BA86C486C5A25337DB22C>I<EB01C0497EA6EB0FFC9038 -7FFF8048B512E00007804880391FFBEFFC393FC3E1FE903803E07F007E80127C00FC1580 -12F8157FA300FCEC3F00A2007E91C7FC127FEA3FC313FBEA1FFF6C13FC6C13FF000114C0 -6C6C7F011F13F801037F14E7ECE1FEECE07F81001880007E1580150F12FFA312FE151F16 -00007E5C007F143ED83F8313FE9038C3E1FC391FFBEFF86CB55A6C5C6C5CC691C7FCEB1F -F8EB03E0A66D5A21417BB92C>I<D807801307D81FE0EB0F80151F487E486C133F160000 -7C5CD8FCFC137EEAF87C15FE5D14015DA21403D8FCFC5BEA7CF8007F13075D383FF00FD8 -1FE05BA23807801FC75B143F92C7FCA25C147E14FE5CA213015CA213035C13075CA2130F -5C131FEC800FED3FC0013FEB7FE0140049EBFFF0017E13F9A2D9FE0113F801FC13F0A212 -0113F8120313F015F90007010013F05B000F14FF49EB7FE0A20007EC3FC06C48EB0F0025 -417DB92C>I<EA0F80EA1FC0EA3FE013F0A213F8A2121F120F1200A4120113F0A2120313 -E01207EA0FC0121FEA3F80EA7F0012FE5A5A12700D1B71B22C>39 -D<143814FC13011303EB07F8EB0FF0EB1FC0EB3F80EB7F0013FE485A485A5B12075B120F -5B485AA2123F90C7FCA25A127EA312FE5AAC7E127EA3127F7EA27F121FA26C7E7F12077F -12037F6C7E6C7E137FEB3F80EB1FC0EB0FF0EB07F8EB03FC130113001438164272B92C> -I<127012FC7E7E6C7E6C7EEA0FE06C7E6C7E6C7E6C7E137F7F1480131F14C0130FEB07E0 -A214F01303A214F81301A314FC1300AC130114F8A3130314F0A2130714E0A2EB0FC0131F -1480133F14005B13FE485A485A485A485AEA3FC0485A48C7FC5A5A1270164279B92C>I< -EB0380497EA60020140800F8143E00FE14FE00FF13C1EBC7C7EBE7CF003FB512F8000F14 -E0000314806C140038007FFCA248B5FC481480000F14E0003F14F839FFE7CFFEEBC7C7EB -07C100FE13C000F8143E0020140800001400A66D5A1F247AAA2C>I<147814FCAF007FB6 -12F0B712F8A46C15F0C700FCC7FCAF147825267DAB2C>I<EA0F80EA1FE0EA3FF0EA7FF8 -A213FCA3123F121F120F120013F8A21201EA03F01207EA1FE0EA7FC0EAFF80130012FC12 -700E17718A2C>I<007FB6FCB71280A46C150021067B9B2C>I<121FEA3F80EA7FC0EAFFE0 -A5EA7FC0EA3F80EA1F000B0B708A2C>I<1507ED0F80151FA2153F16005D157E15FE5D14 -015D14035DA214075D140F5D141F5D143F92C7FC5C147E14FE5CA213015C13035C13075C -130F5C131F5CA2133F91C8FC5B137E13FE5B12015B12035B12075BA2120F5B121F5B123F -90C9FC5A127E12FE5AA25A127821417BB92C>I<EB03F8EB0FFE90383FFF80497F90B57E -3901FE0FF03903F803F848486C7EEBE0004848137EA248487FA248C7EA1F80A2003E140F -007E15C0A3007C140700FC15E0AC6C140F007E15C0A46CEC1F80A36C6CEB3F00A26C6C13 -7E6D13FE00075CEBF0016C6C485A3901FE0FF06CB55A6D5B6D5BD90FFEC7FCEB03F82335 -7CB32C>I<1307497EA2131FA2133F137F13FF5A1207127FB5FC13DF139FEA7C1F1200B3 -AE007FB512E0B612F0A36C14E01C3477B32C>I<EB0FF890387FFF8048B512E000078048 -14FC391FF80FFE393FE001FF903880007F48C7EA3F80007E141F00FE15C0150F6C15E015 -07A3127E123CC8FCA2150F16C0151F1680153F16005D15FE4A5A14034A5A4A5A4A5A4A5A -ECFF804948C7FC495A495A495AEB3FE0EB7F8049C8FC485A4848EB03C04848EB07E0EA1F -E0485A48B6FCB7FCA36C15C023347CB32C>I<EB0FFC90387FFF8048B512E0000714F848 -80391FF807FEEBC0004848137F6D7F1680151FA26C5A6CC7FCC8FC153F16005D15FE1401 -4A5AEC1FF890381FFFF0495BA215F86D7F90380007FEEC00FF81ED3F80ED1FC0150FA216 -E01507A2123C127EB4FC150F16C0A248141F007FEC3F806DEB7F006C6C5B391FF807FE6C -B55A6C5C6C14E0C66C1380D90FFCC7FC23357CB32C>I<EC07F04A7E141F143FA2147EA2 -14FCEB01F8A2EB03F0EB07E0A2EB0FC0EB1F80A2EB3F00137EA25B485AA2485A5B120748 -5AA2485A48C7FCA2127E5AB712FC16FEA36C15FCC8EAF800AA91387FFFF091B512F8A36E -13F027347EB32C>I<000FB512FE4880A35D0180C8FCADEB83FE90389FFF8090B512E015 -F8819038FE03FE9038F000FF01C07F49EB3F8090C7121F6C15C0C8120FA2ED07E0A4123C -127EB4FC150F16C0A248141F007EEC3F80007FEC7F006C6C5B6D485A391FF80FFC6CB55A -6C5C000114C06C6C90C7FCEB0FF823347CB22C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0 -EA3F80EA1F00C7FCAE121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B2470A32C> -58 D<1507ED1F80153F15FF14034A1300EC1FFC4A5AECFFE0491380010790C7FCEB0FFC -EB3FF8EB7FE048485A4890C8FCEA0FFEEA1FF8EA7FF0EAFFC05BA27FEA7FF0EA1FF8EA0F -FEEA03FF6C13C06C6C7EEB3FF8EB0FFC6DB4FC01017F6D13E0EC3FF86E7EEC07FF6E1380 -1400153F151FED0700212A7BAD2C>60 D<127012FC7E6C7E13E06C7EEA1FFC6C7E3803FF -80C67FEB7FF0EB1FF8EB0FFEEB03FF6D13C06D6C7EEC3FF8EC0FFC6EB4FC0201138080A2 -5C02071300EC0FFCEC3FF8EC7FE049485A4990C7FCEB0FFEEB1FF8EB7FF0EBFFC000035B -D80FFEC8FC485AEA7FF0485A138048C9FC5A1270212A7BAD2C>62 -D<EB3FFE0003B512C0000F14F04814FC4880397FE007FF90C7FC00FEEC3F806C141FA315 -3F007EEC7F00003C5CC7EA03FEEC0FFC4A5AEC3FE04A5A4AC7FC495A495A5C13075C130F -5CA76D5A90C9FCA8EB0380EB0FE0A2497EA36D5AA2EB038021337BB22C>I<EC7F809038 -03FFE0010F7F013F7F497F9038FFC0FE3901FE007FD803F87F4848EB1F809038E00FCF39 -0FC03FFF48484813C091B5FCEA3F01393E03F87F903907F03FE0007EEBE01F397C0FC00F -EC8007A2EAFC1F00F8EB0003A900FCEB8007D87C0F14C0A2ECC00F3A7E07E01F80003EEB -F03F903903F87F00393F01FFFED81F805B6E5A6C6C6C5A3907E00FC09039F00007C06C6C -EB0FE0D801FE131F3900FFC0FF6DB512C06D1480010FEBFE00010313F89038007FC02333 -7CB22C>I<14FE497EA4497FA214EFA2130781A214C7A2010F7FA314C390381F83F0A590 -383F01F8A490387E00FCA549137E90B512FEA34880A29038F8003FA34848EB1F80A40007 -15C049130FD87FFEEBFFFC6D5AB514FE6C15FC497E27347EB32C>I<007FB512E015F8B6 -12FE6C8016C03903F0003FED0FE0ED07F01503A2ED01F8A6ED03F0A21507ED0FE0ED1FC0 -EDFF8090B612005D5D15FF16C09039F0001FE0ED07F0ED03F81501ED00FCA216FE167EA6 -16FE16FC1501ED03F8150FED3FF0007FB612E016C0B712806CECFE0015F027337FB22C> -I<02FF13700107EBE0F84913F9013F13FD4913FFEBFF813901FE007F4848131FD807F013 -0F1507485A491303485A150148C7FCA25A007EEC00F01600A212FE5AAB7E127EA3007F15 -F06CEC01F8A26C7EA26C6C13036D14F06C6C130716E0D803FC131F6C6CEB3FC03A00FF81 -FF806DB512006D5B010F5B6D13F00100138025357DB32C>I<007FB5FCB612C015F0816C -803907E003FEEC00FFED7F80153FED1FC0ED0FE0A2150716F0150316F81501A4ED00FCAC -ED01F8A3150316F0A2150716E0150FED1FC0153FED7F80EDFF00EC03FE007FB55AB65A5D -15C06C91C7FC26337EB22C>I<007FB612F0B712F8A37E3903F00001A7ED00F01600A4EC -01E04A7EA490B5FCA5EBF003A46E5A91C8FCA5163C167EA8007FB612FEB7FCA36C15FC27 -337EB22C>I<007FB612F8B712FCA37ED803F0C7FCA716781600A515F04A7EA490B5FCA5 -EBF001A46E5A92C7FCAD387FFFE0B5FC805C7E26337EB22C>I<903901FC038090390FFF -87C04913EF017F13FF90B6FC4813073803FC01497E4848137F4848133F49131F121F5B00 -3F140F90C7FCA2127EED078092C7FCA212FE5AA8913803FFF84A13FCA27E007E6D13F891 -38000FC0A36C141FA27F121F6D133F120F6D137F6C7E6C6C13FF6D5A3801FF076C90B5FC -6D13EF011F13CF6DEB0780D901FCC7FC26357DB32C>I<387FFFE0B57EA36C5BD803F0C8 -FCB3AE16F0ED01F8A8007FB6FCB7FCA36C15F025337DB22C>76 D<D87FE0EB0FFC486CEB -1FFEA26D133F007F15FC000F15E001BC137BA4019E13F3A3EB9F01A2018F13E3A21483A2 -018713C314C7A201831383A214EFA201811303A214FFEB80FEA3147C14381400ACD87FF0 -EB1FFC486CEB3FFEA36C48EB1FFC27337EB22C>I<007FB512C0B612F88115FF6C158026 -03F00013C0153FED0FE0ED07F0A2150316F81501A6150316F01507A2ED0FE0ED3FC015FF -90B61280160015FC5D15C001F0C8FCB0387FFF80B57EA36C5B25337EB22C>80 -D<387FFFFCB67E15E015F86C803907E007FE1401EC007F6F7E151FA26F7EA64B5AA2153F -4BC7FCEC01FE140790B55A5D15E081819038E007FCEC01FE1400157F81A8160FEE1F80A5 -D87FFEEB1FBFB5ECFF00815E6C486D5AC8EA01F029347EB22C>82 -D<90381FF80790B5EA0F804814CF000714FF5A381FF01F383FC003497E48C7FC007E147F -00FE143F5A151FA46CEC0F00007E91C7FC127F7FEA3FE0EA1FFCEBFFC06C13FC0003EBFF -C06C14F06C6C7F01077F9038007FFEEC07FF02001380153FED1FC0A2ED0FE0A200781407 -12FCA56CEC0FC0A26CEC1F806D133F01E0EB7F009038FE01FF90B55A5D00F914F0D8F83F -13C0D8700790C7FC23357CB32C>I<007FB612FCB712FEA43AFC007E007EA70078153CC7 -1400B3AF90383FFFFCA2497F6D5BA227337EB22C>I<D87FF0EB07FF486C491380A36C48 -6D1300001FC8127CA46C6C5CA76C6C495AA4143E147FA33A03E0FF83E0A214F7A201E113 -C3A3000101E35BA201F113C701F313E7A314C1A200005DA201F713F71480A301FF13FF01 -7F91C7FC4A7EA4013E133E29347FB22C>87 D<387FFFFCB512FEA314FC00FCC7FCB3B3B3 -B512FC14FEA36C13FC17416FB92C>91 D<127812F87EA27E127E127F7E7F121F7F120F7F -1207A27F12037F12017F12007F137E137F7F80131FA280130F8013078013038013018013 -00A280147E147F8081141F81140F811407811403A281140181140081157E157F81168015 -1FA2150FED070021417BB92C>I<387FFFFCB512FEA37EC7127EB3B3B3387FFFFEB5FCA3 -6C13FC17417DB92C>I<130EEB3F80EBFFE0000313F8000F13FE487FD87FF113C0D8FFE0 -13E0EB803F38FE000F007CEB07C00030EB01801B0C78B22C>I<007FB6FCB71280A46C15 -0021067B7D2C>I<137013F812011203EA07F0EA0FE0EA1FC01380EA3F00123E127E127C -A212FC5AA4EAFF8013C013E0A2127FA2123FEA1FC0EA0F800D1B71B82C>I<3801FFF000 -0713FE001F6D7E15E048809038C01FF81407EC01FC381F80000006C77EC8127EA3ECFFFE -131F90B5FC1203120F48EB807E383FF800EA7FC090C7FC12FE5AA47E007F14FEEB800338 -3FE01F6CB612FC6C15FE6C14BF0001EBFE1F3A003FF007FC27247CA32C>I<EA7FF0487E -A3127F1201AAEC1FE0ECFFF801FB13FE90B6FC16809138F07FC09138801FE091380007F0 -49EB03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D13036DEB07F0150F91 -38801FE09138E07FC091B51280160001FB5B01F813F83900F03FC027337FB22C>I<9038 -03FFE0011F13F8017F13FE48B5FC48804848C6FCEA0FF0485A49137E4848131890C9FC5A -127EA25AA8127EA2127F6C140F6DEB1F806C7E6D133F6C6CEB7F003907FE03FF6CB55A6C -5C6C6C5B011F13E0010390C7FC21247AA32C>I<EC0FFE4A7EA380EC003FAAEB07F8EB3F -FE90B512BF4814FF5A3807FC0F380FF00348487E497E48487F90C7FC007E80A212FE5AA8 -7E007E5CA2007F5C6C7E5C6C6C5A380FF0073807FC1F6CB612FC6CECBFFE6C143FEB3FFC -90390FF01FFC27337DB22C>I<EB03FE90381FFFC0017F13F048B57E48803907FE03FE39 -0FF800FFD81FE0EB3F805B4848EB1FC090C7120F5A007E15E015075AB7FCA416C000FCC9 -FC7E127EA2127F6CEC03C06DEB07E06C7ED80FF0130F6C6CEB3FC001FF13FF000190B512 -806C1500013F13FC010F13F00101138023247CA32C>I<EC0FF8EC3FFE91B5FC4914805B -903807FC7F14F090390FE03F0014C092C7FCA6007FB512FEB7FCA36C5C26000FC0C7FCB3 -A8003FB512F04880A36C5C21337DB22C>I<ED03F8903907F80FFC90391FFE3FFE017FB6 -FC48B7FC48ECFE7F9038FC0FF82607F003133E3A0FE001FC1CD9C0001300001F8049137E -A66D13FE000F5CEBE0016C6C485A3903FC0FF048B5FC5D481480D99FFEC7FCEB87F80180 -C8FCA37F6C7E90B512F06C14FE48ECFF804815E04815F03A3FC0001FF848C7EA03FC007E -1400007C157C00FC157E48153EA46C157E007E15FCD87F801303D83FE0EB0FF8D81FFCEB -7FF06CB612E0000315806C1500D8003F13F8010713C028387EA42C>I<EA7FF0487EA312 -7F1201AAEC1FE0EC7FFC9038F9FFFE01FB7F90B6FC9138F03F80ECC01F02807FEC000F5B -5BA25BB3267FFFE0B5FCB500F11480A36C01E0140029337FB22C>I<1307EB1FC0A2497E -A36D5AA20107C7FC90C8FCA7387FFFC080B5FC7EA2EA0007B3A8007FB512FCB612FEA36C -14FC1F3479B32C>I<140EEC3F80A2EC7FC0A3EC3F80A2EC0E0091C7FCA748B512804814 -C0A37EC7120FB3B3A2141F003C1480007E133FB414005CEB01FEEBFFFC6C5B5C001F5B00 -0790C7FC1A467CB32C>I<EA7FE0487EA3127F1201AA91381FFFF04A13F8A36E13F09138 -00FE004A5A4A5A4A5A4A5A4A5A4A5A4AC7FC14FEEBF1FC13F3EBF7FE90B5FCA2EC9F80EC -0FC001FE7FEBFC07496C7E496C7E811400157E811680151F3A7FFFC0FFFCB500E113FEA3 -6C01C013FC27337EB22C>I<387FFFE0B57EA37EEA0003B3B3A5007FB61280B712C0A36C -158022337BB22C>I<3A7F83F007E09039CFFC1FF83AFFDFFE3FFCD87FFF13FF91B57E3A -07FE1FFC3E01FCEBF83F496C487E01F013E001E013C0A301C01380B33B7FFC3FF87FF002 -7F13FFD8FFFE6D13F8D87FFC4913F0023F137F2D2481A32C>I<397FF01FE039FFF87FFC -9038F9FFFE01FB7F6CB6FC00019038F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0 -B5FCB500F11480A36C01E0140029247FA32C>I<EB07FCEB1FFF017F13C048B512F04880 -3907FC07FC390FF001FE48486C7E0180133F003F158090C7121F007EEC0FC0A348EC07E0 -A76C140F007E15C0A2007F141F6C15806D133F6C6CEB7F006D5B6C6C485A3907FC07FC6C -B55A6C5C6C6C13C0011F90C7FCEB07FC23247CA32C>I<397FF01FE039FFF8FFF801FB13 -FE90B6FC6C158000019038F07FC09138801FE091380007F049EB03F85BED01FC491300A2 -16FE167EA816FE6D14FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B512 -80160001FB5B01F813F8EC3FC091C8FCAD387FFFE0B57EA36C5B27367FA32C>I<903903 -FC078090391FFF0FC0017F13CF48B512EF4814FF3807FE07380FF00148487E49137F4848 -133F90C7FC48141F127E150F5AA87E007E141FA26C143F7F6C6C137F6D13FF380FF00338 -07FC0F6CB6FC6C14EF6C6C138F6D130FEB07F890C7FCAD0203B5FC4A1480A36E14002936 -7DA32C>I<D87FFEEB3FC0B53801FFF0020713F8021F13FC6C5B39003F7FE1ECFF019138 -FC00F84A13704A13005CA25C5CA391C8FCAF007FB512E0B67EA36C5C26247EA32C>I<90 -387FF8700003B512F8120F5A5A387FC00F387E00034813015AA36CEB00F0007F140013F0 -383FFFC06C13FE6CEBFF80000314E0C66C13F8010113FCEB0007EC00FE0078147F00FC14 -3F151F7EA26C143F6D133E6D13FE9038F007FC90B5FC15F815E000F8148039701FFC0020 -247AA32C>I<131E133FA9007FB6FCB71280A36C1500D8003FC8FCB1ED03C0ED07E0A5EC -800F011FEB1FC0ECE07F6DB51280160001035B6D13F89038003FE0232E7EAD2C>I<3A7F -F003FF80486C487FA3007F7F0001EB000FB3A3151FA2153F6D137F3900FE03FF90B7FC6D -15807F6D13CF902603FE07130029247FA32C>I<3A7FFF01FFFCB514FE148314016C15FC -3A03E0000F80A26D131F00011500A26D5B0000143EA26D137E017C137CA2017E13FC013E -5BA2EB3F01011F5BA21483010F5BA214C701075BA214EF01035BA214FF6D90C7FCA26D5A -147C27247EA32C>I<D87FFFEB7FFF6EB5FCB515806C16004A7ED807C0EB01F0A66C6C49 -5AA3143E147FA2D801F0495AECFF87A214F7A201F113C700005D9038F9E3CFA201FB13EF -A3D97BC190C7FC017F13FFA21480A2013F5B90381F007C29247FA32C>I<3A3FFF03FFF0 -48018713F8A36C010313F03A00FC007E005D90387E01F8013F5BEB1F83EC87E090380FCF -C0903807EF80EB03FF6D90C7FC5C6D5A147C14FE130180903803EF80903807CFC0EB0FC7 -EC83E090381F01F0013F7FEB7E00017C137C49137E0001803A7FFF01FFFC1483B514FE6C -15FC140127247EA32C>I<3A7FFF01FFFCB5008113FE148314816C010113FC3A03E0000F -806C7E151F6D140012005D6D133E137C017E137E013E137CA2013F13FC6D5BA2EB0F815D -A2EB07C1ECC3E0A2EB03E3ECE7C0130114F75DEB00FFA292C7FC80A2143EA2147E147CA2 -14FC5CA2EA0C01003F5BEA7F83EB87E0EA7E0F495A387FFF806C90C8FC6C5A6C5AEA07E0 -27367EA32C>I<003FB612E04815F0A4007EC7EA1FE0ED3FC0ED7F80EDFF004A5A003C49 -5AC7485A4A5A4A5A4A5A4A5A4AC7FCEB01FC495AEB0FF0495A495A495A49C8FC4848EB01 -E04848EB03F0485A485A485A485A485AB7FCA46C15E024247DA32C>I<15FF0207138014 -1F147F91B512004913C04AC7FCEB03F85CB31307EB1FE013FF007F5BB55A49C8FC6D7E6C -7FC67F131FEB07F01303B380EB01FEECFFC06D13FF6E1380141F14070200130021417BB9 -2C>I<127812FCB3B3B3A9127806416DB92C>I<EA7FC0EAFFF813FE6D7E6C7FC67F131FEB -07F01303B380EB01FEECFFC06D13FF6E1380141F147F91B512004913C04AC7FCEB03F85C -B31307EB1FE013FF007F5BB55A49C8FC13F8EA7FC021417BB92C>I -E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fg cmbx10 14.4 42 -/Fg 42 123 df<DC7FFFEC3FFC030FB5D8E003B5FC92B6D8F81F14C00207DBFE7F14E002 -1F92B712F0027FD9E0079138F07FF89127FFFE0001ECC0FF4901F049020013FC49494949 -5A4901804913FC4990C714F8495A013F17F05C7413F849486E49EB7FF0F33FE071ED1FC0 -7192C7FCADBC7EA626007FFCC7000101F0C8FCB3B3A5007FB5D8FC01B612FCA656547DD3 -50>11 D<EF1FC04D7EA24D7EA24D7EA34C7FA24C7FA34C7FA24C80A34C80A24C80A217BF -047F80171F04FF80A24C7E0301814C7E030381A24C7E0307814C7E030F82A24C7E031F82 -4C7F033F825E84037F8293C77E4B825D840201834B800203835D02076F7FA292B9FC4A84 -A24A84A3DA3FC0C86C7F4B81027F84A292C97E4A844A82010185A24A820103854A820107 -85A24A82010F86496C82B600FC0207B712F8A65D537BD268>65 D<BA12E019FF1AE01AFC -1AFF87D8000701F8C7000114E0DE003F7F737F737F737F8587851C8085A21CC0A81C8061 -1C00A24F5B61634F5B4F5B077F13C04EB55A060F49C7FC92B812F81AC0A21AFC1AFF03F8 -C86C13C0071F13F007077F7313FE737F731480A27413C01CE0A27413F0A31CF886A662A2 -1CF0A35013E0A297B512C0614F14804F14004F5B073F5B4EB55ABC5A1BC06308FCC7FC1A -E007FCC8FC55527CD162>I<932601FFFCEC03C0047FD9FFC013070307B600F8130F033F -03FE131F92B8EA803F0203EFC0FF020FDAF00113F1023F49C7EA3FFB4A01F00207B5FC49 -B500C0804991C9FC4949824901F88249498249498249498290B5488292CAFC4885485B86 -485B481A7FA24849183FA3485B1B1FA25AA24A95C7FCA3B5FCAE7EA280A2F30FC07EA36C -7FA21B1F6C6D1980A26C1A3F6C7F1C006C6D606C6E17FEA26D6D4C5A6D6D4C5A6D6D1607 -6D6D4C5A6D01FE4C5A6D6D4C5A6D02C0EDFF806D6C01F8020390C7FC6E01FFEC1FFE020F -02F0EBFFF8020391B65A020017C0033F93C8FC030715FCDB007F14E0040101FCC9FC5254 -78D263>I<BA12C019FEF1FFC01AF81AFE747ED8000701F8C7000F14E0060080071F13FC -07077F07017F7380747F081F7F8886747F747FA2747FA288861D80A2871DC0A31DE0A487 -1DF0AF1DE063A41DC0A398B51280A31D0062646264505BA2505B505B505B505B4FB5C7FC -4F5B070F5B077F5B0607B512E0BC128098C8FC1AF81AE04FC9FC19C05C527CD169>I<BC -7EA487A2D8000701FCC71203F0003F1907851900747E1A3FA21A1F1A0FA3747EA31A0318 -7EA3871A01A306FE90C8FCA3170117031707173F92B6FCA69238FC003F17071703170117 -00A2F31F80187EA2F33F00A595C85AA21B7EA21BFEA31A01631A031A07A21A0F1A1F1A3F -F2FFF81903190F4EB5FCBCFCA363A351517CD05A>I<BCFCA41B80A2D8000701FCC71207 -F0007F190F1903857313C01A7FA21A3F1A1FA21A0F1BE0A31A07A2187EA21BF01A03A397 -C7FC18FEA3170117031707173F92B6FCA69238FC003F1707170317011700A3187EA795C9 -FCB2B812FCA64C517CD057>I<932601FFFCEC01E0047FD9FFE013030307B600F8130703 -1F03FF130F92B8EAC01F0203EFE07F020FDAF801EBF8FF023F91C7EA1FFD4A01F80207B5 -FC91B500C01401010391C97E4949824901F88249498249498249498290B54882A24891CB -FC485B1B7F485B1B3F5A4A181F5AA2485B1B0FA25AA298C8FC5CA2B5FCAE6C057FB712F0 -A280A37E95C7003FEBE000A26C7FA27E807EA26C7FA26C7F6C80A26D7F6D7F6D7F6D01FC -5E6D7F6D6D6C92B5FC010002E05C6E01F85C6E01FF140F020F02F8EBFFF9020391B612F0 -0200EFE03F031FEE800F03079238FE0003DB007F02F01300040191CAFC5C5478D26C>I< -B800E090B812E0A6D8000701FCC9000701FCC7FCB3AC92BAFCA603FCC91207B3B0B800E0 -90B812E0A663527CD16C>I<B812E0A6D8000701FCC7FCB3B3B3B0B812E0A62B527CD134> -I<B800E0027FB6FCA6D8000701FCCAD87FF8C7FC1CE0F3FF805090C8FC505AF20FFC505A -F23FE0505A505A070390C9FC4F5AF10FF84F5A4F5AF1FFC04E5B4E90CAFCF007FC4E5AF0 -3FF04E5A4E5A4D90CBFC4D5AEF0FFC171F4D7E4D7E94B57E0403805E4C804C804C8093B6 -FC03FD019F7F92B5000F7F04FC804C7E4C6C804C6C8004C08193C7FC4B6E7F4B6E7F8672 -7F84727F87728084728087737F85737F737F87857380738088738086747F88747F88B800 -E0011FB712C0A662527CD16C>75 D<B812FCA6D8000701FCCAFCB3B3A71A3FA41A7EA51A -FEA3F101FCA31903A21907190F191FA2F13FF819FF601807181F4DB5FCBBFCA21AF0A448 -527CD153>I<B600FC070FB612C06F616F61A27060A2D800070BF8C7FC7018FBA202F76D -EF01F3A202F36DEF03E3A202F16DEF07C3A202F06DEF0F83A26F6CEF1F03A36F6C173EA2 -6F6D167CA26F6D16F8A26F6DED01F0A26F6DED03E0A36F6DED07C0A26F6DED0F80A2706C -ED1F00A2706C153EA2706D5CA3706D5CA2706D495AA2706D495AA2706D495AA2706D495A -A2716C49C7FCA3716C133EA2716D5AA2716D5AA271EBE1F0A271EBF3E0A371EBFFC0A271 -5CA27290C8FCA2725AA2725A497EB76C057FB712C0725AA2725AA2725A7A527CD183>I< -93380FFFC00303B6FC031F15E092B712FC020316FF020FD9FC0014C0023F01E0011F13F0 -4A90C700037F4948486E13FE4901F86E6C7E49496F7F49496F7F49496F7F49496F7F4990 -C96C7F90B5844A8248864849707FA24849711380A248497113C0A2481BE0A24A83481BF0 -A3481BF8A24A83A3B51AFCAF6C1BF8A36E5FA26C1BF0A36C1BE06E5FA26C1BC06E5F6C1B -80EE01FE6C6D902607FF8090B512006C031F01E05C6E496D5A6C4B01F85C6D6C9027FF03 -FC035B6D902881FC00FE075B6DD9C1F8D97F0F5B6D01E1DA3F9F5B6DD9F1F06DB55A6D01 -F994C7FC6DD9FFF86D5B6D60023F6D4913F0020F01FF90B512C0020391B6C8FC020016FC -031F6F140C03036F141EDB001F01E37F93C700016D133E869738F801FE97B5FCA2841CFC -A285A21CF8A2851CF07314E0A27314C0731480731400735B9638007FF8F21FE0576A78D2 -67>81 D<B912FCF0FFE019FEF1FFC01AF01AFCD8000701F8C7003F13FF06038006008007 -3F7F737F737F87737FA2737FA388A899C8FCA263616361634F5B4F5B96B55A060391C9FC -063F5B92B812F81AC097CAFC19FC19FF9226F8000180DD003F13E0060F7F727F727F8672 -7FA27280A2737FA587A587A575EB0780F50FC0A28773151FA2736D148075133FB800C06D -EC807F739138C1FF000701ECFFFE735D083F5C080714E0CE001F138062537CD167>I<91 -261FFF80130F91B500F85B010702FF5B011FEDC07F49EDF0FF90B712F948D9FC0190B5FC -489038E0000F48018013034848C8FC173F4848814981003F8283485A838312FFA2847FA2 -6D82A27F7F6E92C7FC14E06C13FCECFFC015FE6CECFFE016FF6C16E017F86C16FE6C8284 -6C17E06C836C837F011F826D82010382EB007F020F1680EC007F1503DB003F14C0160316 -00053F13E0838383127C00FC82A383A27E19C0A27EA26D4B1380A27F6D4B130001F85E6D -150F01FF4B5A02C04A5A02F8ECFFF09126FFC0075B019F90B65A010F5ED8FE034BC7FC48 -C66C5C48010F14E0489026007FFEC8FC3B5478D24C>I<001FBC12C0A5481BE09126F000 -3F9038E0007F91C7160701FC1801498401E0193FA249191F49190FA248C8EF07F0A4007E -1A03A500FE1BF8481A01A4C994C7FCB3B3AA91B912F8A655517BD060>I<B700FE013FB7 -6C013FB512FEA6D8003F01F0C8000F01FCC9380FFC006DF603F06F6F18076D735F856F1C -0F6D735F6F8176151F6D71616F1C3F6D7493C7FCA270715D6D4D187E701BFE4F806E6570 -1A016E4C6E5D1AEF707114036E040F607003C716076E041F6E5D1A83701A0F6E043F6E5D -701501077F6F131F6E6570DA7E00163F6E04FE6F91C8FC4F7F71616E030170137E05C049 -7F06037013FE6F4B6D5D05E018016F020704F85B4F7F05F0EFFC036F020F6005F8496D14 -07061F16FE6F4B6D5D05FC180F6F023F04FF5B96C77E7148179F6F63DDFF7E6E14BF6F02 -FE05FFC9FC4E81A26F624E81A270496F5BA270614E81A270614E81A270496F5BA2706195 -C97EA270614D82A2704871CAFC7048173E87537DD18E>87 D<91383FFFC00107B512FC01 -1FECFF80017F15E090B77E48D9E0077F48D9800013FE486DEB3FFF82486D81707F8284A2 -707F6C5BA26C5BC648C7FC90C8FCA44BB5FC4AB6FC143F49B7FC130F013FEBFE0390B512 -E0000314004813FC4813F0485B485B5C4890C7FCA2B5FC5BA35EA27F6C5D5E6E497F6C6D -017E13FE6C6D4848EBFFF86C9026FC0FF814FC6C90B5487E0001EDC03F6C6CEC800F011F -9026FE000313F8010101E090C8FC3E387CB643>97 D<EB3FF8B5FCA61203C6FCB3A3EE7F -F80307B57E031F14F0037F14FC02F9B67E02FB9038807FFF9127FFFC001F13C003F00107 -7F03C06D7F4B7F4AC780717F5C727EA285A2721380A41AC0AD1A80A34E1300A36118FF61 -806E4A5B6F495B6F495B6F495BDAE7F8013F5B9126C3FF01B5C7FC028190B512FCDA007F -5C496D14E049010791C8FC90C813F042547CD24C>I<913803FFF0023FEBFF8091B612E0 -010315F8010F81499038C01FFE903A7FFE0007FF4948491380485B48494913C05C5A485B -A2485B7013805A70130048ED01FC91CAFCA3B5FCAD7E80A27EA2EF07E06C7F170F6C6D15 -C06C161F6E15806C6D143F6C6DEC7F006C6D14FE903A7FFF8003FC6D9038F01FF8010F90 -B55A6D5D01011580D9003F49C7FC020313E033387BB63D>I<943801FFC00407B5FCA6EE -001F1707B3A3913803FFC0023F13FC49B6FC010715C74915F7013FD9E03FB5FC49EB0007 -D9FFFC130148496D7E484980484980484980A25A5C5AA25A91C8FCA3B5FCAD7EA46C7FA2 -7EA26C6D5CA26C6D5C6C5E6C6D49B5FC6C6D4914F0D97FFE010FECFFC0903A3FFF807FEF -6D90B512CF0107158F6DECFE0FD9007F13F00207018049C7FC42547BD24C>I<913803FF -E0023F13FE91B612C0010381010F15F84901C07F903A7FFE001FFE49486D7E48496D1380 -48496D13C0484915E048814A15F048815C48EE7FF8A25A91C8FC18FC173FB5FCA391B7FC -A418F891CAFCA57EA3807EA218786C6D15FC17016C7F6CEE03F86C6D14076E15F06C6DEC -1FE06C6C6C143F6D6C6CEBFFC06DD9F0071300010790B55A010115F86D6C14E0021F1480 -020001F8C7FC36387CB63F>I<ED0FFF92B512C0020714F0021F14F8027F14FC9139FFFC -1FFE49EBF03F4901C013FF49495A491300495AA2495AA2017FEC3FFE4AEB1FFCEE0FF8EE -07F093C7FCADB712F0A626007FFCC8FCB3B3A5007FB6FCA630547CD32A>I<91261FFF80 -EB3FC049B539F803FFE00107DAFE0F13F0011FDAFFBF13F8017F92B512FC9026FFFC0314 -CF48D9F000EBFC1F4801C0013F130F4816FE4849D91FFF13F8F007F04890C76CEB81E0F0 -8000A24883A86C5FA36C6D4990C7FCA26C6D495A6C5E6C01F0EBFFF86CD9FC035B4890B6 -5A1780D803E74AC8FC01E114F82607E01F138091CBFC120FA37FA27F13FE90B712C06C16 -FCEFFF8018E06C17F8846C836C836D178048B912C012074818E04848C8FCD83FF8150F48 -48030313F01700485A187FA56D16FF007F18E06D5D6C6C4B13C06C6C4B13806C6C6C021F -13006C01F0ECFFFE6C01FF010F5BC691B612F0013F16C0010F93C7FC010115F8D9000749 -C8FC3E4F7CB545>I<EB3FF8B5FCA61203C6FCB3A3EE1FFE93B512E0030314F8030F804B -8092393FE07FFF92267F001F7F15FCDAF9F86D7FECFBE014FF4B6D7F5D92C7FCA35CA35C -B3ABB6D8FC07B612E0A643537BD24C>I<137F3801FFC0487F487F487FA2487FA76C5BA2 -6C5B6C5B6C5B6C6CC7FC90C8FCABEB1FF8B5FCA612017EB3B3A4B612F0A61C547BD326> -I<EB3FF8B5FCA61203C6FCB3A44CB512FEA69326001FFCC7FCEF3FF04D5A4D5A4C90C8FC -EE07FE4C5A4C5AEE3FE0EEFFC04B5B4B48C9FCED0FFC4B5A153F4B7E9138F9FFFE02FB7F -91B67EA28383038F7F03077F14FE4A6C7F4A6C7F6F7F707FA2707F707F707F707FA2707F -707F707F717F8385B6D8F803B612C0A642537CD249>107 D<EB3FF8B5FCA612017EB3B3 -B3AFB612F8A61D537BD226>I<D93FF8D90FFFED3FFCB5027F01E049B57E0303B500F801 -0F14E04B02FE4914F8031F6E017F8092263FE03F902680FF807F4BC66C903AC1FC007FFF -000302FC6DD9C3F07FC6D9F9F86DD9E7E06D7FDAFBF0EDEFC04B5EDAFFC06D01FFC76C7F -4B5DA292C75CA24A5EA34A5EB3ABB6D8FC03B6D8F00FB612C0A66A367BB573>I<D93FF8 -EB1FFEB591B512E0030314F8030F804B8092393FE07FFF92267F001F7F000314FCC6D9F9 -F86D7FECFBE014FF4B6D7F5D92C7FCA35CA35CB3ABB6D8FC07B612E0A643367BB54C>I< -EDFFF0021FEBFF80027F14E00103B612FC4981011F9039C03FFF8090273FFE00077FD97F -F801017F49486D7F48496E7E488348496E7E48834A80481880A24818C091C87EA24818E0 -A4B517F0AB6C18E0A46C18C06E5CA26C1880A26C6D4A13006C5F6E147F6C5F6C6D4A5A6C -01FC01035B6D6C495B90271FFFC03F13806D90B6C7FC010315FC010015F0021F14800201 -01F8C8FC3C387CB645>I<D93FF8EB7FF8B50107B57E031F14F0037F14FC02F9B67E02FB -01807F9127FFFC003F13C0000302F0010F7FC602C06D7F5D4AC76C7F717F5C717FA28584 -1A80A47213C0AD4E1380A31A0095B5FCA2615F616E5C6E5E6F495B6F495B6F495B03F801 -7F5BDBFF01B5C7FC02FD90B512FCDAFC7F5C6F14E0030791C8FC030013F093CAFCB0B612 -FCA6424D7CB54C>I<90393FF001FFB5010F13E04B13F84B7F4B7F9238FF1FFFECF1FC00 -039026F3F03F1380C6EBF7E015C0ECFF80A215007013005C705AEE03F84A90C8FCA45CB3 -A9B612FEA631367CB539>114 D<903A01FFF00780011FEBFF1F90B7FC5A120748EB001F -D81FF8130701E0130148487F007F157F49143FA200FF151FA27FA27F01F891C7FC13FF14 -F06CEBFFC015FE6F7E6C15E06C15F86C816C816C816C16806C6C15C0011F15E01303D900 -1F14F01400030713F81501007CEC007F00FC153F161F7E160F7EA26D15F0A26D141F6D15 -E06D143F6DEC7FC001FE903801FF809026FFC00F130091B55A01BF5CD8FE1F14F0D8FC07 -14C027F0007FFCC7FC2D387CB636>I<143FA65CA45CA25BA35B5BA25B5B5B90B5FC5A00 -0F91B5FCB8FCA5D8003F90C8FCB3A8EE07E0AB6DEC0FC01580161F6D01C01380163F6D90 -38F07F006DEBFFFE6D5C6D6C5B021F13E0020313802B4D7ECB35>I<D91FFCEDFFE0B502 -07B5FCA60003ED001FC61607B3AD5FA35FA25F017F5D6E91B5FC013FDA01FB13F86ED907 -F3EBFFE06D9038C01FE36D90B512C36D15830101ECFE036D6C13F8020701C0EC80004337 -7BB54C>I<B600F80107B512C0A6C649C8383FE000017FEE1F806E153FA26D6D4AC7FCA2 -6D6D147E18FE6D6D5C17016D5E6F13036D5E6F13076D5E6F130F6D5E6F131FA26E6C495A -A26E018090C8FC5F6E147EEEC0FE6E5C16E16E5C16F36E5C16FFA26E5CA26E5CA26F5BA2 -6F90C9FCA26F5AA26F5AA26F5AA26F5A42357DB449>I<B6D8F07FB5D8E001B512F0A600 -0101FCC7D87FF8C73807F8006C745A7214076E143F017F626E6E6C140F6D624D6C141F6D -6D605F6F6F133F6D97C7FC6F90B56C5B6D197E5E03F001F96D13FE6D02035E03F8EDF001 -6D03F05D160703FC9039E07FF8036D020F5E03FEEDFC07027FDAC03F5C041F14FE03FFD9 -801F130F6E013F5E04BFECFF1F6E4A6C5C04FF159F4C6D13BF6E95C8FC4C6D13FF6E5FA2 -4C7F6E5F4C7F6E5FA24C147F6E5F4C143F037F5EA26F486E5A6FC86C5A5C357DB463>I< -007FB500F8013FB51280A6D8003F0180D907FEC7FC6D6D6D5A6D6D495A6D6D495A6D4B5A -6D6D495A6F495A6D6D49C8FC6E6C485A6E13816EEB83FC6EEBC7F8EEEFF06EEBFFE06E5C -6E5C6E91C9FC81A26F7F6F7F6F7F5D4B7F4B7F92B57E834A486C7E4A487EDA07F8804A48 -6C7F4A486C7F4A486C7F4A486C7F82DAFF008049486D7F49486E7E49486E7F49486E7F01 -3F81B691B612F0A644357EB449>I<B600F80107B512C0A6C649C8383FE000017FEE1F80 -6E153FA26D6D4AC7FCA26D6D147E18FE6D6D5C17016D5E6F13036D5E6F13076D5E6F130F -6D5E6F131FA26E6C495AA26E018090C8FC5F6E147EEEC0FE6E5C16E16E5C16F36E5C16FF -A26E5CA26E5CA26F5BA26F90C9FCA26F5AA26F5AA26F5AA35EA25E150F5E151FD81FE05C -486C133F486C91CAFC5D486C137E15FE4A5AA24A5A49485A007F495A9038F03FC06C48B4 -5A90B5CBFC6C5B000713F86C13E0C66CCCFC424D7DB449>I<001FB8128018C0A4DAC000 -148049C7140001F85B49495B49495B495D003F5C49495B4B5B5F5D90C7B55A4A91C7FC5E -5C4A5B4A5BC75C5C4A5B4A5B5E91B5FC4991C8FC4949EB0FC05D5B495B495B4B131F4916 -80495B90B55A92C7FC48163F485B4849147F5C4816FF48495B48495B4A130F4892B51200 -B9FCA47E32357CB43D>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fh cmr10 10 61 -/Fh 61 124 df<DA0FF813FC91397FFF07FF903B01F807DF83C0903A07E001FF0F903B1F -8007FE1FE090393F000FFC137E16F85B9338F007804848010790C7FC1503ACB812F8A328 -01F80003F0C7FCB3AB486C497E267FFFE0B512F0A3333B7FBA30>11 -D<EC0FF8EC7FFE903901F80780903907E001C090391F8000E090383F0007017E497EA25B -A2485A6F5AED018092C8FCA9ED03F0B7FCA33901F8000F1503B3AA486C497E267FFFE0B5 -12C0A32A3B7FBA2E>I<001C131C007F137F39FF80FF80A26D13C0A3007F137F001C131C -00001300A40001130101801380A20003130301001300485B00061306000E130E485B485B -485B006013601A197DB92A>34 D<121C127FEAFF80A213C0A3127F121C1200A412011380 -A2120313005A1206120E5A5A5A12600A1979B917>39 D<146014E0EB01C0EB0380EB0700 -130E131E5B5BA25B485AA2485AA212075B120F90C7FCA25A121EA2123EA35AA65AB2127C -A67EA3121EA2121F7EA27F12077F1203A26C7EA26C7E1378A27F7F130E7FEB0380EB01C0 -EB00E01460135278BD20>I<12C07E12707E7E7E120F6C7E6C7EA26C7E6C7EA21378A213 -7C133C133E131EA2131F7FA21480A3EB07C0A6EB03E0B2EB07C0A6EB0F80A31400A25B13 -1EA2133E133C137C1378A25BA2485A485AA2485A48C7FC120E5A5A5A5A5A13527CBD20> -I<121C127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A5A5A -12600A19798817>44 D<B512FCA516057F941C>I<121C127FEAFF80A5EA7F00121C0909 -798817>I<150C151E153EA2153C157CA2157815F8A215F01401A215E01403A215C01407 -A21580140FA215005CA2141E143EA2143C147CA2147814F8A25C1301A25C1303A2495AA2 -5C130FA291C7FC5BA2131E133EA2133C137CA2137813F8A25B1201A25B1203A25B1207A2 -5B120FA290C8FC5AA2121E123EA2123C127CA2127812F8A25A12601F537BBD2A>I<EB01 -C013031307131F13FFB5FCA2131F1200B3B3A8497E007FB512F0A31C3879B72A>49 -D<EB0FF0EB7FFE48B57E3903E03FE0390F000FF0000E6D7E486D7E486D7E123000706D7E -126012FCB4EC7F807FA56CC7FC121CC8FCEDFF00A34A5A5D14035D4A5A5D140F4A5A4A5A -92C7FC147C5C495A495A495A495A91C8FC011EEB01805B5B49130348481400485A485A00 -0EC75A000FB6FC5A5A485CB6FCA321387CB72A>I<EB07F8EB3FFF4913C03901F80FF039 -03C007F848486C7E380E0001000F80381FE0006D7FA56C5A6C5AC85A1401A25D4A5AA24A -5A5DEC0F80027EC7FCEB1FFCECFF809038000FE06E7EEC01FC816E7EED7F80A216C0A215 -3F16E0A2121EEA7F80487EA416C049137F007F1580007EC7FC0070ECFF006C495A121E39 -0F8003F83907F00FF00001B512C06C6C90C7FCEB0FF8233A7DB72A>I<1538A2157815F8 -A2140114031407A2140F141F141B14331473146314C313011483EB030313071306130C13 -1C131813301370136013C01201EA038013005A120E120C5A123812305A12E0B712F8A3C7 -3803F800AB4A7E0103B512F8A325397EB82A>I<0006140CD80780133C9038F003F890B5 -FC5D5D158092C7FC14FC38067FE090C9FCABEB07F8EB3FFE9038780F803907E007E09038 -8003F0496C7E12066E7EC87EA28181A21680A4123E127F487EA490C71300485C12E00060 -5C12700030495A00385C6C1303001E495A6C6C485A3907E03F800001B5C7FC38007FFCEB -1FE0213A7CB72A>I<EC3FC0903801FFF0010713FC90380FE03E90383F800790387E001F -49EB3F804848137F485AA2485A000FEC3F0049131E001F91C7FCA2485AA3127F90C9FCEB -01FC903807FF8039FF1E07E090383801F0496C7E01607F01E0137E497FA249148016C015 -1FA290C713E0A57EA56C7E16C0A2121FED3F807F000F15006C6C5B15FE6C6C5B6C6C485A -3900FE07F090383FFFC06D90C7FCEB03FC233A7DB72A>I<EB03F8EB1FFF017F13C09038 -FC07E03903F803F048486C7E48486C7E49137E121F48487FA2007F158090C7FCA248EC1F -C0A616E0A56C143FA27F123F001F147FA26C6C13FF3907E001DF0003149F3801F0033900 -FC0F1FD93FFC13C0EB07F090C7FC153F1680A316005D000F147E487E486C5BA24A5A4A5A -49485A6C48485A001C495A260F807FC7FC3807FFFC000113F038003FC0233A7DB72A>57 -D<121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA7F00121C092479A317> -I<1538A3157CA315FEA34A7EA34A6C7EA202077FEC063FA2020E7FEC0C1FA2021C7FEC18 -0FA202387FEC3007A202707FEC6003A202C07F1501A2D901807F81A249C77F167FA20106 -810107B6FCA24981010CC7121FA2496E7EA3496E7EA3496E7EA213E0707E1201486C81D8 -0FFC02071380B56C90B512FEA3373C7DBB3E>65 D<B712C016F816FE000190398001FF80 -6C90C7EA3FE0EE0FF0EE03F8707E707E177FA2EF3F8018C0171F18E0170F18F0A3EF07F8 -A418FCAC18F8A4EF0FF0A218E0A2171F18C0EF3F80A2EF7F0017FE4C5A4C5AEE0FF0EE3F -E0486DEBFF80B8C7FC16F816C036397DB83F>68 D<B812FCA30001903880000F6C90C712 -01EE007E173E171E170EA31706A317078316C0A394C7FCA31501A21503150F91B5FCA3EC -000F15031501A21500A21860A318E093C712C0A41701A3EF0380A21707A2170F173F177F -486D903807FF00B9FCA333397DB839>I<B812F8A30001903880001F6C90C71201EE00FC -177C173C171CA2170CA4170E1706A2ED0180A21700A41503A21507151F91B5FCA3EC001F -15071503A21501A692C8FCAD4813C0B612C0A32F397DB836>I<DBFF8013C0020FEBF001 -023F13FC9139FF803F03903A03FC000787D90FF0EB03CF4948EB00EF4948147F4948143F -49C8121F485A4848150F48481507A248481503A2485A1701123F5B007F1600A448481600 -AB93B6FCA26C7E9338007FE0EF3FC0A2123F7F121FA26C7EA26C7EA26C7E6C7E6C6C157F -6D7E6D6C14FF6D6C14EFD90FF8EB03C7D903FEEB0783903A00FFC03F0191393FFFFC0002 -0F01F0130002001380383D7CBA41>I<B612C0A3C6EBC0006D5AB3B3AD497EB612C0A31A -397EB81E>73 D<B612E0A3000101C0C8FC6C90C9FCB3AD1718A517381730A31770A317F0 -A216011603160FEE1FE0486D13FFB8FCA32D397DB834>76 D<B5933807FFF86E5DA20001 -F0FC002600DFC0ED1BF8A2D9CFE01533A3D9C7F01563A3D9C3F815C3A2D9C1FCEC0183A3 -D9C0FEEC0303A2027F1406A36E6C130CA36E6C1318A26E6C1330A36E6C1360A26E6C13C0 -A3913901FC0180A3913900FE0300A2ED7F06A3ED3F8CA2ED1FD8A3ED0FF0A3486C6D5A48 -7ED80FFC6D48497EB500C00203B512F8A2ED018045397DB84C>I<B5913807FFFE8080C6 -9238007FE06EEC1F80D9DFF0EC0F001706EBCFF8EBC7FCA2EBC3FEEBC1FFA201C07F6E7E -A26E7E6E7E81140F6E7E8114036E7E168080ED7FC016E0153FED1FF0ED0FF8A2ED07FCED -03FEA2ED01FF6F1386A2EE7FC6EE3FE6A2EE1FF6EE0FFEA216071603A216011600A2177E -486C153E487ED80FFC151EB500C0140EA2170637397DB83E>I<EC03FF021F13E09138FE -01FC903901F8007ED907E0EB1F8049486D7ED93F80EB07F049C76C7E01FE6E7E48486E7E -49157E0003167F4848ED3F80A24848ED1FC0A2001F17E049150F003F17F0A3007F17F849 -1507A300FF17FCAC007F17F86D150FA3003F17F0A26C6CED1FE0A36C6CED3FC000071780 -6D157F000317006C6C15FEA26C6C4A5A017F4A5A6D6C495A6D6C495AD907E0EB1F80D903 -F8017FC7FC903900FE01FC91381FFFE0020390C8FC363D7BBA41>I<003FB812E0A3D9C0 -03EB001F273E0001FE130348EE01F00078160000701770A300601730A400E01738481718 -A4C71600B3B0913807FF80011FB612E0A335397DB83C>84 D<B6903807FFFEA300010180 -9038007FE06C90C8EA1F80EF0F001706B3B2170E6D150C80171C133F17186D6C14385F6D -6C14F06D6C5C6D6C495A6D6CEB07806D6C49C7FC91387F807E91381FFFF8020713E09138 -007F80373B7DB83E>I<B500FC91387FFF80A30003018091380FFC006C90C8EA07E0715A -6C705A6E1403017F93C7FCA280013F1506A26E140E011F150C80010F5DA28001075DA26E -147001031560A26D6C5CA2806D4A5AA2ED8003027F91C8FCA291383FC006A215E0021F5B -A2EDF01C020F1318A26E6C5AA215FC02035BA2EDFEE002015BA26E6C5AA36FC9FCA3153E -A2151CA3393B7EB83E>I<B5D8FC07B5D8F001B5FCA30007902780001FFEC7EA1FF86C48 -C7D80FF8EC07E000010307ED03C01B807F6C6F6C1500A26E5F017F6E6C1406A280013F4A -6C5CA280011F4A6D5BEE067FA26D6C010E6D5BEE0C3FA26D6C011C6D5BEE181FA26D6C6F -5BEE300FA26D6C6F485AEE6007A26D6C4CC7FC9338C003FCA203805D913B7F818001FE06 -A203C1150EDA3FC3C7EAFF0CA203E3151CDA1FE6EC7F98A215F6DA0FFCEC3FF0A302075E -4B141FA202035E4B140FA202015E4B1407A2020093C8FC4B80503B7EB855>I<007FB590 -383FFFFCA3C601F801071380D97FE0D903FCC7FC013FEC01F06D6C5C5F6D6C5C6D6C1303 -4CC8FC6D6C1306160E6D6C5B6DEB8018163891387FC0306E6C5A16E06E6C5A91380FF180 -15FB6EB4C9FC5D14036E7EA26E7F6F7EA24B7E15DF9138019FF09138038FF8150F913806 -07FC91380E03FE140C4A6C7EEC38000230804A6D7E14E04A6D7E49486D7E130391C76C7E -01066E7E130E010C6E7E011C1401013C8101FE822607FF80010713E0B500E0013FEBFF80 -A339397EB83E>I<3901800180000313033907000700000E130E485B0018131800381338 -003013300070137000601360A200E013E0485BA400CE13CE39FF80FF806D13C0A3007F13 -7FA2393F803F80390E000E001A1974B92A>92 D<EB1FE0EBFFFC3803E03F3907000F8039 -0F8007E0486C6C7E13E06E7EA26E7E6C5A6C5AC8FCA4147FEB07FFEB3FE0EBFE00EA03F8 -EA0FF0EA1FC0123F485A90C7FC160C12FEA31401A26C13036CEB077C903980063E18383F -C01E3A0FE0781FF03A03FFF00FE03A007F8007C026277DA52A>97 -D<EA03F012FFA3120F1203B0EC1FE0EC7FF89038F1E03E9039F3801F809039F7000FC001 -FEEB07E049EB03F049EB01F85BED00FCA216FEA2167E167FAA167E16FEA216FC15016D14 -F8ED03F07F01EEEB07E001C6EB0FC09039C7801F00903881E07E903800FFF8C7EA1FC028 -3B7EB92E>I<EB03FC90381FFF8090387E03E03901F80070484813F83907E001FC380FC0 -03A2EA1F80123F90380001F848EB00F01500A2127E12FEAA127E127FA26C14067F001F14 -0E6D130C000F141C6C6C13386C6C13706C6C13E039007C07C090381FFF00EB07F81F277D -A525>I<ED0FC0EC03FFA3EC003F150FB0EB03F8EB1FFF90387E078F9038F801EF3903F0 -007F4848133F4848131FA24848130F123F90C7FC5AA2127E12FEAA127E127FA27EA26C6C -131FA26C6C133F6C6C137F6C6CEBEFF03A01F801CFFF39007C078F90381FFE0FD907F813 -C0283B7DB92E>I<EB07F8EB1FFF90387C0FC03901F803E03903F001F0D807E013F8380F -C0004848137CA248C7127E153E5A153F127E12FEA3B7FCA248C8FCA5127EA2127FA26C14 -037F001F14076C6C13060007140E6D131CD801F013386C6C137090387E03E090381FFF80 -903803FC0020277EA525>I<147E903803FF8090380FC1E0EB1F8790383F0FF0137EA213 -FCA23901F803C091C7FCADB512FCA3D801F8C7FCB3AB487E387FFFF8A31C3B7FBA19>I< -ED03F090390FF00FF890393FFC3C3C9039F81F707C3901F00FE03903E007C03A07C003E0 -10000FECF000A248486C7EA86C6C485AA200075C6C6C485A6D485A6D48C7FC38073FFC38 -060FF0000EC9FCA4120FA213C06CB512C015F86C14FE6CECFF804815C03A0F80007FE048 -C7EA0FF0003E140348140116F8481400A56C1401007C15F06CEC03E0003F1407D80F80EB -0F80D807E0EB3F003901FC01FC39007FFFF0010790C7FC26387EA52A>I<EA03F012FFA3 -120F1203B0EC0FF0EC3FFCECF03F9039F1C01F809039F3800FC0EBF70013FE496D7EA25B -A35BB3A3486C497EB500C1B51280A3293A7EB92E>I<EA0380EA0FE0487EA56C5AEA0380 -C8FCAAEA03F012FFA312071203B3AA487EB512C0A312387EB717>I<EB01C0EB07F0EB0F -F8A5EB07F0EB01C090C7FCAAEB01F813FFA313071301B3B3A2123C127E00FF13F01303A2 -14E038FE07C0127C383C0F00EA0FFEEA03F8154984B719>I<EA03F012FFA3120F1203B1 -913801FFFCA39138007FC01600157C15705D4A5A4A5A4AC7FC141E1438147814FC13F1EB -F3FEEBF73F01FE7FEBF81F496C7E8114076E7E6E7E811400157E157F811680ED1FC0486C -EB3FF0B500C0B5FCA3283A7EB92C>I<EA03F012FFA3120F1203B3B3AD487EB512C0A312 -3A7EB917>I<2703F00FF0EB1FE000FFD93FFCEB7FF8913AF03F01E07E903BF1C01F8380 -3F3D0FF3800FC7001F802603F70013CE01FE14DC49D907F8EB0FC0A2495CA3495CB3A348 -6C496CEB1FE0B500C1B50083B5FCA340257EA445>I<3903F00FF000FFEB3FFCECF03F90 -39F1C01F803A0FF3800FC03803F70013FE496D7EA25BA35BB3A3486C497EB500C1B51280 -A329257EA42E>I<EB03FE90380FFF8090383E03E09038F800F84848137C48487F48487F -4848EB0F80001F15C090C712074815E0A2007EEC03F0A400FE15F8A9007E15F0A2007F14 -076C15E0A26C6CEB0FC0000F15806D131F6C6CEB3F006C6C137EC66C13F890387E03F090 -381FFFC0D903FEC7FC25277EA52A>I<3903F01FE000FFEB7FF89038F1E07E9039F3801F -803A0FF7000FC0D803FEEB07E049EB03F04914F849130116FC150016FEA3167FAA16FEA3 -ED01FCA26DEB03F816F06D13076DEB0FE001F614C09039F7803F009038F1E07E9038F0FF -F8EC1FC091C8FCAB487EB512C0A328357EA42E>I<D903F813C090381FFE0190387E0781 -9038FC01C33903F000E3000714774848133749133F001F141F485A150F48C7FCA312FEAA -127FA37E6D131F121F6D133F120F6C6C137F6C6C13EF3901F801CF39007E078F90381FFE -0FEB07F890C7FCABED1FE00203B5FCA328357DA42C>I<3807E01F00FFEB7FC09038E1E3 -E09038E387F0380FE707EA03E613EE9038EC03E09038FC0080491300A45BB3A2487EB512 -F0A31C257EA421>I<EBFF03000313E7380F80FF381E003F487F487F00707F12F0A2807E -A27EB490C7FCEA7FE013FF6C13E06C13F86C7F00037FC67F01071380EB007F141F00C0EB -0FC01407A26C1303A37E15806C13077EEC0F00B4131E38F3C07C38E1FFF038C03F801A27 -7DA521>I<1318A51338A31378A313F8120112031207001FB5FCB6FCA2D801F8C7FCB215 -C0A93800FC011580EB7C03017E13006D5AEB0FFEEB01F81A347FB220>I<D803F0EB07E0 -00FFEB01FFA3000FEB001F00031407B3A4150FA3151F12016D133F0000EC77F86D9038E7 -FF8090383F03C790381FFF87903A03FC07E00029267EA42E>I<B538803FFEA33A0FF800 -0FF06C48EB07E00003EC03C06D148000011500A26C6C1306A26D130E017E130CA26D5BA2 -EC8038011F1330A26D6C5AA214E001075BA2903803F180A3D901FBC7FCA214FF6D5AA214 -7CA31438A227257EA32C>I<B53A1FFFE03FFEA3260FF8009038000FF86C48017EEB03E0 -18C00003023EEB0180A26C6C013FEB0300A36C6CEC8006156FA2017E9038EFC00C15C7A2 -D93F016D5A15830281EBF038D91F831430150102C3EBF87090260FC6001360A2D907E66D -5A02EC137CA2D903FCEB7F804A133FA2010192C7FC4A7FA20100141E4A130E0260130C37 -257EA33C>I<B538807FFFA33A03FE003FF00001EC1F80000092C7FC017E131C6D13186D -6C5AECC070010F5B6D6C5AECF180EB03FB6DB4C8FC6D5AA2147F804A7E8114CF903801C7 -E090380383F090380703F8EB0601496C7E011C137E49137F01787F496D7E486C80000FEC -3FF0D8FFFE90B51280A329247FA32C>I<B538803FFEA33A0FF8000FF06C48EB07C00003 -EC03806C7E16007F00001406A2017E5BA2137F6D5BA26D6C5AA2ECC070010F1360A26D6C -5AA214F101035BA2D901FBC7FCA214FF6D5AA2147CA31438A21430A214701460A25CA2EA -7C0100FE5B130391C8FC1306EAFC0EEA701C6C5AEA1FF0EA0FC027357EA32C>I<003FB5 -12FCA2EB8003D83E0013F8003CEB07F00038EB0FE012300070EB1FC0EC3F800060137F15 -0014FE495AA2C6485A495AA2495A495A495AA290387F000613FEA2485A485A0007140E5B -4848130C4848131CA24848133C48C7127C48EB03FC90B5FCA21F247EA325>I<B81280A2 -290280962A>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fi cmbx10 17.28 15 -/Fi 15 116 df<95B56C15E0053F02FCEC03F00407B76C1307043F04E0130F4BB800F813 -1F030705FE133F031F9438FF807F037F9126FC003FEBC1FF4AB60080010313F34A02F8C8 -6CB5FC020F02C0151F4A91C91207027F01FC8291B548824902E0707E494A83494A834991 -CB7E495B49498449865D90B5488448875D481C7F5D481C3F5D5A1D1F4891CDFCA3481C0F -5CA248F407E09AC7FCA35CA2B5FCB07EA280A47EF503E06EF207F07EA36C801D0F7E6F1A -E07E6F191F7E6FF13FC07E6D6DF17F80816DF3FF006D6D606D6D4E5A6D6E17076D6E4D5A -6D02F04D5A6D6E4D5A6E6D4D5A021F01FF4C485A6E02E003075B020302F8DB1FFEC7FC6E -DAFF80ECFFFC6E6C02FC011F13F0031F91B75A0307188003014DC8FCDB003F16F8040716 -C0DC003F4AC9FC05001480646677E377>67 D<BEFCA41D80A3D8000102F0C8FC1A071A00 -1B3F871B077513C087A2871C7FA21C3FA3F41FE0A31C0FF13F80A5F407F0A3197F99C7FC -A219FFA26060180F187F93B7FCA79338F0007F180F18038484A2197F1D7FA2193F1DFEA6 -1C0196C813FCA31C03A31C071DF8A21C0FA21C1F1C3F1DF01C7F1CFF63631B0F6398B512 -E01A0797B6FCBEFCA41DC0A360617AE06C>69 D<95B56C1570053F02FCEC01F80403B76C -1303043F04F0130793B800FC130F030705FF131F031FF0C03F037F9126FC001FEBE0FF92 -B60080010113F9020302FCC8003FB5FC020F02E0150F4A028015034A49C97E91B500F882 -494A834902C0171F495C4991CB7E49498449864B84495B90B54884481C7F5D481C3F5D48 -1C1F5D5A1D0F4891CDFCA3481C075CA2775A4899C8FCA35CA2B5FCB07E6E041FB9FCA47E -A36E93C8ECF8007EA36C80A26C80A27E817E816C807F6D7F816D7F6D806D6E5E6D806D80 -6D6E5E023F01FE5E6E6D6C5D6E02E05D020302FC157F0200DAFFC0903801FFF36F02FE01 -1F13E1031F91B7EAC07F0307F0001F03004D1307043F04F81301040304C0EB0070DC003F -4ACAFC050014C0706677E382>71 D<B700F80403B712F08282A2828383D800016F92C700 -3F90C7FC71EF07F8A2838383834A81816F806F806F80846F80816F806F80708070808582 -708070807080708085708183718071807180867180837180718072808772808472807280 -7280877280847314807314C07314E07314F01CF8857314FC7314FE7314FF7414871DC774 -14E7867414F77414FF86A28686878787A28787878787A2888888888888A28890260FFFC0 -84B700FC187F1D3F1D1FA21D0F1D07775A74627AE181>78 D<BA12FEF1FFF8F2FFC01BF8 -1BFEF3FFC01CF0D8000102E0C7001F80070014FE081F7F748008038074807480757F8987 -89A28987A28AA99BC8FCA2515BA265A2515B6598B55A505C505C080F91C9FC083F13FC4F -B55A071F14E093B9CAFC1BFC1BC0871BF804E0C714FE071F6D7E070780070114F0738074 -7F8688747F8689A28689A989A8F701F0F703F889A286A21F07746E14F08677130FB900C0 -6E16E0756D131F756DEB3FC0759138C0FF80090391B5120009005D0A3F5CCF000314F0E2 -001F13C075647AE17C>82 D<B900E0020FB712C0A7D8000102F0CB01FCC7FCF51FE0B3B3 -B3A96D1B3F66A2826E1A7F66A26E1AFF7096C8FC6E61656E6D17036E6D4D5A1C0F6E6E4C -5A6E6E4C5A6E6E4C5A6F6D4B485A6F01FC03075B6F01FF031F90C9FC030702C0ECFFFE6F -02FE011F5B030091B712F0043F5F040F178004034CCAFCDC007F15F005071580DD001F01 -F0CBFC72647AE17F>85 D<913803FFFE027FEBFFF00103B612FE010F6F7E013F16E049D9 -001F13F8D9FFE001077F486D01017F4801FC6D6D7E717F486D8085717FA2717FA3856C49 -80A26C5B38007FE0EB1F8090C9FCA5040FB5FC030FB6FC4AB7FC141F91B8FC0103ECF807 -010F1400013F13F890B512E04814804891C7FC4813FC485B5A485B5C5A5CB5FCA25CA25F -A36E5CA26C5E6E5C6C6D02FD7F0401ECFFC06C6DD903F9ECFF806C01FED90FF015C00003 -9039FFC07FE06C91B5EA807F6C6C4B7E011F02FC130F010302F001011480D9001F018090 -C9FC4A437BC150>97 D<92380FFFF092B67E020715F0023F15FC91B8FC4917800107DA00 -1F13C04901F8010313E04901E0010F13F0017F5B90B5484913F84891C7FC5C5A485BA248 -5B5A7113F05C487013E005011380489338007E0095C7FC5CA3B5FCAE7E80A37EA2806C18 -F8F001FC6C6D1503A26C6DED07F86C7FF00FF06C6E141F6C6E15E06D6DEC7FC06D01F814 -FF6D01FE010313800107903AFFC01FFE006D91B55A01005E023F15E0020F1580020102FC -C7FCDA000F13C03E437BC149>99 D<F13FFE0507B5FCA7EF00078484B3A7923807FFE092 -B512FC0207ECFF81021F15E1027F15F149B538C03FFD01079026FC0007B5FC4901F01301 -49496D7E017F01808090B5814891C87E4A814849815A485BA25A5C5AA35A5CA3B5FCAE7E -A46C7FA37EA26C7FA26C6D5D6C5F806C5F6C6D5D6D6D4A7F6D6D49B67E6D6D49EDFF8001 -0701F8130F6D01FFEBFFF3010091B512E3023F1583020FECFE03020114F8DA000F018002 -E0C7FC51657BE35C>I<92380FFFC04AB512FC020FECFF80023F15E091B712F80103D9FE -037F499039F0007FFE011F49EB1FFF4901806D7F4990C76C7F90B56E7F48496E7F5C4870 -7F485B8548177F4A825A183F4884A2485BA21A8084A2B5FCA391B9FCA41A0002E0CBFCA5 -7EA3807EA36C181F6EEE3F807E197F6C6D17006C606E5E6C6D15016C6E4A5A6D6D14076D -6DEC1FF86D01F8EC7FF06D01FE49485A01039026FFC01F5B6D91B6C7FC6D6C5D021F15F8 -020315E0DA007F91C8FC030713F041437BC14C>I<EE3FFE0307B512C0033F14F092B67E -020381020F9038F80FFF4AEBC03F027FD9007F13804A5A494990B512C0495BA2495BA249 -5BA349496D1380711300715A715AEF01E094C8FCAFB812E0A7D8001F01E0C9FCB3B3AE00 -7FB612FEA73A657BE432>I<902607FF80902607FFC0ED1FFFB6027F01FC4AB512F04CB6 -020714FC040703C0011F14FF041F6F017F8193263FF81F6D9026FFE07F7F9326FF800790 -28F803FE001F7F922781FE00039026FC07F86D7FC6DA83F89226FE0FE0816DD987F04C5A -6DD98FE06D6D48486D7F4C94C7FCDB9F80167E03BFC84A8003BE4D8215FE4B5FA24B5FA2 -4B5FA34B5FB3B1B7D8F803B7D8E00FB71280A781417AC08A>109 -D<902607FF80903807FFC0B6027F13FC4CB6FC040715C0041F8193263FF81F7F9326FF80 -077F922781FE00037FC6DA83F8816DEB87F06DD98FE06D7F5EED9F8003BFC8FC03BE8315 -FE5DA25DA25DA35DB3B1B7D8F803B712E0A753417AC05C>I<903A07FF8007FEB690381F -FFC0047F13F093B57E038314FE923987FC1FFFDCF07F1380ED8FC0C6DA9F80B512C07F6D -EBBF0015BE15FE5DA25D7113805D711300EF0FFCEF03F04B90C8FCA55DB3AEB712FCA73A -417BC044>114 D<913A3FFFC007800103B538FC1FC0011FECFF3F017F15FF9038FFF000 -000390C7121FD807FC1407484880484880484880177F485A173FA212FF6D151FA27F7F6D -ED0F8001FF92C7FC14E014FF15F86CECFFE016FC6C15FF17C06C16F06C826C16FE6C826C -17806C6C16C06D16E0130F010116F0EB003F020115F8EC0007DB003F13FC16071601007C -8100FE167F173F6C161FA36D150FA26D16F8A26D151F7F18F06D153F6DED7FE06D16C06D -6C903801FF8002E00107130002FCEB7FFE01DFB65A018715F0D8FE0315C048C66C91C7FC -0070010713E036437BC141>I E -%EndDVIPSBitmapFont +%%BeginProcSet: texps.pro 0 0 +%! +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 +ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ +pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get +div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end +definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup +sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll +mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ +exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} +forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end + +%%EndProcSet +%%BeginFont: CMMI8 +%!PS-AdobeFont-1.1: CMMI8 1.100 +%%CreationDate: 1996 Jul 23 07:53:54 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI8) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI8 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 58 /period put +readonly def +/FontBBox{-24 -250 1110 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 +5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC +4391C9DF440285B8FC159D0E98D4258FC57892DDF753642CD526A96ACEDA4120 +788F22B1D09F149794E66DD1AC2C2B3BC6FEC59D626F427CD5AE9C54C7F78F62 +C36F49B3C2E5E62AFB56DCEE87445A12A942C14AE618D1FE1B11A9CF9FAA1F32 +617B598CE5058715EF3051E228F72F651040AD99A741F247C68007E68C84E9D1 +D0BF99AA5D777D88A7D3CED2EA67F4AE61E8BC0495E7DA382E82DDB2B009DD63 +532C74E3BE5EC555A014BCBB6AB31B8286D7712E0E926F8696830672B8214E9B +5D0740C16ADF0AFD47C4938F373575C6CA91E46D88DE24E682DEC44B57EA8AF8 +4E57D45646073250D82C4B50CBBB0B369932618301F3D4186277103B53B3C9E6 +DB42D6B30115F67B9D078220D5752644930643BDF9FACF684EBE13E39B65055E +B1BD054C324962025EC79E1D155936FE32D9F2224353F2A46C3558EF216F6BB2 +A304BAF752BEEC36C4440B556AEFECF454BA7CBBA7537BCB10EBC21047333A89 +8936419D857CD9F59EBA20B0A3D9BA4A0D3395336B4CDA4BA6451B6E4D1370FA +D9BDABB7F271BC1C6C48D9DF1E5A6FAE788F5609DE3C48D47A67097C547D9817 +AD3A7CCE2B771843D69F860DA4059A71494281C0AD8D4BAB3F67BB6739723C04 +AE05F9E35B2B2CB9C7874C114F57A185C8563C0DCCA93F8096384D71A2994748 +A3C7C8B8AF54961A8838AD279441D9A5EB6C1FE26C98BD025F353124DA68A827 +AE2AF8D25CA48031C242AA433EEEBB8ABA4B96821786C38BACB5F58C3D5DA011 +85B385124C2B6534F3CD1866AF92009D93B97F763AA3D16684AA65F029E776DA +3BFB75EDD46D562E6A284DB4F2FDBF7CDE7C1F3772CD7B6FD372842A0E07E3EF +68A98AB9278ADC2D35891543F57ED6DCFE8923368D556F1A8B3E35863112F409 +FBE67FC270328312BAA43A9A372C510717B50AAB01A1E02A9982113E2D7C601C +B0BDA1C0E081E546A97647B74EE5194C57ACD62502B329FED4D966BDEB4028F0 +F082EDD5DFC8387653D620E9E73FDCE3C155347D5929C3A24D6121AEA46BBF3A +B1C8A4793FB7F21C84400912C27D9AB0845537103553BF8F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMTI8 +%!PS-AdobeFont-1.1: CMTI8 1.0 +%%CreationDate: 1991 Aug 18 21:07:42 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTI8) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMTI8 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 45 /hyphen put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 121 /y put +readonly def +/FontBBox{-35 -250 1190 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 +525003F3DAD7933EB57E7DB1462E9D906F6D8F5BF740206C1EC5F36E00AAFF68 +F3EF6F3A2540E5F9564D1C215BC1E7E69C7D04DA5DB1CF195613C9CBF4BAA360 +84AEF3E10E24877FBE36AD731DC97305BDE6DB1F934909FAF60B8E28561FBC57 +0F5B6225425BFDE8F0C71CD4507B82FF803E9A301397975E38A259DE1E1B4FC0 +06BB1DC2D45B987A2268A77CE8DC025CB0D1B39788BBEE149103950650171C94 +5FED1063050A90BD38605BD9365D1C2AE42A7DA3DDB9A263FE10BD487F63D908 +D4F02758BD9D7BE53E6353A25BEFA29E42B50C1D078A8B3A746EEDB381CCE36C +93FC4BD1A8D1D6ACD0D355E948CFE397B74D243EB51597D251D0BAE6884D70E8 +FEE119462E1939A9783414DF59EEA5FF1529F13869D1FF0A44935C5198CC5DAA +E1FD2A17AEEBF4974052D06734A409E26C457C06700C55896C90BB33E044A737 +46590D9FA242819B9527FD59818D8829D4EB2D26A34CC05A2CC063E66F2DF193 +8E4F9670014BC243180E45B51DDB05AD1E6A7F619EE1CE09CFC1A4F02CB7270E +4482FEDF673EDED38EF3173C475C34BFB3F6623C5E942A7797FEDDD0EF1D54E9 +1D90D7076C0A9687E334907C22F2E7C603388D8D626B0E5A62B7543DCBB575D7 +9A6BE1528EC9BC18570001092524E4FBB02F3B29293BCB4F0EF14A2DD9DB22A5 +BB33455799E8120D2A4862424AA4A382972E2845E042506FC8F6E201D11DD0F2 +09FAD8DC29C3E12B66293ACBFB13FA0F26238981F2CD52B47A8CDE6DF5CDFAAF +3113E1A6366B806EABA9C34E5D41167CD10D7B639021FB4CFDAE28CE72A93F3C +E8929A4813956AAB24BE7C20FCF9196E8E2F30816FE2279CE3E6067667A39E44 +488D58BFD17606AE885FA06F478D359A6ECF5564C095FE0E5038425D8B152750 +F72F41B3D1E7420EE91CF4A9ED5BBE8C2275624AE257D2BDF5752E803B426F40 +924CB5C29460BC09EC84F3F3A95F6900836F0ECCF6A7BB85A3F8D650017E5FE0 +503A73644EC6C6B0254F0259F8DD4AB3945950974CEB34521881A2506E76EBB3 +7DBA7812E0186DE2C0AD3E6D42BCA320014368DD738408C54AE2CAAA9C05612B +E7F33218F2FECCE8DB2E4B3A3BCD9D8D0BAD7EDDCCAE45F6A15FD2B8ED263E45 +14AF0CC7B58EF52D5FE73023EE9DAB8249D1EB3B795C7B42BFD2A2852D2D16BF +CD71056F412571F41CF7EE80AA916EA4FF1630B1E226F474CC3195006043B1AB +915DA8A9484B930F1F00028287EA3802DA3C3F99961952E04B736CDEC7768307 +879B4D2D553518FBBA727266F94C3A607FFD5D85CD0FB802CA51E6A3792C80F9 +A637D47C13A787F5D9C5BAC24E843DA198B7CC898AD786DEAC0BA9B6EF955ECC +72DA3A8CCCF7F3B69597A2F868AE359737A9714AE6D81989B4152DA33095DAB8 +5759080AA156DF1F3767120018CE81D296D813DC52786586CF3F38EE3CE181D3 +9D79439EE13D4E5799E03338E93315C3F6BA8ADC731A0D8282637E524C1E9736 +29C594C6F19B49C859D7CCA98148215F7E6943637797641D44DC9FB8FA403FCA +BD581E477C7BBDBC84048141760B4EE0D181D585C519D02DEB7D1C650BB49874 +A75E95E6A17D8024346AF3288A32A7EDFFAE15BACD436CC76850F2EAC7EFF565 +C4273160FC5DC7434DB94BFA01D1648421FCFEF66D786CFF60F0031B649B6F14 +E9139B27185E6E9A70E439AA8D68C6535A42634FFDA55DE86BDEDDF3D6B73015 +37C7437A96CDAC620A29942E834F714D82774AED0A83771A152EAC0CC043CB09 +02574AFC4CA006FC0D24C3DAAF4D681CC1D2D7870F273773171A4977AD05A082 +0DF3F50C8A36D7D8AA96E82387AAFB48D048CFAE2CBAA88F1865B84CFBBC1731 +A212A44EB98265A8D4A8C118E038A0C3503B27D8B58846C4F3E8112C8B05A41A +9F8B0E1513528F5D7E509EE847F7224AA06819954974F8065AF49F21840E972D +C1B028B541BA1364045E814A9F8FB299B6B62CA150245D92588056992FE6D71B +FB16F2B42A3DE425B302051FCC4A2AA76F6146BAA385614913D2B11191CA6A09 +BAE8567DCAC342D013C7830A0F03D848397110F021C63C9D6AFA90ABBC2DE4C9 +69EDFEE42C028640F9784E8CA11B83B4E7AB58F8335FA294DD68BA87FFFCC743 +67239D7FF1C54B725D53581832F5307FF1995D8273EBA54372AC82B7D5EC5773 +8F52B55255502008E0EDA0646D4D71137D822A57C0E9E05F3D61B91436B5FFE5 +CD90CABEA89420F4ADD844733B9B0F0C72688B9184A2EF69966411DF2B23A25A +11F009C6F23E452854B77AA33129C531C2C7A8666D550A83CBA6F251CB016F0C +940EC74FF62C721F3D854404F431DB39548F0785C5140A9D406C06306CBB0C99 +B7AA0E4680D8DE074B369A7481F0C12BCEDB787A1A9E4C71C869F5022447E317 +E6B851B8D89144BEE028D2352745CB0C081A7E806482F74E7EDDB5F1601A58D9 +EC5B92F7DAD1B462B0EB9DF22604BB2D617AC6056E723110CEBACFB0F6ADFC92 +F64C98F9910F91A8C4B39EF508A1AA01656C41247E1E8280A97089C515A1792B +509D2DBD3C5B6972F6829B60135247B75DFA7C067675B7010FB2F116B5009B12 +1F139A8A3E25FF52BE00D9C4AE67496958CA3D1D4568218542B77C865056E45A +0A07947C4E7D16D24E07A77ED01F10226CBBC21E0DF75293CED54214149619A2 +4A591F3F99EB14032AE840BEC7313CF1F24250BD8D6BDDBE85883D35D6907C77 +FCF01A7E8DAA9BF8E47DA3225623B645891455874BA99ABF9AC9CFABC083127E +CA636C8673A1ECF967BABDABF1A569319A4E382E7C593CB954522CC9DF04BEA6 +57297331734B3959805B89F96DD23C38DC8CE17C7373EE5F7A9035557E40C310 +7D1DA91F87F0CF45E54518B549DDC5F91851E2899E9756A069CBAE8E63A42974 +299781A390072C7E59B9433F9D47111900DEF4E4F10913BAEE90794333454574 +37B7A46664522983EADBAF6155C6A8624CC7FF1A850313072EF5B066059CC840 +C4A1DA2BAC6DD27D3D3BC9653003D5B25405492BB64FE4A1C294F06492093093 +A4B0175F6DBFE6C4C28C310F71010F97035774250EE0468E54A7CCF54465C7FE +7A70ADA08BB5B6A4AEBB3F60FA39FB810E6D7B1FBF169DEF45FD7E7EEC4B273E +A11269ED5BC9F8250F8D29BCBB656105FF2D71FB624F7A67C899828D3A563491 +9CCE8EF268F2A8986577C3A752F91B650DC9717A89F76DBAC254DF1BC705308B +2E4C7C55A152ED1AE945337B93E411B46DF56DD8F0942DD8403ED15FA515079C +A1035F3C7A2648761792E241C6710503F7A6093FAD8BCA34C0378700928762E7 +FC371BDA7488C95F69518E1DB63068E740942234A79478DF18C5752490DF199F +95C654423257DE301117F3C379DA5C90392A7BA173BA19BF2C35C9A0EE180098 +C228CED65FD5241B5DA3D318891994D363AE49E3B0FFDE091C82DB4BE7B240EB +159050F74BD181337EE202011BC96EB74C68E8BBB26E46020355378E6EC2B9D8 +89DB7907378B83FDC294B134E69D5AC1B2CBC821420EE28CEE8681EA3EC902F8 +3E8503A833B675E21679D6C5B7041701FC553B95D2DB82987EB4A010C8DCD9A9 +C0FB4C048617716CEA638CE3A16C90E55DBF76408A71B3B7FB784820EC3971EF +726DBE12A1098F350D9FF84E1846CD57B6DDAEF32C6B839644F57EE6B256090E +C711154CB95AB2910587E15E3F16D402943157E9CBA2174BE93B820951499A42 +F797664141F9F2698166395DF7116293B6557266C7DA28E2FC1F8BDA4B00C07B +6F7FE6AD4937A694EA423A2B90F9EBD30B8D3710E7E6D7BE15BA631E6991EE2B +1A28A02C4CC51889C37702E57F13F1E54295D77148C7EBB6B006DD232EF94D83 +20FFCB794B221BDEB84DCD737D301A44B8414B4591BD1D184C85B09BC5E28A0D +7DB0830419C1D92775DBFAD72F2D7E581EB08E516B0DE87BFF2DC167EBACE23B +73A3E770832A7A22B28AD12CA07DD15D22FF5EE53C48C55CEE77BD2D429571F8 +9DC52FC92A2D4F7BEDC0F27C39E7BFBBE38721E56234E9AF5FF1EFC753C8E281 +4EAF702CA8F08D3407FEF7E177FDE6177F6604B47872CD9EC22A6644C5A78CDA +FE3C51033C45BC1BE224F09EAF923B058E13ACDC61A0E7CB5C999DB0C8543BFC +4D65815338F65AA12BDDFC1EF5A249270D84BF1377FA064F62F41787F3D875D3 +0E4EBD38E30D593389ED01180CA5AD540A89B31933BCEC4DEEA2CFA94C03FD0D +290573BB3162C80FA9783A66AF33F11CD9437A7EE16812BBC32D80DC10057A97 +C83152905B954CBE464EF39D40056FF3047D9D57B9088A7FAD48E997B5096D20 +E21F9FF5858FC241EC16527F66DE8B403281A8FCA32AF1408D05387C3BFF79CF +25C5E6EE231B17287ACC5643C94E54A6962CE33246F7D03060042B623CB80C2C +2E2AC47CB431B64828D8D35426810074E1B98188A866406D24B8020D2082961A +A4AA27528B60C098CC0F8D34FF1DC6C5A4836C028B2295A4D8281278264283A9 +ABE23AC0A2EC42562FFD6F5FAFA72C8A029F333C26D8CC5B972073019BFB320A +966156DEF26E9AE303FB4E20EEC86A48468755EB228C5BDAB00714F96797F5D7 +E099755C8F80F0E3331B038527D5743345DDB65784D8234292AEB642C74D95AB +8927727F73AF12F8B189BDA6BE8BE6A08333ED0E2F6F95CE8367174E0280565A +97E1F70518E142D658D2335C2FF8C7C401322D6405D0964966EAC8341F34BB5D +1C654BD9D3489E6F730BB646EDE9F8607F401C5DD1B310D7D422703F305ADDE4 +BC45DD88E798C4F4286B117962E210BB9EFDC968BEE0A9C3EB6B35D1C2E8E50F +9B9A8D965B63255791A17BF7E7596DDB15B617B98A8E838DE92775EE9338421C +9A4C9BF5B8E78E475E814EB117719239075BA70DC806DCEF05ACC948AEB8378F +DBAFC9D998270678435EE7F8E262C2341B173AEE3F9A2EBC2C74CB158BE302D7 +A4FE57E744271A24F3714DF24DDC103687754CFC72ADDED342B5FD5CF9D13D98 +1A13712D09148EF593050E8099035C6B9AE8CFD59948E786E3EC4E1F426FA3A7 +9082E10E79CE44C2D9FA830113503944F8D23CDB9C27A3570907FEAEF76D3ED7 +C8E1F81DA7A51CF5B723F0E4C42E3ECAC298B3E1ACB9679A1250633C373805E5 +C9496CF87FA7A858656D4A663D3EE3218D9792CF705C361994B69461026D8CCC +130FB9D34293701A137E393F5AE79DE677D13DF5AE9EDDC545496A8C5456A860 +B36397BCC78EF754B6965D22004B978B4A55409F73C44B9FF02801D524740B9C +E4F45750CD7E45235F376CC2CDCD3BC1B8C7658F52A5EB185EFDB6A0884FF0AF +1958FAA5FDF4595D6EDFE28FB5249A40BDE8BA11AB0E997E9876CA0A0CD05A5B +A26F60316F61DBF6E65F43089BDA2D57F00EC72BA3666952E730B14C79FFADB5 +7448ACE6463BD29995D6F6F571BF3D0B426897E457BD30FE76D6CDD6151A94D3 +3D53801608A7E865A01A2FF3D915CAC2614DFDA0A931E009FD1CB63FCEFD0A3D +B26711BE84286E389805941573E02841C8E653FD3131316E768E2D096E5BA648 +9F03F9825333B2DAC376A79850AC29CEABC8BB1E7D4E34F37D6E9F388124A9E1 +9981131FE0F6718FFC580E678C9D8C1AED790D0C0D78407050D5FF315E605C73 +A16D6868E5DE5E8C1F63A88E159CC44DC0BB3E5CEC35CCBB7493975DC55F52BB +A33709E5AE3066894885728EE784142B492056EF876521DA69BE39FF4E2BB95E +C60688678B37692CD40A8BCD585240B0AA809328CEC0F954F0D50DA10DF61A21 +EADE286E22F67227CA286D9A0512EC909DC28518994C6D6E207D4D00514B0EF9 +5DCDA5965D827642072E6DB4B23D1F6C3250081B4D8E66084AEFD663C5F26E7C +E19A4F3C9A100FC4AADA76F9E4AD474D033819801F7444B51203366CC709AD98 +F62722F700E13DB42D80041014AFCA8D12B23B85BB2302AB944C437FE0FAADF3 +E86291BA50463C32C29FC7D8E4B5EFED49EC40947016D0846AC79E3776E62388 +372568D2AD0DAADAFECEFBC4F7E6A8B47C214A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMSY6 +%!PS-AdobeFont-1.1: CMSY6 1.0 +%%CreationDate: 1991 Aug 15 07:21:34 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY6) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /CMSY6 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 13 /circlecopyrt put +readonly def +/FontBBox{-4 -948 1329 786}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 +7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 +A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 +E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A +221A37D9A807DD01161779DDE7D5FC1B2109839E5B52DFB7605D7BA557CC35D6 +49F6EB651B83771034BA0C39DB8D426A24543EF4529E2D939125B5157482688E +9045C2242F4AFA4C489D975C029177CD6497EACD181FF151A45F521A4C4043C2 +1F3E76EF5B3291A941583E27DFC68B9211105827590393ABFB8AA4D1623D1761 +6AC0DF1D3154B0277BE821712BE7B33385E7A4105E8F3370F981B8FE9E3CF3E0 +007B8C9F2D934F24D591C330487DDF179CECEC5258C47E4B32538F948AB00673 +F9D549C971B0822056B339600FC1E3A5E51844CC8A75B857F15E7276260ED115 +C5FD550F53CE5583743B50B0F9B7C4F836DEF7499F439A6EBE9BF559D2EE0571 +CE54AEC461D354A32E69F39DD0C017BD6576F1E9500DC0328E8AF6EAB528FD7B +85132A2A9995EB211FCE849216BF6D663AD649AE92DA953C4D520AB9A22D27B5 +6C34121FD688F9E17FE39B939D8DCED9EDDE5AF6DD7DC2297F2A3E1287E5AF45 +0306EDBA3C843FB8234D0DDEC7595CDE6657E499324DA260BACAE9D6DB126FD9 +AAA7368F7164F6BBBBE11EFFFB65660DA0961A97D51ADAF2136A085FDC16C199 +72BC2CA210B330C03F4252A275FEAADC95CFBC79C3B7285C4C7B5C9665909A56 +4176C37DCB569C8EED1B59C58B5EBD3ADD31010DCFD59411FC2020E238A07B83 +2439DEB653AFF1CF197533724E45EDA9810B6793E27943CF51484A5BC7DC61C5 +E97F71E04BB623E0BC9C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR6 +%!PS-AdobeFont-1.1: CMR6 1.0 +%%CreationDate: 1991 Aug 20 16:39:02 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR6) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR6 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 53 /five put +dup 54 /six put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 73 /I put +dup 77 /M put +dup 78 /N put +dup 80 /P put +dup 83 /S put +dup 85 /U put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 121 /y put +readonly def +/FontBBox{-20 -250 1193 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C +68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 +3645B82392D5CAE11A7CB49D7E2E82DCD485CBA17D1AFFF95F4224CF7ECEE45C +BFB7C8C77C22A01C345078D28D3ECBF804CDC2FE5025FA0D05CCC5EFC0C4F87E +CBED13DDDF8F34E404F471C6DD2E43331D73E89BBC71E7BF889F6293793FEF5A +C9DD3792F032E37A364C70914843F7AA314413D022AE3238730B420A7E9D0CF5 +D0E24F501451F9CDECE10AF7E14FF15C4F12F3FCA47DD9CD3C7AEA8D1551017D +23131C09ED104C052054520268A4FA3C6338BA6CF14C3DE3BAF2EA35296EE3D8 +D6496277E11DFF6076FE64C8A8C3419FA774473D63223FFA41CBAE609C3D976B +93DFB4079ADC7C4EF07303F93808DDA9F651F61BCCF79555059A44CBAF84A711 +6D98083CEF58230D54AD486C74C4A257FC703ACF918219D0A597A5F680B606E4 +EF94ADF8BF91A5096A806DB64EC96636A98397D22A74932EB7346A9C4B5EE953 +CB3C80AA634BFC28AA938C704BDA8DC4D13551CCFE2B2784BE8BF54502EBA9AF +D49B79237B9C56310550BC30E9108BB06EAC755D6AA4E688EFE2A0AAB17F20FE +00CD0BFF1B9CB6BDA0FA3A29A3117388B6686657A150CE6421FD5D420F4F7FB5 +B0DAA1BA19D638676E9CF159AC7325EF17B9F74E082BEF75E10A31C7011C0FFA +99B797CE549B5C45238DD0FADD6B99D233AC69282DF0D91EA2DBD08CE0083904 +A6D968D5AE3BD159D01BDFF42D16111BC0A517C66B43972080D9DD4F3B9AE7FB +11B035CE715C1218B2D779761D8D7E9DEBE277531BD58F313EBD27E33BEF9DC5 +50C7821A8BBC3B9FDF899D7EAA0B94493B97AFEAC503EB5ED7A7AB600A22D03B +86A088CED7AE528182D2EBF4D351FD835B5DAB2036F44604002D0E21510DDCEA +F8DD36174C2CFEBAE2D183407AAC7D4D52D51D5B2890CD3B23A88228089D26BD +6E7ED4B31A60C45C7D8C00274A812ECF682228F241C13C41497BEAE1DB58C3B8 +3EED1B4F48D1A4706D71EB098C4FD67CC7890957724C12067CA54A2140855928 +E6197231734CB46E3EF820A1C19A6AE55A2547EDAA9994B59311C2D02BAF4950 +2A8739E2E60A1490884101F56392D67FBCB271783118B2568E2DD484465B899A +8312F466470B4A490266852CA56F7F56991A746CCD5A365EAFD700D47D11860E +2E2B21C90AA8B3F9915F81F0E2C2DF98D942F3CEA2300F2B9F6BC99FE21F2966 +AA932F222C35EECC2520F10C110D6FF9A32EF56A812D3760B54B451C79D6FE5F +3F93D3E5F9E4D56096A92B9E953F160551BB6FE26206D6A317219222AA58FE76 +6C758416537175D1F7DDA512DAE5A4794216C90B561F6C29C44FAAA5EB719F20 +43333A0605C0A095D8AAC862DE53BFE3EA97A756193E9E74E7604AB5EEFC1E7C +00888CF0F286073143ABD034A1BD66E81E588FF34930DA0421D01B48A71EF115 +BD68ECA6C15DB673CF17821A79484DA091B0FD42820B35ACBCC4E2873C3B4950 +F76EFCE8F0A80EAE5086450D76847F299FFEFAFB731C72B63DE42CDB342B1691 +0CAF1AD419B1B3102894D78C3ADE69C39ACD063566B0118C0E127D4A7C013D93 +C3F3A8D55B3A6BCFA37FC6796CB40EA156958F27435A2832A5FE55A08B76E258 +9440C4741B30E211BD4216DF1EDEE02D168A398B6769F8D165B7D7225D278BA8 +994DDDE391F57EB890156023E6E3D56E22843F3DCC582F7E6C571EF2BB436631 +A7E7738ADDAE7A0433C43A8A3B90AD8952E976F348973F79797E5B68469542DE +D610798FAFF13B24AFA2574BF898DBD661417C41BD0FB6D448CE99BFABB91117 +E8CDCADFAD71D882E51DF28B7D04624615C826CBFA745CD903E2303337AAA886 +DF481C65C7D914DE22A026BA75D232481DC320B89A9A2F6DA1D9E54C48CDCDF3 +F657A66DFEEA1FEB0E98A71666F115BAC1286D5E0273BE8A67ECEDAA1BFA4921 +E96E67138F28919D708719107D48D8F0C4E4DDBDFE6DEC21C27F260DF7A46327 +D924F8918E2F0837760BEC3666C7D5D60A9F2A7EB0DFAECA1AE4A79C15CEBDA9 +7592B665DFC923D1C6ECB7A3444016A1F9760493BA1D71232BF2576DB84CF966 +7A7466A55FDF764D4BD7810541055B989E8A8189ACA63014CF403E3926C4F455 +81E25361FE1339777B597EFF1CD63F007EE735B9049315DE035415170248B359 +EF4A0BD6960E23D3318A59E11190AFF749ECEBC81B0D3E26795B6369309ABA76 +C1E2EA4EC1DB3065E4618BFDE7729263920EFE5236EA355BC30C95C62718EDDC +69C3824B6A450B37974FE23553D0E1ECA572155E53DFCAD1E4F7C40FCCEB42F0 +8A41A4F516B5937D75FBB86BF290BB6548FF327853DC5A25D002A381A13DBAE8 +6CFD76979CBD26A4F4D97A791BC1E65AC1B34F43AA12D9F5E66E85E368AC33DA +2626EE4E399623D6449037D555E35E0A22E4AABC91B360D7A961FD335E37FAD1 +46DB866561D431B05A65BE91077FEBAD52EA5587D5DB86CBD753EB270B4AFDA6 +68C0F1232BDBC07B5D7E2B58AD4FCE8D004149EA212653A83BCA85A1BC8E5AD7 +D15D165521AB6377FA20A09413403C79B1266F49D983AD0BC50AB766F1CEC782 +4609F22694540DBCF5FD113626C89BDCAA59F4905D07BABD08BA49F976C0A79F +94A77AD26783AA9BC47B8A11CAA11090D09A88BA948844A45BCEDD3CDE0EF114 +2E16ABAC0D90E7B7345C04B53577218009E67C7B7010AD8DB0FF1073DE31C770 +670C6619622031490EA2A2D1A9FB80DD21A5ACC526C2BF0D999651B8E22A28FD +47B4708B288F5BED8E5DFBE57FB3FB33F00657B8544CDF6CAFE1A3BBDA9F2296 +3C5BEC4351412CCB9AB6F450188D307B9AC70CA7D9DD184414833868B27BCF62 +C8CDDF23A7D796D0A1F8155E66EC9D7B35BF0FBE185103A37EC12981EADBD16D +70CDB2D685FC168F08AE39F375739ADFC915A63C6A7246D164A12569155B956D +A7A5795A6EA9D4FDB0AFE54C63CBC01D5C338B68DAC3D23B110527B91BC0527A +30D7E8B7DB2A6CA19B7C71D78D71C41AE0557E0A9CF2F3285F53CEF69DC3C91A +B3EE632FC1416B4B36CD2FDB8BAE850FAC5E9E0B7B57534A8D86948074AB123B +B39EBA873F819AA42D36D4E07E2507EDBB3144337A743FB436545938E4DEABF7 +03EF9E9752B4DF79396023282325AC3AD52F42430A97C54287C94C3C910D025E +B6C40DC9A11D864614393CE973DE186B99F4B3C0F33CA18E1D30F8E8EA70223A +36853FEC29C0F96B59A6F59C0A33712B7053001FD554D23D0FF848FEB3C7EC9F +7455645E42209FD5B8CC08A4A882E34275F6EEC5B16E7A7DE6C9D8941EB6BB46 +ABA35AA067E0439AFFF7DF7A660D66C8503BF35EC83C32270E04512FFA90618F +6825695BB8ED9F97C4FA706BB84B66A9BB210628EBE19ADB36D679CF9E7B3BFA +4D4764BBB31682A14FD537266E2CE1F4640131D324382542FF8B8CD9BB108B69 +6655FE8FCFB277A88C58A7E2AFAC9B740D840EDF1DFC50747CD3EA1DC24B050F +B12404954E42E14DB6092B38F32CBAB9546A9784BFF7FB16FC0F3D2875A35A16 +75EEEA82FDD3DE0BAFF2C26BD37D229CA06A002529D27EAB41E20818ADFBBB5F +0AAA37BB95CAD96A3F700C2E5B7DD988E89049051077CBDC2DDA592E2B99C090 +53C7D459D85A72B01880F10F9919777AAC2A3133B8A7CC5926ACB6C87B0552BE +D310D8E86E5F4B142850D45664F2CB087C0E7546DA66214DE18E67D1BF098A30 +137068F9E9735933B96B4242E805B0D4E58FC9EDE7330D4217C9315BF6317608 +ECEE1BFED5BE0CBCDBE36119465AF20A6D7A3244652112A1E602C358D5271595 +213FC19C6562678CA6B38A817C0E7CD65FE588A1D9307FACB838C6F5461C0ED0 +888437043743899769E94B7EFD49B022E3A663EB0A00479B5C291937407B52DB +36E71F524C1C6F4A91BB99E1A824A25C3917DDD42FC2F9DF16BB14C4D28CFFA3 +BBA2BD381C27AD1885F7DECA566B15C763B3B4B3F3EAF3806275D8600FBE4B42 +D1FEBC74147DB1CF64549C9C7DBEED10F44F4D585371BBA5357ACE0BF864231A +436FEC2C90C94ED01324D5946B89CC05C087CEB96AF03E350BDF44683BDD566F +0B2C48C4041411EF91A57119C9ADB0F2523477F46F72FEA57ADBB2AC25D3135F +4F0BD460DC6D8E29830341C64BAB91275E9CA08B713955A5D344EDAEF871DCC1 +B50F30858C3C3666597B73A752E93DF128546D1A1812C5B916AE1F44CB36DBC5 +A26B5C3ECFE3A3E2A013B5BAD5722A8943BD678F651528ED340EBBF59FE47E0F +D7BC565E44C38FF7697C3F1569C241D339EBC685E7C4D7BBD318B74E6AAFC97C +49EECA3B147E485F1F2475AE983A18395063BFDE981F51E6A2CDBF1906E499CE +6C6403DBD85E65E44839011D7E3F62B7504A9CFBF6A5D3C9AFD6BA64E636D7AA +E43BD83ED14C6EFB36A5233A5D795622583AFAA09000C8557848705231B6ED8E +5E3FA79173C172763C70AD176F4F3DB0054F144F661F9F028B596107DDA43168 +11B6A56CE4D375EB9F3DACC6EC06F632CAD1D994217FA7DA1C56F681FE7CD0AC +6CA60BCD21FF4950D20D4A3F11E0662BC1D3CBD8AFE2DFF3DA1C609E0B337B88 +87B6FC6E735DDEFC00C491916F69D0478BA2C346608AECD337AA80031A269380 +45E450ED7BEAADFCBED412595BAC771ED3C1BFA4459A6278EA1F00CF89C9EBDB +0A43F9CDF70A0AF808CB329CE9907FD5B36C3AF5D1C475AC99A6D6F22596CD42 +1CB7B14123D38D8FD9109438D9F49EC8AF29176204C0A776C60009AA148697B7 +F5496C6FA123F9ADAC59400E139A0B886E110425839B747241A0FD2DCA8621E4 +AC3B71FFB6FF1BD4FC5DF726DA5F383D573640774EC6327F772290930F2656C3 +3D3B1FD3F6B321E0919720F03F3C6EC09D05629549549CAF621EF916071CB6F1 +22625657C27985471E16B21714100F8B80A2C4035C5905C54FF95AB7358117C0 +DE70C0FDA8187FA316189D13A9176C1171A318A81D6A77F0E54D6DE37E5D81C2 +5BF1C7EFFEB8D130DDEA4250C4FF4F1BD1B535A20C3FEF972323F114A9FE90D8 +48162CD532AA3423FDA9AB00AD6754C8216253CE936DAD6AED5BAFAA64921186 +E217F709A73D6083A8D04F11FFF49D2D8AD5A55415043A8EFB32A478B9D70F95 +D9E63A92B53EFAABD9BE62461FEAA541F5CA67FC137E3AAEECB5BE50FF74DAB4 +18BAAE0A7244F072B33F3AF7474EBC681DDB09F4A11663EDA56268CEE9E653D7 +4C068E233BD3F142653DCAEB01E2825AFD6ACC54659F66B21AEE64F66727F033 +B3D7D17C051B17B4BF41DAC5D8FCAB88A36DEB62BCB5D248854EEB8A9EB2672A +391013A66539BDAAD4189563B45C2FB57EBB9B02BA6845FE2E7D66CED6098014 +2831ED864C366FD3D2A36D9823E84C686D401BF9F01B71CB9864AE245E34D554 +4DE79FEE3B5C74846967D0512CC9FC103DCA3DF48D0D491E70C8A102AB9A92AD +E868509AEC8134C6587B505139FC438FA994819CD17F108C754DF744F31B0731 +E07BB4F12389EA058127E75F5AC024595CD8477F5FEC80AE9EF2109D0FF15326 +808FC436888B98938234E93EBFB0BB009F8FACC9D0BC0058E37040CED69EDA45 +D08942E834665C0595737BD2C4B18CEF53BE576C03427D0EBD25D335ACCB2473 +63B2FC3FF036BEF8DE2CAA9308E089C591C331DE41017E36914FBC5426358701 +151572CE393FABA2C55D67E7CDC90C78CC6D58C3C6DF6524E5A9804D0D9A0E3B +DE85F7D0057D2ADBB04FC0077E0080DB404726A8AF5029FAFC05589D835F9ABF +ABAB4C3B3F66384368D4A2B6B3D6C1EC0FB4121C59D1C5C50CE8E65E988D06AD +7D03BDC5B095F3BB54A1E4E7DE57601A28BDF6D1C8A26268FE2A8B510CC62B10 +A2F69EF9E8A766BE982C9D791B42C10502F3BE4516D103DE941633F021DDC99E +4C6BB01CAFD7B886E677897C775485878943292F8592C4DED879058D96EF9F10 +B89C8BFB5567EB7D53B13F1C9893A60D22246DE121C993E9EA563EF972E433BD +DA1119607CEC7C89145164BBF82194A31932BFA6EA40A2466EF148E9EF09209B +973714C0DADAD79BC4DC8F767D948AA227F9A12F46262ADC3FC80BD464EB3750 +51CDE98239A728AFBA32DFCDF0E04F1364399121FBA23EA9660E71F1BD2BF976 +F6DB04FE31B3D89112C8EACEC00D8BC0834D63025580AA2A77588FEF5F95BE78 +7AB5A9BBD218B94A7D7E14AE6FC65A615D39058DE4644A126ED9AA1EA03B0A90 +9B8162D84A883D5BA85B83BE8E7EE7B3EFB9F50ACFBFDE4178C4D12D6054A046 +7CC57C142E055B9B822422C9F6E3F2323278AD2299BF211302CAD720BD980980 +4D4EBA8BCE79BC6613EB227A233BF4E0C5B73FD1C424689FECC8949C19E581B5 +9B4534060BB017C315E46E102F9C54830C11CF867846427AFF0293B6EF11970F +A5E75BB89A8937512FAE083F1BA63BECF2B5ADCF9618F092F461096C565B55B8 +714F9AEAB4F76920A80BB74538CAE55A617C3B265F64E1B1EB19D96DEE120581 +7FDB28B9823C6F5241ED566AA02650CEEA40E6E1A2C6DB55590C5B5572D8F57B +6AEB288D7869B6A7A50B27E496905CE770852E9BE460CD2D1C723FC7236F92DD +727B27FAF82E9E7F32BADB7911ED3C6525D913BFA333EBDC18573F1441624892 +EB53FDBB6A945B38FC9C376C3D534127720420E20DF513EF381E2B6B5D5E5C23 +83412BD67435CD6BCE407B8FDFCE4F0A0C35E5DF9DDBB2D1D5D7CB2A45D886DD +58F908A07FC48C245DC31F28D30FFAD477A1D1AC593FFE8086D05B285C700996 +2CB06125A817D4850B6D3DD246D671554AC1F513932BFACF92A15B75F87DB140 +F5225D5B066A913E6E3631F160CF60F54709FA0DECEBF1BB203F4D902B4351EA +6369E4872617A98DDA8BFD29E8933D201A09149077EC934C0B082B92244DBBA5 +0E70943FE5E1E8823E0620C857D8A3CE3F857FA05A0DE16D7673E9CF27C847A7 +C8A8DC1F7B8E80A652C47C0AD748A60D76724354AE6D98D37E164B8DF1AA36C3 +04975386BD0C356DE67AF3AF9A2A7C5AB957994A588CD1BF864C64C2D00F8D07 +CCD30A5BEED0371BD23A4622BA3B8EFC35FF8A552E770FB899BFDD7A924F228B +95B56FDDF795C0D469B399FD0DDC140CDCB61C6A6E30561CA594D7A7A0E86CE6 +B8B4A04D3651CEAF4D11F86CC71A66DA5D66555E27B1D3503E92E368352A0501 +FD045A7D79716CA26C601CA2888B9E57DED1163C821C10EAFE81CF0461A92413 +BB96D2CBD385D17430F3DD50B260F58DB83423E826B9F55FE96ADC290621D17C +8E4BD1A39007D3EFFB5EC104D2FFC18DF08E16753C26836752BCA0F190882433 +00D86B38E658215741C887494D161A56FDEC75FD5C4E3802318C3D2B72987F3C +2DD3B75F669F2808F2A9C0880852A4A6236FE8A4AA4FFF753FB8E0403A9926F2 +73A342837512D46102279CC3B105A959516C9CD4FF86C704BD81A2DB5FC1BA55 +4798041822419EE5B201F48A1C182EEB9530D6205677136F81D3D911C98FB220 +C04E1532CBB717A68A5AE74FC5F6ACCFFE1ADBF194551F4E9E8C481C32345FDD +4615B1EF62FB11C900DF204485616A9D37EA2B41E81EB1854570A07B76C7A064 +2C897C81FF81F703AD989D304CF7AD99F9B900681C935A9FD79C0188B3E2B50F +19B15C3D95D0319406F917A31676DB06839E0180EB5AF09ACB81A4493CEF52FE +F606841668FF02BBA4492216D789B6A3C4D9C3FA1310305E9878D7457D7791E2 +4F4749102F501AFF64C3EAF5A90B7B85DF090316D74ACAC512B040C19BBC61CC +2534597944221052369729EDFF43EDAB917F2117353A8E76A6ED790FAEFD58CD +7B0F694B156BDCDA89DDF6DCF2B47B71CCC037111432C562AF9C6B6CA1D1BA78 +FCD24F49127731799F7A0C29786E2DAFBE0A24DBFBAE0E9A0DCD44E4649DCB7D +2916659DB0C65232B5CDCB015827F31A5530489B79A6BB45D68E19E3ED13D3B5 +31DC8454C68CF35E3E8FD307CB301884BDC0A03EDC4F08D4142E20494C59F6EA +8CE8046D29869C7DDCA98EC906411C57957D1C8FC5404434250881714434B1A4 +5E368208D33D37066855A8BA7318DBEAABC15A83F2E1E50362142A67E443CF03 +E31904E3AC02993022789C3A1638A2056A0D94EC8D64E2A13CED8014C4F4FA51 +8F54801B2BDE7F9F2D0F656A09EB713E8A97793DC5E7F7005241AC5D45BF297E +429C0CB733F1B86A28AE15CB627C98548AA0DFC81E7F62817989E325324AF65E +C44FB6A9E42A270D789463D125EEEAFDA57DFD09C94F1354D5FB7B10D8F9F47E +B6F581CFB243A6B634647EB496F2884CF4DEA98503F4EE906A38173D2A6BDADC +A21B3C206B15BC842DC7FFB7022AF0F963177F310E971319B9DD3BCE508D4B92 +AB9B051FDB2851502D383EE103C4B0B232E32642E305838BD2D3936387816961 +762185C7152062F990585E9055F94BDBF7BCF46EE1E5D30558BCCB4C996F27B9 +05F40807866C255B81A55D0739041B5275A66F58FC149778AF1D2D90BD83397A +33AAE594FF0A34FE74F524FEB43A223F8E29D7ACEB1E8838EB0AEE7A5AA401CC +9D93AA03026E0879E9B7C7BB3FED71492BDDBB28EEE6860FC9E453B0A73982DD +7AEA950B45736DB924A67B8E88945C2FD9CD01AEAABDFA43D12083AF7D4EB987 +FCD27CA7EDE61E5707AB481BC4B566887884C33C89A2D0B234D6135BBE98ADD7 +90BB22D3BCF19B4C69FAAF0F7946A8E3ACE5C933E2AB65511E861E3C5F9428B7 +B6B61DE712F224237AC705913D0C15E717D00F1913ACF411528D7A0BA81ECC2C +EE9C5A09F0414B01AA880EAF1776C3C4C965FDA4FF258C2C10ED0C0F894F67DC +1EC0876ED390CE114D4635F1F7837381CC94F52F4DA12FB9C700B94D75E282BA +C68B284F09331DCA78387C2F262FFC436FFE0B62F304CBC8BA5C287736ED17EB +7ACE389AC473AD84A72438FD57D3F8BC75E058F0ABCB016BE01ABC26E1F2EAF1 +406809EE7F30883E006C5D62FE0D92AF0FF209B881537F7B5A34443B9A94A6D4 +4C6749230716E53A28B429458A485D1C1530527C869EAC3DB8E0928515CA5370 +83D760905152AE563F58CD82D46F80BBD9D6CA797FC8720CBE190D7264D4C754 +4590D83891A2A01C4D43AE46AECFB938899BBFDD5A0719AB0B51BD705B33446F +24DCFD6C9D7CEC05CBC7084CFC316B0370E9F9C5F3808822C8D29CF927C76BDC +E6C31B044951C7F455686689CF06E8138A7B19B7CE1DFDE3343136DE9287DF1E +81778DDC3BCEF0D6DA8DBD4D56D3E06FD6AE0B51EABDB7B52024636DDC0A2396 +D34630D3E3F47889DB84CBEFB6270B85E448E02F6E81A338AE0230551D629FF4 +94A5859462DCEBE89BA8E57E107F6AC587F79CF8B427C493A5C14AF7BB045176 +A9FEE5E34663AB3AF9A8CF714DD1DD50E18889D04110634B15674D68601C4ED3 +BC8B95B927E5B2E16880E1BC5CE1FE385A2D416973B52C1A2FE4332E964074E2 +94A69FC4946F579CCBC12BD381A80B5F2B1C662CB98138B58EBB93BCA99564B0 +98CF2EB381B04F005343633B163C4DDE8A98500B447D2BEB878AFE8982510794 +D276A4A6DF3D36B0ECF8CFE7D3ED4B364B08AF5012B5AD4BA29FF5886BDF1BB0 +72378D823C1929FB02BF7C9E41B483EE3D18817B056E8FA98FB9863D79EAB517 +54BECBF7579400AC5DF7EDE80E202AF75E66C48257A50390A9784BD6077C8FDB +CBE3D17F8BAD802E97087A8353D3412C24B0F886AFF91D101A5833CDADF898B6 +DE548E996DAFF04D6CF8668A5CFCE8400C2737D0124A97083CC808CB80B24BD5 +0162448072D97FCD1FACC4146559DFFFA11BDDE0E2698D92A9733C10BFD23E38 +73151FA9C0D030872CFA02208A31647E1A7DD2C182044D90F90D48A9C4C422A0 +FB5A3A88331168A296EEDFAA02AEAEBFCA1A698BF8A01F109EF2FB767B4F679D +6A39AFF1972E93364E5FC5E52CCB76B06560A8FCEFEA58BE9893F9B20ED2CDA0 +F0A2EFF2C9142A50B73A1EB3547C2B7954BFA47C590FC35260C75BA557A36AD8 +18CBBC03CC65C597F432FA0F0F27DB31EEE7F754781BFCD4EFF6570BE397BFFC +35A7C0443A8172ED4FCB128DAA55D7A0AC14F9FFF97A43538C005ED8A1FB1760 +8D01F3440420FFFDEE149F036E278E481C35007888431CA712097362CFA27134 +36FCB600FD4C4541659571FC17B8136CF3860E2A41177C4E0B6B5E39B51ABC5D +5B5D6D732DD3D122B956D4B4328F15252762249F5D50EE7E37FBBFCFE28B12ED +48285FF811045768B7893A838F0E02536912157475D473DBB14CB666A00B400C +276DB1129A8D68681CED61F7E21C5761AE13FC383F55BB6FF75579CC533AB682 +E2811BC342AD6E899EBB2B16632CCEDE09B05F9DEBD65591D8CE0B6EF0FEC4DA +10A55429C85B679511962DB373C41EFAC813C0674DA0C2B02BFD0DC1CF82E26E +15BD338FC3236CA8DA4FB3437442EFC077549ED51208497C6B074DFB6D386333 +C0DA4772232A367AC13665201336B291E8F08BB7B30F88A3959B21C0303EAC16 +BF5BA8B4F051B58028544D56A13B171BC76F3854974A0632E262C2B90763593C +D85BA7A24030561D968C05E641F3A72EB769B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMBX8 +%!PS-AdobeFont-1.1: CMBX8 1.0 +%%CreationDate: 1991 Aug 20 16:36:07 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX8) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMBX8 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +readonly def +/FontBBox{-59 -250 1235 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F05C11F9A72F5DA508C30BC4BF52C8B1EC5FB +7F9DDDD0964A6D59193A389D490DAA6F6ACD02CF71C06802F3AE5A001F2B3A6D +EEB60E9DD26DBCE1D29C825A9BEFE3A6572E70DC7B60344C3E0C9C77ABE1804C +7ED61C544F0B4A3D6C7662DE8575C07BED3F6DBA7D64A9C8613AA152B74A140E +AAD9B66E0FAEED6AF9D1820F361C1269A5E90519A3E6D40782E06778C0AFAA30 +E8CEAB87054C4D156C1B14B4E8471D78648FDAC70A3B8ED474FA356393A77420 +4211F60E397D2FEFC6A8D91A80C84EB9E38E663249FB91D5C8A5CBA68BA04272 +5D5D42497E1CF5CA1E62EC2B139F5CD4D6318EBBA7AE28614D2D88709C2A3762 +611524B8A1FFC7B0FCBAF77AD8159C354F4887DB1A27781DE0A4BA7DF2CE2025 +D9278CED48584E8E6BDF30BFD24284BA1DF828B637BF84A02908BBCED67372C9 +EF44711BC2B1DA343C8D9D27A9745525C774F5D639B7AEC197CEEDD06FD27923 +35ED0D402AEEB51134665A47847429D91CF419CA9B09DC905F610F8DFC54E606 +ADCDA19D5CC68A7BC7108EC9236C64205B23CE68B9BC38EF3E5BF9E0E6ADF404 +7365C8D0436609438C82EEB2F356F79186DDF6C1C797D3C278108B1767D15178 +C4C3E8ADC2482BAB9536AE8419E5CF3EE1B6E53BDCE2A83E2E485F496A562C10 +B3F5A131BB19D1E5414C86C5F995521076340536E10613E42779FA15EFDB451F +53495CE8EFF239E4EC442E1439594549D45F5276F93D496C9AC712D762D0B702 +E894290BA028837304AFDDD8BAA6564E9DC307A14A7A206550FADDC7784DE3BF +3390188BBCDDD929C82B1D7B529553BA75ACF5B385D31EE3902D96B2B5DDFFF1 +9F0F90FD791E54128C1717F313486896868A34FAFF22E23CEF046D02C140CCD4 +9730CDEA373A7CAC4D69E3ED60590B4CF83F26EB66896E706DFAB81296288E1C +41CE859B3767F0AD86413F8EA2E72110FC52BF6804ED797C3B31CFEDB482B58B +39C27F22547956219CFA5F19855B8FBEF0272DACD598ED59993377D76FCE9551 +285694FC4109E112FB3B531145321D33201949D2B68213B0E7F96F20BBFDE3CC +992AADBF0DF7DE6B75436DE2D0BF13D8BC7535804A71D4544E98B9E203D5388A +89BB181750CEAD2FACB627BC6107EE1C9C2860E491AB54D40769F9822C77E830 +5F20BFCE14A539F27C0BEEA7B6F11FEA0FDA7B542C0C84F8FE811F0BB6EE47F7 +ED10C4FA171225FAE1E92DC79B62605BF720FB79F2B59B925D1B1BB08A2FE6D4 +6A888653F496E5199172B81D32FD04ED21EEEEE08CED51C87F22208FA48C8F70 +18573E3D31B1664D932578C1D24535B2FBA5B1628C3FFAADB4B29A481E754D4B +CB5BBE2AC2393AB94393C640E6429D99F55DC15761194DADA1C56B216EE4BB60 +1D106EF3DCC9D02631376C3448A47EEC7522AD087C4DADA713B72552E2B9627A +1FA7FABCEB12B5CC3C2789CA9351D3EB78DD73CD6442DD2122BAFDACD317747F +588DB4DB7E7FA894A13C7CBE2665D2F4E668BA4D5976832F8BBACC2F4EB6E00A +805AB5BFB52D402C1A5F607016CCA00602D2BDCF4953B503D5FBCD1F8CCD4930 +0212BCF99C3BF4D2055407A962FF2D451843A96BDB812D7EB7AEA8FC5B020ABF +312D8E98A261902F2085F5546BAD83F189615BBC3D431D43841C70016320E050 +33D0DD9FB670F25F3A47C818EE9D173209A95AF350AE5114D2B5B1F4A526BBF8 +951DC1B9994E77234A8106D74DE3F3CFCACAF4FF5B6608145C731A80E9C05A97 +6F118480BF5895FEDB8606E6B00409ADBD6D60C39A4A30CB9B5AE46508095FF2 +2E5E0BE6CC724DD66014BEC91FAA107F8AF7AC5986C1488995117DBA4616E335 +646BF32CB244FE26073330BCDBA19C29AEA59576F4141AFAEB3326FCD5304C62 +6E81506BB2AF943D196A033B89BC0E00BDE0863C05ACA121CB8777355FBF122E +80B452FEFEE07B3678DC1AA93B3F6975CF4EC48049FEB6BE4ED39B01C5D3AB00 +E0984A4F61D7384FF3D94ABFACD1ADE899E982E11BC9A0E984874EC2DF8D233A +DC199301547833C5C33E64B08E72FC8A097092E054BEC04E4E59CEB8328A646A +C9275AE8D781125676F18FAF1BA2B88BB814CB7AF980817B67C967EE7A1221E6 +CD311A025F5F258E0A9710DF92B6CA1919B859D0BEF4B00F49DC632D9A82BC37 +A5475BB3C27D56FE647D72EB0B96FEF22A43A2FB28A49C8F49CFB68514318208 +CAEE1EED06021A7E5550EBBD8745BAEDBC5320C87285B6DD4D5AEA230E47DC94 +6B704162CD8EB7F95C2B1E1FCBB3BDC5EB90A3A7E6B28A084EDCD665C626E0BF +288A680B54A79CA47EE352C57B6393DC6742C5B99AC3043A23D6B1E131A89059 +1B1CE7BADEBB878CA5A93B0CE4D4A6433EEA505E3E85E0CDD299CDACFC1E3945 +9733039E66152DF405081E320FECB14DCA425411EF73DEA0C10A9FD032EEE891 +F24B6AC497E42A796A565BC545418C889510BC82994DB46D47B27960F3BDBCCE +1FE918F7437310468D9C1D4CFA08A23586B23F209CA5E1D5B9219F9146FD4A67 +272861D66B633C6115E0512EA33E99E5A2C9F786BCF687DE4D94EF7F781A849B +B5AB60B6E571F5510242BF41FA501EDEDED1E98632385821B6111E7C243F0F8F +394554D6F3E6B7CCE3904DF60006BC23971460A063161D8C7B188C00691CC2C6 +744BB48BBB19BF42C81787A6A60352C30631B9DDC6B25635D09190C72539F39F +D2A60792DCB4D6C9B0E89B118C83266E6E545DCB0B40E2655EA02E1399C7F1CA +076C97D6CBD3A89350CFDDD35AFEB9F5DC6180FD53C667540D462848D1B0A575 +114DAD87E1C280AD20030C8C29E93F0FC77465D473C26EF10B332F3D9EB16C84 +93B2F19701547BCBFC251E9B7AA540C2889BD38A17DB039BF9B0C10B1ABA41D2 +BF051BA690B962CE839E6F9C2AFC081031C1049FBBE87B4067A63515BFD1D7C5 +857F560A16B9F7999509D8D825872DAA36E44EA4F7D3CDA7488566D5713CFDF3 +4138C9A981045F83D83FD19EFC2D14CB163A590DF68AA7E5F59E05C7A6F26B46 +5786456B43EF57FB329C91530D503848EA324CE9F87747C2B1D0182CC61C28F5 +98847100F23192937A5B5E3327605FFAD1ED0395B2AA53A41C52E014D3C15E15 +0E91D9D963F377629B43BF71DC3090DB109A56ECF6C5C9EAB8C8C9A12CCCD471 +E6FC1030D7FF7D400AE435D5C333958896A4F6E57BC68321F6B1E6D7540586DB +5A4F495CA2266A45D940FAE1C55AC750D2C650AB0A770DBC7DA2BAD9F14EF411 +64058DDBB9C050317F53D46B59DF5A8D2B4AAEED48ABE87CD5396FE2E8FAEA86 +BAE4C009CD71165A2EAEB72D680F70D55A9B866AEDC2690643B9B1A59CC85862 +AE40CCF7CED2EA6CD30D4B3BD5BE48C547FF52A9FAD1CD75BB7F21BEFCCAE738 +709CCA12294AA1EBA6A89204A8400E25466167B6A8CDA5E87CE571CD841F53D6 +AC5C57D5DE83FFDA77A5AFF1246B1B6B0527864B348DFD44CBD8205CCBD8B5A3 +51D56D897CA483951D2EDA954DD164D4252CAADCA3E5E0539BE0B9DADE6972E6 +3ADF7572F855F4825DC5FC85FDBF7F3A63F914CB5580676DA8FCFB9FAB170CB5 +CEB586F231153E29D03E85BB16F36BE558A91D706DD07CD6A426ED3BE8E64CA4 +5B9AE4FCBEA5EBB41ABB853A208D06F1668111A4D936C9A967ACB9D8263CA679 +79511E31CE1964ABEF5B4786CDFAE5CAF695F52DD437880746244CF68E793C27 +35E12A0BEDFC4CFA874A1FE53CAC6BC262BEF051087A988DC6B612C6E923268F +7960CF416473761118D9B9FDB2F4A8D0454D2472272ACAC1CB4012EC52FA4903 +5A34C2B762B9702583795F9E046D096CC2CDF32BBFD0852233316DB914863AD3 +7B44CD88BEC7A3B3F0BDD1A199A172E318A62F5099BEDBFFB9F0A0074D9D6FD9 +072CC2D9899A31290CC098A77A18688164C6B86D60FD64D2F2B4FB89A7DF8272 +56740E85F27F11A4C429A438A6489A9E9BAADD235CA7E2478EAE998AE0A083C3 +30ECC6ACAAC3AA5053BE5780F5E082A56720143C3482A0DC91B0E1BE3AFE0327 +1FCD1A1F7BAB38E208747D8F465C5D3CB763B8EBB4691C20899F9618D8AD30E5 +166F8F0484E62116B22FEAAFCC9E337F2188F3B0E6967AA8364930E6B300903A +AD310F61A1D9E37E5E81A6789981D000419B8D27048C525A7FA22B1F96F4946E +70C9578B257B67888E28D2A2A1586A460842A32F2C264F7514BC3C6630A0DC1B +BF4E583D6302A09EEBE76DB3AC28CC9D7DC341D14C745CB4AD539047DF9A5B59 +06A3FFE21DF9CE5F12A8C603B91652D07A044476729451FD8ADD752E6DC28972 +70D69C4491E906F5B0FE2008EB0705FA5D98B3AC8C8E2419BF34E2F4741FD369 +D07228085B26F57BD5DBF28CC92608FD0E0731BBC304D6B00308FC3C068B225A +5E9EA26A18BC3EEE444D6C40C6ACC6B583A6F87DC5CE75F51C871FA18E0883D1 +4978C0D8F123A1BA73B66A268ABE134F62F9A3A60AADD56B9039F9DB87099429 +ABE357CC0ACE37D572AD946D0481F6207C2A3369E9470B5C2317A9ACF4B73414 +9EF59CC9F3716AC5D1E3F048BA6542F16331A71222E5ED686F7E28D63DECDDF9 +9ACAC3D605063AB18089D375A321B14941969ED7E35D9F9AE73CD825C6104E2C +334534442103B9451EBC3688722A20404251C003AD0BDF43411609A20FB1E600 +7F328DDB7AF1746FBDE127447E0FE50050E678E4DD1E79291F7D83CD07821AEE +5DD61EEBCEDF75F183437C9AA6417BE61E74F8FB2DB0A7C1891C80C5D04E592E +FF1095AE86EEBF40998EE452520DC0D79332F77A7F3838716836C9E64D9EC809 +555A8C7FD72F6B3C9F4A81FD4CD9E66D2856FAA087A59248DDFD33AADCA0D403 +990DA961A15068ED6A20538A564E1F891439660BCEFB21D1E205B546BF63C89F +F80C6716A2364C1222E4DE7DCAABC01329C3C335EE1C9C6003FECFFE0ADAC78E +3256339722CA93243C823566ACFD0DDE09E237B5256CE9F4ABF43DC5790648BA +111E032BDB926A263C45B30024D2AB93E2D214BFDC2DBC93B8D38B1A6229F6CB +74FF545158BD92BFDBAC7613968EAD2083BD7748A581C2E5BFCD38D6EB672038 +36364AA51FC4B3683A408EBF1ACC7DBA0FBDDE1D455C6E03017A688D4E580BF6 +D9D44CA668C778AF4204A578B9E04A74DF77E13F19CDA2733679FA237CF1DF5B +81C8256833369AD723B9826B8C87A6E1122A84EB49AB63CDE1B281756ED3AC70 +BF7FCDC06B9183DC625C57C547962811D7F0AD3E43B3EA65FDF3878B3A06BF45 +4075A761241AA220E3043790143C688E2CB33B716D77C2C9FB9C1948B5F61457 +B0A6079251472EB89672AC6C3DEFE3A0A512A9899FF79A366463CD3E4A5EBB33 +5BDCDF65F66DB23C5F4478FE98D3CE0FBED50FAD539D6597568033FBF26D49FF +FD339DD37DD0D6361A981B794BB4571B7211F145E033E71962DF5FD3DAC4ACB1 +72A15DFF9A26CEAD20BFAC76440FC3F770B83E45A8C8AD9833E685BF589FE9B0 +7C12A2B3B9A3EBEC71FBE7FE08AC4F73E716522763A151E70DEC10519FA96831 +9D3F87869FF731EA332A5A240FA36B49BF2E010F976C9792B9C984C42CCF8A0F +5F40ACF8735D0C87406BB3E2555C81236696EE69DAF4AF68908E912316758B60 +CD6D36B7DE897E595711831D8B456FFF483CFB58CEF8594510B45D24E0F06571 +A5C0C45E73706657C7A26C244AD7860E71E1B41D5276DEDE69FBE758B18B6BCB +147E166575CE65AF8AEE345FE1A6266F4A82BAAADA58A989B5D30ED7F992A2EC +8E92B256EBA63FC6AFF2A5368E9ECCEB5541DBAF23D287DF8027359D4FB4C692 +540E7BFA0B12FF6084966A6FAEE65455AEA90803C44EFD50EFA95F6E6E41583A +934C8D1E72D95F1F3BF78B2D4F3BCA05E79A5A8AF5D48732BE2533F5434F8C6A +413A90A1922D46B894CCF8CA366C4ED049142245BF77753B4ED19700E16518D3 +3254A6EF730704AC9EBDF9EECDCCACE4525A6DFA808DE4094383C2F74281EC73 +86E106A3EED8497A15B6966E4E00C9F46577DB1AB5F6A3C2DE0360EF4C140165 +968A3D36B10258E2866764D324D9ED6B377F3026A433F2D850103906A729608C +6230339BE659B3E6CDC5239994088AFD77452A173E33BC1963F0B845737A3040 +CBB1351E499CC6D02684C0E019A709BC0826173B340D815533324FE52E6C851E +D4C734EB3064D292B077DF7EC087CAE537D54F5CC85920492C5E0631AA13DB19 +F50ED934FBECD744C468C443C1AF9904739589A6362CDD7C359E1B5D8B3D409F +A0EC10FF5A64FEA3F8E5809E1C2BC6C1EC220216A4D21627CCFEC0CF7C923F9F +1F18FA6BF44FE990AEF8E3C731431D044F4E3DE561DE8BC272FA8E28A0655DE6 +597B68539CC1320EE0B2F2B33D4877ECA9AFF56D2F8A67F65A47DDBCDBFE8818 +219E9FD419F00CCA14C2A79B8E225D9919F552567ED66E867CB91DC2074DC442 +A8E29392B0F40D77CBC215B60217D2BAC703954074F2BC90EDBA6470AA0F4A9E +F2401222256B7CA2F6D18A085E687E6ACD5F2A37147C2D7FF6F0CC7B87DA3803 +B3157E9615F61B4792C3DBF7A44139203C2B9B1398C72A2255BD5D8803780F0C +D2CCA4E7848F0E02C63C35E859B80B5B2953A9E68C221841EE10B1B0098BBBE8 +1DD9C187DB3C487238E92EEA4C762C9D48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMTT8 +%!PS-AdobeFont-1.1: CMTT8 1.0 +%%CreationDate: 1991 Aug 20 16:46:05 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTT8) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +end readonly def +/FontName /CMTT8 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 33 /exclam put +dup 34 /quotedbl put +dup 35 /numbersign put +dup 36 /dollar put +dup 37 /percent put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 42 /asterisk put +dup 43 /plus put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 58 /colon put +dup 60 /less put +dup 62 /greater put +dup 63 /question put +dup 64 /at put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 76 /L put +dup 77 /M put +dup 80 /P put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 87 /W put +dup 91 /bracketleft put +dup 92 /backslash put +dup 93 /bracketright put +dup 94 /asciicircum put +dup 95 /underscore put +dup 96 /quoteleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /braceleft put +dup 124 /bar put +dup 125 /braceright put +readonly def +/FontBBox{-5 -232 545 699}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F0187316F83DDE3E2D27FCDF6C5CE4F95B6EE +3317BD91B7921F3039DD35FEA387D5CFB6C6E9DC84C178F3432994FC7FAC6E5A +ED41A1E2EBA350178FBFEB45944511731BA827167DDAC238FC69A5486B995477 +C469E2E27493B0B711DF8E267D3D5613B450011921685147114106C9472580BD +F531022F6DF5432B2A4EBC51A8032C7F9689B6FA942D849B29709631613DA68D +4DF7B6F059A19304F40A3C3580CE3B51D79D42984194D4F178801720892FB6E7 +61FF43C63F9256B5E9F4227B1378222BAAD4D52C77462DF01892220E11129C16 +6C9E45BB9F01ED7C1AD5D8B4D72BE0E12969AFEA90FEF170603CDB91CB243173 +B19A56084D10293B80A35275F41BF78A054DDC98F4A1FFF592463D944960FB31 +6BE5F03960F9B1F213CBCC7FD448657FE388F10104D42B0715FC9571CC60CF23 +C72560CBB8835A0CA208FE06676B3B48B093CB7FB2C0C53AF17EC5B372A9771B +BFD52FFB7062B4FE0106A01A2A1A1DD4EF5C8C7623EC9324A2CB3B402FCC1FCE +52BFC8662F8A39D5F1B41C97E7CE34E16AC28A1E94007AEA7D4C519399F1B7A9 +48FA7DDB671067244F09C29F95DD60668223F45BBDA8B1C452E930A9F3F341C5 +351D59EA87462FFB30277D3B24E2104D4AAB873BB2B16DA5B23BEE25BE2C8128 +C4CF2F4F438A4E520CD864F3EAFB5363753B82978F6FD664A14E5D6F3A929348 +5839EA752FD635619C4FABF1E1454510BD9D6B538A343BE748AE05B47F917367 +1BA5EDB15F1BDBE806E51B294257D7087334165419A6520462D794D670A1D6E1 +3BB03BF689391D056D55AD660D15A386E6D222C9572BDC4DC8A46EEC75124BB5 +F0E8978FD6031A90E4768CCBF62A5ED8C8087FD66D2033011947634878BDC0AB +6501DA7E6D96E227068E993DBB0072F037CA4111CDD092DD0CAEC1DC6D0CEEC3 +B291B4AF285DBA243A3457A855171EA0527DFBF10E34A60D3BE2092B3218365F +07271A0CFA3AD15205D0D0886AAE1C89807C74C6BB23F55F0405A522BE78D4C3 +0E6C7A2C17EF66CDDD65AB75D03526DBD692FF1557B689A200BB5A593E92DA77 +01E5A82004AEF4402C06C65B21971E8240F87BE60F5F7E0B56D3024B7D49B9A7 +724C55353C362CB35B720A5405B2B9301A1A0083802E8766ADB7856925D45001 +1FA451AA61F72022FF0419B1650CE94208DEEC7EE3B53ED7F9E995F883338936 +EA6FCE2E2466BE5C04B46FC7DD9E80E6F1ECDF77599D3AB9E61C00D7E425636A +E0AAD63D341CE31564C7882916EC35366208A3C06435BF1F55086D627E06B996 +7C49FF12CC6D0E793EB19C4972C3904ED0FA9FE0C4E05140CBAB2C41EC148B05 +43A9AD2CA401532FE0045933AE0B08BC1F16D94D85420A26A9D32A9F2486BD9F +EA2553F2E8B6950F63A1102E9E8DE227BD756612412DB1520358DDB08CFFAEF4 +AC3597978F43E982BEDBAD042738D05AD42348840F9D0122535E6CE711AB2898 +9F1003DB762D3B15BF35F3B7F593C40282FCDA0CFB1DD0B2B3A8DB68E326251A +E4B6B6C559E735EEA2CB221ED8B8E2366B1BFAFAA234FCAB5F94F7134DB434C9 +7033F5ED902DE94FAB29392934E8DFFB00C5D27505CFDB2F1BDC7B10C9379B1B +8533F17A4369203D2C65B5C75975A65D20BF6880FFDF8043435779F26127B38E +09399EBB27BC2CC481594BEAF8A749445805A6EDA1DCDD02D7F23038B6EF99C3 +18918626F164B6F9FB32CFFB0D936C11AE7E2AC80543864A65EA8575DE49848B +B09FDE687FA8AD27D0221315119A0EF7CB87E6C72A232B51E48F4AA67AB0FE6F +36C4BA99B3C0C343EEBF2C0E5905E71FB897C0E80C9A3B15A9CBE81994D24580 +EC447198E94134154F103060C6CCEEC2006A2F7B8A01457493EDB59205B0194F +F4859CB75EAF60F98B0A213864DD8407DE4DF86AE6EDC5147FBED02C022B26D4 +158A8313188C7BFA5F185AF65FA75F0A17DE6A5CA276DCBDB01CF410114E8B17 +5DCCB1486455DDA266A778A9EEB6B41B9DE0F79021D241FEB9E9496DDEEB6558 +7145D3540032DD2F1848CF4AD9F88E67C4B77339BFA9EE3CF75FD78A63ADB40E +68B3D693AEB0E7AA4E46B84BAF08CDC361A106C566D01FE63AF40D245B717B92 +FD7391F92B159830ACA6303C8E96AFA4780DCD4963BD98AF67D8511E4E6C6E7A +32616CE5F6CB270F01B6AC4EE342610E0CA1AF1DFE51CECFF133AD714F5EE89E +978C4BF5EA08125733CFE4B0C3853429E910677D568EA9A4A0800AA5D391A772 +E8114BC600B2D6B2651BBF987CC3509B00CEEBDDBDD82330A9181D209271073F +B37241398D70D049B9FF607A41AC70E64B928DEAB1A0B4745D98ADEFB18F2D04 +0C44BD18F8687967984B9D48A5BF27E09CEFFD7953E6D9881A197CD09B8C75AE +31C9ED0FEF539E4D71E4DE6E65D106975A0F9C57966D50E678AE5EA9FB83EC80 +0020420E2FDB7F4234A3DF285B9D761E1F0A21018BDD9EB84934B808E345BF4E +91556AE5779EADC1BD02E198C73D1D10A56A0F09F01302BB91879DBB084C488C +972D39D4212AAD28F9B24C164F18CAAF595BB6F9EA9DB90C3AC98D0F37C36830 +F28A9DDAFBD9E3C84928E9EA230FBC0F3C3D05DE4084621B65D26AF4F07F74E6 +183E59EAAE390C8AC834DC662B06E83A9CADC8B891B3EDB56FCA7252600082BB +DCE150610319A3861811339A621DEEAD6D619D475BA86984561F489D052BAA18 +7AF5FF29298168AC79B1626F882CB19F6AF7DCC4E28124ECE52599C51890E580 +132273798D3013CF390A8569A8618258D3570D2F1E538E96793E4A939293BCAB +A9EAB62579E456B5C80CB9B79A70EB36080A6AAECB786FBDC7F19E6543F67B8B +39D24FF379D8C6C257C2E361FDB384C822DB095DA0F10211D6572E4DE6D4E8BD +1770868E2752631376DEDD29CC784ECD374D72232026BDF4650B9E2712190D39 +4C0748743D7EE4706B7B31C90E5743E85DAB062B01DA4960E0314D9D51293BEA +9DC2DA2C67DF7186F9346CA769A0C7C6E6DE1BD9B48709EB87C6E6139BDFB245 +69A02887DF104549CFDDD7FFD86E9822FFFD2DF186512BB81BEE95253FB15FEA +01E04ED643D2C7ED7B43AF1919ED54C69908A87FEF3C46BE979787C79F885451 +3C658541A8E388297ACE1CE31AF3DC7DE205B72F27EA432387A609D9401C0FA7 +B53EF719D0BA60B400DD9D02C7D9626799D39C51039B3D0408CBCFEBB0B2EF81 +220B69B2953E00666BB31C73F11F1E6108C62F4F54138631B9FAAC2C9F92935C +2B3D9989D3D78AE5CB66BB48F669178200ECEECAAF28DC0D5378238DFB8C4DEE +D337C8F28BBAC0840F950DF373EE8C3A59568D95648E33802210A3A563B5819B +14C059E7F4AC6F426CD4E7B3F1A2F6F4C2FC19C2C3E9DA7D2C8F950D7564C282 +860C60EADC8F9B71B90DAAD27095804884289E914F0BF17C555A91FD07B13DA0 +66232C27711289C4D5E20A39A4660BFC00566BB31FA6511B763EFBF1CF95AC91 +CCC63FB618BB886C3B7318CC8301E323EDB4E016F0F7889C4FEDE858094C23E2 +8429D32F5C52CAA03CFD74820F2B956E61560B64CCA58607B300CA9166864F66 +49FC01C8848EE25857AD731386858093E9F87299D452D9C13D06F90E9FEF2C9C +B9B78EA3D3F31785364D36B1650A567AE8CF30A7A5E5C6686B614DFFF65EE9E1 +04211CFDD13B3F021E5D9C965BB56FA136C0B14761ADEB5C8092088990E8D0D6 +B92F39F4E85E71FA38904C93EFB4D7FFA8012920C2445339BEEFC621CD4765D7 +01A9C397BDA9C3C0D0E6B15297BA0BBF6169BF10162524EA71D7CA539FC209BF +375314A88500ECFB9C7363C5AE0D7FB44D0D1AFA09F34E57AAEA2EA67E2888A0 +1B202C2FC4017AB742D5437E8BC89CB24A4A1B0DF2453026E69B60AD3AC8EEAF +ABCC24A1F4C628D67BBC03985396C05E5DFFDD98A0CD615D37EE0FC2C9173D91 +7F20B0964E1FACA7FEF48DDF1ABD76716E06B403998530C15C434F1FD2BBB250 +4B95E75486B54604D3687C2320FDF083A23C01A79363A225733925DBB954D366 +3C535E17565ACB00D3ACB5116996A172743511888EAA2D69B180A4C4FECCF034 +BBB539DCD94510B84AB82E9154C93F025FE50BF00B325A6CC4B6974BC3B67596 +CF605CC04A14625DB25A6EB9E9F9BE93066E34A285CDC45ED330AD2073A9DDF4 +8D3A6739CBF4E846C3BB01B9DC7F01055BD43AA0022FFFB2B93DC850419B4BF7 +97451F057CC0BC68C208DF288E8A1310A015BDD1019C17EBDB42CDCA2509CE3C +E74D55C55630B10A7F042F260D0B285DE8399D11D079E91F348317AA3DDE0CC2 +A8DAC75318B5FEA8A6359EE3765E6F75E58D354B9607034F6A8BF0B22C9F770A +F537347806E5FB7C0A6A9325D0519B02A0E7CA47946561B848BFB1C00B5AC67F +BE25853D147950FB70854C7F4C8D7C503850F1748DDA6210DDA2BDA36DE9AF9E +7D4DD3152165C9AFE4CAD15D146B71F0B7F2DEAA5EB3E1637A9CB5C3CF60ACB0 +7E6A11244B3FE758DF42E346A847B6FDCA6B6FCD7F02BE7D467CDC4AA2435E5E +34647FB8C7EFCBFD144895C0AECD5E0F2AA6375C005C75535C0833FCC123A07A +C841157D68C80ED5341FBCA8C83274C751016C40FB73A5EA4C6ABE1ADB730CC5 +1CD781A616C79C2B99EB1F13115FB00A8994DF8017791E23CCC269D90D49B402 +E1AEEF2326CB2AB44079CE18A1FFA08195CA2AFAD0ED73D907F4FC6422B882BE +F7CE67E17EE720B1767BB925E432CDE667B4D3F0483DBCA9EEF9A41A786DBC81 +AC9A52114892FB6D2FA892B6FDD27DDDB9E173AB1DB7FD612506E2D0338D1747 +1ABEB8BA78BF7127FEBBA18A70DAEEB612B7E48885C76CBB9DB5786C17B286C8 +A955C89B3DC4FBC16C3DA027D10148F5A2C685255F2D165570BF8BB7EF72A0C9 +F90C740E57BA036C38B3FD04BDE1119FD3582FAF9F254220CC20532D8C839CCD +ADB7ED9483CB784126475CDE0E8B2C602A14D13486C214AD6B53E14779E7DCD0 +59A4C4D62A704B4EFA896439CB66B953822B492265FFA6BE2367DE24DA97CD5E +31D715A3320B7D0E1EEC35EA1828A218BF3B2B4EFDADCF91DDF152D4E4F92155 +757446DD8D122A22AC3C02D9FB49D31732A03F9AAC36B0494F234466B3C239AB +4D41488FFB5EE503F69942287348E09637CCE28F1A6671B06E8F700A2276B2E9 +60BCDD1CBAECFE816F6A4A1277569D6EF85BB49503708F56A8411F76E53148F8 +A49C0623E3EC3DE32B280F5BD47AE3F759589C2E4DF29ED5DFC587E8241F559B +4B6A1F8646D292D966CBCF651D751E5C92751B289BB75A8058E9B19C375013AC +5B810252BF23FF9C7A0A568C6B4E329F5B71003118F3DE19F99760B525AC3D51 +AC85F6E4E47F1EB7589AC39379C35DE27F4FC5B79B8F5D33049D4BF72A8FAD0D +04A1C77795B44EDC59FEC22A5843F86D18FD4415FAC8AD44AA7520392D57B7B6 +2C755EF3AE81A83D965E65EE8583F575AE1CC4F50A37F0B3C007771A5B60B01C +19FF8858951E0E7CAC7D157D3F5BC7F0E453738DC33EB390F31D38781CDA8578 +F9555EA83FA8BF8BDF55740882D9140C9596ABD438E903B366ADF71304E81E58 +FF9B51BA19FE3EB5599C6D1787569B44BF26D4E14FE79C1D47F3FD4E573CCECC +BA3F8FD36B608D87CAAC3686BE994B252287AEFD9A14AB3051CD4D751F27DB18 +BED214064F065F20D3FE097DF160C63EA5CD01B3C27788A927C79A21C4F2164C +EEE8F38C79A7C68B1C1958F7B6F0F696A203C93918B3C23DBBEECCCB2EF2D96A +EF6BA2A7AE40979ACEEFF78FC82EA9B34F6126F515C307783045FE80587D0FD4 +D0F81422E0B82CCC82BEE3D4189536E2C08B35AFAF3FAE2D5D009DE9BB99598A +A91B9B58964B4CC7CB625084C0DC42ED14D685C25C85181A8735C4EA6BA9CFD2 +B7C8E67977D047470C7A778166FF42BC4B9A8F33C5451FD16878F6D65A47617C +543A1E51AC939FB97235FDCD67962AD3CB5985DFA5737B28AD2E24DFA5921B3A +CF2CF5FF6687C7EC9C66C4DF80C039DD5965CB1B49D0091ACAC40AA078DF781E +55A2457EE55B1E0422C5F8074A9D475E194E5742857BD6544A636AE573FD8E68 +70BF3858E463E94E5F5D956B9859DCF1917516005364779BB9DDB66F5DA107E4 +2B5BC512D0F9C32FDC34794BA631A0731CED84706E2FB9AF7CBD4ECD53B6157F +7B01BFFB519C87689E2A489833D22F3C1D812849B656E6C91088880F135DEE39 +FBE71EB03E6B5AD77280112F6C3E2636D22A38AD1D34F33B7C327122B9F4BE2E +791FED7545D52ABF2ACBDFCF770F8F874806DE0D1977776B330FB8D84A52834B +0D2BC3FC18BC1885959B65A2B395202A8BE49350C1E133EBAEDF41D36345C24F +86E4576E68E81EB707EEFED92F6F09FA46F2F54BA766E3B20F1CFBD6677B59EB +73778BADEBB3783A5CFA9138815187A86694E8965FABF1DF6960865AE363D418 +4C3401F3854DD5C241F3667E2CB34EBBE9A74D890283DCA529E1B63DEA16898E +FD241DAA19EECE2869780A8A03BE546819B3C82762F5757E72C0FA749F90050B +BDDE78E6D01685F6DCEB9A6F45E7EC9D253ED34D2EBCB98FDE257FE1AE7D39C7 +1171F5425F3604B93531EBD0DFF691A905ACAB90F760AF4A674C500119B91549 +0566246482F9454E3D3927239AD8DEEE6D4E9ECB56748D2965D7D4C59E358307 +F936122ECCF570568F9C8C8FE5F135AAE916CED51041840BC4B1F403FA632FD1 +E694065B7F48EE00FE1E6ACAD8B86A11F3ECCA19B5ADB114D0980766991F8AC1 +573EA9B5C8FB5669574CC0426377764CF911BD316C8A7D772F78F47524112BB2 +A32F11FA6A6D1B295D96456A0D621C2B8F284DBD8FEA152D9EDE6A68B9CE8CED +65E380ADEA02DD9C06733A4984AB4F7F8C5E87E58C9AEC65CD3490C87C04DCA3 +42AC5CFFDAF21995432D0115B425B20DFC3AF8206354267FD0A8242BE0B23B24 +7B8BFE5CB5A2340838F3BD77B6ED26A6E43D2F732F5036807505B5E8C155D194 +03E57F31DB974254F3CE52708587825117D646942431DC4A29E99E7DF8193B3F +2C9FA9049DF511A48E405A3B798F0855493AA0A2777BF1F9F55B6797F27B8711 +5B34A0C897B7B13543477D159232939A052E46DF470936A8479BCA8ED9F97F88 +A9D77E43F19DBDD737EA504D94AC6DDAF29AF0DFB73AF8B7681E501AE88A6264 +B879436A69BD0DCF3465BE9D480A31B9702B2BDDB87D647E5A03B7E931505CD6 +7FF4595F44DA7EC3B1BE6C3E713AB806A1737D026A890E77AD137A9317779D08 +B84026855E4D84BFF2B50ACD7E4E23A50B888916681BE1FFD83128E9C36029BB +AB6225DECF2F6DFE22E12A084C27F809F53074A272735FA977D783ADFA5555C5 +F2FF03C670E2018C9388CA3034414402C60E0D49E121FA06B54E649E73E65E2E +3376B59F3E3221FF238488418E7B969795938996B506C9CCAE529C1AD10CBCBD +B2DC727D9722C198F7BAA1BF583AEE1B88740668CC1E9EC960B33820981700CC +01F5AB0586DEA46B96A72EBA2568E8A3774935B4A17BB2DF361B4E4D30814CAE +7C6BABE324FE7FCC67E32F773924E8C995A025948E253CA14FD35DB48A4C9869 +10ADFBFEA18E729FE71A53584FF7CC8E50D04A3700181E0218558C262873C7D8 +DF424F5457D76FE99ACDF797E542433AAF9E811516AC28698A179E17915BB3E1 +368DC25C96394147D0483ECB7EC5543595AD8903BEBFB250C76ACC782BBA59DD +36D393AB25D84A09E19F7788CAA4A9110997581DCA6EA82B149660101B9DA10C +66A13ACB601596B68CBDEB3F8AAAB3DE33874C0B07B71BCB6E4BF05CA47A7AD0 +69B6F516E4ED20D017CE5D324FE97D7FD2412A73B92D8601B8D716AD4C87891B +53D9E95DFAC1F27A582CCA123096B12BC1BFD68F432956606CAAD9752102B925 +555EB728A26DCB480AFA1E87F2990585E477E5E83C045A72FB2DD04D0AFC8512 +640086008CD6989676719D94E4646EA41508A6A4C25E93E84B3928E9F875186D +B2C6079FA73A221FADDED66AA88F5B49208D10C2E1E91E25DB3818D69E69F10D +197A16CF687E74CDE885CB876C185F19D120D916E66F88D03B308ECD3BF2010C +7530AC389495B4E63B70999149C463F46DC3FBB0E77E74ACA0E0CE17172AEFB5 +F3D559DA122B384EC940CD845E8B5271D2859A12F5E913BA6CCF8576ED7F5C04 +9C4FE5B7DF849BBD08DB1B44A71A59CD1769853CF9E49A3425D48D19233988AC +3263BD7D1861EE4E99C9D33FCDE02854B0A9CCC24F337F04F9AA4F0292F5613B +0DC69AFFD972B2EA03B018057A588936F7868AC2FF5474B9A9584F2AB70A6813 +23571813A6B3B48ABA4CB44F6C14E9DD5EBC97D9A705F215B31352711E6DDC25 +27B5CF2AB2C4A1B2310A91711D39A4BB8EDC93361A18A38487F8D2E3C91E5D80 +53C2B713BB837DE72556FA3D1E797EB6A90D83DA02DE424D074B6A8EFF11BE23 +D9E905B15C4860FEC665B2182CA30293A86B5D1BB1F7230D7ACF88D7C53317F2 +57FABDDDC049CA2CF03E8F0FE9FD160736418DDAD7809A85D3F3CAE9F7C51E3D +2238449F781D61AE69614F0B307558D4423C86EE67C353E9B49DBEB7B060D7F5 +25AE5A7F64F20D22B4932E86D5F70632334D3F08F22B81472545ADD27C389FAE +F619E9FF87185F0F54BDDD40430CC44576CA2A2F3F4C115D3C82E53689203F93 +36421BCAEB7FE999BF2EA19D3B126C073EEEEDE1E841BA512B2A4D8E1BFB3A8C +B2272496B09DD88CC7C37EE8E06BB92797FEA48E4845D7EDB60A61206C581894 +1FB3FFFFA610E81026A7AFF8D400EF068D1797F8512F05223DDA51FE18DFDD7D +79FA8754A79D501826F705CC5450BE63C2390764D2AF32BDEF3E45940774C9AF +E869BCF5D5C028278DA373F0B0B6ADA106DBF419FFD5ECA3C60A6C1AD46C6C25 +5C3DC971BB07A23E3F3180DD9DEAEDFC2A96DF506424C5EFA695150D5B550AF8 +E60CDEA33876B075EF693883F6FB70EF5676B4552318E1EBBD4050B2BAD9273B +FA895B3DAB65E4202AB0EBBC633A0810F852824D3FA83865E505F0A226A85D26 +C7D69739B671A64FDAA895F7C98660E43B18923702C6E02C3B0806BC375AC535 +527265D76CAB05110C7854CB477F1ED55D0B876CF2421E3FD0F21337AFBEC2BD +24E8E304B141B878DDF0A9F692E1481FCE9FE8734E6FE9CC2114F0F341AB9E03 +8E4118316EEA0985914711F52F7D2CA2FF11FD9D79C5CBC12807B5992B8485DC +494FC91F87A7A8731CE88752D02E4527597BD7485D4B88BADA367D516EE4069E +12625CD755DE031815AE82EEABBFF8563BD74A2A5430F4B084D7F10CAB27224B +8A8ACAB00DD8B88D7A3B9F05D769D8328E46C1345B7BA0DAD75302227CE54C2C +AB035F296ADF6F7F7E7CDE3EA657F1244C2370C6D95EE876257AD318A92D90D9 +4249B2EF5F001B88C41BF9C9424E9904A28951038318B55BEDDD504F111622D0 +0F9D23CDB090D27E1A7B0B7DEF03C71D5F90523852FB2530A4832382EC10EDDD +EAA73D2C1CC08A53F1262BF636D56748631DEBE79B173EBF76B6E2334BF0D855 +74430668E6E49160A25FDE5DB59FE6320B10D00AFDAA328324572B6F767D98D5 +ABFF8B9418D51864EAAAAAA2872BEDBA9ADDD7F24012DDCD6200E5B322B2FBF2 +3A37639CBD9918FBAC813DDFF7A330CEAF3BBEC787D6B404C88E22F2EA4B0F88 +1260BC45253FDDB713D260F72F074FF766A841C7B258F281C092CF643013ED6D +F4C3DB7750E93E405958FD2DFB84FE26FB582A61A029088B6193560370751546 +230789365755CF9412EE72731564C80661E5D607DB15823CFD57DC71DB65996A +3093A3328998FC86ED7E2214BDAA5D70F0DF0D54D0E2380B71B9E321131F247D +37AB1EE17FEC0ABCFC5906695B15B21CF44DE062BDBC4B9088844D4F0E39E071 +0B33110F36C709E62F7129C3089F2C235F2EFCB1820B54FFA88F157C0CE08271 +AF58E9BEDEEB16F461B77596D9FCA92F3ED5B751FC0C0312769C23E85DB83BA1 +A1F8D74BC27276BD842D5856664582B3F5414E2213E382DDD8EC2EEF31E79B95 +C2497A33906574377E7FAF03CE9131A925189213E7BA883D30BDA2D03A696FDC +E62DC5B68FC604FC6E612BCDB18482FDAD3EE1E2E0ED7F93C91C81176D33BA53 +6CEBA5D8ECDF838640ED67372D1B2943A94D82DC93AC338C57CDE651DAE7C234 +03630634D5C816277DBC9EC71DC0A862F19B1756A11703DF5DB91E110FDC7271 +C2EBBC42F233B575752573E7C3DDC8EFC73A6B8DE7E6B8D48352C3733CB9635C +ECAD66C97F2DD346865CF018F46B4565883834D989216E3CA25556E1F9E98930 +394B985ECF798743D8277C2AB8DCAC16B483610DB7C3C90F71680D807BFD5493 +FBEA7F3FA4293659AE976D036FAD43D509C2DBA3992DD24DE8A99BF1FEEE7431 +31705015A098AD47A51E6D955DAA1A4B03CEA003E0273BA5671F7F1998238D88 +D0DA4262B134AC9003BCE375A75AC93715F8F2F8A628409CAE9FF9D119301B3E +E8147F1DE16649984430EC4BA948BF5C74111D0F8056383D444F6524C7FAD4F8 +6A4FDF445CF8EEDFED560A6C262E24C0444B2AF705926A9E0805A1911F0230ED +5B2030D956CEC14A102CF4F8E8C3DAC74ADC16C169BC4A4DE75DB3CE82376254 +00FA86DB89265200CEB4CC133B2A993AD95C5AE5A695DEBB05624CEE6DDA6B5E +A089344AFA90ACA83A413762F0153EAF7DE15333BF9AF6E75EFEB3964D59E183 +42C5E52A77C87E85E2B3049508C00ADA5D6F0A8EEB2A4D71DF16F3DACD580DD5 +68C68834C0778B469ED2F8C833A1BA9CD0DB2D6AD88C506F5BB23CFEF461D30C +ABF3164B702B433E0156590C1FD699268144766D3AE1F8E582ADC19B2D4FEC59 +0DDC8270512D3318D854BE1BA7F545AF9D9A0F3B59710609AD7A624CDCE04DAB +095A54E8FBBBB1987D01EB7CD1B6BEDCCAA46A07077655A73707D6902BE02565 +EC7C6145AF4E52D1073E3DAC7C087A14E9631570901BEE1FF3255B8D501384A4 +0658B67909EC2F6B90A1BCEFFA9D74C1CF5570D7EA96391CAB7CA4E0CFDDB3FB +C3591EEB49AB7B154973F0EEB9879D53DE90351F0F76BD90764ADE187C68FEB5 +AF1B4B290F2F0AA66E1D138B21C1D4EE491ED26EE44CE490F326A0407B0FA267 +1707218CA4EE1FDE220835476614DD67C7845DFB243FD2C5D856ABC7E97671AD +B85BCAABD214B9D9BA81B4E925A726A122F1FFF11F9581A3F08645BBC4197B27 +D40D2A95EE1DAFA9C8A6157E0E79866BA40C0702B26210725AA2239785D9D9F5 +017047AB62B57F6744B2D4A5D642E971074A2FB1F8809AB65A52E96C51415FC1 +A5286427DE8C81BBFB5A218090595CC14A86A40ED9709D5752157EA673A4084A +93BD7E215DBD1148BC140DDC68FF8F3C1AE10894D8BA9C4A3AE55992F88429C8 +DD9B8247EB0D653FFE69165BE6827825C1F88FB36E69F2A8A3CDB6D72FF96DDA +072C65F51A898EE82590678C43FC184B532ABBEEB801F0143111C9941F2B1C3A +484DF4C0AA7E738EB2063278EB7B70E1BAAA88C50BC462ED449B66E4E0978C1F +7DB04568AF5EB412C3E41BA22E8273C1996042DFF01F9702B676E858F4FDD430 +F6B417197D8999945E9A82DA43969580863825D31F9D59A0D87D0F313FE2C28B +C6B97A98DB142B88A45943DD49471C3424BEB1DB482E9650B0B92AC70FE8845C +DA7716D68C9C2A14BD68F379E2C9DBFF92DBACFA705F328AC2D196F472A24ACA +244A17F00C82EF653DCB067E0F3762CA52E58A5604D29EB1D56B2EB40417E2E7 +9406035A253BC2F539D5B09ACABB048EF1D689A5889B9C5FA6B2E0E2EDB9599B +F6F4B355E3733E6BF9B21DBF7580E52526F2900F980B3C28062A33A25CE7F6A7 +4F13D6AAD9327ECC7F3F97BF15C3BEDE1A0DE042E749F648354D061C3E52E7D9 +F376216E4BD2B782A5AA0D9FDC5551CF660285E4CA7363858C51DCC79F66072A +2FFD59D6799BC84EDC0C5DC09D9E40056A4608B235F1357D454ED3028322AB8F +DAF5CC60F8B5EF4E01A8ECE97C491D828A87CB85D50CD56E4A7BB6DE2315CB0B +D0113AE20B4EF27FC486B648C3C0E6F69C1FFAE0C766DFB8B16611CB504FCAD3 +06B8169190CC5F836CB68D7CC34A8434BDDBBEF33E2B778884A8070654378FB3 +744459C9FFD348B2059652D47335D7C864619700681D45A39F068430F8DBC4F0 +D1122FCC17182216F62C82A2800FEAB2247A07413B3809DBAD5A03E1F1968BBD +B41B98142B9B0403D882A3A70B334F0365353E51A7FE4309DE4EA9BE3B695601 +3CF86249952A437666BDFACB7D272F200A64B9C09A125287FE2779E950687EBB +3EB747653C8D95758407DC3AD8C95AC3D2E18994156FD13CC03A6653EC7A2993 +F9893778089FA63708B0E3942A226A5289090412CBED2CD71BE93DD4CC56F095 +2E41EB41DE3CA0F8953C28C3285C57B75C13CB8A7E588054BDBF3B5AD6E86965 +4BAC32C54CC88E2BA882A887BD84BBC8F15DE986DC2118D2DD0A0E154EE11815 +65B18565F5C97BA8F5753324CCB5CD8D40463D909E832CAD28E62AA2250D8DC3 +120252A10404200CEA8A2B67CF44676E6003B7FC2AC00ADDE1227724B9E8999E +B5A4E94223504B52575111E828E4AC03833844683B64101AB5D91EFB4CC8A822 +72C394436D8930F1541359194EAB8F44403958F415678D3EACC777022271EBA2 +2A76DC2E2E833B426A15D5AE648101CDB8116D353A837D466E4311DD86F1D921 +64EF76C5CB35B5B0E4B8B1B93861E03C1B635391276D77ECFCF247E714CC67EF +72209891C418D1472541D68A6761EBB440E360881E993D3FA4E29CADBFE733AA +7C260797DFE27403E70F6B1D2E493A1C55B2381AF9A815808B5081231FDF30D7 +CB3A1D091A4B6887F9EF692C736AB5770BA5921D48DB3F196A4515FEFD4317D5 +BCBE5394CB5EFDB4C4A972B669C294966E5D76171CE5B903E4D8E6AE50C5C075 +37C42B59E74CF491556B618191C3489D11288587FF05713B18529C7C7DE1B9FC +CEA7667AA32EC4F02F452F9F20E54C89E071ABFC4155ACDB4DF3900EAEC25386 +E14C88BB174890A966703ABE3B6EE4E229882DD0543C3E33025F072EECAC34A7 +7945C2D58A721E42FE71F1A2CBC59EE8278EE39F6BFDAE2AABA5562E0970991B +75A3AE1B2B0CE3B8BA0E32F6D281990054BB095B9E9B128D54E3492C08380208 +B6FD878894DE6F487363C826F26F5B810314E48E86C933B885D21887ECFC7FA7 +711F256D819274209A0E08AB6E147F7642D07C97F92E70699D88ADDFFC941A17 +E521A3D5E3596491CF5D9BB95E483C353441CC4748A59F9E49C79968AAD58F19 +38FE5E275EA22403CC4A287A30F7B616CD4B31519AAB4DD7237916906B59CBCB +C275E1E993B33AD6F76E945DD4CFC3CAC1BA88E5CF9D15F03212207182AA054E +9B53A2469E76F128006747A7E3E95720EC90B43BAF6E016205435EA4AC8C8303 +E1E41BF20358CDA809B88C72AB0C2011A6C91A884D542D92971327564E175217 +A40ED9EDA6B45192C46B648215A556591A5C8AFB8468947B8BEBFAB854983A44 +CB88DD24D3C8920383944E2FE13C18A45D4A5507110C61FBA11945DDE8F0E5C6 +265F450C30BDF5D3C95F40573B139857539F01E8C804BDC8DA9306C133E7FC0B +66F52013A1D7C4BBF2B2E1EBF80EC769D802C7117C06AE917206ED17D13A3E95 +5C987FBAFDF8B1B49E00376E8B4D60E9F2B140267A587BE8D14B1A0249C2B1DF +003533FDA36B565ED493CD1A807E139F6C2CE7148B6FE62615731CDFF1EFD40A +A79DCDDD7F4F4CA0D00DF277E7A38556B684A32AC4A8B6998EF6C1693F043E31 +374B86213BF7CAEE905D239D358FFCF91EF2F34DF7E0A1A16832A54640D42610 +8C77E6BDB82B862426F153B0C87170D31DA509ADAC29EE7A614EF359D584CA36 +787DA85840A14036378E25A53F907D10F7416D5334705DB9A111553FAF2EE20F +9C3A0BFE2D3BE88C28899043C8293D012CD8E2752F30A883C2287D5AE64D00D7 +443218C7F45449B4C9B2BCEBCEEBAE0AC8934549F5E27BC01AED860754AB4962 +12C42C1E066CE0B5726331F64A1B6A738F4D79388076AF52C46CE481988B5341 +85A8CFC7F9ACB1F0647D33B762CCC7C34F91BF607940DFC09040775AFC3FAF6A +41E89010D5700942F78D5F6E159CD13806F1F62C28EC0BD6F40E4E812B50F088 +A20C82231D47C911A9F4213077793947F6C8EA53BF2763F75779BBFA65A75E27 +791959727522E48FC28B9C649BB0AA1DFF96D7681CE5C8A42632EEC5CB7405FC +167DAB24900FF3CDFA2FADEB8829283B73CBA2B1A95B483CD3E6F02C693AAFF9 +9C09D3D2DC196A6EAF720FDFE7C060FECB0392610B17EC0AE65C72D89D892694 +99CADF5E3F60F6571E29EBA897831B8AB7253557713BA2529465C615D848A1CB +57633090AF2993CF37E19A97094B8686238056F22AAAC0CD81034661B9BFF73B +18151C4DDCFCBA332283CB1970BF1830DB778E626626DE94E0A8004E5FD830CA +93E4BC3607809BD56C75B558196999C92E7325ECDF73AA32B49C49C3C5FE4B95 +7F50AC40FD642A52CF12F3547ACAC754EB8F7164FE5624BEF7160B14258EDAD8 +E26A181219321F2AA523CFCA7B2E12878A5E242BB7BA5C9F22D0C5722766C564 +306F713ED39E883D2A7ED68A0D7C7EFD64EB39FC189A0C7FF8111660A188E19C +DE642C8F2B0D284AC2B52405206A5E1A449319D94B3DFA20DBCBC522B5D67431 +E3A072463B59BF356F924434B5AEA53BD49298D25738AA79AB1E274F0A7E9330 +2982789B56EE39AEE8DF359C968C704C7D3B8FCB09FFC69587EEFA7E39DD5370 +FF513753E7518954525B083BFA191115CF310A98EF5CF0C2540265031BCC9694 +8C6A3F1A053753838516389F26ED5D57BE285F92938D59B0DBC6047C0439E127 +55CF071FE044451EC5C557F6CC29D8C5256EB48AFB23A0CCA88307B7E8EE1E45 +91B46854300FF369C6D84072D4D1625A0613CD330AB55B0B326554909D57C7DD +73422A8588FAEA378B917785E75F25E4F4183A36AE15C7FC2C3E2C6E890B113E +0B3FEACB2A3C5ED2F7E5BFF91E8E273869D4143A954E6A5C1012A2FC7839A878 +B86D878370EF71ED0A7555E8858C68B1468E130C1CE3A6199D93FAD963AC0877 +1981237BF431B598966143C8DC7F3B802729DF288A39EDD5B06F0F808741C6AC +4D59EEDEE8655A6CB5FFFD911D8A942590E4BA2709403D0741C70B0FF9FBFA7C +C3FD928B5B265DEE100172E5E917F273918C7941AB9071E1C3EC631AC555CE9F +35F88068E213C0F9A4BA7D133755EFB674717B4FF225AA16BB0B7A930D7F4474 +F2C9C784CB7C8C0A2F2201B57541D25DB2C2C8EB11D172306F7F912149C2E61B +40B0A570CF8A47F792860E4CDCBEB9A05B511E4903921CB80EAEB5A3B6567E14 +71229E7AE16210B7F307E1FEB739554261547BFF5B559B88CB5BDD64124817D1 +AAE0DEDA95D830BBCFE0AE34A90A70E42BE5E9A54D420B7F15D678425F1F7408 +B0A45ED88BBC61FFF2433D65AEBC21CC21A454F416913AF8B4272F7E20CAE1E6 +0AFB2D16F862DFB2861CCDFE73BA66BA95636004349740C2E9292EA3C326F077 +1A69BE963D955A35B72920D063127E3C8DB8655C089312F094231517A9198B70 +CEB0F01B22DD451966D72B2152947AE928D38F39C34EA1A6DCAA758EE660700E +351A8E433028CD6ACD63B6745E0F501E72E3E3A001696B500F83B67E027E47C4 +36B251893D87A5B646C1BFCC94F2516C5A82CA364FCD3F128289F1DBBD0E1BD2 +8D641FBA92924ECDB132C1F89BA3650DAE6E68BAD856CDAC195A70FBB0D9ADD4 +BFE9194C5C2C525337AC29B8A55D56BB2BF90C004F1B5B3842DB2581E728BFE7 +4112D349EF2FD56CD145DC9CCE9F8364830E466E60F6F437EEE13DFC07D8009C +ECF876BCF50BF9C60CC60544EBD3BC42EE61F0DB1ED1EB920CD367149B52B2FD +353B4ADB2C18A087AA670E492BA5FAB513AFBE786F2A729D93F28D282A2A1945 +3A0D2565D395FB4A07E97F04E1A50AEA7EBCAB7D5DABA2603BDCA8FE770A4012 +114B736C19E1649153A74C74E7218A0A031EAAFD8420A712DEB1233036455045 +18F9902DB6390E82EF280BF3C104B4E25EDAD22880D74EE456D1E5225D683D5F +13E8DA2C4D1A8A1F456D9A3887EB3D9ED71BBE682C7FA3AD06CE4F2C554DBB72 +71FCCF5A8D945387E9FA42BE9D774C44FD296270FB67B1004273051EFB74C2AC +2E215CCEA6F18AADA4EE6B94915242B113F094ACC5D837566D5B49C51FA2012A +792357BA0162EA6D04C7106B60E25EDC02CC4FDDC90FA314E4D9DD972536C486 +7A772B06B55C1545C98E90E8104FD7AA76B0DC12C7331859B6DFD01FF9022F05 +34FCF3DB906EDDF0E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMBX10 +%!PS-AdobeFont-1.1: CMBX10 1.00B +%%CreationDate: 1992 Feb 19 19:54:06 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMBX10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 87 /W put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +readonly def +/FontBBox{-301 -250 1164 946}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 +7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 +77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 +2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 +FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F +DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 +7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 +9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 +CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D +6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 +E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E +8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E +3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 +EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 +0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 +4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF +1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910 +757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E +0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665 +6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED +E067598E1B8B781EB59569E3D0D54D8EFAE0F3EDE26279776ABA15341E42E636 +6E02817082BE6FE0B04249A4840C11F95F8ADEFF72173E9A5F2AB2F62C427E5B +DC010E18641EAC906A5EF0F9BC2108062134A7F10956219C5847C0D82F0E8663 +12D963E012DF0DD899911EC5D8096F80B49CA3444CF1294FBFAB57DFACC9D01C +46F3BA2F3D1C14EC30CBF83E5729F1C074D4F1665405CF54722827FBC24AEF08 +F6DD0BC6A79A2DB1FF539454E8F5D1A42D40CCFBC093AFD3E57973A009095CEA +B91FAFD236C47F453B38DB0067907A28EB5E9ADE87A2181F1D6DE4E183631716 +C21F0F952E0666AC74371F8B5C888DC44FBA5607435A619684F502CF625663C7 +94B0DAA79BE8E129E7F5C5AD1B7495C1BC9B1C759867467F55148C7FF2F914D8 +95218C4C3C2D2DB3482C21EA050F23D6A7A056B172EB210276CDB3B1DCA47A9E +8B03B9BADC72F42D28ACE31D0633A0A1B22254F37EBF0433F0EF1CFEBC1CC653 +E3EE6D197AAF36E7FFCC75FE1811BD701298F763AA466B7843770F5F21996A50 +DAA186F387AA9717FEBF91992ED5C4DED8E2C57F0C29F9E3C607A0B528DEC8EC +4908033A0EB87FE3614C55D35338F758606E2B971F4F1956D9009904DC07007D +FB7C7879D19CD37FB26769ADA21348B058957261B5A8CBB91F9A4E6BECC2445C +BF9F64DDD464C6FD2F3E8C89A40CA8FC75CBF6CADA6A6B7D2C63EB5714D15C26 +6E5AA387CF1587932E216BCB4E7391D63F1469206CBF2E297124D8B8C93B1418 +7855751D9C3112888B1E80AAACA230A30728456CA5B1AA59E075C5B534895B24 +F7689D6D6A998EB98A49CE1E2548C4059539E501B40B465322E26B47E2D64843 +E6E675F055A97BA488249709434A12E8F25CC476C8A43944BB37C25EC841F696 +0202AB3EA1EEB657105CA1EEC7B3BC1860F59E1D517B1EF715E9E7946401926E +D0A2FDEC1B14931699A266CFF4506DC74CFD11878E9675664F7B0984F807CBA1 +3F84CDEBCE60D893C887BAEEBD19C68D676727B36D31591AFD543F60669891BA +94B31E3E0267301F74D799F5116296B883D9940164A8FD9C5EF6BA97D75949E2 +32995ECDC83C8B55E12858B4AF11CA04CF1DBD9E89D9450AAC2B8E733A702D27 +8B5520A3577B7F8EA6A1D7B0B468262623D6C55D9BB33C6824BBF3F48BF10599 +42C77FF13EB7EB6F971B0BB2F06F856541DAF495B850AB6402528C284A4BA939 +65D7754A8AAE431D01DA7C7547C92F29A3D152A758D6237E52C61974DC49BBD3 +AF7E01C6CA74526E48515B5B19D8A96E67A403F8B96C699F750DC36C46D1167C +C3B84A260AB5E7A530B8D23B99D098F7160C4C3C275A1F76ED1E167807C65135 +BAD8BE880A844B64A6DA80CC40FEEA6CEB6EEF1FD01504E1BC8DCE99225BC02B +A4224B206C072E95B6A32B4CF6351CE1CCB009BDD15C304E566BDCCF714D2E90 +46B3DD8F3180A0FD2C814936742F96B99D6F8853F55FC596F782FFF3666137C7 +91642CFF9EA7F703E67820742B44104DD9355ECAEBB9779CECB2D6790A84FE34 +6194D3AB97C02C4AF635DAA0365BDC2B8FC811A9676143FFB839C488165F941A +6443A6CB4550F5399B1A4C60B4992A0BAB139F08EBE8FB4F072D208511888489 +27142135141C6F5CCFFA6A2494AE9985CE6B8864BD50B9CDD2D9C19A83371CCA +9626C02A938CD95A052DFD66C0C76F807732F578B9FA4057418055F9281787DA +8CA227B2A7A106E4BD09BC0D5F1D14D5C325B0CFBC4B2BD7E64037896E8C4D37 +CD4B78191DC36999E7AAA353DFA73251BB85006018BB901DEDA41D48339B6CA2 +DAB70C8465F78ADBE36BB42DFD2547E9A18D01FC529B4EAE6BB1EFCAC5FCC50A +4AA032B2FC7323488EDDF56A77C8C82FF09A97212C295946A81058C3266CEB83 +7F76EC815673B6449D53289112E3A09E874E0A75443AE4AB1796D3433C7AC5A9 +9E90C2515BA532B1037DF0B26E8A900888D57BA61CE086D8D48140D648BC4EAE +490CFE2D9694B7BD9C45020769AAA8C3CD90E1283F2A3F480DC7FB575B8B8435 +FBD16FD244321C4958142323025076A52067231FB64D602DC386E8AC85B76B99 +D702429C8DF0A17E51670DD63DF7274790D2464AAECB288BF7A02CFAECD3AC61 +1C5E6C819FC5F03E8A98952287A44DCFD9C9079DFA9772E94E768478D3632AFB +23E9195DA4473F141EB705A949F9F7149ECB0315EC56DF03F135E1ED0EA6A046 +AE61A8E88CF70A59CBE42C4987414F4593F53C98C8C7C82AD4D8F339E426AA61 +B207E51BAF2323771794FA1CF77BAB933A36EF91733FF412E7A621A8DAC07A96 +E8E68E22388EC51C61ECD1CF6E1812D894A9FF867F97F9B3A15EF0785B6AECAD +B4C3DAAF79DE59055A270A86A4C299906C90683A8AB69F06CC473C6B0E3470AE +5596DCF72CF801FB84A338C1BCF8AE0CC43D3581C628B5AD3EB2D01CC89A6845 +D1A66CDC12F662A4D9D73B1DDC2978E2B68B4F8B8E7B4389F5448680ED77BCBC +09CF4106FA91DC27E02A05747C31DBDAC47797CFE9452C43F6178D2F835EF7F1 +2DF381BBB65A9A2D390349E955D8A2126B17CD7431EE7AD45CB3B180049520AB +90EE579C057019BD152D9CD985EAD1D4E111BE36DE5503B7F55D95FAEC4A74C5 +D0A61A6AAC800729DA9F7F8762F6447A5A30B3591FD624C57CB42AC85A3DC6E4 +3884E778E4A76801AE7537536DF232DBCFFDA5B777784EEDEA44B184CEF28352 +6F9FC878EF329369D22C9DDB965615AE9551CA29E374332C3AB0DE815AB44196 +42F9C1AAD67133B5320CC69808D934491C1B963D0AC3F506052675A65AB37F5A +948EC38216D618F4F18555B956E82914D5218C956D08AECE229685B190CFC9E5 +C8D7A4567FE38E03273C47F698EFBB2950A73AD8C07543988399C7F586760C90 +9B527CBBAB1F343049BDFABDDE94B472FC19B269F15D3A315883526AAE6F931A +0EB3CAD700F88C29CE862CA43E43DAE03CA982A81F58FC879BD445945168326A +04C5A6380AECD7EBEA3D0FCFE1EF1B7C310368CFC0EDB1D6E0547DCD5831CDDD +E06450C1EA0D8345A0D17DE19A5EF92136C1F8F404825B82F50315DC696A921F +B8B2FEDCFA3E999E494B57010DB57E4345C721B4736C55DA23671088813BB09E +624BB63B38DAA68C21EBDF1F3DA652EB693CDE19C6FBFCF8FA9A2BF70A01ECF1 +1C358D5231D4135876E48E5FF1A4B9DEB14494E5A3282BC88F386165EBBA6928 +8E0DFF6D932D7FF591DF34A219D395561D905F49F89309314BFA91082B060960 +816C86DEC3BB0F6BE43E7F66782125B3925BA85D97CA2A1F48A3B2362777EE5F +3D476B1A16664CAAA5E7BD51D2C890828FDDFC33CB16FFCA42B6898472FD698D +D931B10B439675B5C003882A30447058FB4195831A27286F25027B10F5B603C8 +16254D13132471369A1800E3D5FE04806B8B445A293F6308F9C0DD0130CCB422 +764E87361242E7BC3EF8EA420A26B3F2ED9F1E03AB8CD73D60302389D6507AA0 +7356D610923699B603701A87D9E1C5632FA5856597F59FAE2CAA6D47D17A7EF0 +8D2F208F8818271BCC8896669BFA402F2002EA57261874640843CE0F1F8392DC +87109F142169FA8C83D4FA1D2971CAFEC7439D67DA2A615ED0C961601078A251 +5524579325C7A82A13096F32D3EC76A67E2493A91ED24A6B2DAAA49951B2D332 +3F58B00ADBA185CF3AA9BE207725A0B286CAA61D076117EE225E7C66E2462A01 +DE9D2885C5E97C472EE04F692703CD75A55E846B5B3E9672541F3EF0A8EF34C7 +CE1FFF82424D3EC2836BA099781D08F43EBF74C7DFB20FFC208D5B0FABB1B0BF +779B386917E1DF953E7DD89BEB6976ACAA42FF9206849397D61705835FB87958 +314BA40C37D62D6F02A70375A93056B55ACC9621CF94B19448AEA37D5B43D9BD +2050D71C3BDE5B624EAD096F67327B37746C3D07B4B408A97DD4AF4C0DF7473B +71916E53D2CE9A9A133FFD0B392B1FB47601C2A9D54D844B4BCEC5EF938E6D1A +DB2A905B37908A8072C54D5737300302306A586F388368CB7A506296DA6C5E17 +2B8B54B9EEE6AA1E11557B26B1D62C5B4ABA17FA10D4AE0D9E1D3C4FE91D9E8B +70B97F5A918DD46AED82E1E3EA4734BF45805D18531167A9ADA1ACBD8DEB48BC +9B5436EC24279DC4B0710A0270A919C2E9722CC029AC29FC5F270B314CD211A5 +ED2C93920FAC054DB2524ED3F8B27B07AD7A63DE96F00FDF2D74D7957D3C856F +647BF955B7EFDB0F01F9A64B07494878BDDDA08B63412234253C04D2AF94657B +B68483E6145D7312D96F12C69E6C854394C377B619BAB9B371C8A9ADA103859D +1C7BA93CD925C144D39AEBF2BA72E67C17437270992AD464626B43158AA7E7D5 +E8A25DD5D36AC2896D03FBD961432F735AD83F87C86F67025B749B4172AD9BA1 +6E452108889C5B1A3D656DF1B8993ECFF57C312F2B3B6DB4B8BC3C8380FA8681 +4C29470E19DC9E6A56F1D5D147D5D25FB88F890B750494BB9DB44AC231DD0CFD +EB7CFB59F76571C86EA2B17D85B0FC0D2DF014463111C932DE08820B3D3C0D17 +92AC0C9F00427FEEB1F53135198538CBF238446341B9CFDC17646194583A3F19 +649A1503A7F07F5DDC20A441B1C2C70F38AD5CD8981252DAE9A3A8F4238CB4F0 +3975E0084FF6C31F446853CDBFE77B87FD7EEF60D57373A95C062676B4F79102 +92300F652574833B0D0AF2D92C214BAAFD656BDED35DECF617EBFBEA2E5A8367 +0198E4BAEE596F1C54B3ECA7D4D7F9AA9BFD5AD5A9D228FC6C6D1B7BB512AADB +E84167C24B65291DB5814959E98A99931437B00AF36A30D5D98B17B278DD1D39 +13DF0B59AD0A1E91CF9B90CEEE1E487B6CD65E0CF3B3A74F2C7B8086B7270908 +F29076338AD4B4EA0D37C04856ABCAD938E9D4E9BD43BC3E13124727B2A085D0 +ACC979A96185BEAF79F042EE42CD352F37899A05176DEB9C4FBBD9D5B5A63D2B +82B195936FBB29B383ABB647CD51E704879A1AD69C451B2B0F2A3327A67C0425 +D3A1AC63C0F73C25168E393C1767E9D07B04D7A2D1ED3BBCE1153123A8A1C89C +64C6F53BB7BFFFB57040B3CA289669021C9F7800EF5F416042321D95DC5D225B +29B23FA7EC5F8151A9CAD269EBF1BF9A4DD0D4CEB63988FFFEDB55A34C3AD692 +5334E33E7BD882A4ADA0D98BC2E7B4EF04587F2CE9D25A1ABA29DA682EAE7533 +52E0734E35CE7FB158D520EE0D66242703429DAF3C4D167AD0685187193E9FE1 +06EF6C3E90315064EB2EC2EB8EF53FD56012D7426D2C8BC229CD39723C339BCD +989618B22949F6D4979D564D350D5E1300C71180BF74BDEDA4B5D961E887B357 +20DF075DD09FDBF469FC19981B48CD28CABB558C8AAEBAA54B36A6C303BBB215 +BB1C8B0ED96B418AF84C69CBBB60F054FA9B8279CCA8EBE8628FFF877217ABB4 +F2E1B8569CD2AA6B2224A275E6423E108FFD8508F17C703E9043476491687842 +5CE5795324D9B64EE0281A38BF37265355E8CC5D84CFAA60830C73271407126A +BF9E48D4AC6723B7A8D54A8880FAB3BAA5DFB1307F7149F8BE635BF7C79721B9 +9448FF1170781E6A773AAF493B5CC7CC0068FF421EF4923BC8F7FC547191BE15 +5D45809DC1303B2E1C4C7A23A1D8161CAA852036B453D8D1B4DF62BD0E8BE7CF +50B95DAC1C8E5844D4F18AFB129C71D0DFFF958BE26B57D4E57E3A0B275BDED2 +05E769FF2A073BC45BC3B2549DCE8204CF78B8950F38A92270F4AEA9FC428562 +60CC1A26B7B20BC6FB3B675B268138A49947ADD087B5B39FD45770DB5C10FB83 +DD18D7AB1C9EBB29BEC7983562265A1686CCD395AB0EF3C9748C5A33C2939D1F +DC3146AF0F2E30B4172984B73A48341311237E974697D1EE03533061B865FB76 +D1C26FBE4E0CA76C8B3C278C650DDBCBADECFC3028F402120F1190AEE9EBC9AA +A6EE57FF7082C113DDAFC9B094D4B9AF0E3405165BDAF284C478F7F10F294380 +ED8948BBD7AC87878B508D65797DC240B555DED69F8B883479CA5DF85F59F392 +93DD5C83334464657E7F5B344BD8B1803A42D4F3B365FD73D1237129A45488A2 +5350B2872598A5FE7E7E1C967C5A5E6533B85ADE0E855C6D559B8BD80E5C714D +CCB04307AEDFFDC41E693F64CA3674F1CC113448BED653DFE02508C07D0B57AB +FBAC51E87F46CD90ED99EDD6536E6BD9C5A12FDC8C38ABA2DE20D28E48911377 +49E573E47F6048A5616173EF23597922629BAF0577349E52F20E6F6D473C3AC6 +DDBBA3CC5901277D39F2EE81FF226E300A9BB0B5894C276F4718BE50EFEC1FF5 +8A2283EE27F5E199D62EDB8EA10C36020AF5312DED0050AA79D79F52F588AF4D +7436B3555D7B6ABA5502645511EA6F215FEEA1D5E7790202F6125E4AC4164A1F +B6A0C4B1AE9C25475DCDF4A9B34161858F7B7D0A2BA865C65E4BDD57F81CB8CB +A04CC0326814E419EAFF3ADF468C654187F9F9E4E699AC891BDC68CDD7B6238C +AD7DD458F9D2BDC35242631DF71A327A2BF6BCA1CC3D7236F8B9D615F5A310AB +DF553AD76FBDAEF228E3619DAC71528B4842E9EDF753F3F9F17F0D0DA81AF276 +056B9EF78A0EBC517B40D1157CEBEF8B9AE4DC17FEF5AABD97BFA91A3AE70112 +0F637C128631161CBD9D4C056F8E2D3B2A90F48108BCEC3871766E242B2E0C82 +1E4BBE0E468FC1C1B7389734BF0E9638634BCD62B00C8ABF2691CC2DB6972588 +A75B58640CD738ABA1BA4C17D66987D73A5C36081894FAF432EC3847DA898C6D +A4801F56CF236EEEB28C6263584B701254AB7112E62DF2AFCCE0A57D6D252359 +3609FC9E3721513165D54FD71A6DC7F2FC7EBBEB54659C0DD241ECF2CD6B835B +D43C1840855A3FFDDF4A260A97C86B01111A5AC6BC55CCAB612E68BF59F3B97B +8472B792F72B7BCFE16ADCEF782441D6B1ED237085AB948C1DF3C6A1AC5E548F +1651F3EDF3C8D445109FBB6EC5AD5889482F4B73AE2540A4AA1B3CD153BFE497 +93E758F6B2E07C6436353F809A66CD6D9AB482E75CE2B55ADA22A2B1C55F2810 +875ACF9E3F5B9E49C476FFDE0FDA12E05942EB9C4C59A10CA4231E1A04DC03E2 +6361E285E517DD39C80C97CDF6FDF4B794EDF24B78ADC7995501C8E3996C3FC5 +CBE409478E6192F9A782B5B163252BCB4968BAA2B0C9CA3FC905492F9BB70855 +25CA8873DD1C994D65E74F37C56FEEB948CF5CAB1C6D51DF6C1E06B3DB776740 +6080D9B0EEBFD8EE81F607A99DA723FD58AC40C2E23B095A3B74C0282A8B1B5D +03CF0FF89AA3F18CA86792F8AC6E29840019186058F9B000B7CDE938DF60F3CB +C202602F2378C608BA9D002281CDB22DF15D4722ADEC41EC942F7F826AC6F516 +6A1943156FB0DB95DC36A30ADBD988846B0C8EC476E5DF4E536FE4B7717FE1A8 +5FC19A2C469577B609073119029A9AE6A82C9E00E3E6694E62116AFC0D7CC96C +B645F7DAE1CBAC1FFBECE873E590614A13E21FD94A805561334767CE5E4FB6EF +ECD1A83016BD9F6469ED9F1D0EE77BF5E88492A1E569A8D1A54B2DB47A93369D +7E4DC9188ACB4523AF57A86E1595274B76FC566967989D50194F59F97F6F039E +243A91094E3CCA88A899A347BF94CCC8A733EB2A9F646C77A2C2FF36939CDFD1 +4AC0BC711B00B35B6BE4017CC994469CAE8500AB667153C99E9FD5CD386F114F +8ADC7426D9A1A229B604EC688610D0055F287739054F9BF7330C1716182C3A3B +5B1991C09C75D862DDC48CA11361F38C387F7CD147122BAA0F7CB1C8819006DA +7257789A3083A7C7349114871D8AF42677673A3AF007E9CEC3B27A63EEA877F1 +91C5820BA602AACC3351F64EAD99EF9D5AB7880B3949209CFB66A810673BB410 +73C7056D04F2CDC9457E790F649951B3AF95ED7DD5D9A97C1D7F6A5DD76A1B3A +9AA803F712E73573CEB3A1CE391D276B3FC20E1FAF2781FB035D7B1098E9692E +2E6909273D14F754778387B24C4CCD76DC6EFBA53AC2334653EAA12D96F986DD +44B283C6370D191113A5DB4F972FC2FEB6C7B51F6A41665F544C8B60460842F1 +869D4FF7A64E884830B866A7609ACC4B1F17B4337EEDA863FDD72AEE54113C65 +53EBEC75EA24C5F65FA0AA7321D24ECD23843A0317ACD32D09B1F3F690DAFD5F +0C328FDB63A9388B128ECDBBB6AB3C8D054D80BC3D2C6192960FEC592C295CE5 +503308B68AC6DE1FE8A0E6535FD283CCBDF820A23F399746BF54133535A5D7D2 +42A1BA10E73D90FDB75028936C4E6EC5FE86732BB869BE527E1074AC01CDF755 +AFBC2855A2DDC8B44AF4FE761E58B04E0FB1FDCEF4C45AEFFEC84AB88141D4D1 +038C6035009977652A3279A628CB134481FFD5281CD073714AADB87A8191A762 +912F238557F6A1825FC721BD32FF20E507138D479CC1FA57060A86C3748BC414 +9F475A5FC0E6096BF9C1E6946FBF9175C6F03D94284A214A83072D75CCA5FC40 +121EF84A9778E42F4D96D61B15518F855DC40A09A25B1221AC6FC13310F17AA4 +CBFF2950B4A6BD40E8DEEE0A0CE86A3C2314932C1C8D1651CBE2BF33C2A88ED9 +1DE9D87287EA84F2E6A4B9BCC914884B8305D9BBFCAAA91C52F44784F5B603CD +3C2106E067669F67E2371AC3BAEE828D14114AD032F9CD2D7607AFD9D6C4D170 +DF7C005B7085736CD303E6D18C64488EB35A210BDC5E9BB3B20B55D4DF6DDBC2 +B1BC0099CB2C7CFF4DF3086BA81EE3309D8BDFDA4AA59727E8B5A7D7E520B0AB +A1A123B776311DB50BF87E9E22A4C4F9A90ADD35397FEEB7C090A029A98D332B +B44D8E8DE0CDA3A605BCCA9A470A965EF9F3192599F5B2218828A88AC877434F +D7EEB17744ACF3C9E5DE73B08B1D49B517B8DFA306049D2F381CF68E47B6A85B +2C9E6C72CA5C7799FB6C71A79AFE7F00F96B8C9AB952CECA3FD3EB815BB3EB68 +0FB79E838F1CF01790ABB471298D304B18037CB71F291EEAB1D144B7F64A70CB +A1C754B12AD657D1CC0DBC66B7E6F93ACD9D5A8C7B36F959A99706B9AB5B3332 +7A1DBF66E13EE0E7F7EF900BB6B2BC14BD0F938E2E27E41FF4FFA8296EC1D829 +A58C7587E3BAC293A5FAFE95CFC4F8E133ED5F43A5FA80524C996B32C8E54B90 +C3BF4B3BB002D433D22440868DAA1061B9B95448F0425C138F877EF7CFD481CD +15B29B6CDD5B440D64C4246FB79BB080CB85477BC3E09A57AB9CE155339F2E50 +5EF003B07A68B6769C8D87621A69BCA512B59192C7D06CB4461B9C8FB29C8319 +2872479837E3EE93DFB86BC3376EE661220FFC3F5283C00F043FC5AF4C089E91 +F602DF07DF62BB3990C59490CEF80B1D736811157BF54FD83DDE66EC3B040A4D +E562EC4B502796F8602CC6F8C67A03FF2C6471A693143F57DBB5017C41998F33 +F6DF5B2C297C0C44C89C55465F7C0C2CC7846E7D3A096D7F6AC4B15D65704642 +CA4359A7E20456BE1AD12E5FE803C9F513912EE4584B522819186B8DE6BCFC77 +00F36A9CA7AF968675B0272A3DFDB13AB5AA3E6CB0B77E228F7A0CA45F45BA7F +B7F065631BF416BCC832C278C4AE249C3DBC77FE7CC5163D06AE9771471C445C +214E451884A7DD7E6F4D110EAA5EE71F5003A3FC9218EBCB2CD5E5C28BBC2FAD +3F4829CB50BB5B91DA35CE8E00B33DEA993154537396EC1904BD155F4B01EA4A +3F3BCD19E3F3BFD55A974A5518E622CFB06D525B8CA92AD7A290DE6D9FEA242B +8B89E069868760DC9BEC1E42EECA652C0A1CB4C1763AC63A582BB15120BCD29F +C1C5FDB0D353CF18385EEA4D99C8C69BC4B76921096870B2121084CAA1840CF6 +08AD34B322CE5C4AEAAA670F74E244EAF893134777DA2769A49767B49823AE41 +59CCD7B86F6B4532F672EFA35430B57871F768574A064C6EF9FC353BF988471E +921B377B6DAFE54517B3D3276CF95E5772B619D3430E89F2A693E32A6A15EF87 +017BC9446751B38B373C62EB6C9287D2C1851634A833771ED7D17FEF8683B643 +17B1F717FB3CFBFF9609D653E407C05B23567A5BD2E624250D69ACD2047F3A31 +897740E407D6FF79F719270ADB6163C47E6F97987BFC36AA5C0CE086FE19BA89 +688E90A92EA796E87C4BBC45493FD57199AC96BBBBC3677ECC3CA3DC5310E414 +65091454BDBC56D276CC3B1904955A5FD555C7CB3FB3C99837B7CF398CD00C2A +1273AEA37A40A4317A1F9519D725960ED08D184C2B42B2CE4D490CF870D88353 +7604CE9F854D134474F22516F9DA1D170AEDF6527C268D51693121D3E7D6F43A +5CBF12758A3F70D547ADC3388F8DB433B08C7046AF624C08BE63437B247F6E14 +922B66AC15F172A23F71AAC52D95405D851381ADB28C5773304199135FEE8E89 +345C35ABCB6FE96AC1E85ABF190CA64D8872E4ABBDE787E59976460FC0889076 +4D9658B6D71355053D5F200D25ADB1E529D8A8BB547C7DA5F4DF91614FEB198D +11A5B0ECBC8A9066C145A44B2E76DB97C8B964FE4E53EE9981D91814ABAE1697 +F003014BD58A125EE73C50CF278C4E7624B8387B496121CB8A41F13E076FC452 +9CB0962308EC2BA763565C6CD88AAB5EB9D499641BF50FB904152F64FF94147E +FBF463E3CAAA3C5409007BBF6B8C60654EDF9FF305487C45FB49491EFEC6F8A4 +5E417E861B0B86610995AEBD0479824574D9B8FCA4875B43E4B89E6B3CC785B1 +E524D81EDAE69E2B71774210EAEF78326910A836405A87A37FE227473A034FFD +1DCEB3468ECDA953BAD29F12DAC93653F615AFE7D374C7FFDCE9C15E52D7F2B7 +1D3CEDFD21059E9FF4B7E1355DE12E9C3B1E6BE7E4C0E28C5F4EE8E1514288EF +A0476F13B17388C0676A16DFF26939319C14F72AEEDB6D4D51FBD5CDFA885E36 +F49C78A363D0849A956E9D8D8D6BF45AF42C1630F2F01925CB855AC9838E9A91 +8467F3E1DA6B4B6473FB1EF853593891E2095FE159C7AF24E419B743B135CD42 +E89823DFC5F316D927C3956376C11375371AE45C8BD02E502DFBC9CA56982B48 +B69285102C9B38972612B3DC8AA9C8AFA35830FBD3CB7C9CEF46AA860DBAEDD9 +841063BCCB67FC242D63014362310F3A6BEBC614E67AAE395F4285604CC37E94 +4CBE201FC1085D87303503E39CD9C338948287FCA7F351E2B055E75F497558EF +33772AB2035A24C19D962E63397D7F9ADBDFD8EB3BEADF4C74E0A7B21E6240F8 +739237CA345BA42E0C6EE14D7087F655420E98B052199BEA5F71CF8B629D7518 +584B37E3B4DAE3B002B9F56A06D91A91DFB058096E4892C78314296C549EC7B0 +893EC4E3324B33E0CC412CA96DC4DC97AD7574FF232DE50AF0F2B581365EB7ED +A354613092C87F6088D8B7A1E702282F7E8FA12A1675C88B4A2A4DDCA858C14C +DA96EA3ACD45A05433BFC8502A02B5737D1F08534FD794A4022178F87A2C26E5 +10B4956A095EED54275C9B822E65D256F02355811FBF6B036E5F46B6F5EA4E05 +F3CFFB4D686A7A7501467F1BBDE90345A1CFD75C06A59A2315F35981338C1B0A +65094CD2498E40233CE54E475A6F3E139D215CFC2996CCCAFF9B76FAF0C4978A +CD54E73E7BF74C11DEC651602FA5B8D0D85E8A173599DEC761802DAB5157A40A +AE177E59E1BFC4AF440FDBEAAD87E9E702214BC1A378B0127AA405F26AC727A0 +2046173A3016A387B2A00FEB03A1EB4001017193B9DA6438792983FCCFDE2D5E +BECAD57F8CED5CB7002ED3E626B5477EA0108E85ED6D47BF044BD6C25BA9EEF7 +8E6A6E55179D18B9B652D8E13AC22A6B3DF1BC88F1FBB5534FC306D5473BF3EB +57014EEFA1E8D7E719D7D17DFC71830FAE02298E45C13573C413E0E5DF7EFA1A +C28B04DB57F3527364963B30164A58424C6907F7038B7DCAAEED91F0FAE03E24 +521BBA746344E36CAEC164EF0332475C75B2ED03459390C2BE49CDDA207A24B0 +BD764351D17B621D1933B2689379D15518775759A1091937EF8DC2D161BB4BCB +A15624C7AD3EF06162A1DAC94D8B6C6C0AC49F95FF6C5C86 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR8 +%!PS-AdobeFont-1.1: CMR8 1.0 +%%CreationDate: 1991 Aug 20 16:39:40 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR8) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR8 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 12 /fi put +dup 34 /quotedblright put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 49 /one put +dup 50 /two put +dup 57 /nine put +dup 58 /colon put +dup 65 /A put +dup 68 /D put +dup 69 /E put +dup 71 /G put +dup 73 /I put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 92 /quotedblleft put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 123 /endash put +readonly def +/FontBBox{-36 -250 1070 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C +68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 +3645B82392D5CAE11A7CB49D7E2E82DCD485CBA1772CE422BB1D7283AD675B65 +48A7EA0069A883EC1DAA3E1F9ECE7586D6CF0A128CD557C7E5D7AA3EA97EBAD3 +9619D1BFCF4A6D64768741EDEA0A5B0EFBBF347CDCBE2E03D756967A16B613DB +0FC45FA2A3312E0C46A5FD0466AB097C58FFEEC40601B8395E52775D0AFCD7DB +8AB317333110531E5C44A4CB4B5ACD571A1A60960B15E450948A5EEA14DD330F +EA209265DB8E1A1FC80DCD3860323FD26C113B041A88C88A21655878680A4466 +FA10403D24BB97152A49B842C180E4D258C9D48F21D057782D90623116830BA3 +9902B3C5F2F2DD01433B0D7099C07DBDE268D0FFED5169BCD03D48B2F058AD62 +D8678C626DC7A3F352152C99BA963EF95F8AD11DB8B0D351210A17E4C2C55AD8 +9EB64172935D3C20A398F3EEEEC31551966A7438EF3FEE422C6D4E05337620D5 +ACC7B52BED984BFAAD36EF9D20748B05D07BE4414A63975125D272FAD83F76E6 +10FFF8363014BE526D580873C5A42B70FA911EC7B86905F13AFE55EB0273F582 +83158793B8CC296B8DE1DCCF1250FD57CB0E035C7EDA3B0092ED940D37A05493 +2EC54E09B984FCA4AB7D2EA182BCF1263AA244B07EC0EA901C077A059F709F30 +4384CB5FA748F2054FAD9A7A43D4EA427918BD414F766531136B60C3477C6632 +BEFE3897B58C19276A301926C2AEF2756B367319772C9B201C49B4D935A8267B +041D6F1783B6AEA4DAC4F5B3507D7032AA640AAB12E343A4E9BDCF419C04A721 +3888B25AF4E293AACED9A6BDC78E61DA1C424C6503CC1885F762BE10AC538E4B +58C4B6BE0BBBE0D121DCD89FA1D8532F91EA374A83705EFA8FD4DFEB37C91DF0 +C1459A641899007FB972682950D1380B4537582E33C818CD46BE14D91C44836C +F921476D1F55F6225310120A5BF9FC29E9B3BBCE29CEF9FF78704C59022BB254 +BB0981F6948E37682E172ECFFD060080860B58BDAEF87EE9CC9606838CE391E4 +144F941CE0BB5A49FDBC5BCB2A47011EF3E7B4CA1FEB87503D5CC5CC0A4BD51C +D5CFC57415CBA0C3E89A334931243678CA19517332040320E2544F563ECF0A86 +542D89C23B40F671E78C8AD864FA543E49F43685DE66F6390C67CDE9CE1389A3 +A85EDBEC0A29C42FFF201BF642D9761D61E1BA6499B3EB61C2E313CB84E38ED8 +6F038A950AA7A3E12A60C14BC2A48252F1FC4A24049A52A9993FE1053401CE48 +34CDE4BD2C865DEBF6EF2E48F7C085FB8976B37383C9F8E3D4425417DA2F1DFF +33A95CE01B3BE1CAFE80D65D56AC63CB2D873856AE925337292925402BBA4CBF +70EC76AD6E5229CC4CB2B587DF328F780350D1E4AD579B4444F7BA546AC1AEE2 +C6E4BD774D3BF38E11F397F5439157F3CF809955C7927DC8CAF7D176720843B3 +6505A59181085C4F0C7D31E6A206F3C4CB427C031C459C797886CF2410745CDF +4C24248346ECA2767CCC3A3DBADA103F1A6A7C94EEA4210AD76877733CA35606 +BDCD78C5A626F031B8B9E98D91F2BAA7ED9C2AB4954DA5DC94FC48C859BB5B31 +43131A021C9C903021ABDAAE0B20BD5A3B28A51CCA07D41E5A99C1F14072573E +175F3465C772B0F4056E2716BE5E008D0FF1BA87B639E2B4A8F88539226E38DC +732CF5B742D29C364777828DE30F57B2A019A932A1544E8AC5841D6782411945 +B76ACE4C2562028102372626A5A264AE3F13F746F3E478D83C447F6AB7304D5E +5977DDF5C254E328F84FC29EB6E3010253BA4E6595364F15F06CA446F0B5CBE3 +578A9AEA1738D94DFB906593827521FB920B876CF9E89CA2E21AEF896492233E +D81C02F646907E0532B5D646B64EEFF6FA5E91AE6503954A7B60883FE7B08EE5 +0648FFE45080B84B9563E98A3F679DE8E9BD3FB7A1B2F035549BC2BE6766F4DF +A8400AE7A70C499D6C49264A77252B2D3738E666D7BFA5CDD9F1A5B203DACBE5 +F1EE7FF770A8A2567626162FC83143451EC2648AF80CC4EB48DA17BF683067DA +F465A3C6D4225BC2282B4DC86217CE5AF2F731D07A56FD61BA12F7C298A3D7B3 +B1401B0A31D378D5E15135C014F563DDFD8476AD4A94E24CABDB0C1756F8AF17 +5715B2F045BCD1E40FDF22A58F87C593DDC28F5A1F53A089296357878ED76CAC +A1E269C56FDA60DF76FB52F1950883B47A5E0DA7119ED98D56ED590AD19C1700 +34CEEB5576C8CEF59A22A39A026E0FDCF96205D452BC8FAD4D119E8E20DDD104 +9D7ECED52E420D85995B9F7969E560C7A49B3A4429891CF29E658D88D6AB6B1A +0C2854552EDE7C2F6F4488EAD52EEA40EFA7DBBF91360A062B926B30B78AD6CF +75F05CF91AC211C71A7317403461A525BDFF08C380FB2296672D864FA77BABF3 +D26D94EE5558F0985170F83730FBECC03E4BA0BBE3C3909CD9C520F05D8AD3DC +77C649A03DF750A1441E67954670D427DC267D13D5C1C43E38110378F66F7C83 +3AD0014DB37AAA9E1F399BC397FF7359FCCC7CE758BC69EF13E50016376E98C2 +2CEA7397E8EB4F96E2C9965A088B061063D5D8DB68C96DD3662363A929CD947B +CB477012BE5078D2C1E8B0179C57F7F67D3E2707067E27DB122D6563ECA39B2F +1CD189D785354263449E0028190D7EEFAF6D0424509AA2EA43F6A53B95EE3FE4 +82354DB8E3F7B7833F9B55E35BCCD28F608D3A9D8C4B81E588D3A15DFFCF3B66 +4B0D156B223C61A568D8451E7E65B473907900B5040E3486FD2B0E0E0A5D24AE +6D9406A9115DD0FC8F3B785CA4CB8E98DC1E7DF922485BEAD4AC9BB02374E852 +4960719075010F730A748A9E5B909A02CF7EF3EE368DDEC383D4FFB47A5096FF +6139811F850DB3E05910EB07D2F04D7CA61FAC4DA080161127F1CF088BB0B9C6 +376B635B2C57F30F7D594CDA88B2ED752D395F360DB50269DF6FCC0DBEA85839 +906AC2E9FCD5CB3F003E628BE01FABCBDB76FB97DAF6E5F76F2FFC30FEA042C7 +2353540DE16611F350A256E31B3891A38F9ABC2970651A3E2E48D6817CCA709D +A499AF22F1CEEFD30A005DA4CDE594F562135180985D21A5B180991E501F3CD7 +E46DBB5ADA616A329459559AF55E9C3C85BC89684860D5D9D0C798A213279CC0 +4AD06C510D69D922337E57789E0CD91D3F804341A7B803432621F3A166FFEAA0 +01A382152D1C61747C49C668B12D24FA861C72543FC3970F9117F454792A7349 +3BF873F2BFCAC89D0C17DD4898952DC1E69AF87B68043B385F1411EE9A879650 +ADA6501475945E5DAFAF42EE3E2FDD7868F01C17CB28A292DE35C305CD1A9FCC +8AF025E0AA1FFA9A579E0672257A513116B346541F511323FF26F57D2CE59501 +84BB15C355D729B0C41C20416BB3AEDE66F45D6D6E98710321D3B6ED8E718626 +03ED3AAB1DDF52FAE18C29F48C6CB31735A0F45F4188A1AA3C0959EC53F7CE05 +757D437A569826D882AC4517C33FD3FAECF06F03FCE758F9A777C629C44ADD0E +20DFFCD9976EEB5158BE2294D3691296201B19DD837779AA946441E673AA7AB5 +90BB2065E682F32A1D46EC589E3F0184A73AA5743765D6C53C137BEBBC9E01C5 +BD9F07165EB6C77393F4D4861A5C4CACB7E289FA428514C3C8045804C61B407B +2BAA59B8CEE81512382CF039001F0EFAF69EC62AF9BA2A4CB53874F0D93A2F9B +E74F9A58F9E317FCF8F82697E47665E55D518F607E6285CD826B439A775D4971 +D8EB1D2825633446806D7FF9AE54F62F82F5E00D2193DF1B23CC0A3323B8F6BA +654BD4383D0B476E52D381B99A3424A7F6A5DD1F7A807531799899E8ACA483B5 +08FE009CADC9F07121703B6DEEA0284B941EAD7D53ABF0E172A4F6F4FF0FD280 +F95BE8E25E9C01A4EDC0D5AC0500A7AB8D99E5D7E7816BA87C9E913BC14D8FB0 +A4A145C0E398CAB10B7F281213F96B848C19FBBE3985FE439420277848F91C60 +E90EAA66922DA62B69A14648DCEE900D7CE9C87F3F375DCE4565BDC0D6B05CE9 +A418CC881CF0266C9E0FF3E02D1EDF4F46488B36595D534FDB419212E180E910 +507044EF09D562A557636D5AF6D1D6A4E9D6888AF4AC91402C7E67FBED2B88E6 +947AAC3C8840DBF58286C1B94FBFF1BE0732896A26F61F772FF979B667D4765E +CC8380503610158EBB18002172D612EC5FBAACF8A724C7AFDAEB22CFD018FE14 +EC736E2D256FCC47DF8117477A7AD858BE6D8986F11762A775DCAFE44A81E309 +A16C619EBEB9623DFC1667C600409C30190113CB87A94512114E8A2C0105793C +8A74FA831F05C81ABF13786372681E1B3892C648867E75D2C7F5D501520B64E4 +CC0BAA74ECC6A2E033047CB14D854E7A198C181E3E4DF06A5EFE9C6AB13E65D5 +2172BFE493DC0C75F6A5997A5CC6F7A622F3F9318B08F32C3FF8A7ED14BD9743 +58E8C60C45C858F5145459893011E9D40A667876F48633D079C347BA66CF02A2 +0F6B7A08159EF5F4D71D370E18CD3159A17988962F9764640E18F7CD34707E50 +D46C7BE1466703F4E5A76FCB59FD68C6DFB4A205E770FD1F11811B52E1A11641 +7720ECF4B11FD3AD44C2FB5E37279AB0C320704A22B8F6F70F53E0F47A619F82 +D4166E5B7C1EA0CDC1FB1AD52A6FED667D61A200E64A15D2C974F07457BA976B +675764000F46AE8E91E351529562B217C9E9A3B93950ECF294996317EF4D929A +81A8CA086E4A7242D48587A676164B7DC98F9875D14B044276FB4A031845FD38 +C47BE4F77018375BAC63648275B477024FB35208B4061A495EB1A9FC667DAE70 +F417AEEB931CEE0C9A435FA3BD20144ADB5473CD137430BF267ADA3FF5E333CB +C80B1AD385E05F347329E68A1B2C7C0C05EFD8F49398922E9C6DEE3BA7198C89 +30B571D1B1AC79CD7390A46ACFF7AF92FC99CD10E9BA4407A2DB70D4BB1FCAEE +FC662BCD66CF83B63A2B3A9923A56B0540B72510E498037AF9BE8DD385F32BBC +99A202B137D4C540BDBAF6413877DEE14B26D58B357D8851CFB751DF2A2CE7D8 +F772D98DE7DD4A9FC7D4BA8D1DB4A439D57C9DB5F8F93D889D70E7716036E52C +5A92CD4157C0BE9FDD4660414AB9F29428A7407AAC0D28793BE17BEB46D9A953 +D5D5F27C852CF88E50BAD670BD0847D4E1B167074D2964AA4944DB45B879BE86 +9C56BF924719799969C9E7DE3FD0196F3CD0586855C490C430DA82B220D8E86E +767234CCAA939F9AF1FD74225DAC5746F3F29A8C89D001F193FFDA7580BCB069 +EC4A0F13D6C9D261F93055379E8E6CAE8359449B86057B2342CF4BD51787BAB0 +8F2E2277C7DE40A06BFA90C93C7F5DA6A3C71CCDBA9D944ED7B014FA426DB638 +1B39A364D6B98B631293FEDF6646F5D9E7B6BE216DBFA565907E308669012F27 +A84890F9E3D7B1BF61E831C8ADD8BCC441D02D964E6BD3128AE5030611AD6048 +66614FB904F2B8722DA5368D5E5FC7E1D60D20F2AC08B20E4E1FE618984C8A61 +391B281C55476EC56D1A51C1B1D39AF4A10CB0448B6AECBB9B014A233526B6CB +005610C9228DABEC64B56D1BFEAE81BC1E9007542BE5C47E3B05CF109A1A6709 +54EEA279D32E4040370B58E33B5A1A1D80B395A8AB364C88C2FDD3F7EF449A41 +10180533589D20244E5E0A65C5F1D4275434E19B8AFB84DCA93AC1937C6C2CEC +4A420730B464217660843AFFF049A99426D882FA2CC3680CEC254C6E4FF81C53 +4978AC63C602DBFDD81D14D3964C4739A1F3EF4B15C98B7A73D26BBF39F27559 +2AB8E8029F6E83EACFA1F8DA09CDF2562C002BD9367EBA5D682E5425CADDBFD1 +45FBE01862D7DE9D083C95502D03C779E8A51DF6131EDF12488396D512AD24FC +411F248AA851B54E399B81CDBD605919771A4F3FDCEAB92274EFA582F59C7771 +10AE7AA21801548A13EA8532E0543A9C560C20EE3C73AA75FAFA795BA39372E3 +0DE80F5F47F7AB05B4F21028EF298247B51ECD3E34E0D4AE3C1303958F0CDB35 +6BE93BE9D3014161D81A3E863F7C3767F5D82284CA2605E43E0CD6C9A01F3DC9 +433CA526AC3CA43869D1E5AF320C19A7A034C03658C30D5A5A72C25B4ED43ACA +E14D6B8C249D6E6D0C9C291CE0CBB404060E837A965A1F5D8937F681522BB956 +FA363C842256273A25E464B43A19B86DBF9EEAB1E7F70EEEEEEF3F93EF54262E +647DF4701506F4B346EECDF569C85F7D03B29B26D1E8FAA28386CE07A9BF8E3F +8DCA805F2CCBC55A6F5E32E50E32026BBCB128315E2D35E35EAB1E1C142D8C4F +CAC940888BC1DB394595A3F748C9CFA2ADF493EE70A41C7D26556DFE9DBB6A74 +FB23C9AC863CB34BDCFE560DDF98D231876003A86C5714BF76CD3CBEE1052963 +44C200A3918E0EA3F51231515ED5449E9B8F06B451BA7B124F05634868C24D2B +A14C0511EC27C28E836F76F1765BBFC3E9AC484721768F0475B3C98C775D5B70 +D9EC58945DDACA523EFDA41C4830A26E91E4C8D2006708EF956C7EBD7D19DFBC +DD20A6598F6894791A6C032DC5E6540597C97651D50F83F6A430E931DDC0C516 +1EC297528B9D72B9787DF9D6C9900AFD7F5EA607F790984984FA603ACEA8D05D +20560237F60CE521E9642CEE775EB04806912A01AB73EC92FFA64AA3A84999CA +1B57C6C133EC4B6865DA57E83828B8AA2635B3EB57F64D2D90F9AD559E049FB1 +26886D577CEED6C370EB6A303057172B46F443FD4BD9FD0E0D50CB441D970151 +F01DF840CE3DFB5CDA9104F4A4B6634693CA32F6FB73A38F3173014D8E1CFE0B +B163AFD91EA1D945AF548065FE55AE954FAABA468262E8BC19843EE3E11125A3 +CB3F59B3E32C6162D6F2C58B2CD5D28E87219F9A9A9722874A9B88911425E31B +EFF198DF3480030F6ED1555C91FF3DB151E5A566819674659C25271450CD9354 +330C9B1CDBC54E4DC98861764E3675C336BB5DF130A43BBC7B8E2C5C40D16C94 +033DE6EDCDE05F232B3FEF61EC182028EDF281F42591D1F597B4E424F73BBB10 +F3EFB5F275E722213E52AB94AA6D767A945E3E82F9A217B786DFCFC19593A88D +ABE66FCDF794E6356F991B754290088F9B55219AD3F20447B56716119A483003 +99E284DAA7321A4129BBCE1D9A58E7AF7C65994BB62D529EE7EC99CD1D1F658E +C37052410F535ABFEF7B401D0ED1277CCB6E18179925F6E7001330F8B939F7E1 +605C63BE858882DE246270507A0A1777ED4245DD7CB2FC4BD49CA6F5DE6697A6 +CE05A3022C84ECCAE8F0F1500885DD835E13E5BB336B208CBFE1870F80D52912 +3F777D348EFEAA77DA609ADC6D53372F3E01182EAB8A05FC4B3DDE07CCB10BBB +7441A3F2E4AFF140F6663B7DF0C96E804BF35AEABD1176D94B8974E199B6D6E8 +97D4EABFCD54C7B4629924F22C80DF1801EF9F8482660F5CED63AA229F225816 +5CEF2B6A12D736604089E3BC6F21E30A768890CC5DFDDCC10DFA1E614C4C913F +1DBED33CAA775B1C01D58B30B57F26B9E6FDFC0F1449B5EB002D9D5B999F95FB +AE0A1D9E7B8C7A7824463B841A0565EFE3F19F10920098BC0430A3A9A1898363 +8EA14F0A84D59DA321CB6A346FA3308AB7DB8A0BE4FB3FDCCF5F46B8B4AC9203 +A6428E9B510305140820AC86AD4BF419AF9094FD60FF3463DA0258C5F0FB767B +FBCA4B62160FAD8D2419796FF10D8AD44DDD1CE8BEC22067D7AD5096B1E6B326 +3AA531227B02B0672BFB2ADF9356ECC541C556151E59AE021D9043B1847292F7 +E6E00F991FE9376CE92307A13C037C14CF1413EFAAC096A19C0A4B14B2089621 +81B47727C6014FA86F0479AAB63C4944D78A9AB967AE17F4F7BA746EADED5417 +D5BBD68DDC822C744432CCBC00587AFF808EC0EB5DB4ACAE9E55A18E2DBE88E3 +5556976658B4E181DE93AC670431D90FB14ACCC19B9EE95E7AA3317B9345FC42 +C7A38347F930152E7A9525561904F9292955226AEFD2CA05D9823927FD34D582 +0139F662DE08AC60D0456883744557E9B78C6A4F2E6B7535B3F5BFE1754130C2 +C9BA2B6493F612D4307F183D82723FB73653EB980A379CE58FD7E8B7D688AD7D +CED57CF951D0B0D00671C9E0E25C748379A8BC89475616670952E796A1804B4F +30D9A6AA145712D1C1859A87FE4C8EF8210E9ACFE5193261183D0C170EB03C12 +84EF83013710D350AA0438C0EA0A9D66F4350796327B12019E6B4BC708094ECF +CD85AD6FFE5D5C6A9AC95FA066BB08F44AC97E8445FEA67E3520BF38024801E8 +912FAFDB543124BB8B03528F372B22FB2482D7667D57188118AB1C95B46AF0F1 +ADFF94D2E39D73DAE759928FC0D2F7DD00E854ACAC62B9D783075666A0FD9909 +99A6BB222AD272EFA07C9F4E62EA6E22B67C363E5AF7335CCF18DA0B59FB33B7 +2C352DA67F87B28AE464D1EE92E38AD396DABC9ED22CD973BB850797FA4BA155 +549F071280BB12C7A9B9D1834F32A3E4407963103ED244226E5892F5A2EA4144 +EFF6A0C4BA24BCF45B9366131D0C09D69AD50E1150859BC44E283EB84D257AA6 +F970EB9E48F6B60C8180C169626F43D5A232AD674B7438CAFDCA244F2F711FC2 +E50BE43FE379B9AB380882CD15CC1272450246E8FCDFB64E98309BE6FFCBFD43 +BB10D1826CA228C0C0331CA36216E680680289445471AF6528D2E3E4F6321298 +10B2D6AFFC5EAD6AA8721F46515473173C0040D5425E1D1BC660C864C5011FFC +ED996B2083F5CC11630D64B5C7029237004710B1EF765667C8DADA607452CAC4 +60A1CD85AAC006CB60786D9F566AB7E9624D571B7388D5CADF26274C7EDCA1D1 +D75D054F5D931D7950704B18921CDDDF5CEAE257671F377A0C1ABD7597D4FB29 +ECB923FF12083BA90BEBC95E93B61193595C0BE7181ACFC3F5A068E6E56026F6 +984E01B341C01685E1D306AD9A42A7DD375704DDD345647989A6CAC2FA407233 +82BA30F71584586AD5F8308DD164FD0E788555EED6B1E8B0E4484893076D1D71 +182578ED0C5C5D4DB805B7C75FF92C7A1CC96773BA32203CD0C893DD592117F2 +DAFE8C9E1FBE859D3AFE11FA068279D7B75C0157F065FA16577A872CD1B2CA71 +784CAE81D720FFA3EE1C6EA6220B253FB088698CCE811D37C9668D2F71302F9F +159C95BA8BC41BB56B7C584CBE6AEEF8D6716AC6B9C8BF657F340241FACB8B5F +863DA71BC37F91AEF5F3EC379AAA07DA8BA900E45AC3888A1435980BA7ADB033 +B4AA9054F9E855E1973BF162EC3F4DC2455CBD98FC31D5451246CC88F3FF5CDB +22880E3685C97149CCFCCF7DDD19B7AD61B46C8762194274F48237098AC5EC7C +F2D7F56EB2AC91CC5275D7D0838BC76DA9E0BB1F1B6E88F439EAB042B3487A77 +3694AE03422D5019416920E7D95618B24B07A8D2EF7F6C22EC67F22DADBF1499 +2A2CD15EC4B518BEF37BCF67EE085B7FC3D32F56EA6EE08180990371E83B1327 +8AAB1973E6DA6188E1732F4D66AFBB39E7C21E1A6D299D87043B0C86F6811B8F +A1B87646692587220A4AE0A91648F3E86BC6343EADADE07D89C674FDBF6CE091 +3C9BE0501AD4C13CB61B8985CC0C1FBA92A213B688A3DCCB1A13016E3196B7E8 +0B987D6417D7028DF1A94AE0B996962B085AF7584B0E29AC9EE2C22A7D124702 +F26855ACE2E21939D1746E843A679DFA46D7293F08CBC31EEA3D005D87C28B05 +D0AC1ABEFB49FFC9C5859926E7997A1F4007827221BC9077222208A7E6762563 +009E297BBADD0A33B009FDCB4EE02B6D1A5D4553C2A6A3FC4B1088E764F40A08 +59C9BA931D73143550D8AAFBE07891F64D4F748A3AE56F3923A8A49FBAFDD8CA +22A757FA39E915E2002D1D9EB83FA146FA8FE4A375CD8D8B8BBA8F3054999F07 +67F4BE0292774E5B221075824D3D57161860763927D2BE57F82CE63D178AEA54 +24FDDB4B529145B32BDDC83EDF5918FB6930AAFDC21E1A16A8F64007455DE27B +210CD374A3FD8291594DD90309D97D53EC23D2CE5105D54EAD696A035D72DC92 +98375DE338BC720E939F763BC5A3B9B1CA9742AEF605D4799E5149820B09A788 +F2777C9F485B2748E6DC1EAC03EBBD9D1160F679841BC8D068767A70E2503FFB +F16FD289760BED0C149CFF778B006EAA6D10E2381B853BA57557640F76C44F93 +F6A3FD5EAC05027F2CADC059BADCA6B2FA2380C7E24F91633804CC32F93AFB71 +42FC3C5430ECF3C363E9363BA165507B1E631D80919D740C83048E788E27CE03 +481334F41BDA50EA0C5AC08E45657210DF5E9E9049C99BD86075F7AEB96C1DF9 +812339D5E95DBB961A6CCD4432A842AD176C0F11DCD32044D5D4C3CD870A9C19 +C2F8F8108E94033960A12FBA170465E5BA2ED2B427B5C4259FF8D51248DB80C5 +778A7DC0CED69DCE784AAA3D3FB236C8CDF9ADD9E3A8A0566A15B95481D64D1B +3361C657A586B9E38AB0E98C6C67108DC7BE7413948E4488A1EB2E48F5111699 +3D5655D6B7F375FF90DC89490ADE36CD53B969C6B1491F020E70F926A4002F58 +D80516B0604E12A9EB0AD9F8369D90A690F390475F046ED82837106B989B081F +AB718EA8337DAB429DCC126F80E23217C98DD8EA3449A73C66E6E2162E7C3475 +739AC26909A195E6FD34821FCD52FCEF60BAB85D81031B93215BB137E4D7771E +6DEDD8C0512406BD0509050F499B20174F694019D33AC7B9923F11F9EC9EE79A +75DC1C6E23D78137543F3F39040144A3AF04075C8FCA201A18FEDB3A9CAB10C1 +BDC2395425B27631859D655AB5E00AD2E7D044243AF8DD4AFA7E898151B94AC8 +58B588E4E8C3A8EF78DBA31C88CE8EE5B9581B1894876327366C782E52A05004 +D14CC443A6A22493C70D7B32BBE8FEC14DDE0DF75EC3EDAB52A7D5AA1B41AE09 +0279F8AFF104EDBABA8BCC9E461E4FEBC5CB3D2FB012C2F0711FB4A12CF7E8C1 +E973D8C32EB71F362C6743AF79F86A772854DE6B4FA36ACCD814A7AEEE7D6BEB +BB431B064212DB00C054AB718D2579C22E81A6F49C76EB7382DA8A1764E04A74 +C67BE4207D93279A70240793BC6A5358E97D119B3F9A6F7DC8858B22BF8666F3 +91C9E444FF6EF893DA7454AD98E7B0BABF9615205979A8A69CAC43A9F69233F1 +BB922EE0DA52E8F41F955AF57586DC3BEA16FFBF55033CA2DD8F0C55297FB0B7 +E6CE026A3F2B08573DB1E91A34AED33429680E544A30108C90E597E8BD39BAE1 +75C4064951CFB38F1A64AB2AEBAAF6806DECE33488B580D9F9647EE41E8F9B0C +7A199225C9174D025B23A158F4F04D76B6BB9F5B78DC168DA7874426EA616009 +9BBCB08948CE5FE807C0979F61F386576329955001A680DAC16D925577DC20EB +E97243D030BF16DD5098275B6555B366B59989DB8D79D509D5775932DF6845E5 +4769CC4716952EE82FA2D09C4C419137B84E48EA64C7E119B43FA7D441BC2923 +35B8B5FC2A8FF5D46503AC496886596048611EE35DE217CCBBCF01749BB933FD +20C50750C54259A7EC0B2CECBD752BEB13A899D4552292D77F4B64781D61F090 +D34D66C2C7C6BBC4C85016A46DE2637680534300A04CB6E0C16B5A7FE654B06C +4FD71FA1A17B0E4A067CB9306A1AEA6CF5A590DC0E30961EDD056D60D6366819 +B3EC4E7C6B9E0082B86363666C83565C80FDCE6152F3B6607975822AA2897B78 +806881C6B8451B0C2BCF1FC07EB24BB304EDC5E64E777CCFA2B86DCC276D185E +8DE6294BEDC1FF52975B1F017327E27C04B121504F45CAD532164CCE73D4CFEB +3D216F46F9DB2C1C58EEAA9DA74586DA321A742E01C61773AD4D39261893DF6A +63F22F80F02B38FAF41D188F923F889EBF1B0709E34AD60331F323DCF2097672 +7EFC30127AB402A3C4D9C7AE88302D5A7B91247AE89AA98BEB035DF51954A42E +922E73FA4A66E378C6688A1CDF425A48563049C30216CA209BDF479914039327 +EB9175B4C8EA399F0BC02F4D3A1EF795F1F774D9C4FDAEB1DA6C0F977A4B4C5F +FB71B7790D704F4DCB3ACBA2B32C0434635DB7133E5EBC144C2868AB3C4E67A6 +5C4D347D0A77A23681281EFE53FCDDA9DF62C7AB0F8B537BE4B22544B5074BE8 +7B193D2B5339FD46A62B8B14E6660BDDCB157F016FDEA3ED1CB3CDCB5CD7E796 +2A12A21CCCC0E568D56733CD6FFC3199A776E31F044A32801203B11EED7E8BA2 +F7153E9ED49EDCA747A48D8ADCBC4CDB33B9E530FD51AC36D43FE8BC19B07311 +D765E02E4BAC5252B9DD5E0D02C554A25607341E5C437192F2BE10B8D895FAF9 +BC645E2E714F6F2E9716AB7AC7706C389F5A072C222D808848D61EA3222F935F +A58A4D0DE506E6EB351396E3F53AFEC44A0AC4CC6B22064AA6AC79E8BFCF477B +36311FB56CF3F2F4CF290610E4C9EC3FCA898AD685B083593A0355BA6D68BAE1 +ECD13F2752EBD5082AED23542184F6BD0820711BF6889F74335684720DB88A0B +D09973122AD44C6F8A29524427AEA937799C2A5A7530624872CCD6E0D5B4A4FB +71128163937E60CE472641E0BF20E5AA447B7BCDFF0430B0DC51ED862A942C77 +6559E7E729AD91B5FC8A8C0B9A3A81A7B25B79F867D290E051E61DB6584292C3 +1D3FF2A43B7F330CC4EF51F889CF6C41BC17C0A37D48CBFACA320D0F8F81FB6C +0FA345815B553245AFBF5757F50ED6443D1928ECDEA26D69132B144E610D67C6 +A097A94AD061A05F641FD4E8626FA58EC9AD6FBC956A161518732B84C1422EF9 +E70F0FAF340AA35FB904E50AE6B47F6C45A8E7D5B2B1368B45AD5B1CDE5C80A5 +9E65385C8C0C5CBB89189084E1C92C1BE209B2EE3EE712637127DD73FBFE6BFA +9D4ADB559F6F5883F215273D674784A1C4F64F79196676942D2B90840336F42E +EE44767432CFE2EBE2550487C9567C990BAF93A246A77F77AFCCA2BF738966BB +D811A2922F825AD11D769C15F24299D7405341FF867FD6E7550463DB69AC5C48 +767A9F55EDCF31421FB230322E493A5B99F347E33A811C890F69888B35045166 +B37C730F954856C8BB7DFED1ECDAF30AF7FDB675F727F6FFB931B81476DE3F0B +950456E6235B4E2DDEFB07CE3E96D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +TeXDict begin 55387786 39139632 1000 600 600 (refcard.dvi) +@start /Fa 197[20 58[{}1 66.4176 /CMMI8 rf /Fb 134[35 +3[38 24 29 30 1[36 36 40 58 18 2[22 36 33 1[33 36 33 +33 36 51[26 45[{}19 66.4176 /CMTI8 rf /Fc 242[61 13[{}1 +49.8132 /CMSY6 rf /Fd 134[32 1[43 32 34 24 24 24 1[34 +30 34 50 18 32 1[18 34 30 19 27 34 27 34 30 11[45 1[34 +2[41 1[45 54 3[22 1[47 39 41 1[43 42 45 10[30 30 1[30 +30 30 30 1[18 21 18 44[{}43 49.8132 /CMR6 rf /Fe 134[43 +43 59 43 45 32 32 34 43 45 41 45 68 23 43 1[23 45 41 +25 37 45 36 45 40 85[47 11[{}25 66.4176 /CMBX8 rf /Ff +130[35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 +3[35 2[35 35 35 1[35 2[35 35 4[35 35 35 35 35 35 35 35 +35 35 1[35 1[35 4[35 35 35 35 35 35 35 35 35 35 35 35 +35 35 35 1[35 35 35 35 35 33[{}74 66.4176 /CMTT8 rf /Fg +133[51 60 60 83 60 64 45 45 47 1[64 57 64 95 32 60 1[32 +64 57 35 53 64 51 64 56 9[118 2[80 64 86 86 3[109 69 +90 1[43 90 90 72 75 88 83 81 87 53[67 11[{}42 99.6264 +/CMBX10 rf /Fh 132[35 31 37 37 51 37 39 27 28 28 37 39 +35 39 59 20 37 22 20 39 35 22 31 39 31 39 35 4[35 3[53 +72 53 53 51 4[55 53 65 44 2[25 1[55 1[48 54 2[53 6[20 +35 6[35 35 2[20 24 20 2[27 27 20 4[35 21[39 41 11[{}55 +66.4176 /CMR8 rf /Fi 140[54 57 3[76 115 6[42 63 76 61 +1[67 11[106 2[103 3[108 6[108 1[90 1[99 67[{}15 119.552 +/CMBX10 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin -%%PaperSize: A4 - +%%BeginPaperSize: a4 +a4 +%%EndPaperSize + @landscape end %%EndSetup %%Page: 1 1 -1 0 bop 158 -320 a Fi(GNU)55 b(Emacs)g(Reference)f(Card)922 --185 y Fh(\(for)27 b(v)n(ersion)f(21\))0 56 y Fg(Starting)47 -b(Emacs)0 251 y Fh(T)-7 b(o)27 b(en)n(ter)g(GNU)i(Emacs)d(21,)h(just)h -(t)n(yp)r(e)g(its)g(name:)36 b Ff(emacs)0 383 y Fh(T)-7 -b(o)27 b(read)g(in)h(a)f(\014le)h(to)f(edit,)h(see)g(Files,)f(b)r(elo)n -(w.)0 611 y Fg(Lea)l(ving)45 b(Emacs)0 807 y Fh(susp)r(end)28 -b(Emacs)e(\(or)h(iconify)h(it)g(under)f(X\))405 b Ff(C-z)0 -906 y Fh(exit)28 b(Emacs)e(p)r(ermanen)n(tly)917 b Ff(C-x)42 -b(C-c)0 1134 y Fg(Files)0 1330 y Fe(read)28 b Fh(a)f(\014le)h(in)n(to)f -(Emacs)981 b Ff(C-x)42 b(C-f)0 1429 y Fe(sa)m(v)m(e)29 -b Fh(a)e(\014le)h(bac)n(k)e(to)i(disk)955 b Ff(C-x)42 -b(C-s)0 1529 y Fh(sa)n(v)n(e)26 b Fe(all)h Fh(\014les)1356 -b Ff(C-x)42 b(s)0 1628 y Fe(insert)27 b Fh(con)n(ten)n(ts)g(of)h -(another)e(\014le)i(in)n(to)f(this)h(bu\013er)134 b Ff(C-x)42 -b(i)0 1728 y Fh(replace)27 b(this)g(\014le)h(with)g(the)g(\014le)g(y)n -(ou)f(really)f(w)n(an)n(t)196 b Ff(C-x)42 b(C-v)0 1828 -y Fh(write)27 b(bu\013er)h(to)g(a)f(sp)r(eci\014ed)h(\014le)738 -b Ff(C-x)42 b(C-w)0 1927 y Fh(v)n(ersion)26 b(con)n(trol)g(c)n(hec)n -(kin/c)n(hec)n(k)n(out)616 b Ff(C-x)42 b(C-q)0 2168 y -Fg(Getting)47 b(Help)0 2363 y Fh(The)27 b(help)h(system)f(is)h(simple.) -37 b(T)n(yp)r(e)27 b Ff(C-h)f Fh(\(or)h Ff(F1)p Fh(\))g(and)g(follo)n -(w)g(the)h(direc-)0 2463 y(tions.)37 b(If)28 b(y)n(ou)f(are)f(a)h -(\014rst-time)h(user,)f(t)n(yp)r(e)h Ff(C-h)42 b(t)27 -b Fh(for)g(a)g Fe(tutorial)p Fh(.)0 2595 y(remo)n(v)n(e)f(help)i(windo) -n(w)1061 b Ff(C-x)42 b(1)0 2695 y Fh(scroll)26 b(help)i(windo)n(w)1128 -b Ff(C-M-v)0 2827 y Fh(aprop)r(os:)35 b(sho)n(w)27 b(commands)g(matc)n -(hing)g(a)g(string)199 b Ff(C-h)42 b(a)0 2927 y Fh(sho)n(w)27 -b(the)h(function)g(a)f(k)n(ey)g(runs)749 b Ff(C-h)42 -b(c)0 3027 y Fh(describ)r(e)27 b(a)g(function)1113 b -Ff(C-h)42 b(f)0 3126 y Fh(get)27 b(mo)r(de-sp)r(eci\014c)h(information) -726 b Ff(C-h)42 b(m)0 3354 y Fg(Error)j(Reco)l(v)l(ery)0 -3550 y Fe(ab)s(ort)28 b Fh(partially)f(t)n(yp)r(ed)h(or)e(executing)i -(command)154 b Ff(C-g)0 3649 y Fe(reco)m(v)m(er)29 b -Fh(a)e(\014le)h(lost)f(b)n(y)h(a)f(system)g(crash)286 -b Ff(M-x)42 b(recover-file)0 3749 y Fe(undo)28 b Fh(an)f(un)n(w)n(an)n -(ted)g(c)n(hange)826 b Ff(C-x)42 b(u)i Fh(or)e Ff(C-_)0 -3848 y Fh(restore)26 b(a)h(bu\013er)h(to)f(its)h(original)e(con)n(ten)n -(ts)228 b Ff(M-x)42 b(revert-buffer)0 3948 y Fh(redra)n(w)26 -b(garbaged)f(screen)947 b Ff(C-l)0 4176 y Fg(Incremen)l(tal)47 -b(Searc)l(h)0 4371 y Fh(searc)n(h)26 b(forw)n(ard)1269 -b Ff(C-s)0 4471 y Fh(searc)n(h)26 b(bac)n(kw)n(ard)1202 -b Ff(C-r)0 4571 y Fh(regular)26 b(expression)g(searc)n(h)892 -b Ff(C-M-s)0 4670 y Fh(rev)n(erse)26 b(regular)f(expression)i(searc)n -(h)614 b Ff(C-M-r)0 4803 y Fh(select)27 b(previous)g(searc)n(h)f -(string)782 b Ff(M-p)0 4902 y Fh(select)27 b(next)h(later)f(searc)n(h)f -(string)732 b Ff(M-n)0 5002 y Fh(exit)28 b(incremen)n(tal)f(searc)n(h) -960 b Ff(RET)0 5102 y Fh(undo)28 b(e\013ect)g(of)f(last)g(c)n(haracter) -785 b Ff(DEL)0 5201 y Fh(ab)r(ort)27 b(curren)n(t)g(searc)n(h)1061 -b Ff(C-g)0 5334 y Fh(Use)33 b Ff(C-s)g Fh(or)f Ff(C-r)g -Fh(again)h(to)g(rep)r(eat)g(the)h(searc)n(h)e(in)h(either)h(direction.) -54 b(If)0 5433 y(Emacs)27 b(is)g(still)h(searc)n(hing,)e -Ff(C-g)g Fh(cancels)h(only)g(the)h(part)f(not)h(done.)258 -5567 y Fd(c)239 5569 y Fc(\015)23 b Fd(1997)g(F)-5 b(ree)21 -b(Soft)n(w)n(are)h(F)-5 b(oundation,)20 b(Inc.)28 b(P)n(ermissions)22 -b(on)g(bac)n(k.)29 b(v2.2)3858 5663 y Fh(1)p eop +TeXDict begin @landscape 1 0 bop -358 -364 a Fi(GNU)45 +b(Emacs)h(Reference)g(Card)274 -256 y Fh(\(for)23 b(v)n(ersion)g(22\)) +-450 -58 y Fg(Starting)37 b(Emacs)-450 101 y Fh(T)-6 +b(o)24 b(en)n(ter)g(GNU)g(Emacs)g(22,)f(just)h(t)n(yp)r(e)h(its)e +(name:)32 b Ff(emacs)-450 295 y Fg(Lea)m(ving)37 b(Emacs)-450 +454 y Fh(susp)r(end)24 b(Emacs)g(\(or)g(iconify)f(it)h(under)g(X\))254 +b Ff(C-z)-450 533 y Fh(exit)24 b(Emacs)g(p)r(ermanen)n(tly)691 +b Ff(C-x)36 b(C-c)-450 728 y Fg(Files)-450 886 y Fe(read)23 +b Fh(a)h(\014le)g(in)n(to)g(Emacs)744 b Ff(C-x)36 b(C-f)-450 +966 y Fe(sa)n(v)n(e)23 b Fh(a)h(\014le)f(bac)n(k)i(to)f(disk)722 +b Ff(C-x)36 b(C-s)-450 1046 y Fh(sa)n(v)n(e)24 b Fe(all)f +Fh(\014les)1062 b Ff(C-x)36 b(s)-450 1125 y Fe(insert)16 +b Fh(con)n(ten)n(ts)j(of)e(another)h(\014le)f(in)n(to)g(this)g +(bu\013er)71 b Ff(C-x)36 b(i)-450 1205 y Fh(replace)24 +b(this)g(\014le)g(with)f(the)i(\014le)e(y)n(ou)i(really)e(w)n(an)n(t)78 +b Ff(C-x)36 b(C-v)-450 1285 y Fh(write)23 b(bu\013er)h(to)h(a)e(sp)r +(eci\014ed)i(\014le)538 b Ff(C-x)36 b(C-w)-450 1364 y +Fh(toggle)25 b(read-only)f(status)g(of)f(bu\013er)454 +b Ff(C-x)36 b(C-q)-450 1561 y Fg(Getting)h(Help)-450 +1719 y Fh(The)22 b(help)g(system)g(is)f(simple.)30 b(T)n(yp)r(e)22 +b Ff(C-h)h Fh(\(or)e Ff(F1)p Fh(\))i(and)f(follo)n(w)f(the)i(di-)-450 +1799 y(rections.)30 b(If)20 b(y)n(ou)g(are)g(a)g(\014rst-time)g(user,)g +(t)n(yp)r(e)h Ff(C-h)36 b(t)20 b Fh(for)f(a)h Fe(tutorial)p +Fh(.)-450 1905 y(remo)n(v)n(e)k(help)g(windo)n(w)813 +b Ff(C-x)36 b(1)-450 1985 y Fh(scroll)23 b(help)h(windo)n(w)869 +b Ff(C-M-v)-450 2092 y Fh(aprop)r(os:)32 b(sho)n(w)23 +b(commands)i(matc)n(hing)f(a)g(string)80 b Ff(C-h)36 +b(a)-450 2171 y Fh(describ)r(e)24 b(the)g(function)h(a)f(k)n(ey)g(runs) +449 b Ff(C-h)36 b(k)-450 2251 y Fh(describ)r(e)24 b(a)g(function)856 +b Ff(C-h)36 b(f)-450 2331 y Fh(get)25 b(mo)r(de-sp)r(eci\014c)f +(information)528 b Ff(C-h)36 b(m)-450 2524 y Fg(Error)j(Reco)m(v)m(ery) +-450 2683 y Fe(ab)r(ort)17 b Fh(partially)g(t)n(yp)r(ed)i(or)f +(executing)h(command)72 b Ff(C-g)-450 2762 y Fe(reco)n(v)n(er)23 +b Fh(\014les)g(lost)h(b)n(y)g(a)g(system)g(crash)142 +b Ff(M-x)36 b(recover-session)-450 2842 y Fe(undo)24 +b Fh(an)g(un)n(w)n(an)n(ted)h(c)n(hange)474 b Ff(C-x)36 +b(u,)g(C-_)g Fh(or)f Ff(C-/)-450 2922 y Fh(restore)24 +b(a)g(bu\013er)g(to)g(its)f(original)g(con)n(ten)n(ts)114 +b Ff(M-x)36 b(revert-buffer)-450 3001 y Fh(redra)n(w)23 +b(garbaged)i(screen)717 b Ff(C-l)-450 3196 y Fg(Incremen)m(tal)36 +b(Searc)m(h)-450 3354 y Fh(searc)n(h)24 b(forw)n(ard)990 +b Ff(C-s)-450 3434 y Fh(searc)n(h)24 b(bac)n(kw)n(ard)935 +b Ff(C-r)-450 3514 y Fh(regular)23 b(expression)h(searc)n(h)671 +b Ff(C-M-s)-450 3593 y Fh(rev)n(erse)24 b(regular)f(expression)h(searc) +n(h)435 b Ff(C-M-r)-450 3700 y Fh(select)24 b(previous)g(searc)n(h)g +(string)576 b Ff(M-p)-450 3780 y Fh(select)24 b(next)h(later)f(searc)n +(h)g(string)533 b Ff(M-n)-450 3859 y Fh(exit)24 b(incremen)n(tal)g +(searc)n(h)729 b Ff(RET)-450 3939 y Fh(undo)24 b(e\013ect)i(of)d(last)h +(c)n(haracter)580 b Ff(DEL)-450 4019 y Fh(ab)r(ort)24 +b(curren)n(t)g(searc)n(h)815 b Ff(C-g)-450 4125 y Fh(Use)27 +b Ff(C-s)h Fh(or)f Ff(C-r)h Fh(again)g(to)f(rep)r(eat)i(the)f(searc)n +(h)f(in)g(either)h(direction.)-450 4205 y(If)23 b(Emacs)h(is)f(still)g +(searc)n(hing,)h Ff(C-g)g Fh(cancels)h(only)e(the)i(part)f(not)g(done.) +-358 4311 y Fd(c)-375 4313 y Fc(\015)d Fd(2006)h(F)-5 +b(ree)22 b(Soft)n(w)n(are)g(F)-5 b(oundation,)20 b(Inc.)27 +b(P)n(ermissions)21 b(on)g(bac)n(k.)28 b(v2.3)1746 -364 +y Fg(Motion)1746 -201 y Fe(en)n(tit)n(y)e(to)g(mo)n(v)n(e)h(o)n(v)n(er) +472 b(bac)n(kw)n(ard)69 b(forw)n(ard)1746 -121 y Fh(c)n(haracter)885 +b Ff(C-b)302 b(C-f)1746 -42 y Fh(w)n(ord)1017 b Ff(M-b)302 +b(M-f)1746 38 y Fh(line)1058 b Ff(C-p)302 b(C-n)1746 +118 y Fh(go)24 b(to)g(line)g(b)r(eginning)g(\(or)g(end\))281 +b Ff(C-a)302 b(C-e)1746 197 y Fh(sen)n(tence)913 b Ff(M-a)302 +b(M-e)1746 277 y Fh(paragraph)855 b Ff(M-{)302 b(M-})1746 +357 y Fh(page)1028 b Ff(C-x)36 b([)231 b(C-x)37 b(])1746 +437 y Fh(sexp)1033 b Ff(C-M-b)232 b(C-M-f)1746 516 y +Fh(function)916 b Ff(C-M-a)232 b(C-M-e)1746 596 y Fh(go)24 +b(to)g(bu\013er)g(b)r(eginning)h(\(or)f(end\))212 b Ff(M-<)302 +b(M->)1746 704 y Fh(scroll)23 b(to)h(next)h(screen)822 +b Ff(C-v)1746 783 y Fh(scroll)23 b(to)h(previous)g(screen)700 +b Ff(M-v)1746 863 y Fh(scroll)23 b(left)1155 b Ff(C-x)36 +b(<)1746 943 y Fh(scroll)23 b(righ)n(t)1108 b Ff(C-x)36 +b(>)1746 1022 y Fh(scroll)23 b(curren)n(t)h(line)f(to)h(cen)n(ter)h(of) +f(screen)312 b Ff(C-u)36 b(C-l)1746 1213 y Fg(Killing)h(and)g(Deleting) +1746 1376 y Fe(en)n(tit)n(y)26 b(to)g(kill)723 b(bac)n(kw)n(ard)69 +b(forw)n(ard)1746 1456 y Fh(c)n(haracter)25 b(\(delete,)g(not)f(kill\)) +360 b Ff(DEL)302 b(C-d)1746 1536 y Fh(w)n(ord)1017 b +Ff(M-DEL)232 b(M-d)1746 1615 y Fh(line)23 b(\(to)i(end)f(of)5 +b(\))699 b Ff(M-0)36 b(C-k)161 b(C-k)1746 1695 y Fh(sen)n(tence)913 +b Ff(C-x)36 b(DEL)161 b(M-k)1746 1775 y Fh(sexp)1033 +b Ff(M--)36 b(C-M-k)91 b(C-M-k)1746 1882 y Fh(kill)23 +b Fe(region)1099 b Ff(C-w)1746 1962 y Fh(cop)n(y)25 b(region)e(to)i +(kill)d(ring)736 b Ff(M-w)1746 2042 y Fh(kill)23 b(through)h(next)h(o)r +(ccurrence)g(of)e Fb(char)329 b Ff(M-z)36 b Fb(char)1746 +2149 y Fh(y)n(ank)25 b(bac)n(k)f(last)g(thing)g(killed)620 +b Ff(C-y)1746 2229 y Fh(replace)24 b(last)g(y)n(ank)g(with)g(previous)g +(kill)358 b Ff(M-y)1746 2431 y Fg(Marking)1746 2594 y +Fh(set)24 b(mark)g(here)1018 b Ff(C-@)36 b Fh(or)f Ff(C-SPC)1746 +2673 y Fh(exc)n(hange)26 b(p)r(oin)n(t)e(and)g(mark)658 +b Ff(C-x)36 b(C-x)1746 2781 y Fh(set)24 b(mark)g Fb(ar)l(g)30 +b Fe(w)n(ords)22 b Fh(a)n(w)n(a)n(y)639 b Ff(M-@)1746 +2861 y Fh(mark)23 b Fe(paragraph)894 b Ff(M-h)1746 2940 +y Fh(mark)23 b Fe(page)1095 b Ff(C-x)36 b(C-p)1746 3020 +y Fh(mark)23 b Fe(sexp)1101 b Ff(C-M-@)1746 3100 y Fh(mark)23 +b Fe(function)966 b Ff(C-M-h)1746 3179 y Fh(mark)23 b(en)n(tire)h +Fe(bu\013er)852 b Ff(C-x)36 b(h)1746 3370 y Fg(Query)i(Replace)1746 +3533 y Fh(in)n(teractiv)n(ely)25 b(replace)f(a)g(text)h(string)414 +b Ff(M-\045)1746 3613 y Fh(using)24 b(regular)f(expressions)305 +b Ff(M-x)36 b(query-replace-regexp)1746 3721 y Fh(V)-6 +b(alid)23 b(resp)r(onses)h(in)f(query-replace)i(mo)r(de)f(are)1746 +3828 y Fe(replace)f Fh(this)h(one,)g(go)g(on)g(to)g(next)466 +b Ff(SPC)1746 3908 y Fh(replace)24 b(this)g(one,)g(don't)g(mo)n(v)n(e) +572 b Ff(,)1746 3988 y Fe(skip)23 b Fh(to)i(next)f(without)h(replacing) +488 b Ff(DEL)1746 4067 y Fh(replace)24 b(all)f(remaining)h(matc)n(hes) +525 b Ff(!)1746 4147 y Fe(bac)n(k)27 b(up)d Fh(to)g(the)g(previous)g +(matc)n(h)460 b Ff(^)1746 4227 y Fe(exit)23 b Fh(query-replace)871 +b Ff(RET)1746 4306 y Fh(en)n(ter)24 b(recursiv)n(e)g(edit)g(\()p +Ff(C-M-c)i Fh(to)e(exit\))370 b Ff(C-r)3942 -364 y Fg(Multiple)36 +b(Windo)m(ws)3942 -244 y Fh(When)27 b(t)n(w)n(o)f(commands)g(are)g(sho) +n(wn,)g(the)h(second)g(is)d(a)i(similar)e(com-)3942 -164 +y(mand)g(for)f(a)h(frame)f(instead)h(of)g(a)f(windo)n(w.)3942 +-67 y(delete)i(all)e(other)h(windo)n(ws)467 b Ff(C-x)36 +b(1)212 b(C-x)37 b(5)e(1)3942 12 y Fh(split)23 b(windo)n(w,)h(ab)r(o)n +(v)n(e)h(and)f(b)r(elo)n(w)267 b Ff(C-x)36 b(2)212 b(C-x)37 +b(5)e(2)3942 92 y Fh(delete)25 b(this)e(windo)n(w)640 +b Ff(C-x)36 b(0)212 b(C-x)37 b(5)e(0)3942 189 y Fh(split)23 +b(windo)n(w,)h(side)f(b)n(y)h(side)649 b Ff(C-x)36 b(3)3942 +286 y Fh(scroll)23 b(other)h(windo)n(w)838 b Ff(C-M-v)3942 +383 y Fh(switc)n(h)24 b(cursor)f(to)h(another)h(windo)n(w)206 +b Ff(C-x)36 b(o)212 b(C-x)37 b(5)e(o)3942 463 y Fh(select)25 +b(bu\013er)e(in)h(other)g(windo)n(w)320 b Ff(C-x)36 b(4)g(b)141 +b(C-x)37 b(5)e(b)3942 542 y Fh(displa)n(y)24 b(bu\013er)g(in)f(other)h +(windo)n(w)273 b Ff(C-x)36 b(4)g(C-o)71 b(C-x)37 b(5)e(C-o)3942 +622 y Fh(\014nd)24 b(\014le)g(in)f(other)h(windo)n(w)460 +b Ff(C-x)36 b(4)g(f)141 b(C-x)37 b(5)e(f)3942 702 y Fh(\014nd)24 +b(\014le)g(read-only)g(in)f(other)h(windo)n(w)148 b Ff(C-x)36 +b(4)g(r)141 b(C-x)37 b(5)e(r)3942 782 y Fh(run)23 b(Dired)h(in)f(other) +h(windo)n(w)390 b Ff(C-x)36 b(4)g(d)141 b(C-x)37 b(5)e(d)3942 +861 y Fh(\014nd)24 b(tag)h(in)e(other)h(windo)n(w)452 +b Ff(C-x)36 b(4)g(.)141 b(C-x)37 b(5)e(.)3942 958 y Fh(gro)n(w)24 +b(windo)n(w)f(taller)852 b Ff(C-x)36 b(^)3942 1038 y +Fh(shrink)23 b(windo)n(w)h(narro)n(w)n(er)698 b Ff(C-x)36 +b({)3942 1118 y Fh(gro)n(w)24 b(windo)n(w)f(wider)844 +b Ff(C-x)36 b(})3942 1264 y Fg(F)-10 b(ormatting)3942 +1384 y Fh(inden)n(t)25 b(curren)n(t)f Fe(line)f Fh(\(mo)r(de-dep)r +(enden)n(t\))267 b Ff(TAB)3942 1464 y Fh(inden)n(t)25 +b Fe(region)d Fh(\(mo)r(de-dep)r(enden)n(t\))420 b Ff(C-M-\\)3942 +1544 y Fh(inden)n(t)25 b Fe(sexp)f Fh(\(mo)r(de-dep)r(enden)n(t\))482 +b Ff(C-M-q)3942 1623 y Fh(inden)n(t)25 b(region)e(rigidly)g +Fb(ar)l(g)30 b Fh(columns)413 b Ff(C-x)36 b(TAB)3942 +1720 y Fh(insert)23 b(newline)h(after)g(p)r(oin)n(t)662 +b Ff(C-o)3942 1800 y Fh(mo)n(v)n(e)24 b(rest)g(of)f(line)h(v)n +(ertically)f(do)n(wn)437 b Ff(C-M-o)3942 1880 y Fh(delete)25 +b(blank)f(lines)f(around)h(p)r(oin)n(t)482 b Ff(C-x)36 +b(C-o)3942 1959 y Fh(join)23 b(line)g(with)h(previous)g(\(with)g(arg,)f +(next\))236 b Ff(M-^)3942 2039 y Fh(delete)25 b(all)e(white)h(space)h +(around)f(p)r(oin)n(t)358 b Ff(M-\\)3942 2119 y Fh(put)24 +b(exactly)h(one)g(space)f(at)h(p)r(oin)n(t)503 b Ff(M-SPC)3942 +2216 y Fh(\014ll)23 b(paragraph)1025 b Ff(M-q)3942 2295 +y Fh(set)24 b(\014ll)f(column)1005 b Ff(C-x)36 b(f)3942 +2375 y Fh(set)24 b(pre\014x)g(eac)n(h)h(line)e(starts)h(with)506 +b Ff(C-x)36 b(.)3942 2472 y Fh(set)24 b(face)1211 b Ff(M-o)3942 +2609 y Fg(Case)37 b(Change)3942 2730 y Fh(upp)r(ercase)25 +b(w)n(ord)961 b Ff(M-u)3942 2809 y Fh(lo)n(w)n(ercase)24 +b(w)n(ord)979 b Ff(M-l)3942 2889 y Fh(capitalize)25 b(w)n(ord)975 +b Ff(M-c)3942 2986 y Fh(upp)r(ercase)25 b(region)924 +b Ff(C-x)36 b(C-u)3942 3066 y Fh(lo)n(w)n(ercase)24 b(region)942 +b Ff(C-x)36 b(C-l)3942 3212 y Fg(The)h(Minibu\013er)3942 +3332 y Fh(The)24 b(follo)n(wing)f(k)n(eys)h(are)g(de\014ned)h(in)e(the) +i(minibu\013er.)3942 3429 y(complete)g(as)f(m)n(uc)n(h)g(as)f(p)r +(ossible)539 b Ff(TAB)3942 3509 y Fh(complete)25 b(up)f(to)g(one)h(w)n +(ord)673 b Ff(SPC)3942 3588 y Fh(complete)25 b(and)f(execute)778 +b Ff(RET)3942 3668 y Fh(sho)n(w)24 b(p)r(ossible)f(completions)636 +b Ff(?)3942 3748 y Fh(fetc)n(h)25 b(previous)e(minibu\013er)g(input)484 +b Ff(M-p)3942 3828 y Fh(fetc)n(h)25 b(later)e(minibu\013er)g(input)i +(or)e(default)276 b Ff(M-n)3942 3907 y Fh(regexp)24 b(searc)n(h)h(bac)n +(kw)n(ard)f(through)h(history)204 b Ff(M-r)3942 3987 +y Fh(regexp)24 b(searc)n(h)h(forw)n(ard)d(through)j(history)261 +b Ff(M-s)3942 4067 y Fh(ab)r(ort)24 b(command)953 b Ff(C-g)3942 +4164 y Fh(T)n(yp)r(e)28 b Ff(C-x)37 b(ESC)f(ESC)28 b +Fh(to)h(edit)f(and)h(rep)r(eat)f(the)h(last)f(command)h(that)3942 +4243 y(used)c(the)g(minibu\013er.)33 b(T)n(yp)r(e)26 +b Ff(F10)f Fh(to)g(activ)l(ate)h(the)g(men)n(u)f(bar)f(using)3942 +4323 y(the)h(minibu\013er.)p eop end %%Page: 2 2 -2 1 bop 0 -337 a Fg(Motion)0 -130 y Fe(en)m(tit)m(y)32 -b(to)g(mo)m(v)m(e)f(o)m(v)m(er)704 b(bac)m(kw)m(ard)86 -b(forw)m(ard)0 -30 y Fh(c)n(haracter)1181 b Ff(C-b)346 -b(C-f)0 69 y Fh(w)n(ord)1339 b Ff(M-b)346 b(M-f)0 169 -y Fh(line)1389 b Ff(C-p)346 b(C-n)0 268 y Fh(go)27 b(to)g(line)h(b)r -(eginning)g(\(or)e(end\))474 b Ff(C-a)346 b(C-e)0 368 -y Fh(sen)n(tence)1215 b Ff(M-a)346 b(M-e)0 468 y Fh(paragraph)1146 -b Ff(M-{)346 b(M-})0 567 y Fh(page)1351 b Ff(C-x)42 b([)260 -b(C-x)42 b(])0 667 y Fh(sexp)1358 b Ff(C-M-b)258 b(C-M-f)0 -767 y Fh(function)1221 b Ff(C-M-a)258 b(C-M-e)0 866 y -Fh(go)27 b(to)g(bu\013er)h(b)r(eginning)f(\(or)g(end\))393 -b Ff(M-<)346 b(M->)0 1002 y Fh(scroll)26 b(to)i(next)g(screen)1071 -b Ff(C-v)0 1101 y Fh(scroll)26 b(to)i(previous)e(screen)928 -b Ff(M-v)0 1201 y Fh(scroll)26 b(left)1466 b Ff(C-x)42 -b(<)0 1300 y Fh(scroll)26 b(righ)n(t)1409 b Ff(C-x)42 -b(>)0 1400 y Fh(scroll)26 b(curren)n(t)h(line)h(to)f(cen)n(ter)g(of)h -(screen)471 b Ff(C-u)42 b(C-l)0 1643 y Fg(Killing)k(and)h(Deleting)0 -1849 y Fe(en)m(tit)m(y)32 b(to)g(kill)996 b(bac)m(kw)m(ard)86 -b(forw)m(ard)0 1949 y Fh(c)n(haracter)26 b(\(delete,)i(not)f(kill\))568 -b Ff(DEL)346 b(C-d)0 2049 y Fh(w)n(ord)1339 b Ff(M-DEL)258 -b(M-d)0 2148 y Fh(line)28 b(\(to)g(end)f(of)6 b(\))966 -b Ff(M-0)42 b(C-k)172 b(C-k)0 2248 y Fh(sen)n(tence)1215 -b Ff(C-x)42 b(DEL)172 b(M-k)0 2348 y Fh(sexp)1358 b Ff(M--)42 -b(C-M-k)84 b(C-M-k)0 2483 y Fh(kill)28 b Fe(region)1400 -b Ff(C-w)0 2583 y Fh(cop)n(y)27 b(region)f(to)h(kill)h(ring)971 -b Ff(M-w)0 2682 y Fh(kill)28 b(through)f(next)g(o)r(ccurrence)g(of)g -Fb(char)494 b Ff(M-z)42 b Fb(char)0 2818 y Fh(y)n(ank)27 -b(bac)n(k)f(last)i(thing)f(killed)836 b Ff(C-y)0 2917 -y Fh(replace)27 b(last)g(y)n(ank)g(with)h(previous)e(kill)528 -b Ff(M-y)0 3170 y Fg(Marking)0 3377 y Fh(set)28 b(mark)e(here)1303 -b Ff(C-@)42 b Fh(or)h Ff(C-SPC)0 3476 y Fh(exc)n(hange)26 -b(p)r(oin)n(t)i(and)f(mark)879 b Ff(C-x)42 b(C-x)0 3612 -y Fh(set)28 b(mark)e Fb(ar)l(g)36 b Fe(w)m(ords)27 b -Fh(a)n(w)n(a)n(y)856 b Ff(M-@)0 3711 y Fh(mark)27 b Fe(paragraph)1162 -b Ff(M-h)0 3811 y Fh(mark)27 b Fe(page)1394 b Ff(C-x)42 -b(C-p)0 3911 y Fh(mark)27 b Fe(sexp)1400 b Ff(C-M-@)0 -4010 y Fh(mark)27 b Fe(function)1243 b Ff(C-M-h)0 4110 -y Fh(mark)27 b(en)n(tire)g Fe(bu\013er)1107 b Ff(C-x)42 -b(h)0 4353 y Fg(Query)k(Replace)0 4559 y Fh(in)n(teractiv)n(ely)26 -b(replace)h(a)g(text)h(string)592 b Ff(M-\045)0 4659 -y Fh(using)27 b(regular)f(expressions)448 b Ff(M-x)42 -b(query-replace-reg)o(ex)o(p)0 4794 y Fh(V)-7 b(alid)28 -b(resp)r(onses)e(in)i(query-replace)d(mo)r(de)j(are)0 -4930 y Fe(replace)g Fh(this)g(one,)f(go)g(on)g(to)h(next)653 -b Ff(SPC)0 5029 y Fh(replace)27 b(this)g(one,)h(don't)g(mo)n(v)n(e)776 -b Ff(,)0 5129 y Fe(skip)27 b Fh(to)h(next)g(without)g(replacing)678 -b Ff(DEL)0 5229 y Fh(replace)27 b(all)g(remaining)g(matc)n(hes)721 -b Ff(!)0 5328 y Fe(bac)m(k)33 b(up)28 b Fh(to)g(the)g(previous)e(matc)n -(h)646 b Ff(^)0 5428 y Fe(exit)27 b Fh(query-replace)1128 -b Ff(RET)0 5528 y Fh(en)n(ter)27 b(recursiv)n(e)f(edit)i(\()p -Ff(C-M-c)e Fh(to)h(exit\))530 b Ff(C-r)3858 5663 y Fh(2)p -eop -%%Page: 3 3 -3 2 bop 0 -337 a Fg(Multiple)47 b(Windo)l(ws)0 -173 y -Fh(When)28 b(t)n(w)n(o)f(commands)g(are)g(sho)n(wn,)f(the)i(second)f -(is)h(for)f(\\other)f(frame.")0 -48 y(delete)i(all)f(other)g(windo)n -(ws)920 b Ff(C-x)42 b(1)0 76 y Fh(split)28 b(windo)n(w,)f(ab)r(o)n(v)n -(e)f(and)i(b)r(elo)n(w)422 b Ff(C-x)42 b(2)257 b(C-x)42 -b(5)h(2)0 176 y Fh(delete)28 b(this)g(windo)n(w)860 b -Ff(C-x)42 b(0)257 b(C-x)42 b(5)h(0)0 301 y Fh(split)28 -b(windo)n(w,)f(side)h(b)n(y)f(side)869 b Ff(C-x)42 b(3)0 -425 y Fh(scroll)26 b(other)h(windo)n(w)1091 b Ff(C-M-v)0 -550 y Fh(switc)n(h)27 b(cursor)f(to)i(another)f(windo)n(w)349 -b Ff(C-x)42 b(o)257 b(C-x)42 b(5)h(o)0 650 y Fh(select)27 -b(bu\013er)h(in)g(other)f(windo)n(w)484 b Ff(C-x)42 b(4)h(b)170 -b(C-x)42 b(5)h(b)0 749 y Fh(displa)n(y)27 b(bu\013er)h(in)f(other)g -(windo)n(w)429 b Ff(C-x)42 b(4)h(C-o)82 b(C-x)42 b(5)h(C-o)0 -849 y Fh(\014nd)28 b(\014le)g(in)g(other)f(windo)n(w)648 -b Ff(C-x)42 b(4)h(f)170 b(C-x)42 b(5)h(f)0 948 y Fh(\014nd)28 -b(\014le)g(read-only)e(in)i(other)f(windo)n(w)281 b Ff(C-x)42 -b(4)h(r)170 b(C-x)42 b(5)h(r)0 1048 y Fh(run)27 b(Dired)h(in)g(other)f -(windo)n(w)566 b Ff(C-x)42 b(4)h(d)170 b(C-x)42 b(5)h(d)0 -1148 y Fh(\014nd)28 b(tag)f(in)h(other)f(windo)n(w)639 -b Ff(C-x)42 b(4)h(.)170 b(C-x)42 b(5)h(.)0 1272 y Fh(gro)n(w)26 -b(windo)n(w)h(taller)1107 b Ff(C-x)42 b(^)0 1372 y Fh(shrink)27 -b(windo)n(w)g(narro)n(w)n(er)924 b Ff(C-x)42 b({)0 1472 -y Fh(gro)n(w)26 b(windo)n(w)h(wider)1098 b Ff(C-x)42 -b(})0 1661 y Fg(F)-11 b(ormatting)0 1825 y Fh(inden)n(t)28 -b(curren)n(t)f Fe(line)f Fh(\(mo)r(de-dep)r(enden)n(t\))417 -b Ff(TAB)0 1924 y Fh(inden)n(t)28 b Fe(region)f Fh(\(mo)r(de-dep)r -(enden)n(t\))597 b Ff(C-M-\\)0 2024 y Fh(inden)n(t)28 -b Fe(sexp)g Fh(\(mo)r(de-dep)r(enden)n(t\))670 b Ff(C-M-q)0 -2123 y Fh(inden)n(t)28 b(region)e(rigidly)h Fb(ar)l(g)36 -b Fh(columns)591 b Ff(C-x)42 b(TAB)0 2248 y Fh(insert)27 -b(newline)h(after)f(p)r(oin)n(t)884 b Ff(C-o)0 2348 y -Fh(mo)n(v)n(e)26 b(rest)i(of)f(line)h(v)n(ertically)e(do)n(wn)618 -b Ff(C-M-o)0 2447 y Fh(delete)28 b(blank)f(lines)h(around)e(p)r(oin)n -(t)672 b Ff(C-x)42 b(C-o)0 2547 y Fh(join)28 b(line)g(with)g(previous)e -(\(with)j(arg,)d(next\))381 b Ff(M-^)0 2647 y Fh(delete)28 -b(all)f(white)h(space)f(around)g(p)r(oin)n(t)526 b Ff(M-\\)0 -2746 y Fh(put)28 b(exactly)f(one)g(space)g(at)h(p)r(oin)n(t)697 -b Ff(M-SPC)0 2871 y Fh(\014ll)28 b(paragraph)1308 b Ff(M-q)0 -2970 y Fh(set)28 b(\014ll)g(column)1287 b Ff(C-x)42 b(f)0 -3070 y Fh(set)28 b(pre\014x)f(eac)n(h)g(line)g(starts)g(with)701 -b Ff(C-x)42 b(.)0 3195 y Fh(set)28 b(face)1529 b Ff(M-g)0 -3394 y Fg(Case)46 b(Change)0 3558 y Fh(upp)r(ercase)27 -b(w)n(ord)1235 b Ff(M-u)0 3658 y Fh(lo)n(w)n(ercase)25 -b(w)n(ord)1256 b Ff(M-l)0 3757 y Fh(capitalize)27 b(w)n(ord)1252 -b Ff(M-c)0 3882 y Fh(upp)r(ercase)27 b(region)1191 b -Ff(C-x)42 b(C-u)0 3981 y Fh(lo)n(w)n(ercase)25 b(region)1212 -b Ff(C-x)42 b(C-l)0 4170 y Fg(The)k(Minibu\013er)0 4334 -y Fh(The)28 b(follo)n(wing)e(k)n(eys)h(are)f(de\014ned)i(in)g(the)g -(minibu\013er.)0 4459 y(complete)g(as)e(m)n(uc)n(h)i(as)f(p)r(ossible) -739 b Ff(TAB)0 4559 y Fh(complete)28 b(up)f(to)h(one)f(w)n(ord)897 -b Ff(SPC)0 4658 y Fh(complete)28 b(and)f(execute)1018 -b Ff(RET)0 4758 y Fh(sho)n(w)27 b(p)r(ossible)g(completions)852 -b Ff(?)0 4858 y Fh(fetc)n(h)28 b(previous)e(minibu\013er)j(input)674 -b Ff(M-p)0 4957 y Fh(fetc)n(h)28 b(later)f(minibu\013er)h(input)g(or)f -(default)430 b Ff(M-n)0 5057 y Fh(regexp)26 b(searc)n(h)h(bac)n(kw)n -(ard)e(through)i(history)344 b Ff(M-r)0 5156 y Fh(regexp)26 -b(searc)n(h)h(forw)n(ard)e(through)i(history)411 b Ff(M-s)0 -5256 y Fh(ab)r(ort)27 b(command)1225 b Ff(C-g)0 5381 -y Fh(T)n(yp)r(e)25 b Ff(C-x)42 b(ESC)g(ESC)24 b Fh(to)h(edit)g(and)g -(rep)r(eat)g(the)g(last)f(command)h(that)g(used)0 5480 -y(the)h(minibu\013er.)36 b(T)n(yp)r(e)26 b Ff(F10)e Fh(to)h(activ)-5 -b(ate)25 b(the)g(men)n(u)h(bar)e(using)h(the)h(mini-)0 -5580 y(bu\013er.)3858 5663 y(3)p eop -%%Page: 4 4 -4 3 bop 158 -320 a Fi(GNU)55 b(Emacs)g(Reference)f(Card)0 --42 y Fg(Bu\013ers)0 165 y Fh(select)27 b(another)g(bu\013er)1059 -b Ff(C-x)42 b(b)0 264 y Fh(list)28 b(all)f(bu\013ers)1303 -b Ff(C-x)42 b(C-b)0 364 y Fh(kill)28 b(a)f(bu\013er)1380 -b Ff(C-x)42 b(k)0 607 y Fg(T)-11 b(ransp)t(osing)0 814 -y Fh(transp)r(ose)26 b Fe(c)m(haracters)1005 b Ff(C-t)0 -913 y Fh(transp)r(ose)26 b Fe(w)m(ords)1184 b Ff(M-t)0 -1013 y Fh(transp)r(ose)26 b Fe(lines)1239 b Ff(C-x)42 -b(C-t)0 1112 y Fh(transp)r(ose)26 b Fe(sexps)1205 b Ff(C-M-t)0 -1355 y Fg(Sp)t(elling)47 b(Chec)l(k)0 1562 y Fh(c)n(hec)n(k)27 -b(sp)r(elling)g(of)h(curren)n(t)f(w)n(ord)711 b Ff(M-$)0 -1662 y Fh(c)n(hec)n(k)27 b(sp)r(elling)g(of)h(all)f(w)n(ords)f(in)i -(region)332 b Ff(M-x)42 b(ispell-region)0 1761 y Fh(c)n(hec)n(k)27 -b(sp)r(elling)g(of)h(en)n(tire)f(bu\013er)562 b Ff(M-x)42 -b(ispell-buffer)0 2013 y Fg(T)-11 b(ags)0 2220 y Fh(\014nd)28 -b(a)f(tag)g(\(a)h(de\014nition\))947 b Ff(M-.)0 2319 -y Fh(\014nd)28 b(next)g(o)r(ccurrence)e(of)i(tag)823 -b Ff(C-u)42 b(M-.)0 2419 y Fh(sp)r(ecify)28 b(a)f(new)h(tags)e(\014le) -732 b Ff(M-x)43 b(visit-tags-tabl)o(e)0 2554 y Fh(regexp)26 -b(searc)n(h)h(on)g(all)g(\014les)h(in)f(tags)g(table)259 -b Ff(M-x)42 b(tags-search)0 2654 y Fh(run)27 b(query-replace)f(on)h -(all)g(the)h(\014les)264 b Ff(M-x)42 b(tags-query-replac)o(e)0 -2754 y Fh(con)n(tin)n(ue)27 b(last)g(tags)g(searc)n(h)f(or)h -(query-replace)294 b Ff(M-,)0 2996 y Fg(Shells)0 3203 -y Fh(execute)27 b(a)h(shell)f(command)893 b Ff(M-!)0 -3303 y Fh(run)27 b(a)h(shell)f(command)g(on)h(the)g(region)529 -b Ff(M-|)0 3402 y Fh(\014lter)28 b(region)e(through)h(a)g(shell)g -(command)429 b Ff(C-u)42 b(M-|)0 3502 y Fh(start)27 b(a)g(shell)h(in)g -(windo)n(w)f Ff(*shell*)635 b(M-x)42 b(shell)0 3745 y -Fg(Rectangles)0 3951 y Fh(cop)n(y)27 b(rectangle)f(to)i(register)879 -b Ff(C-x)42 b(r)i(r)0 4051 y Fh(kill)28 b(rectangle)1330 -b Ff(C-x)42 b(r)i(k)0 4151 y Fh(y)n(ank)27 b(rectangle)1270 -b Ff(C-x)42 b(r)i(y)0 4250 y Fh(op)r(en)28 b(rectangle,)e(shifting)i -(text)g(righ)n(t)576 b Ff(C-x)42 b(r)i(o)0 4350 y Fh(blank)27 -b(out)h(rectangle)1095 b Ff(C-x)42 b(r)i(c)0 4450 y Fh(pre\014x)27 -b(eac)n(h)g(line)h(with)g(a)f(string)756 b Ff(C-x)42 -b(r)i(t)0 4692 y Fg(Abbrevs)0 4899 y Fh(add)27 b(global)g(abbrev)1146 -b Ff(C-x)42 b(a)i(g)0 4999 y Fh(add)27 b(mo)r(de-lo)r(cal)g(abbrev)971 -b Ff(C-x)42 b(a)i(l)0 5098 y Fh(add)27 b(global)g(expansion)f(for)i -(this)f(abbrev)472 b Ff(C-x)42 b(a)i(i)f(g)0 5198 y Fh(add)27 -b(mo)r(de-lo)r(cal)g(expansion)g(for)g(this)h(abbrev)296 -b Ff(C-x)42 b(a)i(i)f(l)0 5298 y Fh(explicitly)28 b(expand)f(abbrev)904 -b Ff(C-x)42 b(a)i(e)0 5433 y Fh(expand)27 b(previous)g(w)n(ord)f -(dynamically)537 b Ff(M-/)3858 5663 y Fh(4)p eop -%%Page: 5 5 -5 4 bop 0 -337 a Fg(Regular)46 b(Expressions)0 -130 y -Fh(an)n(y)27 b(single)g(c)n(haracter)e(except)j(a)f(newline)448 -b Ff(.)87 b Fh(\(dot\))0 -30 y(zero)26 b(or)h(more)g(rep)r(eats)1053 -b Ff(*)0 69 y Fh(one)27 b(or)g(more)g(rep)r(eats)1076 -b Ff(+)0 169 y Fh(zero)26 b(or)h(one)g(rep)r(eat)1142 -b Ff(?)0 268 y Fh(quote)27 b(regular)f(expression)g(sp)r(ecial)i(c)n -(haracter)d Fb(c)219 b Ff(\\)p Fb(c)0 368 y Fh(alternativ)n(e)26 -b(\(\\or"\))1162 b Ff(\\|)0 468 y Fh(grouping)1480 b -Ff(\\\()43 b Fa(:)14 b(:)g(:)43 b Ff(\\\))0 567 y Fh(same)27 -b(text)h(as)f Fb(n)6 b Fh(th)28 b(group)949 b Ff(\\)p -Fb(n)0 667 y Fh(at)27 b(w)n(ord)g(break)1291 b Ff(\\b)0 -767 y Fh(not)28 b(at)f(w)n(ord)g(break)1143 b Ff(\\B)0 -902 y Fe(en)m(tit)m(y)942 b(matc)m(h)32 b(start)102 b(matc)m(h)31 -b(end)0 1002 y Fh(line)1055 b Ff(^)543 b($)0 1101 y Fh(w)n(ord)1005 -b Ff(\\<)499 b(\\>)0 1201 y Fh(bu\013er)974 b Ff(\\`)499 -b(\\')0 1300 y Fe(class)32 b(of)f(c)m(haracters)430 b(matc)m(h)32 -b(these)83 b(matc)m(h)31 b(others)0 1400 y Fh(explicit)d(set)789 -b Ff([)44 b Fa(:)14 b(:)g(:)43 b Ff(])315 b([^)42 b Fa(:)14 -b(:)g(:)44 b Ff(])0 1500 y Fh(w)n(ord-syn)n(tax)25 b(c)n(haracter)376 -b Ff(\\w)499 b(\\W)0 1599 y Fh(c)n(haracter)26 b(with)i(syn)n(tax)e -Fb(c)329 b Ff(\\s)p Fb(c)461 b Ff(\\S)p Fb(c)0 1842 y -Fg(In)l(ternational)48 b(Character)e(Sets)0 2049 y Fh(sp)r(ecify)28 -b(principal)f(language)239 b Ff(M-x)42 b(set-language-env)o(ir)o(onm)o -(en)o(t)0 2148 y Fh(sho)n(w)27 b(all)g(input)h(metho)r(ds)592 -b Ff(M-x)42 b(list-input-method)o(s)0 2248 y Fh(enable)27 -b(or)g(disable)g(input)i(metho)r(d)667 b Ff(C-\\)0 2348 -y Fh(set)28 b(co)r(ding)f(system)g(for)g(next)h(command)465 -b Ff(C-x)42 b(RET)h(c)0 2447 y Fh(sho)n(w)27 b(all)g(co)r(ding)g -(systems)531 b Ff(M-x)42 b(list-coding-syst)o(em)o(s)0 -2547 y Fh(c)n(ho)r(ose)26 b(preferred)h(co)r(ding)g(system)224 -b Ff(M-x)42 b(prefer-coding-sys)o(te)o(m)0 2800 y Fg(Info)0 -3007 y Fh(en)n(ter)27 b(the)h(Info)g(do)r(cumen)n(tation)f(reader)481 -b Ff(C-h)42 b(i)0 3106 y Fh(\014nd)28 b(sp)r(eci\014ed)g(function)g(or) -f(v)-5 b(ariable)26 b(in)i(Info)321 b Ff(C-h)42 b(C-i)0 -3242 y Fh(Mo)n(ving)26 b(within)j(a)e(no)r(de:)83 3377 -y(scroll)f(forw)n(ard)1221 b Ff(SPC)83 3476 y Fh(scroll)26 -b(rev)n(erse)1248 b Ff(DEL)83 3576 y Fh(b)r(eginning)28 -b(of)f(no)r(de)1069 b Ff(.)87 b Fh(\(dot\))0 3711 y(Mo)n(ving)26 -b(b)r(et)n(w)n(een)i(no)r(des:)83 3847 y Fe(next)g Fh(no)r(de)1332 -b Ff(n)83 3946 y Fe(previous)27 b Fh(no)r(de)1165 b Ff(p)83 -4046 y Fh(mo)n(v)n(e)26 b Fe(up)1397 b Ff(u)83 4146 y -Fh(select)27 b(men)n(u)h(item)g(b)n(y)g(name)768 b Ff(m)83 -4245 y Fh(select)27 b Fb(n)6 b Fh(th)29 b(men)n(u)e(item)h(b)n(y)g(n)n -(um)n(b)r(er)f(\(1{9\))311 b Fb(n)83 4345 y Fh(follo)n(w)27 -b(cross)f(reference)h(\(return)g(with)h Ff(l)p Fh(\))373 -b Ff(f)83 4445 y Fh(return)27 b(to)h(last)f(no)r(de)h(y)n(ou)e(sa)n(w) -714 b Ff(l)83 4544 y Fh(return)27 b(to)h(directory)e(no)r(de)835 -b Ff(d)83 4644 y Fh(go)27 b(to)g(an)n(y)g(no)r(de)h(b)n(y)f(name)838 -b Ff(g)0 4779 y Fh(Other:)83 4915 y(run)27 b(Info)h Fe(tutorial)1080 -b Ff(h)83 5014 y Fe(quit)28 b Fh(Info)1379 b Ff(q)83 -5114 y Fh(searc)n(h)26 b(no)r(des)h(for)h(regexp)865 -b Ff(M-s)3858 5663 y Fh(5)p eop -%%Page: 6 6 -6 5 bop 0 -337 a Fg(Registers)0 -130 y Fh(sa)n(v)n(e)26 -b(region)g(in)i(register)1006 b Ff(C-x)42 b(r)i(s)0 -30 -y Fh(insert)27 b(register)f(con)n(ten)n(ts)h(in)n(to)h(bu\013er)566 -b Ff(C-x)42 b(r)i(i)0 105 y Fh(sa)n(v)n(e)26 b(v)-5 b(alue)28 -b(of)f(p)r(oin)n(t)h(in)g(register)729 b Ff(C-x)42 b(r)i(SPC)0 -205 y Fh(jump)28 b(to)g(p)r(oin)n(t)g(sa)n(v)n(ed)e(in)i(register)676 -b Ff(C-x)42 b(r)i(j)0 457 y Fg(Keyb)t(oard)h(Macros)0 -664 y Fe(start)28 b Fh(de\014ning)g(a)f(k)n(eyb)r(oard)f(macro)609 -b Ff(C-x)42 b(\()0 764 y Fe(end)28 b Fh(k)n(eyb)r(oard)e(macro)g -(de\014nition)672 b Ff(C-x)42 b(\))0 863 y Fe(execute)28 -b Fh(last-de\014ned)f(k)n(eyb)r(oard)f(macro)432 b Ff(C-x)42 -b(e)0 963 y Fh(app)r(end)28 b(to)f(last)h(k)n(eyb)r(oard)e(macro)665 -b Ff(C-u)42 b(C-x)h(\()0 1063 y Fh(name)27 b(last)h(k)n(eyb)r(oard)e -(macro)436 b Ff(M-x)42 b(name-last-kbd-ma)o(cr)o(o)0 -1162 y Fh(insert)27 b(Lisp)h(de\014nition)g(in)g(bu\013er)439 -b Ff(M-x)43 b(insert-kbd-macr)o(o)0 1405 y Fg(Commands)j(Dealing)g -(with)i(Emacs)d(Lisp)0 1612 y Fh(ev)-5 b(al)27 b Fe(sexp)h -Fh(b)r(efore)f(p)r(oin)n(t)981 b Ff(C-x)42 b(C-e)0 1711 -y Fh(ev)-5 b(al)27 b(curren)n(t)g Fe(defun)1111 b Ff(C-M-x)0 -1811 y Fh(ev)-5 b(al)27 b Fe(region)1199 b Ff(M-x)42 -b(eval-region)0 1911 y Fh(read)27 b(and)g(ev)-5 b(al)28 -b(minibu\013er)914 b Ff(M-:)0 2010 y Fh(load)27 b(from)g(standard)g -(system)g(directory)301 b Ff(M-x)42 b(load-library)0 -2263 y Fg(Simple)47 b(Customization)0 2470 y Fh(customize)27 -b(v)-5 b(ariables)27 b(and)g(faces)563 b Ff(M-x)42 b(customize)0 -2605 y Fh(Making)27 b(global)f(k)n(ey)h(bindings)h(in)g(Emacs)e(Lisp)i -(\(examples\):)0 2741 y Ff(\(global-set-key)37 b("\\C-cg")k -('goto-line\))0 2840 y(\(global-set-key)c("\\M-#")k('query-replace-re)o -(gex)o(p\))0 3093 y Fg(W)-11 b(riting)46 b(Commands)0 -3300 y Ff(\(defun)41 b Fb(c)l(ommand-name)51 b Ff(\()p -Fb(ar)l(gs)7 b Ff(\))87 3399 y(")p Fb(do)l(cumentation)f -Ff(")44 b(\(interactive)38 b(")p Fb(template)6 b Ff("\))87 -3499 y Fb(b)l(o)l(dy)h Ff(\))0 3634 y Fh(An)28 b(example:)0 -3770 y Ff(\(defun)41 b(this-line-to-top)o(-of)o(-w)o(ind)o(ow)c -(\(line\))87 3869 y("Reposition)i(line)j(point)g(is)g(on)h(to)g(top)f -(of)h(window.)0 3969 y(With)f(ARG,)g(put)g(point)g(on)g(line)g(ARG.")87 -4069 y(\(interactive)d("P"\))87 4168 y(\(recenter)h(\(if)i(\(null)g -(line\))697 4268 y(0)610 4368 y(\(prefix-numeric-v)o(al)o(ue)37 -b(line\)\)\)\))0 4503 y Fh(The)32 b Ff(interactive)c -Fh(sp)r(ec)k(sa)n(ys)f(ho)n(w)g(to)h(read)f(argumen)n(ts)g(in)n -(teractiv)n(ely)-7 b(.)0 4603 y(T)n(yp)r(e)27 b Ff(C-h)43 -b(f)g(interactive)23 b Fh(for)k(more)g(details.)476 4919 -y Fd(Cop)n(yrigh)n(t)805 4917 y(c)787 4919 y Fc(\015)22 -b Fd(1997)h(F)-5 b(ree)21 b(Soft)n(w)n(are)h(F)-5 b(oundation,)20 -b(Inc.)654 4998 y(v2.2)i(for)g(GNU)h(Emacs)e(v)n(ersion)h(21,)h(1997) -798 5078 y(designed)e(b)n(y)h(Stephen)e(Gildea)0 5194 -y(P)n(ermission)f(is)i(gran)n(ted)f(to)h(mak)n(e)e(and)i(distribute)d -(copies)i(of)g(this)h(card)e(pro)n(vided)g(the)h(cop)n(y-)0 -5273 y(righ)n(t)i(notice)f(and)h(this)g(p)r(ermission)f(notice)g(are)g -(preserv)n(ed)g(on)h(all)g(copies.)0 5389 y(F)-5 b(or)20 -b(copies)g(of)h(the)f(GNU)h(Emacs)f(man)n(ual,)g(write)g(to)h(the)f(F) --5 b(ree)20 b(Soft)n(w)n(are)g(F)-5 b(oundation,)19 b(Inc.,)0 -5468 y(59)k(T)-5 b(emple)20 b(Place,)h(Suite)g(330,)h(Boston,)h(MA)f -(02111-1307)h(USA)3858 5663 y Fh(6)p eop +TeXDict begin @landscape 2 1 bop -358 -364 a Fi(GNU)45 +b(Emacs)h(Reference)g(Card)-450 -141 y Fg(Bu\013ers)-450 +24 y Fh(select)24 b(another)h(bu\013er)811 b Ff(C-x)36 +b(b)-450 104 y Fh(list)23 b(all)g(bu\013ers)1018 b Ff(C-x)36 +b(C-b)-450 184 y Fh(kill)23 b(a)g(bu\013er)1084 b Ff(C-x)36 +b(k)-450 378 y Fg(T)-10 b(ransp)s(osing)-450 543 y Fh(transp)r(ose)24 +b Fe(c)n(haracters)760 b Ff(C-t)-450 623 y Fh(transp)r(ose)24 +b Fe(w)n(ords)915 b Ff(M-t)-450 703 y Fh(transp)r(ose)24 +b Fe(lines)964 b Ff(C-x)36 b(C-t)-450 782 y Fh(transp)r(ose)24 +b Fe(sexps)935 b Ff(C-M-t)-450 985 y Fg(Sp)s(elling)37 +b(Chec)m(k)-450 1151 y Fh(c)n(hec)n(k)25 b(sp)r(elling)e(of)h(curren)n +(t)g(w)n(ord)516 b Ff(M-$)-450 1231 y Fh(c)n(hec)n(k)25 +b(sp)r(elling)e(of)h(all)f(w)n(ords)g(in)g(region)201 +b Ff(M-x)36 b(ispell-region)-450 1310 y Fh(c)n(hec)n(k)25 +b(sp)r(elling)e(of)h(en)n(tire)g(bu\013er)395 b Ff(M-x)36 +b(ispell-buffer)-450 1514 y Fg(T)-10 b(ags)-450 1680 +y Fh(\014nd)24 b(a)g(tag)g(\(a)h(de\014nition\))716 b +Ff(M-.)-450 1760 y Fh(\014nd)24 b(next)h(o)r(ccurrence)g(of)e(tag)612 +b Ff(C-u)36 b(M-.)-450 1839 y Fh(sp)r(ecify)24 b(a)f(new)i(tags)f +(\014le)537 b Ff(M-x)36 b(visit-tags-table)-450 1948 +y Fh(regexp)24 b(searc)n(h)h(on)f(all)f(\014les)g(in)g(tags)i(table)138 +b Ff(M-x)36 b(tags-search)-450 2027 y Fh(run)23 b(query-replace)i(on)f +(all)f(the)h(\014les)144 b Ff(M-x)36 b(tags-query-replace)-450 +2107 y Fh(con)n(tin)n(ue)25 b(last)f(tags)g(searc)n(h)g(or)g +(query-replace)163 b Ff(M-,)-450 2310 y Fg(Shells)-450 +2476 y Fh(execute)26 b(a)e(shell)f(command)670 b Ff(M-!)-450 +2555 y Fh(run)23 b(a)h(shell)f(command)i(on)f(the)g(region)362 +b Ff(M-|)-450 2635 y Fh(\014lter)24 b(region)f(through)i(a)f(shell)f +(command)276 b Ff(C-u)36 b(M-|)-450 2715 y Fh(start)24 +b(a)g(shell)f(in)g(windo)n(w)h Ff(*shell*)467 b(M-x)36 +b(shell)-450 2909 y Fg(Rectangles)-450 3074 y Fh(cop)n(y)25 +b(rectangle)g(to)f(register)659 b Ff(C-x)36 b(r)g(r)-450 +3154 y Fh(kill)23 b(rectangle)1043 b Ff(C-x)36 b(r)g(k)-450 +3234 y Fh(y)n(ank)25 b(rectangle)992 b Ff(C-x)36 b(r)g(y)-450 +3313 y Fh(op)r(en)25 b(rectangle,)f(shifting)f(text)i(righ)n(t)401 +b Ff(C-x)36 b(r)g(o)-450 3393 y Fh(blank)24 b(out)h(rectangle)843 +b Ff(C-x)36 b(r)g(c)-450 3473 y Fh(pre\014x)24 b(eac)n(h)h(line)e(with) +h(a)g(string)553 b Ff(C-x)36 b(r)g(t)-450 3676 y Fg(Abbrevs)-450 +3841 y Fh(add)24 b(global)g(abbrev)886 b Ff(C-x)36 b(a)g(g)-450 +3921 y Fh(add)24 b(mo)r(de-lo)r(cal)g(abbrev)737 b Ff(C-x)36 +b(a)g(l)-450 4001 y Fh(add)24 b(global)g(expansion)h(for)e(this)g +(abbrev)313 b Ff(C-x)36 b(a)g(i)f(g)-450 4081 y Fh(add)24 +b(mo)r(de-lo)r(cal)g(expansion)h(for)e(this)g(abbrev)164 +b Ff(C-x)36 b(a)g(i)f(l)-450 4160 y Fh(explicitly)24 +b(expand)h(abbrev)680 b Ff(C-x)36 b(a)g(e)-450 4269 y +Fh(expand)25 b(previous)f(w)n(ord)f(dynamically)368 b +Ff(M-/)1746 -364 y Fg(Regular)37 b(Expressions)1746 -198 +y Fh(an)n(y)24 b(single)g(c)n(haracter)h(except)g(a)f(newline)291 +b Ff(.)71 b Fh(\(dot\))1746 -119 y(zero)24 b(or)f(more)h(rep)r(eats)807 +b Ff(*)1746 -39 y Fh(one)24 b(or)g(more)f(rep)r(eats)827 +b Ff(+)1746 41 y Fh(zero)24 b(or)f(one)i(rep)r(eat)882 +b Ff(?)1746 120 y Fh(quote)25 b(regular)e(expression)h(sp)r(ecial)g(c)n +(haracter)h Fb(c)96 b Ff(\\)p Fb(c)1746 200 y Fh(alternativ)n(e)25 +b(\(\\or"\))900 b Ff(\\|)1746 280 y Fh(grouping)1170 +b Ff(\\\()36 b Fa(:)11 b(:)h(:)34 b Ff(\\\))1746 359 +y Fh(same)24 b(text)h(as)e Fb(n)5 b Fh(th)25 b(group)718 +b Ff(\\)p Fb(n)1746 439 y Fh(at)24 b(w)n(ord)g(break)1009 +b Ff(\\b)1746 519 y Fh(not)24 b(at)h(w)n(ord)e(break)884 +b Ff(\\B)1746 627 y Fe(en)n(tit)n(y)676 b(matc)n(h)27 +b(start)84 b(matc)n(h)26 b(end)1746 707 y Fh(line)774 +b Ff(^)465 b($)1746 787 y Fh(w)n(ord)733 b Ff(\\<)430 +b(\\>)1746 866 y Fh(bu\013er)706 b Ff(\\`)430 b(\\')1746 +946 y Fe(class)27 b(of)f(c)n(haracters)238 b(matc)n(h)27 +b(these)71 b(matc)n(h)26 b(others)1746 1026 y Fh(explicit)e(set)549 +b Ff([)36 b Fa(:)11 b(:)h(:)35 b Ff(])276 b([^)36 b Fa(:)11 +b(:)g(:)35 b Ff(])1746 1105 y Fh(w)n(ord-syn)n(tax)24 +b(c)n(haracter)201 b Ff(\\w)430 b(\\W)1746 1185 y Fh(c)n(haracter)25 +b(with)f(syn)n(tax)g Fb(c)157 b Ff(\\s)p Fb(c)397 b Ff(\\S)p +Fb(c)1746 1388 y Fg(In)m(ternational)36 b(Character)g(Sets)1746 +1554 y Fh(sp)r(ecify)24 b(principal)f(language)643 b +Ff(C-x)36 b(RET)g(l)1746 1633 y Fh(sho)n(w)24 b(all)f(input)h(metho)r +(ds)423 b Ff(M-x)36 b(list-input-methods)1746 1713 y +Fh(enable)25 b(or)e(disable)g(input)i(metho)r(d)478 b +Ff(C-\\)1746 1793 y Fh(set)24 b(co)r(ding)h(system)f(for)f(next)h +(command)307 b Ff(C-x)36 b(RET)g(c)1746 1872 y Fh(sho)n(w)24 +b(all)f(co)r(ding)h(systems)372 b Ff(M-x)37 b(list-coding-systems)1746 +1952 y Fh(c)n(ho)r(ose)25 b(preferred)e(co)r(ding)h(system)114 +b Ff(M-x)36 b(prefer-coding-system)1746 2157 y Fg(Info)1746 +2323 y Fh(en)n(ter)24 b(the)h(Info)f(do)r(cumen)n(tation)i(reader)321 +b Ff(C-h)36 b(i)1746 2402 y Fh(\014nd)24 b(sp)r(eci\014ed)h(function)f +(or)f(v)l(ariable)h(in)g(Info)183 b Ff(C-h)36 b(S)1746 +2511 y Fh(Mo)n(ving)24 b(within)f(a)h(no)r(de:)1817 2619 +y(scroll)e(forw)n(ard)949 b Ff(SPC)1817 2699 y Fh(scroll)22 +b(rev)n(erse)973 b Ff(DEL)1817 2778 y Fh(b)r(eginning)24 +b(of)f(no)r(de)820 b Ff(.)71 b Fh(\(dot\))1746 2887 y(Mo)n(ving)24 +b(b)r(et)n(w)n(een)h(no)r(des:)1817 2995 y Fe(next)e +Fh(no)r(de)1043 b Ff(n)1817 3075 y Fe(previous)23 b Fh(no)r(de)900 +b Ff(p)1817 3154 y Fh(mo)n(v)n(e)24 b Fe(up)1097 b Ff(u)1817 +3234 y Fh(select)24 b(men)n(u)g(item)g(b)n(y)g(name)564 +b Ff(m)1817 3314 y Fh(select)24 b Fb(n)5 b Fh(th)25 b(men)n(u)f(item)g +(b)n(y)g(n)n(um)n(b)r(er)g(\(1{9\))176 b Fb(n)1817 3393 +y Fh(follo)n(w)22 b(cross)i(reference)g(\(return)g(with)g +Ff(l)p Fh(\))230 b Ff(f)1817 3473 y Fh(return)23 b(to)i(last)e(no)r(de) +i(y)n(ou)f(sa)n(w)518 b Ff(l)1817 3553 y Fh(return)23 +b(to)i(directory)f(no)r(de)621 b Ff(d)1817 3633 y Fh(go)24 +b(to)g(top)g(no)r(de)h(of)e(Info)h(\014le)578 b Ff(t)1817 +3712 y Fh(go)24 b(to)g(an)n(y)g(no)r(de)h(b)n(y)f(name)623 +b Ff(g)1746 3821 y Fh(Other:)1817 3929 y(run)23 b(Info)h +Fe(tutorial)825 b Ff(h)1817 4009 y Fh(lo)r(ok)23 b(up)h(a)g(sub)t(ject) +h(in)e(the)i(indices)398 b Ff(i)1817 4088 y Fh(searc)n(h)24 +b(no)r(des)g(for)f(regexp)648 b Ff(s)1817 4168 y Fe(quit)22 +b Fh(Info)1083 b Ff(q)3942 -364 y Fg(Registers)3942 -198 +y Fh(sa)n(v)n(e)24 b(region)g(in)f(register)767 b Ff(C-x)36 +b(r)g(s)3942 -119 y Fh(insert)23 b(register)h(con)n(ten)n(ts)i(in)n(to) +e(bu\013er)392 b Ff(C-x)36 b(r)g(i)3942 -10 y Fh(sa)n(v)n(e)24 +b(v)l(alue)h(of)e(p)r(oin)n(t)h(in)g(register)531 b Ff(C-x)36 +b(r)g(SPC)3942 69 y Fh(jump)23 b(to)i(p)r(oin)n(t)f(sa)n(v)n(ed)g(in)g +(register)486 b Ff(C-x)36 b(r)g(j)3942 274 y Fg(Keyb)s(oard)i(Macros) +3942 440 y Fe(start)22 b Fh(de\014ning)j(a)e(k)n(eyb)r(oard)i(macro)429 +b Ff(C-x)36 b(\()3942 519 y Fe(end)24 b Fh(k)n(eyb)r(oard)h(macro)f +(de\014nition)482 b Ff(C-x)36 b(\))3942 599 y Fe(execute)24 +b Fh(last-de\014ned)h(k)n(eyb)r(oard)g(macro)278 b Ff(C-x)36 +b(e)3942 679 y Fh(app)r(end)25 b(to)f(last)g(k)n(eyb)r(oard)h(macro)477 +b Ff(C-u)36 b(C-x)g(\()3942 758 y Fh(name)24 b(last)g(k)n(eyb)r(oard)h +(macro)292 b Ff(M-x)37 b(name-last-kbd-macro)3942 838 +y Fh(insert)23 b(Lisp)h(de\014nition)g(in)g(bu\013er)289 +b Ff(M-x)36 b(insert-kbd-macro)3942 1041 y Fg(Commands)i(Dealing)f +(with)g(Emacs)i(Lisp)3942 1207 y Fh(ev)l(al)24 b Fe(sexp)g +Fh(b)r(efore)g(p)r(oin)n(t)744 b Ff(C-x)36 b(C-e)3942 +1287 y Fh(ev)l(al)24 b(curren)n(t)g Fe(defun)855 b Ff(C-M-x)3942 +1366 y Fh(ev)l(al)24 b Fe(region)935 b Ff(M-x)36 b(eval-region)3942 +1446 y Fh(read)24 b(and)g(ev)l(al)g(minibu\013er)687 +b Ff(M-:)3942 1526 y Fh(load)24 b(from)f(standard)h(system)g(directory) +175 b Ff(M-x)36 b(load-library)3942 1731 y Fg(Simple)h(Customization) +3942 1896 y Fh(customize)25 b(v)l(ariables)e(and)i(faces)396 +b Ff(M-x)36 b(customize)3942 2004 y Fh(Making)24 b(global)g(k)n(ey)g +(bindings)g(in)f(Emacs)h(Lisp)f(\(examples\):)3942 2113 +y Ff(\(global-set-key)40 b("\\C-cg")d('goto-line\))3942 +2192 y(\(global-set-key)j("\\M-#")d('query-replace-regexp\))3942 +2397 y Fg(W)-10 b(riting)38 b(Commands)3942 2563 y Ff(\(defun)f +Fb(c)l(ommand-name)43 b Ff(\()p Fb(ar)l(gs)5 b Ff(\))4013 +2643 y(")p Fb(do)l(cumentation)g Ff(")38 b(\(interactive)g(")p +Fb(template)5 b Ff("\))4013 2722 y Fb(b)l(o)l(dy)h Ff(\))3942 +2831 y Fh(An)24 b(example:)3942 2939 y Ff(\(defun)37 +b(this-line-to-top-of-win)q(dow)42 b(\(line\))4013 3019 +y("Reposition)c(line)e(point)h(is)f(on)g(to)g(top)g(of)g(window.)3942 +3098 y(With)g(ARG,)h(put)f(point)h(on)f(line)g(ARG.")4013 +3178 y(\(interactive)i("P"\))4013 3258 y(\(recenter)f(\(if)g(\(null)f +(line\))4507 3337 y(0)4436 3417 y(\(prefix-numeric-value)41 +b(line\)\)\)\))3942 3525 y Fh(The)35 b Ff(interactive)k +Fh(sp)r(ec)c(sa)n(ys)g(ho)n(w)h(to)f(read)h(argumen)n(ts)g(in)n(terac-) +3942 3605 y(tiv)n(ely)-6 b(.)32 b(T)n(yp)r(e)24 b Ff(C-h)36 +b(f)g(interactive)26 b Fh(for)d(more)h(details.)4235 +3736 y Fd(Cop)n(yrigh)n(t)4538 3734 y(c)4521 3736 y Fc(\015)d +Fd(2006)i(F)-5 b(ree)21 b(Soft)n(w)n(are)i(F)-5 b(oundation,)20 +b(Inc.)4399 3800 y(v2.3)i(for)f(GNU)f(Emacs)h(v)n(ersion)h(22,)f(2006) +4532 3864 y(designed)f(b)n(y)h(Stephen)f(Gildea)3942 +3956 y(P)n(ermission)28 b(is)f(gran)n(ted)i(to)f(mak)n(e)h(and)e +(distribute)f(copies)j(of)f(this)f(card)h(pro-)3942 4020 +y(vided)23 b(the)h(cop)n(yrigh)n(t)h(notice)g(and)f(this)f(p)r +(ermission)h(notice)g(are)h(preserv)n(ed)g(on)3942 4084 +y(all)20 b(copies.)3942 4176 y(F)-5 b(or)21 b(copies)g(of)g(the)g(GNU)e +(Emacs)i(man)n(ual,)f(write)h(to)g(the)f(F)-5 b(ree)22 +b(Soft)n(w)n(are)g(F)-5 b(oun-)3942 4240 y(dation,)29 +b(Inc.,)g(51)g(F)-5 b(ranklin)28 b(Street,)h(Fifth)f(Flo)r(or,)h +(Boston,)i(MA)d(02110-1301)3942 4304 y(USA)p eop end %%Trailer -end + userdict /end-hook known{end-hook}if %%EOF
--- a/leim/COPYING Sat Oct 14 16:56:21 2006 +0000 +++ b/leim/COPYING Sat Oct 14 17:36:28 2006 +0000 @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -15,7 +15,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,7 +55,7 @@ The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest @@ -303,10 +303,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. @@ -336,5 +335,5 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
--- a/leim/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/leim/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,36 @@ +2006-10-12 Kenichi Handa <handa@m17n.org> + + * Makefile.in (install): Be sure to make ${INSTALLDIR} before `cd' + to it. + +2006-10-05 Chong Yidong <cyd@stupidchicken.com> + + * quail/latin-ltx.el: Fix typo in previous change. + +2006-10-05 Stefan Monnier <monnier@iro.umontreal.ca> + + * quail/latin-ltx.el: Remove rules that start with { since they are + redundant and hence impact the { key for no good reason. + +2006-10-02 Kenichi Handa <handa@m17n.org> + + * Makefile.in (install): Fix previous change. + +2006-09-28 Kenichi Handa <handa@m17n.org> + + * Makefile.in (install): Be sure to make ${INSTALLDIR}. + +2006-09-15 Jay Belanger <belanger@truman.edu> + + * COPYING: Replace "Library Public License" by "Lesser Public + License" throughout. + +2006-09-06 Micha,Ak(Bl Cadilhac <michael.cadilhac@lrde.org> + + * quail/uni-input.el (ucs-input-method): Don't make the action of + a key not in [0-9a-zA-Z] when it was expected to be. Let the Emacs + mechanism do it. + 2006-07-12 David Kastrup <dak@gnu.org> * quail/greek.el: Change iota subscriptum transliteration in
--- a/leim/Makefile.in Sat Oct 14 16:56:21 2006 +0000 +++ b/leim/Makefile.in Sat Oct 14 17:36:28 2006 +0000 @@ -216,6 +216,9 @@ sed -n '/^[^;]/ p' < ${srcdir}/leim-ext.el >> $@ install: all + if [ ! -d ${INSTALLDIR} ] ; then \ + ${srcdir}/${dot}${dot}/mkinstalldirs ${INSTALLDIR}; \ + else true; fi if [ x`(cd ${INSTALLDIR} && /bin/pwd)` != x`(/bin/pwd)` ] ; then \ rm -rf ${INSTALLDIR}/leim-list.el; \ rm -rf ${INSTALLDIR}/quail ${INSTALLDIR}/ja-dic ; \
--- a/leim/quail/latin-ltx.el Sat Oct 14 16:56:21 2006 +0000 +++ b/leim/quail/latin-ltx.el Sat Oct 14 17:36:28 2006 +0000 @@ -45,17 +45,17 @@ (quail-define-rules ("!`" ?¡) - ("{\\pounds}" ?£) ("\\pounds" ?£) - ("{\\S}" ?§) ("\\S" ?§) + ("\\pounds" ?£) ;; ("{\\pounds}" ?£) + ("\\S" ?§) ;; ("{\\S}" ?§) ("\\\"{}" ?¨) - ("{\\copyright}" ?©) ("\\copyright" ?©) + ("\\copyright" ?©) ;; ("{\\copyright}" ?©) ("$^a$" ?ª) ("\\={}" ?¯) ("$\\pm$" ?±) ("\\pm" ?±) ("$^2$" ?²) ("$^3$" ?³) ("\\'{}" ?´) - ("{\\P}" ?¶) ("\\P" ?¶) + ("\\P" ?¶) ;; ("{\\P}" ?¶) ;; Fixme: Yudit has the equivalent of ("\\cdot" ?â‹…), for U+22C5, DOT ;; OPERATOR, whereas · is MIDDLE DOT. JadeTeX translates both to ;; \cdot. @@ -71,8 +71,8 @@ ("\\~{A}" ?Ã) ("\\~A" ?Ã) ("\\\"{A}" ?Ä) ("\\\"A" ?Ä) ("\\\k{A}" ?Ä„) - ("{\\AA}" ?Ã…) ("\\AA" ?Ã…) - ("{\\AE}" ?Æ) ("\\AE" ?Æ) + ("\\AA" ?Ã…) ;; ("{\\AA}" ?Ã…) + ("\\AE" ?Æ) ;; ("{\\AE}" ?Æ) ("\\c{C}" ?Ç) ("\\cC" ?Ç) ("\\`{E}" ?È) ("\\`E" ?È) ("\\'{E}" ?É) ("\\'E" ?É) @@ -93,14 +93,14 @@ ("\\\"{O}" ?Ö) ("\\\"O" ?Ö) ("\\\k{O}" ?Ǫ) ("$\\times$" ?×) ("\\times" ?×) - ("{\\O}" ?Ø) ("\\O" ?Ø) + ("\\O" ?Ø) ;; ("{\\O}" ?Ø) ("\\`{U}" ?Ù) ("\\`U" ?Ù) ("\\'{U}" ?Ú) ("\\'U" ?Ú) ("\\^{U}" ?Û) ("\\^U" ?Û) ("\\\"{U}" ?Ãœ) ("\\\"U" ?Ãœ) ("\\\k{U}" ?Ų) ("\\'{Y}" ?Ã) ("\\'Y" ?Ã) - ("{\\ss}" ?ß) ("\\ss" ?ß) + ("\\ss" ?ß) ;; ("{\\ss}" ?ß) ("\\`{a}" ?à ) ("\\`a" ?à ) ("\\'{a}" ?á) ("\\'a" ?á) @@ -108,8 +108,8 @@ ("\\~{a}" ?ã) ("\\~a" ?ã) ("\\\"{a}" ?ä) ("\\\"a" ?ä) ("\\\k{a}" ?Ä…) - ("{\\aa}" ?Ã¥) ("\\aa" ?Ã¥) - ("{\\ae}" ?æ) ("\\ae" ?æ) + ("\\aa" ?Ã¥) ;; ("{\\aa}" ?Ã¥) + ("\\ae" ?æ) ;; ("{\\ae}" ?æ) ("\\c{c}" ?ç) ("\\cc" ?ç) ("\\`{e}" ?è) ("\\`e" ?è) ("\\'{e}" ?é) ("\\'e" ?é) @@ -130,7 +130,7 @@ ("\\\"{o}" ?ö) ("\\\"o" ?ö) ("\\\k{o}" ?Ç«) ("$\\div$" ?÷) ("\\div" ?÷) - ("{\\o}" ?ø) ("\\o" ?ø) + ("\\o" ?ø) ;; ("{\\o}" ?ø) ("\\`{u}" ?ù) ("\\`u" ?ù) ("\\'{u}" ?ú) ("\\'u" ?ú) ("\\^{u}" ?û) ("\\^u" ?û) @@ -181,7 +181,7 @@ ("\\u{\\i}" ?Ä) ("\\ui" ?Ä) ("\\.{I}" ?Ä°) ("\\.I" ?Ä°) - ("{\\i}" ?ı) ("\\i" ?ı) + ("\\i" ?ı) ;; ("{\\i}" ?ı) ("\\^{J}" ?Ä´) ("\\^J" ?Ä´) ("\\^{\\j}" ?ĵ) ("\\^j" ?ĵ) ("\\c{K}" ?Ķ) ("\\cK" ?Ķ) @@ -191,8 +191,8 @@ ("\\c{L}" ?Ä») ("\\cL" ?Ä») ("\\c{l}" ?ļ) ("\\cl" ?ļ) - ("{\\L}" ?Å) ("\\L" ?Å) - ("{\\l}" ?Å‚) ("\\l" ?Å‚) + ("\\L" ?Å) ;; ("{\\L}" ?Å) + ("\\l" ?Å‚) ;; ("{\\l}" ?Å‚) ("\\'{N}" ?Ń) ("\\'N" ?Ń) ("\\'{n}" ?Å„) ("\\'n" ?Å„) ("\\c{N}" ?Å…) ("\\cN" ?Å…) @@ -206,8 +206,8 @@ ("\\H{O}" ?Å) ("\\HO" ?Å) ("\\U{o}" ?Å‘) ("\\Uo" ?Å‘) - ("{\\OE}" ?Å’) ("\\OE" ?Å’) - ("{\\oe}" ?Å“) ("\\oe" ?Å“) + ("\\OE" ?Å’) ;; ("{\\OE}" ?Å’) + ("\\oe" ?Å“) ;; ("{\\oe}" ?Å“) ("\\'{R}" ?Å”) ("\\'R" ?Å”) ("\\'{r}" ?Å•) ("\\'r" ?Å•) ("\\c{R}" ?Å–) ("\\cR" ?Å–)
--- a/leim/quail/uni-input.el Sat Oct 14 16:56:21 2006 +0000 +++ b/leim/quail/uni-input.el Sat Oct 14 17:36:28 2006 +0000 @@ -100,11 +100,6 @@ (progn (push key events) (ucs-input-insert-char key)) - (let ((last-command-char key) - (current-prefix-arg)) - (condition-case err - (call-interactively (key-binding seq)) - (quail-error (message "%s" (cdr err)) (beep)))) (quail-delete-region) (throw 'non-digit (append (reverse events) (listify-key-sequence seq))))))
--- a/lib-src/.cvsignore Sat Oct 14 16:56:21 2006 +0000 +++ b/lib-src/.cvsignore Sat Oct 14 17:36:28 2006 +0000 @@ -21,5 +21,6 @@ yow Makefile makefile +blessmail *-spd *.pdb
--- a/lib-src/COPYING Sat Oct 14 16:56:21 2006 +0000 +++ b/lib-src/COPYING Sat Oct 14 17:36:28 2006 +0000 @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -15,7 +15,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,7 +55,7 @@ The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest @@ -303,10 +303,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. @@ -336,5 +335,5 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
--- a/lib-src/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/lib-src/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,16 @@ +2006-10-09 Eli Zaretskii <eliz@gnu.org> + + * makefile.w32-in (../src/config.h): Fix error message. + +2006-09-30 Eli Zaretskii <eliz@gnu.org> + + * .cvsignore: Add blessmail. + +2006-09-15 Jay Belanger <belanger@truman.edu> + + * COPYING: Replace "Library Public License" by "Lesser Public + License" throughout. + 2006-08-09 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> * etags.c (readline): expect sscanf returns >= 1. @@ -10,7 +23,7 @@ 2006-08-07 Masatake YAMATO <jet@gyve.org> - * etags.c (TEX_mode): Check getc retruns EOF. + * etags.c (TEX_mode): Check getc returns EOF. File ended without newline causes infinite loop. 2002-07-30 Adrian Aichner <adrian@xemacs.org> (tiny change)
--- a/lib-src/makefile.w32-in Sat Oct 14 16:56:21 2006 +0000 +++ b/lib-src/makefile.w32-in Sat Oct 14 17:36:28 2006 +0000 @@ -318,7 +318,7 @@ # Headers we would preprocess if we could. # ../src/config.h: ../nt/$(CONFIG_H) - echo config.h has changed. Re-run configure.bat. + echo $(CONFIG_H) has changed. Re-run configure.bat. exit -1 getopt.h: getopt_.h
--- a/lisp/COPYING Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/COPYING Sat Oct 14 17:36:28 2006 +0000 @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -15,7 +15,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,7 +55,7 @@ The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest @@ -303,10 +303,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. @@ -336,5 +335,5 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
--- a/lisp/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,1755 @@ +2006-10-13 Giorgos Keramidas <keramida@ceid.upatras.gr> (tiny change) + + * apropos.el (apropos-pattern-quoted): Fix a typo in a doc + string. + +2006-10-13 Eli Zaretskii <eliz@gnu.org> + + * subr.el (start-process-shell-command): Doc fix. + +2006-10-13 Stefan Monnier <monnier@iro.umontreal.ca> + + * vc-hooks.el (vc-ignore-dir-regexp): Make it into a defcustom. + (vc-find-root): Don't walk higher up than ~. + +2006-10-12 Chong Yidong <cyd@stupidchicken.com> + + * international/utf-8.el (utf-translate-cjk-load-tables): + Avoid clobbering last-coding-system-used during load. + +2006-10-12 Carsten Dominik <dominik@science.uva.nl> + + * textmodes/reftex-global.el (reftex-create-tags-file): Quote file + arguments. + +2006-10-12 Andreas Schwab <schwab@suse.de> + + * files.el (auto-mode-alist): Match change log file name also with + a dash before a numeric extension. + +2006-10-11 Ilya Zakharevich <ilyaz@cpan.org> + + * progmodes/cperl-mode.el: Merge from upstream, upto version 5.22. + After 5.0: + (cperl-add-tags-recurse-noxs-fullpath): New function (for -batch mode). + + After 5.1: Major edit. Summary of most visible changes: + + - Multiple <<HERE per line allowed. + - Handles multiline subroutine declaration headers (with comments). + (The exception is `cperl-etags' - but it is not used in the rest + of the mode.) + - Fontifies multiline my/our declarations (even with comments, + and with legacy `font-lock'). + - Major speedup of syntaxification, both immediate and postponed + (3.5x to 15x [for different CPUs and versions of Emacs] on the + huge real-life document I tested). + - New bindings, edits to imenu. + - "_" is made into word-char during fontification/syntaxification; + some attempts to recognize non-word "_" during other operations too. + - Detect bug in Emacs with `looking-at' inside `narrow' and bulk out. + - autoload some more perldoc-related stuff + - New convenience features: ISpell POD/HEREDOCs, narrow-to-HEREDOC. + - Attempt to incorporate XEmacs edits which reached me. + + Fine-grained changelog: + (cperl-hook-after-change): New configuration variable. + (cperl-vc-sccs-header): Likewise. + (cperl-vc-sccs-header): Likewise. + (cperl-vc-header-alist): Default via two preceding variables. + (cperl-invalid-face): Remove double quoting under XEmacs + (still needed under 21.2). + (cperl-tips): Update URLs for resources. + (cperl-problems): Likewise. + (cperl-praise): Mention new features. + New C-c key bindings: for `cperl-find-bad-style', + `cperl-pod-spell', `cperl-here-doc-spell', `cperl-narrow-to-here-doc', + `cperl-perdoc', and `cperl-perldoc-at-point'. + CPerl Mode menu changes: "Fix style by spaces", "Imenu on Perl Info" + moved, new submenu of Tools with Ispell entries and narrowing. + (cperl-after-sub-regexp): New defsubst. + (cperl-imenu--function-name-regexp-perl): Use `cperl-after-sub-regexp'. + Allows heads up to head4. + Allow "package;". + (defun-prompt-regexp): Use `cperl-after-sub-regexp'. + (paren-backwards-message): ??? Something for XEmacs??? + (cperl-mode): Never auto-switch abbrev-mode off. + Try to allow '_' be non-word char. + Do not use `font-lock-unfontify-region-function' on XEmacs. + Reset syntax cache on mode start. + Support multiline facification (even on legacy `font-lock'). + (cperl-facemenu-add-face-function): ??? Some contributed code ??? + (cperl-after-change-function): Since `font-lock' and `lazy-lock' + refuse to inform us whether the fontification is due to lazy + calling or due to edit to a buffer, install our own hook + (controlled by `cperl-hook-after-change'). + (cperl-electric-pod): =cut may have been recognized as start. + (cperl-block-p): Move, updatedfor attributes. + (cperl-calculate-indent): Try to allow '_' be non-word char + Support subs with attributes. + (cperl-where-am-i): Queit (?) a warning. + (cperl-cached-syntax-table) New function. + (cperl-forward-re): Use `cperl-cached-syntax-table'. + (cperl-unwind-to-safe): Recognize `syntax-type' property + changing in a middle of line. + (cperl-find-sub-attrs): New function. + (cperl-find-pods-heres): Allow many <<EOP per line. + Allow subs with attributes. + Major speedups (3.5x..15x on a real-life test file nph-proxy.pl). + Recognize "extproc " (OS/2) case-folded and only at start. + /x on s///x with empty replacement was not recognized. + Better comments. + (cperl-after-block-p): Remarks on diff with `cperl-block-p'. + Allow subs with attributes, labels. + Do not confuse "else::foo" with "else". + Minor optimizations... + (cperl-after-expr-p): Try to allow '_' be non-word char. + (cperl-fill-paragraph): Try to detect a major bug in Emacs + with `looking-at' inside `narrow' and bulk out if found. + (cperl-imenu--create-perl-index): Updates for new + `cperl-imenu--function-name-regexp-perl'. + (cperl-outline-level): Likewise. + (cperl-init-faces): Allow multiline subroutine headers + and my/our declarations, and ones with comments. + Allow subroutine attributes. + (cperl-imenu-on-info): Better docstring. + (cperl-etags): Rudimentary support for attributes. + Support for packages and "package;". + (cperl-add-tags-recurse-noxs): Better (?) docstring. + (cperl-add-tags-recurse-noxs-fullpath): Likewise. + (cperl-tags-hier-init): Misprint for `fboundp' fixed. + (cperl-not-bad-style-regexp): Try to allow '_' be non-word char. + (cperl-perldoc): Add autoload. + (cperl-perldoc-at-point): Likewise. + (cperl-here-doc-spell): New function. + (cperl-pod-spell): Likewise. + (cperl-map-pods-heres): Likewise. + (cperl-get-here-doc-region): Likewise. + (cperl-font-lock-fontify-region-function): Likewise (backward + compatibility for legacy `font-lock'). + (cperl-font-lock-unfontify-region-function): Fix style. + (cperl-fontify-syntaxically): Recognize and optimize away deferred + calls with no-change. Governed by `cperl-hook-after-change'. + (cperl-fontify-update): Recognize that syntaxification region + can be larger than fontification one. + XXXX we leave `cperl-postpone' property, so this is quadratic... + (cperl-fontify-update-bad): Temporary placeholder until + it is clear how to implement `cperl-fontify-update'. + (cperl-time-fontification): New function. + (attrib-group): New text attribute. + (multiline): New value: `syntax-type' text attribute. + + After 5.2: + (cperl-emulate-lazy-lock): New function. + (cperl-fontify-syntaxically): Would skip large regions. + Add `cperl-time-fontification', `cperl-emulate-lazy-lock' to menu. + Some globals were declared, but uninitialized. + + After 5.3, 5.4: + (cperl-facemenu-add-face-function): Add docs, fix U<>. + Copyright message updated. + (cperl-init-faces): Work around a bug in `font-lock'. May slow + facification down a bit. + Misprint for my|our|local for old `font-lock' + "our" was not fontified same as "my|local". + Highlight variables after "my" etc even in + a middle of an expression. + Do not facify multiple variables after my etc + unless parentheses are present. + + After 5.5, 5.6 + (cperl-fontify-syntaxically): after-change hook could reset. + (cperl-syntax-done-to) to a middle of line; unwind to BOL. + + After 5.7: + (cperl-init-faces): Allow highlighting of local ($/). + (cperl-problems-old-emaxen): New variable (for the use of DOCSTRING). + (cperl-problems): Remove fixed problems. + (cperl-find-pods-heres): Recognize #-comments in m##x too. + Recognize charclasses (unless delimiter is \). + (cperl-fontify-syntaxically): Unwinding to safe was done in wrong order. + (cperl-regexp-scan): Update docs. + (cperl-beautify-regexp-piece): Use information got from regexp scan. + + After 5.8: + Major user visible changes: + Recognition and fontification of character classes in RExen. + Variable indentation of RExen according to groups. + + (cperl-find-pods-heres): Recognize POSIX classes in REx charclasses. + Fontify REx charclasses in variable-name face. + Fontify POSIX charclasses in "type" face. + Fontify unmatched "]" in function-name face. + Mark first-char of HERE-doc as `front-sticky'. + Reset `front-sticky' property when needed. + (cperl-calculate-indent): Indents //x -RExen accordning to parens level. + (cperl-to-comment-or-eol): Recognize ends of `syntax-type' constructs. + (cperl-backward-to-noncomment): Recognize stringy `syntax-type' + constructs. Support `narrow'ed buffers. + (cperl-praise): Remove a reservation. + (cperl-make-indent): New function. + (cperl-indent-for-comment): Use `cperl-make-indent'. + (cperl-indent-line): Likewise. + (cperl-lineup): Likewise. + (cperl-beautify-regexp-piece): Likewise. + (cperl-contract-level): Likewise. + (cperl-toggle-set-debug-unwind): New function. + New menu entry for this. + (fill-paragraph-function): Use when `boundp'. + (cperl-calculate-indent): Take into account groups when indenting RExen. + (cperl-to-comment-or-eol): Recognize # which end a string. + (cperl-modify-syntax-type): Make only syntax-table property non-sticky. + (cperl-fill-paragraph): Return t: needed for `fill-paragraph-function'. + (cperl-fontify-syntaxically): More clear debugging message. + (cperl-pod2man-build-command): Check (XEmacs) `Man-filter-list'. + (cperl-init-faces): More complicated highlight even on XEmacs (new). + Merge cosmetic changes from XEmacs. + + After 5.9: + (cperl-1+): Move to before the first use. + (cperl-1-): Likewise. + + After 5.10: + + This code may lock Emacs hard!!! Use on your own risk! + + (cperl-font-locking): New internal variable. + (cperl-beginning-of-property): New function. + (cperl-calculate-indent): Use `cperl-beginning-of-property' + instead of `previous-single-property-change'. + (cperl-unwind-to-safe): Likewise. + (cperl-after-expr-p): Likewise. + (cperl-get-here-doc-region): Likewise. + (cperl-font-lock-fontify-region-function): Likewise. + (cperl-to-comment-or-eol): Do not call `cperl-update-syntaxification' + recursively. + Bound `next-single-property-change' via `point-max'. + (cperl-unwind-to-safe): Bound likewise + (cperl-font-lock-fontify-region-function): Likewise + (cperl-find-pods-heres): Mark as recursive for `cperl-to-comment-or-eol' + Initialization of `cperl-font-lock-multiline-start' could be + missed if the "main" fontification did not run due to the + keyword being already fontified. + (cperl-pod-spell): Return t from do-one-chunk function. + (cperl-map-pods-heres): Stop when the worker returns nil. + Call `cperl-update-syntaxification'. + (cperl-get-here-doc-region): Call `cperl-update-syntaxification'. + (cperl-get-here-doc-delim): Remove unused function. + + After 5.11: + + The possible lockup of Emacs (introduced in 5.10) fixed. + + (cperl-unwind-to-safe): `cperl-beginning-of-property' won't return nil. + (cperl-syntaxify-for-menu): New customization variable. + (cperl-select-this-pod-or-here-doc): New function. + (cperl-get-here-doc-region): Extra argument. + Do not adjust pos by 1. + + New menu entries + (Perl/Tools): Selection of current POD or HERE-DOC section. + (Debugging CPerl:) backtrace on fontification. + + After 5.12: + (cperl-cached-syntax-table): Use `car-safe'. + (cperl-forward-re): Remove spurious argument SET-ST. + Add documentation. + (cperl-forward-group-in-re): New function. + (cperl-find-pods-heres): Find and highlight (?{}) blocks in RExen + (XXXX Temporary (?) hack is to syntax-mark them as comment). + + After 5.13: + (cperl-string-syntax-table): Make { and } not-grouping + (Sometimes they ARE grouping in RExen, but matching them would only + confuse in many situations when they are not) + (beginning-of-buffer): Replace two occurences with goto-char... + (cperl-calculate-indent): `char-after' could be nil... + (cperl-find-pods-heres): REx can start after "[" too. + Hightlight (??{}) in RExen too. + (cperl-maybe-white-and-comment-rex): New constant + (cperl-white-and-comment-rex): Likewise. + XXXX Not very efficient, but hard to make + better while keeping 1 group. + + After 5.13: + (cperl-find-pods-heres): $foo << identifier() is not a HERE-DOC. + Likewise for 1 << identifier. + + After 5.14: + (cperl-find-pods-heres): Different logic for $foo .= <<EOF etc. + Error-less condition-case could fail. + (cperl-font-lock-fontify-region-function): Likewise. + (cperl-init-faces): Likewise. + + After 5.15: + (cperl-find-pods-heres): Support property REx-part2. + (cperl-calculate-indent): Likewise. + Don't special-case REx with non-empty 1st line. + (cperl-find-pods-heres): In RExen, highlight non-literal backslashes. + Invert highlighting of charclasses: + now the envelop is highlighted. + Highlight many others 0-length builtins. + (cperl-praise): Mention indenting and highlight in RExen. + + After 5.15: + (cperl-find-pods-heres): Highlight capturing parens in REx. + + After 5.16: + (cperl-find-pods-heres): Highlight '|' for alternation + Initialize `font-lock-warning-face' if not present. + (cperl-find-pods-heres): Use `font-lock-warning-face' instead of + `font-lock-function-name-face'. + (cperl-look-at-leading-count): Likewise. + (cperl-find-pods-heres): Localize `font-lock-variable-name-face', + `font-lock-keyword-face' (needed for + batch processing), etc... + Use `font-lock-builtin-face' for builtin in REx + Now `font-lock-variable-name-face' + is used for interpolated variables + Use "talking aliases" for faces inside REx + Highlight parts of REx (except in charclasses) + according to the syntax and/or semantic + Syntax-mark a {}-part of (?{}) as "comment" + (it was the ()-part) + Better logic to distinguish what is what in REx + (cperl-tips-faces): Document REx highlighting + (cperl-praise): Mention REx syntax highlight etc. + + After 5.17: + (cperl-find-sub-attrs): Would not always manage to print error message. + (cperl-find-pods-heres): Localize `font-lock-constant-face'. + + After 5.18: + (cperl-find-pods-heres): Misprint in REx for parsing REx. + Very minor optimization. + `my-cperl-REx-modifiers-face' got quoted. + Recognize "print $foo <<END" as HERE-doc. + Put `REx-interpolated' text attribute if needed. + (cperl-invert-if-unless-modifiers): New function. + (cperl-backward-to-start-of-expr): Likewise. + (cperl-forward-to-end-of-expr): Likewise. + (cperl-invert-if-unless): Works in "the opposite way" too. + Cursor position on return is on the switch-word. + Indents comments better. + (REx-interpolated): New text attribute. + (cperl-next-interpolated-REx): New function. + (cperl-next-interpolated-REx-0): Likewise. + (cperl-next-interpolated-REx-1): Likewise. + "\C-c\C-x", "\C-c\C-y", "\C-c\C-v": New keybinding for these functions. + Perl/Regexp menu: 3 new entries for `cperl-next-interpolated-REx'. + (cperl-praise): Mention finded interpolated RExen. + + After 5.19: + (cperl-init-faces): Highlight %$foo, @$foo too. + (cperl-short-docs): Better docs for system, exec. + (cperl-find-pods-heres): Better detect << after print {FH} <<EOF etc. + Would not find HERE-doc ended by EOF without NL. + (cperl-short-docs): Correct not-doubled \-escapes. + start block: Put some `defvar' for stuff gone from XEmacs. + + After 5.20: + initial comment: Extend copyright, fix email address. + (cperl-indent-comment-at-column-0): New customization variable. + (cperl-comment-indent): Indentation after $#a would increasy by 1. + (cperl-mode): Make `defun-prompt-regexp' grok BEGIN/END etc. + (cperl-find-pods-heres): Mark CODE of s///e as `syntax-type' `multiline' + (cperl-at-end-of-expr): Would fail if @BAR=12 follows after ";". + (cperl-init-faces): If `cperl-highlight-variables-indiscriminately' + highlight $ in $foo too (UNTESTED). + (cperl-set-style): Docstring missed some available styles. + toplevel: Menubar/Perl/Indent-Styles had FSF, now K&R. + Change "Current" to "Memorize Current". + (cperl-indent-wrt-brace): New customization variable; the default is + as for pre-5.2 version. + (cperl-styles-entries): Keep `cperl-extra-newline-before-brace-multiline'. + (cperl-style-alist): Likewise. + (cperl-fix-line-spacing): Support `cperl-merge-trailing-else' being nil, + and `cperl-extra-newline-before-brace' etc + being t + (cperl-indent-exp): Plans B and C to find continuation blocks even + if `cperl-extra-newline-before-brace' is t. + + After 5.21: + Improve some docstrings concerning indentation. + (cperl-indent-rules-alist): New variable. + (cperl-sniff-for-indent): New function name + (separated from `cperl-calculate-indent'). + (cperl-calculate-indent): Separate the sniffer and the indenter; + uses `cperl-sniff-for-indent' now. + (cperl-comment-indent): Test for `cperl-indent-comment-at-column-0' + was inverted; + Support `comment-column' = 0. + +2006-10-11 Martin Rudalics <rudalics@gmx.at> + + * dnd.el (dnd-handle-one-url): Fix typo in doc-string. + * help-at-pt.el (scan-buf-move-to-region): Likewise. + * longlines.el (longlines-window-change-function): Likewise. + * simple.el (undo-ask-before-discard): Likewise. + * wid-edit.el (widget-field-prompt-internal) + (widget-documentation-link-p): Likewise. + +2006-10-10 Stefan Monnier <monnier@iro.umontreal.ca> + + * progmodes/sh-script.el (sh-get-kw): | is not among the allowed chars + for a keyword. + +2006-10-09 Stefan Monnier <monnier@iro.umontreal.ca> + + * newcomment.el (comment-valid-prefix-p): Make the check + more thorough. From an idea by Martin Rudalics <rudalics@gmx.at>. + (comment-indent-new-line): Adjust call. + +2006-10-09 Ken Manheimer <ken.manheimer@gmail.com> + + * allout.el (allout-back-to-current-heading): Base on lower-level + routines to get proper disqualification of aberrant topics. + +2006-10-09 Richard Stallman <rms@gnu.org> + + * textmodes/two-column.el (2C-two-columns): Doc fix. + +2006-10-09 Kim F. Storm <storm@cua.dk> + + * shell.el (explicit-csh-args, explicit-bash-args): Add comment + about implicit use. + +2006-10-08 Richard Stallman <rms@gnu.org> + + * textmodes/two-column.el (2C-two-columns): Doc fix. + +2006-10-08 Reiner Steib <Reiner.Steib@gmx.de> + + * files.el: Mark `buffer-read-only' as safe-local-variable. + +2006-10-08 Nick Roberts <nickrob@snap.net.nz> + + * progmodes/gdb-ui.el (gdb-speedbar-expand-node): Burp if + GUD buffer has been killed. + +2006-10-07 Stefan Monnier <monnier@iro.umontreal.ca> + + * completion.el (add-completions-from-c-buffer): + Don't presume an error's second element is a string. + Use looking-at rather than buffer-substring + member. + +2006-10-07 Eli Zaretskii <eliz@gnu.org> + + * mail/rmail.el (rmail-redecode-body): If the old encoding is + `undecided', call find-coding-systems-region to find a proper + non-trivial encoding. + (rmail-mime-charset-pattern): Allow a TAB between "Content-Type" + and "text/plain". + +2006-10-07 Kevin Ryde <user42@zip.com.au> + + * textmodes/reftex-vars.el (defgroup reftex): Update home page + url-link. + + * strokes.el (defgroup strokes): Remove invalid url-link. + +2006-10-07 Magnus Henoch <mange@freemail.hu> + + * autoinsert.el (auto-insert-alist): Doc fix. + +2006-10-07 Johan Bockg,be(Brd <bojohan@dd.chalmers.se> + + * mouse-sel.el (mouse-insert-selection-internal): + Use insert-for-yank, so that yank handlers are run. + +2006-10-07 Kim F. Storm <storm@cua.dk> + + * ido.el (ido-file-extension-aux): Fix comparison. + +2006-10-06 Kim F. Storm <storm@cua.dk> + + * ido.el (ido-wide-find-dirs-or-files): Use shell-quote-argument. + +2006-10-05 Juanma Barranquero <lekktu@gmail.com> + + * emacs-lisp/advice.el (ad-remove-advice, ad-parse-arglist) + (ad-make-mapped-call): Use `let', not `let*'. + +2006-10-05 Chong Yidong <cyd@stupidchicken.com> + + * international/mule-cmds.el (coding-system-change-eol-conversion): + Ensure the coding system is initialized before calling + coding-system-eol-type. + +2006-10-04 Carsten Dominik <dominik@science.uva.nl> + + * textmodes/org.el (org-rm-props, org-activate-plain-links) + (org-activate-angle-links, org-activate-dates) + (org-activate-target-links, org-activate-camels) + (org-activate-tags): Add `rear-nonsticky' text property to avoid + textproperty keymaps from being active beyond the end of a line. + (org-unfontify-region): Also remove `rear-nonsticky' property. + +2006-10-04 Kenichi Handa <handa@m17n.org> + + * international/code-pages.el (next): Table fixed. + +2006-10-04 Stefan Monnier <monnier@iro.umontreal.ca> + + * progmodes/sh-script.el (sh-prev-thing): Remove (forward-char 1) now + that it's been made unnecessary by removing narrowing. + +2006-10-03 Stefan Monnier <monnier@iro.umontreal.ca> + + * progmodes/sh-script.el (sh-prev-thing): Massage to untangle the + control flow a bit, simplify another bit, and add comments. + +2006-10-03 David Kastrup <dak@gnu.org> + + * help.el (describe-mode): For clicks on mode-line, use "@" + interactive argument to get the major mode of the click instead of + the current buffer. + + * isearch.el (isearch-mouse-2): Use new semantics of `key-binding' + in order to better redirect mouse-2 clicks. Also allow default + bindings to apply. + +2006-10-03 Kim F. Storm <storm@cua.dk> + + * emacs-lisp/cl.el (pushnew-internal): Remove defvar. + (pushnew): Fix last change. + +2006-10-03 Denis St,A|(Bnkel <dstuenkel@googlemail.com> (tiny change) + + * ibuf-ext.el (eval, view-and-eval) <define-ibuffer-op>: + Use the interactive spec of `eval-expression'. + +2006-10-02 Michael Welsh Duggan <md5i@cs.cmu.edu> + + * progmodes/sh-script.el (sh-prev-thing): Fix last change. + +2006-10-02 MIYOSHI Masanori <miyoshi@meadowy.org> (tiny change) + + * mail/smtpmail.el (smtpmail-try-auth-methods): Fix typo in + 2006-09-28 commit. + +2006-10-02 Kenichi Handa <handa@m17n.org> + + * international/code-pages.el (iso-8859-6): Table fixed. + +2006-10-01 Chris Moore <christopher.ian.moore@gmail.com> (tiny change) + + * dired.el (dired-build-subdir-alist): Fix previous change. + +2006-10-01 Johan Bockg,Ae(Brd <bojohan+mail@dd.chalmers.se> + + * simple.el (undo-elt-crosses-region): Fix the inequalities. + +2006-10-01 Stefan Monnier <monnier@iro.umontreal.ca> + + * emacs-lisp/find-func.el (find-function-regexp): Don't match + "define-button-type". + + * pcvs.el (cvs-update-header): Fix handling of extra newlines so that + they don't keep accumulating. + +2006-10-01 Bob Rogers <rogers-emacs@rgrjr.dyndns.org> (tiny change) + + * ffap.el (ffap-rfc-path): Change the address of the RFC + repository to ftp.rfc-editor.org, as ds.internic.net seems to be gone. + +2006-10-01 Stephen Berman <Stephen.Berman@gmx.net> + + * allout.el (allout-expose-topic): Rectify implementation of "+" + spec, so that bodies are not exposed with headlines. + +2006-10-01 Ken Manheimer <ken.manheimer@gmail.com> + + * allout.el (allout-current-depth): Do aberrent check only at or + below doublecheck depth. + (allout-chart-subtree): Make it explicit that LEVELS being nil + means unlimited depth. Drop undocumented support for LEVELS value + t meaning unlimited depth. (This is consistent with + allout-chart-to-reveal, but contrary to allout-show-children, + which needs to use nil to default to depth of 1.) + (allout-goto-prefix-doublechecked): Wrap long docstring line. + (allout-chart-to-reveal): Be explicit in docstring about meaning + of nil LEVELS, and drop support for LEVELS value t. + (allout-show-children): Translate the level spec used by this + routine to that used by allout-chart-subtree and + allout-chart-to-reveal. + (allout-show-to-offshoot): Retry once when stuck, after opening + subtree - improvements in discontinuity handling likely will + enable progress. + +2006-09-30 Chong Yidong <cyd@stupidchicken.com> + + * wid-edit.el (widget-button-click-moves-point): New variable. + (widget-button-click): If widget-button-click-moves-point is + non-nil, set point after performing the button action + + * cus-edit.el (custom-mode): Set widget-button-click-moves-point. + +2006-09-30 Martin Rudalics <rudalics@gmx.at> + + * files.el (find-file-existing): Modify to not allow wildcards. + +2006-09-30 Johan Bockg,Ae(Brd <bojohan@dd.chalmers.se> + + * simple.el (undo-more): When undo information for the region is + exhausted, say "No further undo information FOR REGION". + +2006-09-30 Michael Welsh Duggan <md5i@cs.cmu.edu> + + * progmodes/sh-script.el (sh-prev-thing): + Take `sh-leading-keywords' into account. + +2006-09-29 Glenn Morris <rgm@gnu.org> + + * custom.el (defcustom): Doc fix. + + * calendar/calendar.el (european-calendar-style): + Call european-calendar or american-calendar as needed when set. + (diary-view-entries, list-calendar-holidays): Move autoloads + before use. + +2006-09-29 Juri Linkov <juri@jurta.org> + + * progmodes/cperl-mode.el (cperl-after-expr-p): Don't move point + to nil if there is no previous property change. + +2006-09-26 Micha,Ak(Bl Cadilhac <michael.cadilhac@lrde.org> + + * cus-edit.el (custom-save-all): Switch to emacs-lisp mode before + saving anything to be sure that `forward-sexp' behaves correctly. + +2006-09-29 Chong Yidong <cyd@stupidchicken.com> + + * simple.el (line-move-finish): Ignore field boundaries if the + initial and final points have the same `field' property. + +2006-09-29 Kim F. Storm <storm@cua.dk> + + * ido.el (ido-file-internal): Only bind minibuffer-completing-file-name + to t while calling ido-read-internal. + +2006-09-29 Carsten Dominik <dominik@science.uva.nl> + + * textmodes/org.el (org-file-remote-p): Get regexp from list. + (org-archive-subtree): Remove erraneous `]' from character list. + +2006-09-28 Jonathan Yavner <jyavner@member.fsf.org> + + * ses.el (ses-in-print-area, ses-goto-data, ses-load) + (ses-reconstruct-all): Make undo of "insert row" work by keeping + markers for data-area and parameters-area. + +2006-09-28 Stefan Monnier <monnier@iro.umontreal.ca> + + * progmodes/make-mode.el (makefile-mode): Don't disable jit-lock. + + * font-lock.el (font-lock-after-change-function): Refontify next line + as well if end is at BOL. + (font-lock-extend-jit-lock-region-after-change): Be more careful to + only extend the region as much as needed. + +2006-09-28 Richard Stallman <rms@gnu.org> + + * comint.el (comint-mode): Bind font-lock-defaults non-nil. + + * subr.el (insert-for-yank-1): Handle `font-lock-face' specially. + + * international/mule.el (after-insert-file-set-coding): + If VISIT, don't let set-buffer-multibyte make undo info. + +2006-09-28 Osamu Yamane <yamane@green.ocn.ne.jp> (tiny change) + + * mail/smtpmail.el (smtpmail-try-auth-methods): Do not break long + lines in base64-encoded authentication response. + +2006-09-26 Vinicius Jose Latorre <viniciusjl@ig.com.br> + + * progmode/ebnf2ps.el: Doc fix. Implement arrow spacing and scaling. + (ebnf-version): New version 4.3. + (ebnf-arrow-extra-width, ebnf-arrow-scale): New options. + (ebnf-prologue): Adjust PostScript programming. + (ebnf-begin-file, ebnf-insert-ebnf-prologue, ebnf-terminal-dimension1) + (ebnf-repeat-dimension, ebnf-except-dimension): Adjust code. + +2006-09-26 Stefan Monnier <monnier@iro.umontreal.ca> + + * jit-lock.el (jit-lock-force-redisplay): Rename from + jit-lock-fontify-again, and undo the mistaken change I've just done. + + * jit-lock.el (jit-lock-fontify-now): Don't fontify the empty text. + (jit-lock-fontify-again): Don't refontify text that's not displayed. + +2006-09-26 Kenichi Handa <handa@m17n.org> + + * startup.el (display-splash-screen): Allow a prefix argument. + +2006-09-25 Jason Rumney <jasonr@gnu.org> + + * subr.el (shell-quote-argument): Use DOS logic for Windows + shells with DOS semantics. + +2006-09-24 Richard Stallman <rms@gnu.org> + + * progmodes/compile.el (compilation-goto-locus-delete-o): New fn. + (compilation-goto-locus): Use compilation-goto-locus-delete-o + to delete the overlay. Put it on pre-command-hook. + + * emacs-lisp/timer.el (timer-max-repeats): Doc fix. + + * startup.el (fancy-splash-screens, normal-splash-screen): + Call the splash buffer *About GNU Emacs*. + + * simple.el (next-error-highlight, next-error-highlight-no-select): + Default to 0.5. + (yank-excluded-properties): Add `fontified'. + + * font-lock.el (font-lock-compile-keywords): Allow value of + syntax-begin-function to enable paren-column-0 highlighting. + +2006-09-24 Chris Moore <christopher.ian.moore@gmail.com> (tiny change) + + * dired.el (dired-build-subdir-alist): When file ends in colon, + don't exit the loop, just disregard that file. + +2006-09-24 Chong Yidong <cyd@stupidchicken.com> + + * simple.el (line-move-finish): Handle corner case for fields in + continued lines. + (line-move-1): Remove flawed test for that case. + +2006-09-24 Ken Manheimer <ken.manheimer@gmail.com> + + * icomplete.el (icomplete-simple-completing-p): Use the correct + name for the new variable, `icomplete-with-completion-tables'. + (file local variables): Remove superfluous setting. + +2006-09-23 Jeff Miller <jmiller@cablespeed.com> (tiny change) + + * calendar/appt.el (appt-check): Fix typo for appointments just + after midnight. + +2006-09-23 Chong Yidong <cyd@stupidchicken.com> + + * help.el (describe-key-briefly, describe-key): Don't expect an + extra up event if a down-event is generated by a popup menu. + +2006-09-23 Michal Nazarewicz <mnazarewicz@gmail.com> (tiny change) + + * textmodes/ispell.el (ispell-change-dictionary): Don't check the + local dictionary when changing the global dictionary. + +2006-09-23 Ken Manheimer <ken.manheimer@gmail.com> + + * icomplete.el (icomplete-with-completion-tables): List of + specialized completion tables with which icomplete should + operate. Include the new `internal-complete-buffer', so icomplete + works with interactive buffer-selection. + (icomplete-simple-completing-p): Add acceptance of specialized + completion tables listed in icomplete-with-completion-tables. + +2006-09-23 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * frame.el (focus-follows-mouse): Set default to nil on Mac. + + * startup.el (command-line): Use `custom-reevaluate-setting' for + `focus-follows-mouse'. + +2006-09-22 Richard Stallman <rms@gnu.org> + + * cus-edit.el (custom-buffer-create-internal): In `emacs -q', + explain why Save is not available. + +2006-09-22 Juanma Barranquero <lekktu@gmail.com> + + * woman.el (woman0-so): Use `let*', not `let'. + (woman-horizontal-line): Remove unbalanced parenthesis. + +2006-09-22 Stefan Monnier <monnier@iro.umontreal.ca> + + * woman.el: Make sure all the end-of-region markers we use have + a non-nil insertion-type. + (woman0-so): Move things around so we can use copy-marker. + (woman0-roff-buffer, woman2-process-escapes-to-eol, woman2-roff-buffer): + Adjust marker type. + (woman2-process-escapes): Check marker type. + (woman-horizontal-line): Dispense with the use of a marker. + +2006-09-22 Jay Belanger <belanger@truman.edu> + + * calc/calc-lang.el: Add Greek letters to math-variable-table + property of tex. + +2006-09-22 Chong Yidong <cyd@stupidchicken.com> + + * files.el (save-some-buffers-action-alist): Display diff in view-mode. + +2006-09-22 Masatake YAMATO <jet@gyve.org> + + * add-log.el (add-log-current-defun): Use `forward-sexp' + instead of `forward-word' to pick c++::symbol. + Reported by Herbert Euler <herberteuler@hotmail.com>. + +2006-09-22 Kenichi Handa <handa@m17n.org> + + * bindings.el: Fix setting self-insert-command for multibyte + characters in global-map. + +2006-09-21 David Kastrup <dak@gnu.org> + + * mouse.el (mouse-posn-property): Fix typo for `event-start' in + doc string. + +2006-09-21 Kenichi Handa <handa@m17n.org> + + * language/european.el ("Latin-1"): Add windows-1252 to + coding-priority. + ("German"): Likewise. + +2006-09-21 Kim F. Storm <storm@cua.dk> + + * emacs-lisp/cl-macs.el (member*): Use memql instead of complex code. + Suggested by Miles Bader. + + * emacs-lisp/cl.el (pushnew): Rework 2006-09-10 change. Use memql + instead of add-to-list in the simple case. + +2006-09-20 Kenichi Handa <handa@m17n.org> + + * isearch.el (isearch-process-search-char): Cancel the previous change. + (isearch-search-string): New function. + (isearch-search): Use isearch-search-string. + (isearch-lazy-highlight-search): Likewise. + +2006-09-20 Vinicius Jose Latorre <viniciusjl@ig.com.br> + + * lpr.el (lpr-page-header-switches): Insert `*' at beginning of doc + string to become an option. + +2006-09-20 Stefan Monnier <monnier@iro.umontreal.ca> + + * files.el (find-buffer-visiting): Don't get fooled by a nil inode. + +2006-09-20 Kim F. Storm <storm@cua.dk> + + * simple.el (line-move-partial): Call pos-visible-in-window-p with + position t instead of trying both window-end and window-end - 1. + +2006-09-20 Carsten Dominik <dominik@science.uva.nl> + + * textmodes/org.el (org-scan-tags): Find end of subtrees also in + hidden trees. + +2006-09-20 David Kastrup <dak@gnu.org> + + * mouse.el (mouse-posn-property): Improve doc string. + (mouse-on-link-p): Change buffers for function calls on links. + + * menu-bar.el (clipboard-yank): Bomb out in interactive use if + buffer is read-only. + +2006-09-20 Ken Manheimer <ken.manheimer@gmail.com> + + * allout.el (allout-unprotected): Let inhibit-read-only only when + buffer-read-only isn't set. + (allout-annotate-hidden): Enable topic annotation during copies even + when the buffer is read-only, eg for topic copies. Ensure that the loop + advances, even when the span extends beyond the deletion region. + (allout-toggle-subtree-encryption): Use allout-structure-added-hook + rather than allout-exposure-changed-hook, as a stronger assertion. + (allout-keybindings-list): Add bindings for + allout-copy-line-as-kill and allout-copy-topic-as-kill. + (allout-copy-line-as-kill, allout-copy-topic-as-kill): + Copy wrappers for allout-kill-line and allout-kill-topic. + (allout-listify-exposed): Position correctly to accumulate lines. + +2006-09-19 Chong Yidong <cyd@stupidchicken.com> + + * simple.el (line-move-1): Escape field boundaries occurring + exactly at point. Update goal column if constrained to a field. + (line-move-finish): Escape field boundaries occurring exactly at point. + +2006-09-19 Stefan Monnier <monnier@iro.umontreal.ca> + + * mouse.el (mouse-on-link-p): Tentatively fix last change. + (mouse-drag-vertical-line): Remove unused var `wconfig'. + +2006-09-19 Kim F. Storm <storm@cua.dk> + + * help.el (describe-key-briefly, describe-key): Simplify printing + of descriptions by using format and %S. Fix "is undefined" + messages to say "at that spot" for mouse events. + + * simple.el (line-move-partial): Optimize. Try window-line-height + before posn-at-point to get vpos of current line. + +2006-09-18 Michael Kifer <kifer@cs.stonybrook.edu> + + * viper.el: Bump up version/date of update to reflect the substantial + changes done in August 2006. + + * viper-cmd (viper-next-line-at-bol): Make sure button-at, push-button + are defined. + + * ediff-util.el (ediff-add-to-history): New function. + + * ediff.el: Use ediff-add-to-history instead of add-to-history. + +2006-09-18 Wolfgang Jenkner <wjenkner@inode.at> (tiny change) + + * textmodes/conf-mode.el (conf-space-mode): Doc fix. + Delete duplicate make-local-variable form. + (conf-space-keywords): Add autoload cookie. + Fix typo (`keywords', not `keyword'). + +2006-09-18 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * cus-start.el (all): Rename x-gtk-show-chooser-help-text to + x-gtk-file-dialog-help-text. Rename x-use-old-gtk-file-dialog + to x-gtk-use-old-file-dialog + +2006-09-18 Richard Stallman <rms@gnu.org> + + * wid-edit.el (widget-button-click): Handle non-mouse-motion events + that might come in during mouse tracking. + +2006-09-18 Kim F. Storm <storm@cua.dk> + + * simple.el (line-move-partial): Rework 2006-09-15 change to use + new window-line-height function. Further optimize by not calling + pos-visible-in-window-p for window-end when window-line-height + returns useful information. + +2006-09-16 Richard Stallman <rms@gnu.org> + + * textmodes/conf-mode.el (conf-mode-map): Use conf-space-keywords cmd. + (conf-space-mode): Don't handle prefix arg. + Delete conf-space-keywords-override code. + Use add-hook. + (conf-space-keywords): New command. + (conf-space-mode-internal): Be careful with imenu-generic-expression. + Delete conf-space-keywords-override code. + (conf-space-keywords-alist): Doc fix. + (conf-space-font-lock-keywords): Doc fix. + (conf-space-keywords-override): Var deleted. + +2006-09-16 Chong Yidong <cyd@stupidchicken.com> + + * startup.el (fancy-splash-screens): Don't switch to the scratch + buffer; it may not be the next buffer. + +2006-09-16 Romain Francoise <romain@orebokech.com> + + * saveplace.el (load-save-place-alist-from-file): Use expanded name + in both messages. + +2006-09-16 Slawomir Nowaczyk <slawomir.nowaczyk.847@student.lu.se> + + * progmodes/python.el (python-preoutput-filter): + Fix arg order to string-match. + +2006-09-16 Richard Stallman <rms@gnu.org> + + * obsolete/fast-lock.el (fast-lock-cache-data): Provide 2nd arg to + font-lock-compile-keywords. + + * font-lock.el (font-lock-compile-keywords): Rename optional arg + to SYNTACTIC-KEYWORDS and reverse the sense. All callers changed. + +2006-09-16 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * cus-start.el (all): Add x-gtk-show-chooser-help-text. + + * select.el (xselect-convert-to-string): If UTF8_STRING is requested + and the data doesn't look like UTF8, send STRING instead. + +2006-09-16 Agustin Martin <agustin.martin@hispalinux.es> + + * textmodes/flyspell.el (flyspell-check-region-doublons): + New function to detect duplicated words. + (flyspell-large-region): Use it. + +2006-09-16 Chong Yidong <cyd@stupidchicken.com> + + * simple.el (line-move-to-column): Revert 2006-08-03 change. + +2006-09-16 Eli Zaretskii <eliz@gnu.org> + + * help.el (describe-prefix-bindings): Use let, not let*. + +2006-09-16 Ken Manheimer <ken.manheimer@gmail.com> + + * allout.el (allout-regexp, allout-line-boundary-regexp) + (allout-bob-regexp): Correct grouping and boundaries to fix + backwards traversal. + (allout-depth-specific-regexp, allout-depth-one-regexp): + New versions that exploit \\{M\\} regexp syntax, to avoid geometric or + worse time in allout-ascend. + (allout-doublecheck-at-and-shallower): Identify depth threshold + below which topics are checked for and disqualified by containment + discontinuities. + (allout-hotspot-key-handler): Correctly handle multiple-key + strokes. Remove some unused variables. + (allout-mode-leaders): Clarify that mode-specific comment-start + will be used. + (set-allout-regexp): Correctly regexp-quote allout regexps to + properly accept alternative header-leads and primary bullets with + regexp-specific characters (eg, C "/*", mathematica "(*"). + Include new regular expressions among those configured. + (allout-infer-header-lead-and-primary-bullet): + Rename allout-infer-header-lead. + (allout-recent-depth): Manifest as a variable as well as a function. + (allout-prefix-data): Simplify into an inline instead of a macro, + assuming current match data rather than being explicitly passed + it. Establish allout-recent-depth value as well as + allout-recent-prefix-beginning and allout-recent-prefix-end. + (allout-aberrant-container-p): True when an item's immediate + offspring discontinuously contained. Useful for disqualifying + unintended topic prefixes, likely at low depths. + (allout-goto-prefix-doublechecked): Elaborate version of + allout-goto-prefix which disqualifies aberrant pseudo-items. + (allout-pre-next-prefix): Layer on top of lower-level routines, to + get disqualification of aberrant containers. + (allout-end-of-prefix, allout-end-of-subtree): Disqualify aberrant + containers. + (allout-beginning-of-current-entry): Position at start of buffer + when in container (depth 0) entry. + (nullify-allout-prefix-data): Invalidate allout-recent-* prefix data. + (allout-current-bullet): Strip text properties. + (allout-get-prefix-bullet): Use right match groups. + (allout-beginning-of-line, allout-next-heading): + Disqualify aberrant containers. + (allout-previous-heading): Disqualify aberrant containers, and + change to regular (rather than inline) function, to allow + self-recursion. + (allout-get-invisibility-overlay): Increment so progress is made + when the first overlay is not the sought one. + (allout-end-of-prefix): Disqualify aberrant containers. + (allout-end-of-line): Cycle something like allout-beginning-of-line. + (allout-mode): Make allout-old-style-prefixes (ie, enabling use with + outline.el outlines) functional again. Change the primary bullet + along with the header-lead - level 1 new-style bullets now work. + Engage allout-before-change-handler in mainline emacs, not just + xemacs, to do undo handling. + (allout-before-change-handler): Expose undo changes occurring in + hidden regions. Use allout-get-invisibility-overlay instead of + reimplementing it inline. + (allout-chart-subtree): Use start rather than end of prefix in + charts. Use allout-recent-depth variable. + (allout-chart-siblings): Disqualify aberrant topics. + (allout-beginning-of-current-entry): Position correctly. + (allout-ascend): Use new allout-depth-specific-regexp and + allout-depth-one-regexp for linear instead of O(N^2) or worse + behavior. + (allout-ascend-to-depth): Depend on allout-ascend, rather than + reimplementing an algorithm. + (allout-up-current-level): Depend on allout-ascend, rather than + reimplementing an algorithm. Return to start-point if we fail. + (allout-descend-to-depth): Use allout-recent-depth variable + instead of function. + (allout-next-sibling): On traversal of numerous intervening + topics, resort to economical allout-next-sibling-leap. + (allout-next-sibling-leap): Specialized version of + allout-next-sibling that uses allout-ascend cleverly, to depend on + a regexp search to leap large numbers of contained topics, rather + than arbitrarily many one-by-one traversals. + (allout-next-visible-heading): Disqualify aberrant topics. + (allout-previous-visible-heading): Position consistently when + interactive. + (allout-forward-current-level): Base on allout-previous-sibling + rather than (differently) reimplmenting the algorithm. Remove some + unused variables. + (allout-solicit-alternate-bullet): Present default choice stripped + of text properties. + (allout-rebullet-heading): Use bullet stripped of text properties. + Register changes using allout-exposure-change-hook. + Disregard aberrant topics. + (allout-shift-in): With universal-argument, make topic a peer of + it's former offspring. Simplify the code by separating out + allout-shift-out functionality. + (allout-shift-out): With universal-argument, make offspring peers + of their former container, and its siblings. Implement the + functionality here, rather than inappropriately muddling the + implementation of allout-shift-in. + (allout-rebullet-topic): Respect additional argument for new + parent-child separation function. + (allout-yank-processing): Use allout-ascend directly. + (allout-show-entry): Disqualify aberrant topics. + (allout-show-children): Handle discontinuous children gracefully, + extending the depth being revealed to expose them and posting a + message indicating the situation. + (allout-show-to-offshoot): Remove obsolete and incorrect comment. + Leave cursor in correct position. + (allout-hide-current-subtree): Use allout-ascend directly. + Disqualify aberrant topics. + (allout-kill-line, allout-kill-topic): Preserve exposure layout in + a way that the yanks can restore it, as used to happen. + (allout-yank-processing): Restore exposure layout as recorded by + allout-kill-*, as used to happen. + (allout-annotate-hidden, allout-hide-by-annotation): New routines + for preseving and restoring exposure layout across kills. + (allout-toggle-subtree-encryption): Run allout-exposure-change-hook. + (allout-encrypt-string): Strip text properties. + Rearranged order and outline-headings for some of the + miscellaneous functions. + (allout-resolve-xref): No need to quote the error name in the + condition-case handler section. + (allout-flatten): Classic recursive (and recursively intensive, + without tail-recursion) list-flattener, needed by allout-shift-out + when confronted with discontinuous children. + +2006-09-16 Jason Rumney <jasonr@gnu.org> + + * dnd.el (dnd-open-remote-file-function): Use dnd-open-local-file + on ms-windows. + (dnd-open-unc-file): Remove. + (dnd-open-local-file): Mention in doc string that it also handles + remote files if the system natively supports unc file-names. + +2006-09-15 Kim F. Storm <storm@cua.dk> + + * help.el (describe-key): Handle C-h k in *Help* buffer; collect + all necessary information about the event before erasing *Help*. + + * simple.el (line-move-partial): Use window-line-visiblity to + quickly check whether last line is partially visible, and only do + the hard (and slow) part in that case. + +2006-09-15 Jay Belanger <belanger@truman.edu> + + * COPYING: Replace "Library Public License" by "Lesser Public + License" throughout. + +2006-09-15 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * term/x-win.el (x-menu-bar-open): New function for F10. + +2006-09-15 Chong Yidong <cyd@stupidchicken.com> + + * progmodes/compile.el (compilation-error-regexp-alist-alist): + Disallow filenames containing " -" to avoid confusion with libtool + compilation messages. Suggested by Stefan Monnier. + +2006-09-15 David Kastrup <dak@gnu.org> + + * mouse-sel.el (mouse-sel-follow-link-p): Use event position + instead of buffer position for `mouse-on-link-p'. + + * mouse.el (mouse-posn-property): New function looking up the + properties at a click position in overlays and text properties in + either buffer or strings. + (mouse-on-link-p): Use `mouse-posn-property' to streamline lookup + of both `follow-link' as well as `mouse-face' properties. + (mouse-drag-track): Check `mouse-on-link-p' on event position, not + buffer position. + + * help.el (describe-key-briefly): When reading a down-event on + mode lines or scroll bar, swallow the following up event, too. + Use the new mouse sensitity of `key-binding' for lookup. + (describe-key): The same here. + +2006-09-15 Juanma Barranquero <lekktu@gmail.com> + + * play/life.el (life-patterns): Add a few more interesting patterns. + (life-setup): Force `show-trailing-whitespace' to nil. + +2006-09-14 Richard Stallman <rms@gnu.org> + + * startup.el (fancy-splash-text): Change text to improve alignment. + (fancy-splash-screens): Don't set non-standard tab width. + Bind cursor-type temporarily, and make it easy to patch to + preserve the splash buffer. + (normal-splash-screen, fancy-splash-tail): Spell out "Meta-x". + (fancy-splash-screens): Display echo-area message explicitly. + Don't set fancy-splash-help-echo. + + * simple.el (line-number-mode): Group mode-line instead of + editing-basics. + (column-number-mode, size-indication-mode): Likewise. + + * faces.el (mode-line-faces): Group mode-line instead of modeline. + + * time.el (display-time): Group mode-line instead of modeline. + + * cus-edit.el (mode-line): Rename from modeline. All uses changed. + +2006-09-14 Chong Yidong <cyd@stupidchicken.com> + + * startup.el (fancy-splash-text): Move editing instructions to + fancy-splash-head. + (fancy-splash-head): Issue editing instructions. + (fancy-splash-screens): Fixup whitespace. + +2006-09-14 Stefan Monnier <monnier@iro.umontreal.ca> + + * bindings.el (mode-line-buffer-identification-keymap): + Remove duplicate line. + +2006-09-14 Micha,Ak(Bl Cadilhac <michael.cadilhac@lrde.org> + + * ido.el (ido-ignore-item-p): Allow any kind of functions in + ignore lists. + +2006-09-14 Kim F. Storm <storm@cua.dk> + + * jit-lock.el (jit-lock-fontify-again): New function. + (jit-lock-fontify-now): Use it instead of lambda form. + +2006-09-13 Agustin Martin <agustin.martin@hispalinux.es> + + * textmodes/flyspell.el (flyspell-word, flyspell-correct-word) + (flyspell-auto-correct-word): Make ispell-filter local to these + functions. Check that ispell-filter has new stuff before calling + ispell-parse-output. + +2006-09-13 Kim F. Storm <storm@cua.dk> + + * simple.el (line-move-partial): Optimize. + +2006-09-13 Richard Stallman <rms@gnu.org> + + * thingatpt.el (thing-at-point-bounds-of-url-at-point): + Delete spurious backquote. + +2006-09-07 Ryan Yeske <rcyeske@gmail.com> + + * net/rcirc.el (rcirc-print): Fix last change. + +2006-09-12 Jay Belanger <belanger@truman.edu> + + * calc/calc.el (calc-dispatch): Remove unnecessary `sit-for'. + +2006-09-07 Ryan Yeske <rcyeske@gmail.com> + + * net/rcirc.el (rcirc-scroll-show-maximum-output): Rename from + rcirc-show-maximum-output. + (rcirc-mode): Remove window-scroll-function hook. + (rcirc-scroll-to-bottom): Remove function. + (rcirc-print): Recenter so point stays at the bottom of the window + if point was already there. + +2006-09-12 Paul Eggert <eggert@cs.ucla.edu> + + * comint.el (comint-exec-1): Set EMACS to the full name of Emacs, + not to "t". + * progmodes/compile.el (compilation-start): Likewise. + * progmodes/idlwave.el (idlwave-rescan-asynchronously): + Don't use expand-file-name on invocation-directory, since this + might mishandle special characters in invocation-directory. + +2006-09-12 Stefan Monnier <monnier@iro.umontreal.ca> + + * pcvs-defs.el: Remove * in defcustom's docstrings. + +2006-09-12 Nick Roberts <nickrob@snap.net.nz> + + * progmodes/compile.el (compilation-directory-properties): + Doc fix for help-echo. + +2006-09-12 Lars Hansen <larsh@soem.dk> + + * desktop.el (desktop-read): Add comment. + +2006-09-12 Kim F. Storm <storm@cua.dk> + + * simple.el (next-error-highlight, next-error-highlight-no-select): + Fix spelling error. + + * subr.el (sit-for): Rework to use input-pending-p and cond. + Return nil input is pending on entry also for SECONDS <= 0. + (while-no-input): Use input-pending-p instead of sit-for. + +2006-09-11 Richard Stallman <rms@gnu.org> + + * simple.el (next-error-highlight, next-error-highlight-no-select): + Fix custom type and doc strings. + +2006-09-11 Stefan Monnier <monnier@iro.umontreal.ca> + + * diff-mode.el (diff-apply-hunk-to-backup-file): New var. + (diff-apply-hunk): Use it to ask for confirmation. + +2006-09-11 Reiner Steib <Reiner.Steib@gmx.de> + + * emacs-lisp/cl.el (pushnew): Add missing `,'. + +2006-09-11 David Kastrup <dak@gnu.org> + + * help.el (string-key-binding, describe-key-briefly) + (describe-key): Remove `string-key-binding' and its callers since + `key-binding' already caters for the proper lookup now. + +2006-09-11 Stefan Monnier <monnier@iro.umontreal.ca> + + * progmodes/cfengine.el (cfengine-font-lock-syntactic-keywords): Newvar. + (cfengine-mode): Use it. Fix \ syntax to be like /. + + * bindings.el (mode-line-buffer-identification-keymap): + Move initialization into declaration. + +2006-09-10 Kim F. Storm <storm@cua.dk> + + * ido.el (ido-edit-input, ido-complete, ido-take-first-match) + (ido-push-dir-first, ido-kill-buffer-at-head, ido-exhibit) + (ido-delete-file-at-head): Pass head of ido-matches through ido-name + in case of merged directories. Reported by Micha,Ak(Bl Cadilhac. + +2006-09-10 Richard Stallman <rms@gnu.org> + + * dired-aux.el: Handle errors in recursive copy usefully. + (dired-create-files-failures): New variable. + (dired-copy-file): Remove condition-case. + (dired-copy-file-recursive): Check for errors on all file + operations, and add them to dired-create-files-failures. + Check file file-date-erorr here too. + (dired-create-files): Check dired-create-files-failures + and report those errors too. + + * emacs-lisp/cl.el (pushnew): Use add-to-list when convenient. + + * subr.el (add-to-list): New argument COMPARE-FN. + +2006-09-10 Reiner Steib <Reiner.Steib@gmx.de> + + * filecache.el (file-cache-add-directory) + (file-cache-add-directory-list, file-cache-add-file) + (file-cache-add-directory-using-find) + (file-cache-add-directory-using-locate) + (file-cache-add-directory-recursively): Add autoloads. + +2006-09-09 Richard Stallman <rms@gnu.org> + + * textmodes/conf-mode.el (conf-space-mode): + Use hack-local-variables-hook instead of calling hack-local-variables. + (conf-space-keywords-override): New variable. + (conf-space-mode-internal): New subroutine. Reinit Font Lock mode. + (conf-space-mode): Always make conf-space-keywords and + conf-space-keywords-override local. + Call conf-space-mode-internal directly as well as via hook. + +2006-09-09 Slawomir Nowaczyk <slawomir.nowaczyk.847@student.lu.se> (tiny change) + + * progmodes/python.el (python-font-lock-keywords): Add `self' and other + quasi-keywords. + +2006-09-09 Stefan Monnier <monnier@iro.umontreal.ca> + + * progmodes/python.el: Quieten the compiler about hippie-expand vars. + (python-send-string): Be slightly more careful about adding \n. + + * startup.el (normal-splash-screen): Don't display the buffer if we'll + kill it right away anyway. + +2006-09-09 Eli Zaretskii <eliz@gnu.org> + + * international/codepage.el (cp850-decode-table): Fix a few codes. + (cp858-decode-table): New variable. + +2006-09-09 Toby Allsopp <Toby.Allsopp@navman.com> (tiny change) + + * net/ldap.el (ldap-search-internal): Doc fix. + +2006-09-09 Micha,Ak(Bl Cadilhac <michael.cadilhac@lrde.org> + + * play/life.el (life-display-generation): Test for input manually if + `sleeptime' is negative or null. + + * lpr.el (lpr-page-header-switches): Page title switch is one of them. + (print-region-1): Substitute `%s' with the page title. + +2006-09-09 Matt Hodges <MPHodges@member.fsf.org> + + * locate.el (locate-current-search): New variable. + (locate): Set buffer local value. Use current buffer if it is + in Locate mode. + (locate-mode): Disable undo here. + (locate-do-setup): Use locate-current-filter from buffer to be killed. + (locate-update): Use locate-current-search and locate-current-filter. + +2006-09-08 David Kastrup <dak@gnu.org> + + * desktop.el (desktop-read): When loading a desktop, disable + saving it while the load progresses, and switch off a pending lazy + load by calling `desktop-lazy-abort'. + +2006-08-27 Martin Rudalics <rudalics@gmx.at> + + * window.el (mouse-autoselect-window-timer) + (mouse-autoselect-window-position) + (mouse-autoselect-window-window) + (mouse-autoselect-window-now): New vars. + (mouse-autoselect-window-cancel) + (mouse-autoselect-window-select) + (mouse-autoselect-window-start): New functions. + (handle-select-window): Call `mouse-autoselect-window-start' when + delayed window autoselection is enabled. + + * cus-start.el (mouse-autoselect-window): Handle delayed window + autoselection. + + * emacs-lisp/eldoc.el: Add `handle-select-window' to the set of + commands after which it is allowed to print in the echo area. + +2006-09-08 Richard Stallman <rms@gnu.org> + + * textmodes/fill.el (adaptive-fill-regexp): Don't match `(1)' or `1.' + + * mail/rmail.el (rmail-get-new-mail): Say whether all msgs are spam. + (rmail-convert-to-babyl-format): Don't record undo, leave list empty. + + * emacs-lisp/timer.el (timer-create, timer-activate): Doc fixes. + (cancel-timer-internal): Add doc string. + (cancel-function-timers): Doc fix. + (with-timeout-handler, timer-event-last*): Add doc strings. + + * emacs-lisp/bindat.el (bindat-unpack): Doc fix. + + * files.el (risky-local-variable-p): Match ...-bindat-spec. + + * dired.el (dired-log-summary): Add doc string. + + * cus-edit.el (custom-menu-create): Bind deactivate-mark here + (custom-group-menu-create): Not here. + +2006-09-08 Carsten Dominik <dominik@science.uva.nl> + + * textmodes/org.el (org-dblock-write:clocktable): Avoid infinite loop. + +2006-09-08 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * term/mac-win.el: (show-hide-font-panel): New HI command ID symbol. + (mac-apple-event-map): Define its handler. + +2006-09-07 Toby Allsopp <Toby.Allsopp@navman.com> (tiny change) + + * net/ldap.el (ldap-search-internal): Handle `auth' key. + +2006-09-07 Magnus Henoch <mange@freemail.hu> + + * net/rcirc.el (rcirc-activity-string): Don't quote value in case + clause. + +2006-09-07 Micha,Ak(Bl Cadilhac <michael.cadilhac@lrde.org> + + * info.el (Info-index): Bind completion-ignore-case. + +2006-09-07 Stefan Monnier <monnier@iro.umontreal.ca> + + * progmodes/prolog.el (inferior-prolog-flavor): New var left out of + previous commit. + (inferior-prolog-guess-flavor): New fun left out of previous commit. + (prolog-consult-region-and-go): Don't hard code "*prolog*" and don't + burp in dedicated windows. + (inferior-prolog-self-insert-command): New command. + (inferior-prolog-mode-map): Use it. + +2006-09-07 Reiner Steib <Reiner.Steib@gmx.de> + + * international/latexenc.el (latex-inputenc-coding-alist): Add cp858. + + * international/code-pages.el: Add cp858. + +2006-09-07 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * dnd.el: Fix bootstrapping. + +2006-09-07 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * dnd.el (dnd-protocol-alist): Add what url-handler-mode can handle. + (dnd-open-remote-url): New function. + (dnd-open-remote-file-function): Set to dnd-open-remote-url if + not windows-nt. + +2006-09-07 Jason Rumney <jasonr@gnu.org> + + * dnd.el (dnd-open-remote-file-function): New variable. + (dnd-open-unc-file): New function. + (dnd-open-file): Call dnd-open-remote-file-function if set. + +2006-09-06 Daiki Ueno <ueno@unixuser.org> + + * pgg-gpg.el (pgg-gpg-process-region): Encode passphrase with + pgg-passphrase-coding-system rather than locale-coding-system. + * pgg-def.el (pgg-passphrase-coding-system): New user option. + +2006-09-06 Stefan Monnier <monnier@iro.umontreal.ca> + + * progmodes/prolog.el: Remove * in docstrings. + (prolog-program-name): Add SWI prolog. + (prolog-mode-menu): New menu. + (prolog-mode): Set comment-add. + (prolog-indent-line): Simplify. Use indent-line-to. + (inferior-prolog-buffer): New var. + (inferior-prolog-run, inferior-prolog-process): New funs. + (run-prolog, switch-to-prolog): Rewrite, using them. + (prolog-consult-region): Use inferior-prolog-buffer. + (inferior-prolog-load-file): New function. + (prolog-mode-map): Add bindings for load-file and switch-to-prolog. + + * textmodes/fill.el (fill-single-word-nobreak-p): Allow breaking before + last word, if it's not the end of the paragraph. + + * files.el (abbreviate-file-name): Don't mistakenly match newlines in + file name. + +2006-09-06 Ralf Angeli <angeli@caeruleus.net> + + * frame.el (display-mm-dimensions-alist): New defcustom. + (display-mm-height, display-mm-width): Use it. + +2006-09-06 Simon Josefsson <jas@extundo.com> + + * mail/smtpmail.el (smtpmail-starttls-credentials): Doc fix. + +2006-09-06 Nick Roberts <nickrob@snap.net.nz> + + * progmodes/gdb-ui.el (gdb-var-list-children-regexp) + (gdb-var-list-children-regexp-1): Tweak regexps to catch full + string values. + +2006-09-06 Kim F. Storm <storm@cua.dk> + + * simple.el (line-move-partial): New function to do vscrolling for + partially visible images / tall lines. Rewrite based on code + previously in line-move. Simplify backwards vscrolling. + (line-move): Use it. Simplify. + +2006-09-05 Kim F. Storm <storm@cua.dk> + + * emulation/cua-base.el (cua--pre-command-handler-1): Rewrite. + +2006-09-05 Chong Yidong <cyd@stupidchicken.com> + + * progmodes/compile.el (compilation-error-regexp-alist-alist): + Process the `gcc-include' after the `gnu' rule. + +2006-09-05 Kim F. Storm <storm@cua.dk> + + * ido.el (ido-visit-buffer): Use buffer name if buffer arg is a buffer. + +2006-09-05 Daiki Ueno <ueno@unixuser.org> + + * pgg.el (pgg-clear-string): Alias to clear-string for backward + compatibility. + + * pgg-gpg.el (pgg-gpg-process-region): Avoid display blinking with + inhibit-redisplay; encode passphrase with locale-coding-system. + +2006-09-04 Dan Nicolaescu <dann@ics.uci.edu> + + * term/xterm.el (terminal-init-xterm): Add more C-M- bindings. + +2006-09-05 Nick Roberts <nickrob@snap.net.nz> + + * progmodes/gdb-ui.el (gdb-var-list-children-regexp) + (gdb-var-list-children-regexp): Make type field optional. + + * progmodes/gud.el (gud-speedbar-buttons): Allow for no type + e.g public, protected in C++. + +2006-09-04 John Paul Wallington <jpw@pobox.com> + + * simple.el (completion-show-help): New defcustom. + (completion-setup-function): Heed it. + +2006-09-04 Dan Nicolaescu <dann@ics.uci.edu> + + * term/xterm.el (terminal-init-xterm): Add C-M- bindings. + +2006-09-04 Richard Stallman <rms@gnu.org> + + * mail/rmail-spam-filter.el (rsf-scanning-messages-now): Doc fix. + (rsf-min-region-to-spam-list): Doc fix. + (rsf-add-content-type-field): Doc fix. + + * simple.el (kill-region): Explicitly test there is a region. + +2006-09-04 Chong Yidong <cyd@stupidchicken.com> + + * mail/feedmail.el (feedmail-buffer-to-sendmail): Look for + sendmail in several common directories. + + * mail/sendmail.el (sendmail-program): Moved here from paths.el. + + * paths.el (sendmail-program): Removed. + +2006-09-04 Daiki Ueno <ueno@unixuser.org> + + * pgg-gpg.el (pgg-gpg-process-region): Revert two patches from Satyaki + Das. http://article.gmane.org/gmane.emacs.gnus.general/49947 + http://article.gmane.org/gmane.emacs.gnus.general/50457 + +2006-09-03 Chong Yidong <cyd@stupidchicken.com> + + * cus-edit.el (custom-group-menu-create): Avoid deactivating the + mark after running the menu filter. + +2006-09-03 Juri Linkov <juri@jurta.org> + + * international/quail.el (quail-defrule-internal): Add a check + if a key is a vector. + +2006-09-02 Juri Linkov <juri@jurta.org> + + * man.el (Man-topic-history): New variable. + (man): Use it. + + * woman.el (woman-topic-history): Change defvar to defvaralias + for symbol `Man-topic-history'. + + * shell.el (shell-filter-ctrl-a-ctrl-b): Check if + `comint-last-output-start' is a marker by using `markerp' and + check if it has a position by using `marker-position', and use + this position for `goto-char'. + + * international/quail.el (quail-defrule-internal): Add missing + `error' call for null key. + +2006-09-02 Ryan Yeske <rcyeske@gmail.com> + + * rcirc.el (rcirc-keywords): New variable. + (rcirc-bright-nicks, rcirc-dim-nicks): New variables. + (rcirc-bright-nick-regexp, rcirc-dim-nick-regexp): Remove + variables. + (rcirc-responses-no-activity): New function. + (rcirc-handler-generic): Check for responses in above. + (rcirc-process-command): Add ?: character to arguments of raw + server commands. + (rcirc-format-response-string): Use `rcirc-bright-nicks' and + `rcirc-dim-nicks'. + (rcirc-gray-toggle): Remove unused variable. + (rcirc-print): Remove some tracking logic, which is moved into + markup functions. + (rcirc-activity-types): Was `rcirc-activity-type', now a list of + types. + (rcirc-activity-string): Look for 'keyword in activity-types. + (rcirc-window-configuration-change): Don't erase overlay-arrow + unnecessarily. + (rcirc-add-or-remove): New function. + (rcirc-cmd-ignore): Use it. + (rcirc-message-leader): Remove unused function. + (rcicr-cmd-bright, rcirc-cmd-dim, rcirc-cmd-keyword): New commands. + (rcirc-add-face): New function. + (rcirc-facify): Use rcirc-add-face. + (rcirc-url-regexp): Add parens. + (rcirc-map-regexp): Remove function. + (rcirc-mangle-regexp): Remove function. + (rcirc-markup-text-functions): New variable. + (rcirc-markup-text): New function (replaces `rcirc-mangle-text'). + (rcirc-markup-body-text, rcirc-markup-attributes) + (rcirc-markup-my-nick, rcirc-markup-urls, rcirc-markup-keywords) + (rcirc-markup-bright-nicks): New markup handler functions. + (rcirc-nick-in-message-full-line): New face. + (rcirc-track-nick): Rename from `rcirc-mode-line-nick'. + (rcirc-track-keyword, rcirc-url, rcirc-keyword): New faces. + +2006-09-02 Martin Rudalics <rudalics@gmx.at> + + * cus-start.el (hscroll-margin, hscroll-step) + (mode-line-in-non-selected-windows, mouse-autoselect-window) + (x-use-underline-position-properties): Change version to "22.1" + since they will appear there for the first time. + +2006-09-01 Chong Yidong <cyd@stupidchicken.com> + + * imenu.el (imenu-update-menubar): Use buffer-chars-modified-tick. + +2006-08-31 Richard Stallman <rms@gnu.org> + + * cus-edit.el (custom-save-variables): Slight cleanup. + (Custom-no-edit): Renamed from custom-no-edit. + (Custom-newline): Renamed from custom-newline. + (custom-mode-map): Use new names. + + * emacs-lisp/easy-mmode.el (define-minor-mode): Reference manual + about customization, rather than M-x customize, in the doc string + made for the defcustom. + + * emacs-lisp/trace.el (trace-function-background): Doc fix. + +2006-08-31 Romain Francoise <romain@orebokech.com> + + * dired-x.el (dired-guess-shell-alist-default): Update. + +2006-08-31 Michael Mauger <mmaug@yahoo.com> + + * custom.el (custom-theme-set-variables): Autoload packages before + sorting the variables. + +2006-08-30 Michael Kifer <kifer@cs.stonybrook.edu> + + * viper-cmd.el (viper-special-read-and-insert-char): Convert events to + chars if XEmacs. + (viper-after-change-undo-hook): Check if undo-in-progress is bound. + +2006-08-30 Stefan Monnier <monnier@iro.umontreal.ca> + + * progmodes/python.el (python-eldoc-function): Re-enable quit while + waiting for process. + +2006-08-30 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * term/mac-win.el (mac-string-to-utxt): If adjustment for MacJapanese + results in ASCII-only string, encode original one directly. + +2006-08-29 Romain Francoise <romain@orebokech.com> + + * startup.el (normal-splash-screen, fancy-splash-screens): + Make buffer read-only and arrange to enter view mode if necessary. + +2006-08-29 Chong Yidong <cyd@stupidchicken.com> + + * hl-line.el (hl-line): New face. + (hl-line-face): Use it. + + * image-mode.el (image-mode): Fix last fix. + Suggested by Kim F. Storm. + +2006-08-29 Michael Albinus <michael.albinus@gmx.de> + + Sync with Tramp 2.0.54. + + * net/tramp.el (tramp-convert-file-attributes): Call `eql' instead + of `=', because `tramp-get-remote-gid' might not always return an + integer when expected. + (tramp-register-file-name-handlers): `partial-completion-mode' is + unknown to XEmacs. + (tramp-time-diff): Don't use `floor', it might fail for large + differences. + (tramp-handle-make-auto-save-file-name): For Emacs 21, set + `tramp-auto-save-directory' if unset in order to guarantee unique + auto-save file names. + +2006-08-28 Chong Yidong <cyd@stupidchicken.com> + + * image-mode.el (image-mode): Display image as text on a terminal. + +2006-08-28 Stefan Monnier <monnier@iro.umontreal.ca> + + * progmodes/python.el (python-send-command): Simplify. + (run-python): Don't generate a new buffer unless `new' was specified. + Make sure we send `import emacs' to the proper process. + + * progmodes/python.el (python-send-command): Don't wait for the command + to terminate. Don't fiddle with compilation-parsing-end. + +2006-08-28 Chong Yidong <cyd@stupidchicken.com> + + * emacs-lisp/checkdoc.el (checkdoc-file-comments-engine): + Insert commentary after first line summary. + + * woman.el (woman-follow): New function, based on `man-follow'. + (woman-mode-map): Use it. + + * ibuffer.el (ibuffer-do-sort-by-recency): Perform full update + since ibuffer-do-sort-by-recency does not define a sorter. + +2006-08-28 Kim F. Storm <storm@cua.dk> + + * find-dired.el (find-dired): Use shell-quote-argument to properly + escape ( and ) args. Also use it on {} and ; args in default + value of find-ls-option string. + (find-grep-dired): Use shell-quote-argument on {} and ; args. + 2006-08-27 Michael Olson <mwolson@gnu.org> * emacs-lisp/tq.el: Small grammar fix in comments. @@ -96,7 +1848,8 @@ * progmodes/grep.el (grep-find-use-xargs): Use explicit value `exec' to mean "use find -exec"; nil now unambiguously means auto-detect. (grep-compute-defaults): Set grep-find-use-xargs to `exec' if not `gnu'. - Use shell-quote-argument to build grep-find-command and grep-find-template. + Use shell-quote-argument to build grep-find-command and + grep-find-template. (rgrep): Use shell-quote-argument to properly quote arguments to find. Reported by Tom Seddon. @@ -1088,7 +2841,7 @@ repertoire of unit tests. Called just before the provide iff user has customized `allout-run-unit-tests-on-load' non-nil. -2006-07-14 K,Aa(Broly L,Bu(Brentey <lorentey@elte.hu> +2006-07-14 K,Aa(Broly L$,1 q(Brentey <lorentey@elte.hu> * emacs-lisp/authors.el (authors-aliases): Update. @@ -2948,7 +4701,7 @@ compatibility function (Emacs 18/19). (idlwave-is-continuation-line): Always return point at start of previous non-blank continuation line. - `keyword-parameters': Fix continued comment font-lock matcher. + (keyword-parameters): Fix continued comment font-lock matcher. (idlwave-font-lock-fontify-region): Written, use as font-lock-fontify-region-function, to fix continued keyword fontification issues. @@ -3201,7 +4954,7 @@ (mac-TIFF-to-string): New functions. (x-get-selection, x-selection-value) (mac-select-convert-to-string): Use them. - (mac-text-encoding-mac-japanese-basic-variant): New constant. + (mac-text-encoding-mac-japanese-basic-variant): New constant. (mac-dnd-types-alist): New customization variable. (mac-dnd-handle-furl, mac-dnd-handle-hfs, mac-dnd-insert-utxt) (mac-dnd-insert-TEXT, mac-dnd-insert-TIFF, mac-dnd-drop-data) @@ -3720,7 +5473,7 @@ Sync with Tramp 2.0.53. * net/tramp.el (tramp-completion-mode): ?\t has event-modifier - 'control. Reported by Matthias F,bv(Brste <slashdevslashnull@gmx.net>. + 'control. Reported by Matthias F,Av(Brste <slashdevslashnull@gmx.net>. (tramp-completion-file-name-handler): Add autoload cookie for adding to `file-name-handler-alist'. @@ -8314,7 +10067,7 @@ Let term-handle-ansi-terminal-messages override what Bash says about its current directory. -2005-12-16 L$,1 q(Brentey K,Aa(Broly <lorentey@elte.hu> +2005-12-16 K,Aa(Broly L$,1 q(Brentey <lorentey@elte.hu> * bindings.el (last-buffer): Move to simple.el. * simple.el (last-buffer): Move here. @@ -10071,7 +11824,7 @@ prompts work for AUTH PLAIN. Also reported by Steve Allan <seallan@verizon.net>. -2005-12-06 L$,1 q(Brentey K,Aa(Broly <lorentey@elte.hu> +2005-12-06 K,Aa(Broly L$,1 q(Brentey <lorentey@elte.hu> * frame.el (set-frame-parameter): Add doc string. @@ -10455,7 +12208,7 @@ (flyspell-post-command-hook): Check input-pending-p while processing the potentially long list of buffer changes. -2005-11-28 L$,1 q(Brentey K,Aa(Broly <lorentey@elte.hu> +2005-11-28 K,Aa(Broly L$,1 q(Brentey <lorentey@elte.hu> * buff-menu.el (list-buffers-noselect): Display the selected frame's buffer list, not the global one. @@ -15598,8 +17351,9 @@ Move to beginning of file. (scheme-interaction-mode-commands-alist) (scheme-interaction-mode-map, scheme-debugger-mode-map): - Declare them before use. Note: the initialization code for the variables - has not been moved because it uses functions that reference the variables. + Declare them before use. Note: the initialization code for the + variables has not been moved because it uses functions that reference + the variables. (xscheme-control-g-message-string, xscheme-process-filter-alist) (xscheme-prompt-for-expression-map): Declare them before use. (scheme-debugger-mode-commands): "?\ " -> "?\s".
--- a/lisp/add-log.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/add-log.el Sat Oct 14 17:36:28 2006 +0000 @@ -914,7 +914,7 @@ ;; Include certain keywords if they ;; precede the name. (setq middle (point)) - (forward-word -1) + (forward-sexp -1) ;; Is this C++ method? (when (and (< 2 middle) (string= (buffer-substring (- middle 2)
--- a/lisp/allout.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/allout.el Sat Oct 14 17:36:28 2006 +0000 @@ -698,9 +698,11 @@ ("*" allout-rebullet-current-heading) ("#" allout-number-siblings) ("\C-k" allout-kill-line t) + ("\M-k" allout-copy-line-as-kill t) ("\C-y" allout-yank t) ("\M-y" allout-yank-pop t) ("\C-k" allout-kill-topic) + ("\M-k" allout-copy-topic-as-kill) ; Miscellaneous commands: ;([?\C-\ ] allout-mark-topic) ("@" allout-resolve-xref) @@ -847,18 +849,37 @@ (defvar allout-bullets-string-len 0 "Length of current buffers' `allout-plain-bullets-string'.") (make-variable-buffer-local 'allout-bullets-string-len) +;;;_ = allout-depth-specific-regexp +(defvar allout-depth-specific-regexp "" + "*Regular expression to match a heading line prefix for a particular depth. + +This expression is used to search for depth-specific topic +headers at depth 2 and greater. Use `allout-depth-one-regexp' +for to seek topics at depth one. + +This var is set according to the user configuration vars by +`set-allout-regexp'. It is prepared with format strings for two +decimal numbers, which should each be one less than the depth of the +topic prefix to be matched.") +(make-variable-buffer-local 'allout-depth-specific-regexp) +;;;_ = allout-depth-one-regexp +(defvar allout-depth-one-regexp "" + "*Regular expression to match a heading line prefix for depth one. + +This var is set according to the user configuration vars by +`set-allout-regexp'. It is prepared with format strings for two +decimal numbers, which should each be one less than the depth of the +topic prefix to be matched.") +(make-variable-buffer-local 'allout-depth-one-regexp) ;;;_ = allout-line-boundary-regexp (defvar allout-line-boundary-regexp () "`allout-regexp' with outline style beginning-of-line anchor. -This is properly set when `allout-regexp' is produced by -`set-allout-regexp', so that (match-beginning 2) and (match-end -2) delimit the prefix.") +This is properly set by `set-allout-regexp'.") (make-variable-buffer-local 'allout-line-boundary-regexp) ;;;_ = allout-bob-regexp (defvar allout-bob-regexp () - "Like `allout-line-boundary-regexp', for headers at beginning of buffer. -\(match-beginning 2) and \(match-end 2) delimit the prefix.") + "Like `allout-line-boundary-regexp', for headers at beginning of buffer.") (make-variable-buffer-local 'allout-bob-regexp) ;;;_ = allout-header-subtraction (defvar allout-header-subtraction (1- (length allout-header-prefix)) @@ -869,7 +890,14 @@ "Length of `allout-plain-bullets-string', updated by `set-allout-regexp'.") (make-variable-buffer-local 'allout-plain-bullets-string-len) - +;;;_ = allout-doublecheck-at-and-shallower +(defconst allout-doublecheck-at-and-shallower 3 + "Verify apparent topics of this depth and shallower as being non-aberrant. + +Verified with `allout-aberrant-container-p'. This check's usefulness is +limited to shallow prospects, because the determination of aberrance +depends on the mistaken item being followed by a legitimate item of +excessively greater depth.") ;;;_ X allout-reset-header-lead (header-lead) (defun allout-reset-header-lead (header-lead) "*Reset the leading string used to identify topic headers." @@ -961,7 +989,9 @@ "Generate proper topic-header regexp form for outline functions. Works with respect to `allout-plain-bullets-string' and -`allout-distinctive-bullets-string'." +`allout-distinctive-bullets-string'. + +Also refresh various data structures that hinge on the regexp." (interactive) ;; Derive allout-bullets-string from user configured components: @@ -996,19 +1026,84 @@ ;; Derive next for repeated use in allout-pending-bullet: (setq allout-plain-bullets-string-len (length allout-plain-bullets-string)) (setq allout-header-subtraction (1- (length allout-header-prefix))) - ;; Produce the new allout-regexp: - (setq allout-regexp (concat "\\(" - (regexp-quote allout-header-prefix) - "[ \t]*[" - allout-bullets-string - "]\\)\\|" - (regexp-quote allout-primary-bullet) - "+\\|\^l")) - (setq allout-line-boundary-regexp - (concat "\\(\n\\)\\(" allout-regexp "\\)")) - (setq allout-bob-regexp - (concat "\\(\\`\\)\\(" allout-regexp "\\)")) - ) + + (let (new-part old-part) + (setq new-part (concat "\\(" + (regexp-quote allout-header-prefix) + "[ \t]*" + ;; already regexp-quoted in a custom way: + "[" allout-bullets-string "]" + "\\)") + old-part (concat "\\(" + (regexp-quote allout-primary-bullet) + "\\|" + (regexp-quote allout-header-prefix) + "\\)" + "+" + " ?[^" allout-primary-bullet "]") + allout-regexp (concat new-part + "\\|" + old-part + "\\|\^l") + + allout-line-boundary-regexp (concat "\n" new-part + "\\|" + "\n" old-part) + + allout-bob-regexp (concat "\\`" new-part + "\\|" + "\\`" old-part)) + + (setq allout-depth-specific-regexp + (concat "\\(^\\|\\`\\)" + "\\(" + + ;; new-style spacers-then-bullet string: + "\\(" + (allout-format-quote (regexp-quote allout-header-prefix)) + " \\{%s\\}" + "[" (allout-format-quote allout-bullets-string) "]" + "\\)" + + ;; old-style all-bullets string, if primary not multi-char: + (if (< 0 allout-header-subtraction) + "" + (concat "\\|\\(" + (allout-format-quote + (regexp-quote allout-primary-bullet)) + (allout-format-quote + (regexp-quote allout-primary-bullet)) + (allout-format-quote + (regexp-quote allout-primary-bullet)) + "\\{%s\\}" + ;; disqualify greater depths: + "[^" + (allout-format-quote allout-primary-bullet) + "]\\)" + )) + "\\)" + )) + (setq allout-depth-one-regexp + (concat "\\(^\\|\\`\\)" + "\\(" + + "\\(" + (regexp-quote allout-header-prefix) + ;; disqualify any bullet char following any amount of + ;; intervening whitespace: + " *" + (concat "[^ " allout-bullets-string "]") + "\\)" + (if (< 0 allout-header-subtraction) + ;; Need not support anything like the old + ;; bullet style if the prefix is multi-char. + "" + (concat "\\|" + (regexp-quote allout-primary-bullet) + ;; disqualify deeper primary-bullet sequences: + "[^" allout-primary-bullet "]")) + "\\)" + )))) ;;;_ : Key bindings ;;;_ = allout-mode-map (defvar allout-mode-map nil "Keybindings for (allout) outline minor mode.") @@ -1142,7 +1237,7 @@ (if (not (symbolp name)) (error "Pair's name, %S, must be a symbol, not %s" name (type-of name))) - (setq prior-value (condition-case err + (setq prior-value (condition-case nil (symbol-value name) (void-variable nil))) (when (not (assoc name allout-mode-prior-settings)) @@ -1186,7 +1281,7 @@ ;;;_ > allout-unprotected (expr) (defmacro allout-unprotected (expr) "Enable internal outline operations to alter invisible text." - `(let ((inhibit-read-only t) + `(let ((inhibit-read-only (if (not buffer-read-only) t)) (inhibit-field-text-motion t)) ,expr)) ;;;_ = allout-mode-hook @@ -1600,7 +1695,9 @@ Topic-oriented Killing and Yanking: ---------------------------------- \\[allout-kill-topic] allout-kill-topic Kill current topic, including offspring. -\\[allout-kill-line] allout-kill-line Like kill-line, but reconciles numbering, etc. +\\[allout-copy-topic-as-kill] allout-copy-topic-as-kill Copy current topic, including offspring. +\\[allout-kill-line] allout-kill-line kill-line, attending to outline structure. +\\[allout-copy-line-as-kill] allout-copy-line-as-kill Copy line but don't delete it. \\[allout-yank] allout-yank Yank, adjusting depth of yanked topic to depth of heading if yanking into bare topic heading (ie, prefix sans text). @@ -1792,8 +1889,7 @@ (remove-from-invisibility-spec '(allout . t)) (remove-hook 'pre-command-hook 'allout-pre-command-business t) (remove-hook 'post-command-hook 'allout-post-command-business t) - (when (featurep 'xemacs) - (remove-hook 'before-change-functions 'allout-before-change-handler t)) + (remove-hook 'before-change-functions 'allout-before-change-handler t) (remove-hook 'isearch-mode-end-hook 'allout-isearch-end-handler t) (remove-hook write-file-hook-var-name 'allout-write-file-hook-handler t) (remove-hook 'auto-save-hook 'allout-auto-save-hook-handler t) @@ -1813,7 +1909,7 @@ (allout-overlay-preparations) ; Doesn't hurt to redo this. - (allout-infer-header-lead) + (allout-infer-header-lead-and-primary-bullet) (allout-infer-body-reindent) (set-allout-regexp) @@ -1854,9 +1950,8 @@ (allout-add-resumptions '(line-move-ignore-invisible t)) (add-hook 'pre-command-hook 'allout-pre-command-business nil t) (add-hook 'post-command-hook 'allout-post-command-business nil t) - (when (featurep 'xemacs) - (add-hook 'before-change-functions 'allout-before-change-handler - nil t)) + (add-hook 'before-change-functions 'allout-before-change-handler + nil t) (add-hook 'isearch-mode-end-hook 'allout-isearch-end-handler nil t) (add-hook write-file-hook-var-name 'allout-write-file-hook-handler nil t) @@ -1996,18 +2091,20 @@ (defun allout-before-change-handler (beg end) "Protect against changes to invisible text. -See allout-overlay-interior-modification-handler for details. - -This before-change handler is used only where modification-hooks -overlay property is not supported." +See allout-overlay-interior-modification-handler for details." + + (if (and (allout-mode-p) undo-in-progress (allout-hidden-p)) + (allout-show-to-offshoot)) + ;; allout-overlay-interior-modification-handler on an overlay handles ;; this in other emacs, via `allout-exposure-category's 'modification-hooks. (when (and (featurep 'xemacs) (allout-mode-p)) ;; process all of the pending overlays: - (dolist (overlay (overlays-in beg end)) - (if (eq (overlay-get ol 'invisible) 'allout) - (allout-overlay-interior-modification-handler - overlay nil beg end nil))))) + (save-excursion + (got-char beg) + (let ((overlay (allout-get-invisibility-overlay))) + (allout-overlay-interior-modification-handler + overlay nil beg end nil))))) ;;;_ > allout-isearch-end-handler (&optional overlay) (defun allout-isearch-end-handler (&optional overlay) "Reconcile allout outline exposure on arriving in hidden text after isearch. @@ -2035,19 +2132,35 @@ (defvar allout-recent-prefix-end 0 "Buffer point of the end of the last topic prefix encountered.") (make-variable-buffer-local 'allout-recent-prefix-end) +;;;_ = allout-recent-depth +(defvar allout-recent-depth 0 + "Depth of the last topic prefix encountered.") +(make-variable-buffer-local 'allout-recent-depth) ;;;_ = allout-recent-end-of-subtree (defvar allout-recent-end-of-subtree 0 "Buffer point last returned by `allout-end-of-current-subtree'.") (make-variable-buffer-local 'allout-recent-end-of-subtree) -;;;_ > allout-prefix-data (beg end) -(defmacro allout-prefix-data (beg end) - "Register allout-prefix state data - BEGINNING and END of prefix. +;;;_ > allout-prefix-data () +(defsubst allout-prefix-data () + "Register allout-prefix state data. For reference by `allout-recent' funcs. Returns BEGINNING." - `(setq allout-recent-prefix-end ,end - allout-recent-prefix-beginning ,beg)) + (setq allout-recent-prefix-end (or (match-end 1) (match-end 2)) + allout-recent-prefix-beginning (or (match-beginning 1) + (match-beginning 2)) + allout-recent-depth (max 1 (- allout-recent-prefix-end + allout-recent-prefix-beginning + allout-header-subtraction))) + allout-recent-prefix-beginning) +;;;_ > nullify-allout-prefix-data () +(defsubst nullify-allout-prefix-data () + "Mark allout prefix data as being uninformative." + (setq allout-recent-prefix-end (point) + allout-recent-prefix-beginning (point) + allout-recent-depth 0) + allout-recent-prefix-beginning) ;;;_ > allout-recent-depth () -(defmacro allout-recent-depth () +(defsubst allout-recent-depth () "Return depth of last heading encountered by an outline maneuvering function. All outline functions which directly do string matches to assess @@ -2055,19 +2168,17 @@ `allout-recent-prefix-end' if successful. This function uses those settings to return the current depth." - '(max 1 (- allout-recent-prefix-end - allout-recent-prefix-beginning - allout-header-subtraction))) + allout-recent-depth) ;;;_ > allout-recent-prefix () -(defmacro allout-recent-prefix () +(defsubst allout-recent-prefix () "Like `allout-recent-depth', but returns text of last encountered prefix. All outline functions which directly do string matches to assess headings set the variables `allout-recent-prefix-beginning' and `allout-recent-prefix-end' if successful. This function uses those settings -to return the current depth." - '(buffer-substring allout-recent-prefix-beginning - allout-recent-prefix-end)) +to return the current prefix." + (buffer-substring-no-properties allout-recent-prefix-beginning + allout-recent-prefix-end)) ;;;_ > allout-recent-bullet () (defmacro allout-recent-bullet () "Like allout-recent-prefix, but returns bullet of last encountered prefix. @@ -2076,8 +2187,8 @@ headings set the variables `allout-recent-prefix-beginning' and `allout-recent-prefix-end' if successful. This function uses those settings to return the current depth of the most recently matched topic." - '(buffer-substring (1- allout-recent-prefix-end) - allout-recent-prefix-end)) + '(buffer-substring-no-properties (1- allout-recent-prefix-end) + allout-recent-prefix-end)) ;;;_ #4 Navigation @@ -2091,7 +2202,9 @@ (save-excursion (allout-beginning-of-current-line) (and (looking-at allout-regexp) - (allout-prefix-data (match-beginning 0) (match-end 0))))) + (allout-prefix-data) + (or (> allout-recent-depth allout-doublecheck-at-and-shallower) + (not (allout-aberrant-container-p)))))) ;;;_ > allout-on-heading-p () (defalias 'allout-on-heading-p 'allout-on-current-heading-p) ;;;_ > allout-e-o-prefix-p () @@ -2101,6 +2214,51 @@ (beginning-of-line)) (looking-at allout-regexp)) (= (point)(save-excursion (allout-end-of-prefix)(point))))) +;;;_ > allout-aberrant-container-p () +(defun allout-aberrant-container-p () + "True if topic, or next sibling with children, contains them discontinuously. + +Discontinuous means an immediate offspring that is nested more +than one level deeper than the topic. + +If topic has no offspring, then the next sibling with offspring will +determine whether or not this one is determined to be aberrant. + +If true, then the allout-recent-* settings are calibrated on the +offspring that qaulifies it as aberrant, ie with depth that +exceeds the topic by more than one." + + ;; This is most clearly understood when considering standard-prefix-leader + ;; low-level topics, which can all too easily match text not intended as + ;; headers. For example, any line with a leading '.' or '*' and lacking a + ;; following bullet qualifies without this protection. (A sequence of + ;; them can occur naturally, eg a typical textual bullet list.) We + ;; disqualify such low-level sequences when they are followed by a + ;; discontinuously contained child, inferring that the sequences are not + ;; actually connected with their prospective context. + + (let ((depth (allout-depth)) + (start-point (point)) + done aberrant) + (save-excursion + (while (and (not done) + (re-search-forward allout-line-boundary-regexp nil 0)) + (allout-prefix-data) + (goto-char allout-recent-prefix-beginning) + (cond + ;; sibling - continue: + ((eq allout-recent-depth depth)) + ;; first offspring is excessive - aberrant: + ((> allout-recent-depth (1+ depth)) + (setq done t aberrant t)) + ;; next non-sibling is lower-depth - not aberrant: + (t (setq done t))))) + (if aberrant + aberrant + (goto-char start-point) + ;; recalibrate allout-recent-* + (allout-depth) + nil))) ;;;_ : Location attributes ;;;_ > allout-depth () (defun allout-depth () @@ -2113,10 +2271,10 @@ (let ((start-point (point))) (if (and (allout-goto-prefix) (not (< start-point (point)))) - (allout-recent-depth) + allout-recent-depth (progn - ;; Oops, no prefix, zero prefix data: - (allout-prefix-data (point)(point)) + ;; Oops, no prefix, nullify it: + (nullify-allout-prefix-data) ;; ... and return 0: 0))))) ;;;_ > allout-current-depth () @@ -2149,10 +2307,10 @@ (condition-case nil (save-excursion (allout-back-to-current-heading) - (buffer-substring (- allout-recent-prefix-end 1) - allout-recent-prefix-end)) + (buffer-substring-no-properties (- allout-recent-prefix-end 1) + allout-recent-prefix-end)) ;; Quick and dirty provision, ostensibly for missing bullet: - ('args-out-of-range nil)) + (args-out-of-range nil)) ) ;;;_ > allout-get-prefix-bullet (prefix) (defun allout-get-prefix-bullet (prefix) @@ -2160,7 +2318,7 @@ ;; Doesn't make sense if we're old-style prefixes, but this just ;; oughtn't be called then, so forget about it... (if (string-match allout-regexp prefix) - (substring prefix (1- (match-end 0)) (match-end 0)))) + (substring prefix (1- (match-end 2)) (match-end 2)))) ;;;_ > allout-sibling-index (&optional depth) (defun allout-sibling-index (&optional depth) "Item number of this prospective topic among its siblings. @@ -2172,12 +2330,12 @@ (save-excursion (cond ((and depth (<= depth 0) 0)) - ((or (not depth) (= depth (allout-depth))) + ((or (null depth) (= depth (allout-depth))) (let ((index 1)) - (while (allout-previous-sibling (allout-recent-depth) nil) + (while (allout-previous-sibling allout-recent-depth nil) (setq index (1+ index))) index)) - ((< depth (allout-recent-depth)) + ((< depth allout-recent-depth) (allout-ascend-to-depth depth) (allout-sibling-index)) (0)))) @@ -2229,11 +2387,17 @@ (if (or (not allout-beginning-of-line-cycles) (not (equal last-command this-command))) (move-beginning-of-line 1) - (let ((beginning-of-body (save-excursion - (allout-beginning-of-current-entry) - (point)))) + (allout-depth) + (let ((beginning-of-body + (save-excursion + (while (and (<= allout-recent-depth + allout-doublecheck-at-and-shallower) + (allout-aberrant-container-p) + (allout-previous-visible-heading 1))) + (allout-beginning-of-current-entry) + (point)))) (cond ((= (current-column) 0) - (allout-beginning-of-current-entry)) + (goto-char beginning-of-body)) ((< (point) beginning-of-body) (allout-beginning-of-current-line)) ((= (point) beginning-of-body) @@ -2241,7 +2405,7 @@ (t (allout-beginning-of-current-line) (if (< (point) beginning-of-body) ;; we were on the headline after its start: - (allout-beginning-of-current-entry))))))) + (goto-char beginning-of-body))))))) ;;;_ > allout-end-of-line () (defun allout-end-of-line () "End-of-line with `allout-end-of-line-cycles' behavior, if set." @@ -2261,6 +2425,7 @@ (allout-hidden-p))) (allout-back-to-current-heading) (allout-show-current-entry) + (allout-show-children) (allout-end-of-entry)) ((>= (point) end-of-entry) (allout-back-to-current-heading) @@ -2270,40 +2435,49 @@ (defsubst allout-next-heading () "Move to the heading for the topic \(possibly invisible) after this one. -Returns the location of the heading, or nil if none found." - - (if (and (bobp) (not (eobp)) (looking-at allout-regexp)) +Returns the location of the heading, or nil if none found. + +We skip anomolous low-level topics, a la `allout-aberrant-container-p'." + (if (looking-at allout-regexp) (forward-char 1)) - (if (re-search-forward allout-line-boundary-regexp nil 0) - (allout-prefix-data ; Got valid location state - set vars: - (goto-char (or (match-beginning 2) - allout-recent-prefix-beginning)) - (or (match-end 2) allout-recent-prefix-end)))) + (when (re-search-forward allout-line-boundary-regexp nil 0) + (allout-prefix-data) + (and (<= allout-recent-depth allout-doublecheck-at-and-shallower) + ;; this will set allout-recent-* on the first non-aberrant topic, + ;; whether it's the current one or one that disqualifies it: + (allout-aberrant-container-p)) + (goto-char allout-recent-prefix-beginning))) ;;;_ > allout-this-or-next-heading (defun allout-this-or-next-heading () "Position cursor on current or next heading." ;; A throwaway non-macro that is defined after allout-next-heading ;; and usable by allout-mode. - (if (not (allout-goto-prefix)) (allout-next-heading))) + (if (not (allout-goto-prefix-doublechecked)) (allout-next-heading))) ;;;_ > allout-previous-heading () -(defmacro allout-previous-heading () +(defun allout-previous-heading () "Move to the prior \(possibly invisible) heading line. -Return the location of the beginning of the heading, or nil if not found." - - '(if (bobp) - nil - (allout-goto-prefix) - (if - ;; searches are unbounded and return nil if failed: - (or (re-search-backward allout-line-boundary-regexp nil 0) - (looking-at allout-bob-regexp)) - (progn ; Got valid location state - set vars: - (allout-prefix-data - (goto-char (or (match-beginning 2) - allout-recent-prefix-beginning)) - (or (match-end 2) allout-recent-prefix-end)))))) +Return the location of the beginning of the heading, or nil if not found. + +We skip anomolous low-level topics, a la `allout-aberrant-container-p'." + + (if (bobp) + nil + ;; allout-goto-prefix-doublechecked calls us, so we can't use it here. + (let ((start-point (point))) + (allout-goto-prefix) + (when (or (re-search-backward allout-line-boundary-regexp nil 0) + (looking-at allout-bob-regexp)) + (goto-char (allout-prefix-data)) + (if (and (<= allout-recent-depth allout-doublecheck-at-and-shallower) + (allout-aberrant-container-p)) + (or (allout-previous-heading) + (and (goto-char start-point) + ;; recalibrate allout-recent-*: + (allout-depth) + nil)) + (point)))))) ;;;_ > allout-get-invisibility-overlay () (defun allout-get-invisibility-overlay () "Return the overlay at point that dictates allout invisibility." @@ -2311,7 +2485,8 @@ got) (while (and overlays (not got)) (if (equal (overlay-get (car overlays) 'invisible) 'allout) - (setq got (car overlays)))) + (setq got (car overlays)) + (pop overlays))) got)) ;;;_ > allout-back-to-visible-text () (defun allout-back-to-visible-text () @@ -2324,23 +2499,20 @@ ;;;_ " These routines either produce or assess charts, which are ;;; nested lists of the locations of topics within a subtree. ;;; -;;; Use of charts enables efficient navigation of subtrees, by -;;; requiring only a single regexp-search based traversal, to scope -;;; out the subtopic locations. The chart then serves as the basis -;;; for assessment or adjustment of the subtree, without redundant -;;; traversal of the structure. +;;; Charts enable efficient subtree navigation by providing a reusable basis +;;; for elaborate, compound assessment and adjustment of a subtree. ;;;_ > allout-chart-subtree (&optional levels visible orig-depth prev-depth) (defun allout-chart-subtree (&optional levels visible orig-depth prev-depth) "Produce a location \"chart\" of subtopics of the containing topic. -Optional argument LEVELS specifies the depth \(relative to start -depth) for the chart. +Optional argument LEVELS specifies a depth limit \(relative to start +depth) for the chart. Null LEVELS means no limit. When optional argument VISIBLE is non-nil, the chart includes only the visible subelements of the charted subjects. -The remaining optional args are not for internal use by the function. +The remaining optional args are for internal use by the function. Point is left at the end of the subtree. @@ -2348,12 +2520,12 @@ routines need assess the structure only once, and then use the chart for their elaborate manipulations. -Topics are entered in the chart so the last one is at the car. -The entry for each topic consists of an integer indicating the point -at the beginning of the topic. Charts for offspring consists of a -list containing, recursively, the charts for the respective subtopics. -The chart for a topics' offspring precedes the entry for the topic -itself. +The chart entries for the topics are in reverse order, so the +last topic is listed first. The entry for each topic consists of +an integer indicating the point at the beginning of the topic +prefix. Charts for offspring consists of a list containing, +recursively, the charts for the respective subtopics. The chart +for a topics' offspring precedes the entry for the topic itself. The other function parameters are for internal recursion, and should not be specified by external callers. ORIG-DEPTH is depth of topic at @@ -2380,17 +2552,17 @@ (while (and (not (eobp)) ; Still within original topic? - (< orig-depth (setq curr-depth (allout-recent-depth))) + (< orig-depth (setq curr-depth allout-recent-depth)) (cond ((= prev-depth curr-depth) ;; Register this one and move on: - (setq chart (cons (point) chart)) + (setq chart (cons allout-recent-prefix-beginning chart)) (if (and levels (<= levels 1)) ;; At depth limit - skip sublevels: (or (allout-next-sibling curr-depth) ;; or no more siblings - proceed to ;; next heading at lesser depth: (while (and (<= curr-depth - (allout-recent-depth)) + allout-recent-depth) (if visible (allout-next-visible-heading 1) (allout-next-heading))))) @@ -2437,26 +2609,29 @@ Effectively a top-level chart of siblings. See `allout-chart-subtree' for an explanation of charts." (save-excursion - (if (allout-goto-prefix) - (let ((chart (list (point)))) - (while (allout-next-sibling) - (setq chart (cons (point) chart))) - (if chart (setq chart (nreverse chart))))))) + (when (allout-goto-prefix-doublechecked) + (let ((chart (list (point)))) + (while (allout-next-sibling) + (setq chart (cons (point) chart))) + (if chart (setq chart (nreverse chart))))))) ;;;_ > allout-chart-to-reveal (chart depth) (defun allout-chart-to-reveal (chart depth) "Return a flat list of hidden points in subtree CHART, up to DEPTH. +If DEPTH is nil, include hidden points at any depth. + Note that point can be left at any of the points on chart, or at the start point." (let (result here) - (while (and (or (eq depth t) (> depth 0)) + (while (and (or (null depth) (> depth 0)) chart) (setq here (car chart)) (if (listp here) - (let ((further (allout-chart-to-reveal here (or (eq depth t) - (1- depth))))) + (let ((further (allout-chart-to-reveal here (if (null depth) + depth + (1- depth))))) ;; We're on the start of a subtree - recurse with it, if there's ;; more depth to go: (if further (setq result (append further result))) @@ -2514,15 +2689,28 @@ (search-backward "\n" nil 1)) (forward-char 1) (if (looking-at allout-regexp) - (setq done (allout-prefix-data (match-beginning 0) - (match-end 0))) + (setq done (allout-prefix-data)) (forward-char -1))) (if (bobp) (cond ((looking-at allout-regexp) - (allout-prefix-data (match-beginning 0)(match-end 0))) + (allout-prefix-data)) ((allout-next-heading)) (done)) done))) +;;;_ > allout-goto-prefix-doublechecked () +(defun allout-goto-prefix-doublechecked () + "Put point at beginning of immediately containing outline topic. + +Like `allout-goto-prefix', but shallow topics \(according to +`allout-doublecheck-at-and-shallower') are checked and +disqualified for child containment discontinuity, according to +`allout-aberrant-container-p'." + (allout-goto-prefix) + (if (and (<= allout-recent-depth allout-doublecheck-at-and-shallower) + (allout-aberrant-container-p)) + (allout-previous-heading) + (point))) + ;;;_ > allout-end-of-prefix () (defun allout-end-of-prefix (&optional ignore-decorations) "Position cursor at beginning of header text. @@ -2530,46 +2718,40 @@ If optional IGNORE-DECORATIONS is non-nil, put just after bullet, otherwise skip white space between bullet and ensuing text." - (if (not (allout-goto-prefix)) + (if (not (allout-goto-prefix-doublechecked)) nil - (let ((match-data (match-data))) - (goto-char (match-end 0)) - (if ignore-decorations - t - (while (looking-at "[0-9]") (forward-char 1)) - (if (and (not (eolp)) (looking-at "\\s-")) (forward-char 1))) - (store-match-data match-data)) + (goto-char allout-recent-prefix-end) + (if ignore-decorations + t + (while (looking-at "[0-9]") (forward-char 1)) + (if (and (not (eolp)) (looking-at "\\s-")) (forward-char 1))) ;; Reestablish where we are: (allout-current-depth))) ;;;_ > allout-current-bullet-pos () (defun allout-current-bullet-pos () "Return position of current \(visible) topic's bullet." - (if (not (allout-current-depth)) + (if (not (allout-current-depth)) nil - (1- (match-end 0)))) + (1- allout-recent-prefix-end))) ;;;_ > allout-back-to-current-heading () (defun allout-back-to-current-heading () - "Move to heading line of current topic, or beginning if already on the line. - -Return value of point, unless we started outside of (before any) topics, -in which case we return nil." + "Move to heading line of current topic, or beginning if not in a topic. + +If interactive, we position at the end of the prefix. + +Return value of resulting point, unless we started outside +of (before any) topics, in which case we return nil." (allout-beginning-of-current-line) - (if (or (allout-on-current-heading-p) - (and (re-search-backward (concat "^\\(" allout-regexp "\\)") - nil 'move) - (progn (while (allout-hidden-p) - (allout-beginning-of-current-line) - (if (not (looking-at allout-regexp)) - (re-search-backward (concat - "^\\(" allout-regexp "\\)") - nil 'move))) - (allout-prefix-data (match-beginning 1) - (match-end 1))))) - (if (interactive-p) - (allout-end-of-prefix) - (point)))) + (let ((bol-point (point))) + (allout-goto-prefix-doublechecked) + (if (<= (point) bol-point) + (if (interactive-p) + (allout-end-of-prefix) + (point)) + (goto-char (point-min)) + nil))) ;;;_ > allout-back-to-heading () (defalias 'allout-back-to-heading 'allout-back-to-current-heading) ;;;_ > allout-pre-next-prefix () @@ -2578,9 +2760,8 @@ Returns that character position." - (if (re-search-forward allout-line-boundary-regexp nil 'move) - (prog1 (goto-char (match-beginning 0)) - (allout-prefix-data (match-beginning 2)(match-end 2))))) + (if (allout-next-heading) + (goto-char (1- allout-recent-prefix-beginning)))) ;;;_ > allout-end-of-subtree (&optional current include-trailing-blank) (defun allout-end-of-subtree (&optional current include-trailing-blank) "Put point at the end of the last leaf in the containing topic. @@ -2596,11 +2777,11 @@ (interactive "P") (if current (allout-back-to-current-heading) - (allout-goto-prefix)) - (let ((level (allout-recent-depth))) + (allout-goto-prefix-doublechecked)) + (let ((level allout-recent-depth)) (allout-next-heading) (while (and (not (eobp)) - (> (allout-recent-depth) level)) + (> allout-recent-depth level)) (allout-next-heading)) (if (eobp) (allout-end-of-entry) @@ -2629,6 +2810,9 @@ (interactive) (let ((start-point (point))) (move-beginning-of-line 1) + (if (< 0 (allout-current-depth)) + (goto-char allout-recent-prefix-end) + (goto-char (point-min))) (allout-end-of-prefix) (if (and (interactive-p) (= (point) start-point)) @@ -2676,23 +2860,18 @@ (defun allout-ascend-to-depth (depth) "Ascend to depth DEPTH, returning depth if successful, nil if not." (if (and (> depth 0)(<= depth (allout-depth))) - (let ((last-good (point))) - (while (and (< depth (allout-depth)) - (setq last-good (point)) - (allout-beginning-of-level) - (allout-previous-heading))) - (if (= (allout-recent-depth) depth) - (progn (goto-char allout-recent-prefix-beginning) - depth) - (goto-char last-good) - nil)) - (if (interactive-p) (allout-end-of-prefix)))) + (let (last-ascended) + (while (and (< depth allout-recent-depth) + (setq last-ascended (allout-ascend)))) + (goto-char allout-recent-prefix-beginning) + (if (interactive-p) (allout-end-of-prefix)) + (and last-ascended allout-recent-depth)))) ;;;_ > allout-ascend () (defun allout-ascend () "Ascend one level, returning t if successful, nil if not." (prog1 (if (allout-beginning-of-level) - (allout-previous-heading)) + (allout-previous-heading)) (if (interactive-p) (allout-end-of-prefix)))) ;;;_ > allout-descend-to-depth (depth) (defun allout-descend-to-depth (depth) @@ -2703,47 +2882,24 @@ (start-depth (allout-depth))) (while (and (> (allout-depth) 0) - (not (= depth (allout-recent-depth))) ; ... not there yet + (not (= depth allout-recent-depth)) ; ... not there yet (allout-next-heading) ; ... go further - (< start-depth (allout-recent-depth)))) ; ... still in topic + (< start-depth allout-recent-depth))) ; ... still in topic (if (and (> (allout-depth) 0) - (= (allout-recent-depth) depth)) + (= allout-recent-depth depth)) depth (goto-char start-point) nil)) ) -;;;_ > allout-up-current-level (arg &optional dont-complain) -(defun allout-up-current-level (arg &optional dont-complain) - "Move out ARG levels from current visible topic. - -Positions on heading line of containing topic. Error if unable to -ascend that far, or nil if unable to ascend but optional arg -DONT-COMPLAIN is non-nil." +;;;_ > allout-up-current-level (arg) +(defun allout-up-current-level (arg) + "Move out ARG levels from current visible topic." (interactive "p") - (allout-back-to-current-heading) - (let ((present-level (allout-recent-depth)) - (last-good (point)) - failed) - ;; Loop for iterating arg: - (while (and (> (allout-recent-depth) 1) - (> arg 0) - (not (bobp)) - (not failed)) - (setq last-good (point)) - ;; Loop for going back over current or greater depth: - (while (and (not (< (allout-recent-depth) present-level)) - (or (allout-previous-visible-heading 1) - (not (setq failed present-level))))) - (setq present-level (allout-current-depth)) - (setq arg (- arg 1))) - (if (or failed - (> arg 0)) - (progn (goto-char last-good) - (if (interactive-p) (allout-end-of-prefix)) - (if (not dont-complain) - (error "Can't ascend past outermost level") - (if (interactive-p) (allout-end-of-prefix)) - nil)) + (let ((start-point (point))) + (allout-back-to-current-heading) + (if (not (allout-ascend)) + (progn (goto-char start-point) + (error "Can't ascend past outermost level")) (if (interactive-p) (allout-end-of-prefix)) allout-recent-prefix-beginning))) @@ -2756,24 +2912,101 @@ Go backward if optional arg BACKWARD is non-nil. -Return depth if successful, nil otherwise." - - (if (and backward (bobp)) +Return the start point of the new topic if successful, nil otherwise." + + (if (if backward (bobp) (eobp)) nil - (let ((start-depth (or depth (allout-depth))) + (let ((target-depth (or depth (allout-depth))) (start-point (point)) + (count 0) + leaping last-depth) - (while (and (not (if backward (bobp) (eobp))) - (if backward (allout-previous-heading) - (allout-next-heading)) - (> (setq last-depth (allout-recent-depth)) start-depth))) - (if (and (not (eobp)) - (and (> (or last-depth (allout-depth)) 0) - (= (allout-recent-depth) start-depth))) - allout-recent-prefix-beginning - (goto-char start-point) - (if depth (allout-depth) start-depth) - nil)))) + (while (and + ;; done too few single steps to resort to the leap routine: + (not leaping) + ;; not at limit: + (not (if backward (bobp) (eobp))) + ;; still traversable: + (if backward (allout-previous-heading) (allout-next-heading)) + ;; we're below the target depth + (> (setq last-depth allout-recent-depth) target-depth)) + (setq count (1+ count)) + (if (> count 7) ; lists are commonly 7 +- 2, right?-) + (setq leaping t))) + (cond (leaping + (or (allout-next-sibling-leap target-depth backward) + (progn + (goto-char start-point) + (if depth (allout-depth) target-depth) + nil))) + ((and (not (eobp)) + (and (> (or last-depth (allout-depth)) 0) + (= allout-recent-depth target-depth))) + allout-recent-prefix-beginning) + (t + (goto-char start-point) + (if depth (allout-depth) target-depth) + nil))))) +;;;_ > allout-next-sibling-leap (&optional depth backward) +(defun allout-next-sibling-leap (&optional depth backward) + "Like `allout-next-sibling', but by direct search for topic at depth. + +Traverse at optional DEPTH, or current depth if none specified. + +Go backward if optional arg BACKWARD is non-nil. + +Return the start point of the new topic if successful, nil otherwise. + +Costs more than regular `allout-next-sibling' for short traversals: + + - we have to check the prior \(next, if travelling backwards) + item to confirm connectivity with the prior topic, and + - if confirmed, we have to reestablish the allout-recent-* settings with + some extra navigation + - if confirmation fails, we have to do more work to recover + +It is an increasingly big win when there are many intervening +offspring before the next sibling, however, so +`allout-next-sibling' resorts to this if it finds itself in that +situation." + + (if (if backward (bobp) (eobp)) + nil + (let* ((start-point (point)) + (target-depth (or depth (allout-depth))) + (search-whitespace-regexp nil) + (depth-biased (- target-depth 2)) + (expression (if (<= target-depth 1) + allout-depth-one-regexp + (format allout-depth-specific-regexp + depth-biased depth-biased))) + found + done) + (while (not done) + (setq found (if backward + (re-search-backward expression nil 'to-limit) + (forward-char 1) + (re-search-forward expression nil 'to-limit))) + (if (and found (allout-aberrant-container-p)) + (setq found nil)) + (setq done (or found (if backward (bobp) (eobp))))) + (if (not found) + (progn (goto-char start-point) + nil) + ;; rationale: if any intervening items were at a lower depth, we + ;; would now be on the first offspring at the target depth - ie, + ;; the preceeding item (per the search direction) must be at a + ;; lesser depth. that's all we need to check. + (if backward (allout-next-heading) (allout-previous-heading)) + (if (< allout-recent-depth target-depth) + ;; return to start and reestablish allout-recent-*: + (progn + (goto-char start-point) + (allout-depth) + nil) + (goto-char found) + ;; locate cursor and set allout-recent-*: + (allout-goto-prefix)))))) ;;;_ > allout-previous-sibling (&optional depth backward) (defun allout-previous-sibling (&optional depth backward) "Like `allout-forward-current-level' backwards, respecting invisible topics. @@ -2807,7 +3040,7 @@ (let ((depth (allout-depth))) (while (allout-previous-sibling depth nil)) - (prog1 (allout-recent-depth) + (prog1 allout-recent-depth (if (interactive-p) (allout-end-of-prefix))))) ;;;_ > allout-next-visible-heading (arg) (defun allout-next-visible-heading (arg) @@ -2821,21 +3054,36 @@ (step (if backward -1 1)) prev got) - (while (> arg 0) ; limit condition - (while (and (not (if backward (bobp)(eobp))) ; boundary condition - ;; Move, skipping over all those concealed lines: - (prog1 (condition-case nil (or (line-move step) t) - (error nil)) - (allout-beginning-of-current-line)) - (not (setq got (looking-at allout-regexp))))) + (while (> arg 0) + (while (and + ;; Boundary condition: + (not (if backward (bobp)(eobp))) + ;; Move, skipping over all concealed lines in one fell swoop: + (prog1 (condition-case nil (or (line-move step) t) + (error nil)) + (allout-beginning-of-current-line)) + ;; Deal with apparent header line: + (if (not (looking-at allout-regexp)) + ;; not a header line, keep looking: + t + (allout-prefix-data) + (if (and (<= allout-recent-depth + allout-doublecheck-at-and-shallower) + (allout-aberrant-container-p)) + ;; skip this aberrant prospective header line: + t + ;; this prospective headerline qualifies - register: + (setq got allout-recent-prefix-beginning) + ;; and break the loop: + nil)))) ;; Register this got, it may be the last: (if got (setq prev got)) (setq arg (1- arg))) (cond (got ; Last move was to a prefix: - (allout-prefix-data (match-beginning 0) (match-end 0)) - (allout-end-of-prefix)) + (allout-end-of-prefix)) (prev ; Last move wasn't, but prev was: - (allout-prefix-data (match-beginning 0) (match-end 0))) + (goto-char prev) + (allout-end-of-prefix)) ((not backward) (end-of-line) nil)))) ;;;_ > allout-previous-visible-heading (arg) (defun allout-previous-visible-heading (arg) @@ -2845,7 +3093,8 @@ A heading line is one that starts with a `*' (or that `allout-regexp' matches)." (interactive "p") - (allout-next-visible-heading (- arg))) + (prog1 (allout-next-visible-heading (- arg)) + (if (interactive-p) (allout-end-of-prefix)))) ;;;_ > allout-forward-current-level (arg) (defun allout-forward-current-level (arg) "Position point at the next heading of the same level. @@ -2856,38 +3105,25 @@ (interactive "p") (let ((start-depth (allout-current-depth)) (start-arg arg) - (backward (> 0 arg)) - last-depth - (last-good (point)) - at-boundary) + (backward (> 0 arg))) (if (= 0 start-depth) (error "No siblings, not in a topic...")) (if backward (setq arg (* -1 arg))) - (while (not (or (zerop arg) - at-boundary)) - (while (and (not (if backward (bobp) (eobp))) - (if backward (allout-previous-visible-heading 1) - (allout-next-visible-heading 1)) - (> (setq last-depth (allout-recent-depth)) start-depth))) - (if (and last-depth (= last-depth start-depth) - (not (if backward (bobp) (eobp)))) - (setq last-good (point) - arg (1- arg)) - (setq at-boundary t))) - (if (and (not (eobp)) - (= arg 0) - (and (> (or last-depth (allout-depth)) 0) - (= (allout-recent-depth) start-depth))) - allout-recent-prefix-beginning - (goto-char last-good) - (if (not (interactive-p)) - nil - (allout-end-of-prefix) - (error "Hit %s level %d topic, traversed %d of %d requested" - (if backward "first" "last") - (allout-recent-depth) - (- (abs start-arg) arg) - (abs start-arg)))))) + (allout-back-to-current-heading) + (while (and (not (zerop arg)) + (if backward + (allout-previous-sibling) + (allout-next-sibling))) + (setq arg (1- arg))) + (if (not (interactive-p)) + nil + (allout-end-of-prefix) + (if (not (zerop arg)) + (error "Hit %s level %d topic, traversed %d of %d requested" + (if backward "first" "last") + allout-recent-depth + (- (abs start-arg) arg) + (abs start-arg)))))) ;;;_ > allout-backward-current-level (arg) (defun allout-backward-current-level (arg) "Inverse of `allout-forward-current-level'." @@ -2977,34 +3213,41 @@ Returns the qualifying command, if any, else nil." (interactive) - (let* ((key-num (cond ((numberp last-command-char) last-command-char) + (let* ((key-string (if (numberp last-command-char) + (char-to-string last-command-char))) + (key-num (cond ((numberp last-command-char) last-command-char) ;; for XEmacs character type: ((and (fboundp 'characterp) (apply 'characterp (list last-command-char))) (apply 'char-to-int (list last-command-char))) (t 0))) - mapped-binding - (on-bullet (eq (point) (allout-current-bullet-pos)))) + mapped-binding) (if (zerop key-num) nil - (if (and (<= 33 key-num) - (setq mapped-binding + (if (and + ;; exclude control chars and escape: + (<= 33 key-num) + (setq mapped-binding + (or (and (assoc key-string allout-keybindings-list) + ;; translate literal membership on list: + (cadr (assoc key-string allout-keybindings-list))) + ;; translate as a keybinding: (key-binding (concat allout-command-prefix (char-to-string - (if (and (<= 97 key-num) ; "a" + (if (and (<= 97 key-num) ; "a" (>= 122 key-num)) ; "z" (- key-num 96) key-num))) - t))) - ;; Qualified with the allout prefix - do hot-spot operation. + t)))) + ;; Qualified as an allout command - do hot-spot operation. (setq allout-post-goto-bullet t) ;; accept-defaults nil, or else we'll get allout-item-icon-key-handler. (setq mapped-binding (key-binding (char-to-string key-num)))) (while (keymapp mapped-binding) (setq mapped-binding - (lookup-key mapped-binding (read-key-sequence-vector nil t)))) + (lookup-key mapped-binding (vector (read-char))))) (if mapped-binding (setq this-command mapped-binding))))) @@ -3036,7 +3279,7 @@ (setq choice (solicit-char-in-string (format "Select bullet: %s ('%s' default): " sans-escapes - default-bullet) + (substring-no-properties default-bullet)) sans-escapes t))) (message "") @@ -3275,7 +3518,7 @@ (allout-ascend-to-depth depth)) ((>= relative-depth 1) nil) (t (allout-back-to-current-heading))) - (setq ref-depth (allout-recent-depth)) + (setq ref-depth allout-recent-depth) (setq ref-bullet (if (> allout-recent-prefix-end 1) (allout-recent-bullet) @@ -3363,7 +3606,7 @@ (setq dbl-space t)) (if (save-excursion (allout-next-heading) - (when (> (allout-recent-depth) ref-depth) + (when (> allout-recent-depth ref-depth) ;; This is an offspring. (forward-line -1) (looking-at "^\\s-*$"))) @@ -3388,7 +3631,13 @@ (if (and dbl-space (not (> relative-depth 0))) (newline 1)) (if (and (not (eobp)) - (not (bolp))) + (or (not (bolp)) + (and (not (bobp)) + ;; bolp doesnt detect concealed + ;; trailing newlines, compensate: + (save-excursion + (forward-char -1) + (allout-hidden-p))))) (forward-char 1)))) )) (setq start (point)) @@ -3507,23 +3756,28 @@ (interactive "p") (let ((initial-col (current-column)) (on-bullet (eq (point)(allout-current-bullet-pos))) + from to (backwards (if (< arg 0) (setq arg (* arg -1))))) (while (> arg 0) (save-excursion (allout-back-to-current-heading) (allout-end-of-prefix) + (setq from allout-recent-prefix-beginning + to allout-recent-prefix-end) (allout-rebullet-heading t ;;; solicit nil ;;; depth nil ;;; number-control nil ;;; index - t)) ;;; do-successors + t) ;;; do-successors + (run-hook-with-args 'allout-exposure-change-hook + from to t)) (setq arg (1- arg)) (if (<= arg 0) nil (setq initial-col nil) ; Override positioning back to init col (if (not backwards) (allout-next-visible-heading 1) - (allout-goto-prefix) + (allout-goto-prefix-doublechecked) (allout-next-visible-heading -1)))) (message "Done.") (cond (on-bullet (goto-char (allout-current-bullet-pos))) @@ -3573,7 +3827,7 @@ (new-depth (or new-depth current-depth)) (mb allout-recent-prefix-beginning) (me allout-recent-prefix-end) - (current-bullet (buffer-substring (- me 1) me)) + (current-bullet (buffer-substring-no-properties (- me 1) me)) (new-prefix (allout-make-topic-prefix current-bullet nil new-depth @@ -3627,11 +3881,17 @@ ) ; let* ((current-depth (allout-depth))...) ) ; defun ;;;_ > allout-rebullet-topic (arg) -(defun allout-rebullet-topic (arg) +(defun allout-rebullet-topic (arg &optional sans-offspring) "Rebullet the visible topic containing point and all contained subtopics. Descends into invisible as well as visible topics, however. +When optional sans-offspring is non-nil, subtopics are not +shifted. \(Shifting a topic outwards without shifting its +offspring is disallowed, since this would create a \"containment +discontinuity\", where the depth difference between a topic and +its immediate offspring is greater than one.) + With repeat count, shift topic depth by that amount." (interactive "P") (let ((start-col (current-column))) @@ -3642,17 +3902,18 @@ ;; Fill the user in, in case we're shifting a big topic: (if (not (zerop arg)) (message "Shifting...")) (allout-back-to-current-heading) - (if (<= (+ (allout-recent-depth) arg) 0) + (if (<= (+ allout-recent-depth arg) 0) (error "Attempt to shift topic below level 1")) - (allout-rebullet-topic-grunt arg) + (allout-rebullet-topic-grunt arg nil nil nil nil sans-offspring) (if (not (zerop arg)) (message "Shifting... done."))) (move-to-column (max 0 (+ start-col arg))))) -;;;_ > allout-rebullet-topic-grunt (&optional relative-depth ...) +;;;_ > allout-rebullet-topic-grunt (&optional relative-depth ...) (defun allout-rebullet-topic-grunt (&optional relative-depth starting-depth starting-point index - do-successors) + do-successors + sans-offspring) "Like `allout-rebullet-topic', but on nearest containing topic \(visible or not). @@ -3663,8 +3924,23 @@ First arg RELATIVE-DEPTH means to shift the depth of the entire topic that amount. -The rest of the args are for internal recursive use by the function -itself. The are STARTING-DEPTH, STARTING-POINT, and INDEX." +Several subsequent args are for internal recursive use by the function +itself: STARTING-DEPTH, STARTING-POINT, and INDEX. + +Finally, if optional SANS-OFFSPRING is non-nil then the offspring +are not shifted. \(Shifting a topic outwards without shifting +its offspring is disallowed, since this would create a +\"containment discontinuity\", where the depth difference between +a topic and its immediate offspring is greater than one..)" + + ;; XXX the recursion here is peculiar, and in general the routine may + ;; need simplification with refactoring. + + (if (and sans-offspring + relative-depth + (< relative-depth 0)) + (error (concat "Attempt to shift topic outwards without offspring," + " would cause containment discontinuity."))) (let* ((relative-depth (or relative-depth 0)) (new-depth (allout-depth)) @@ -3676,44 +3952,57 @@ (and (or (zerop relative-depth) (not on-starting-call)) (allout-sibling-index)))) + (starting-index index) (moving-outwards (< 0 relative-depth)) - (starting-point (or starting-point (point)))) + (starting-point (or starting-point (point))) + (local-point (point))) ;; Sanity check for excessive promotion done only on starting call: (and on-starting-call moving-outwards (> 0 (+ starting-depth relative-depth)) - (error "Attempt to shift topic out beyond level 1")) ;;; ====> + (error "Attempt to shift topic out beyond level 1")) (cond ((= starting-depth new-depth) - ;; We're at depth to work on this one: - (allout-rebullet-heading nil ;;; solicit - (+ starting-depth ;;; starting-depth - relative-depth) - nil ;;; number - index ;;; index - ;; Every contained topic will get hit, - ;; and we have to get to outside ones - ;; deliberately: - nil) ;;; do-successors - ;; ... and work on subsequent ones which are at greater depth: - (setq index 0) - (allout-next-heading) - (while (and (not (eobp)) - (< starting-depth (allout-recent-depth))) - (setq index (1+ index)) - (allout-rebullet-topic-grunt relative-depth ;;; relative-depth - (1+ starting-depth);;;starting-depth - starting-point ;;; starting-point - index))) ;;; index + ;; We're at depth to work on this one. + + ;; When shifting out we work on the children before working on + ;; the parent to avoid interim `allout-aberrant-container-p' + ;; aberrancy, and vice-versa when shifting in: + (if (>= relative-depth 0) + (allout-rebullet-heading nil + (+ starting-depth relative-depth) + nil ;;; number + index + nil)) ;;; do-successors + (when (not sans-offspring) + ;; ... and work on subsequent ones which are at greater depth: + (setq index 0) + (allout-next-heading) + (while (and (not (eobp)) + (< starting-depth (allout-depth))) + (setq index (1+ index)) + (allout-rebullet-topic-grunt relative-depth + (1+ starting-depth) + starting-point + index))) + (when (< relative-depth 0) + (save-excursion + (goto-char local-point) + (allout-rebullet-heading nil ;;; solicit + (+ starting-depth relative-depth) + nil ;;; number + starting-index + nil)))) ;;; do-successors ((< starting-depth new-depth) ;; Rare case - subtopic more than one level deeper than parent. ;; Treat this one at an even deeper level: - (allout-rebullet-topic-grunt relative-depth ;;; relative-depth - new-depth ;;; starting-depth - starting-point ;;; starting-point - index))) ;;; index + (allout-rebullet-topic-grunt relative-depth + new-depth + starting-point + index + sans-offspring))) (if on-starting-call (progn @@ -3721,8 +4010,8 @@ ;; if topic has changed depth (if (or do-successors (and (not (zerop relative-depth)) - (or (= (allout-recent-depth) starting-depth) - (= (allout-recent-depth) (+ starting-depth + (or (= allout-recent-depth starting-depth) + (= allout-recent-depth (+ starting-depth relative-depth))))) (allout-rebullet-heading nil nil nil nil t)) ;; Now rectify numbering of new siblings of the adjusted topic, @@ -3747,24 +4036,24 @@ was-eobp) (while (and (not (eobp)) (allout-depth) - (>= (allout-recent-depth) depth) + (>= allout-recent-depth depth) (>= ascender depth)) ; Skip over all topics at ; lesser depths, which can not ; have been disturbed: (while (and (not (setq was-eobp (eobp))) - (> (allout-recent-depth) ascender)) + (> allout-recent-depth ascender)) (allout-next-heading)) ; Prime ascender for ascension: - (setq ascender (1- (allout-recent-depth))) - (if (>= (allout-recent-depth) depth) + (setq ascender (1- allout-recent-depth)) + (if (>= allout-recent-depth depth) (allout-rebullet-heading nil ;;; solicit nil ;;; depth nil ;;; number-control nil ;;; index t)) ;;; do-successors (if was-eobp (goto-char (point-max))))) - (allout-recent-depth)) + allout-recent-depth) ;;;_ > allout-number-siblings (&optional denumber) (defun allout-number-siblings (&optional denumber) "Assign numbered topic prefix to this topic and its siblings. @@ -3780,7 +4069,7 @@ (save-excursion (allout-back-to-current-heading) (allout-beginning-of-level) - (let ((depth (allout-recent-depth)) + (let ((depth allout-recent-depth) (index (if (not denumber) 1)) (use-bullet (equal '(16) denumber)) (more t)) @@ -3794,55 +4083,84 @@ (setq more (allout-next-sibling depth nil)))))) ;;;_ > allout-shift-in (arg) (defun allout-shift-in (arg) - "Increase depth of current heading and any topics collapsed within it. - -We disallow shifts that would result in the topic having a depth more than -one level greater than the immediately previous topic, to avoid containment -discontinuity. The first topic in the file can be adjusted to any positive -depth, however." + "Increase depth of current heading and any items collapsed within it. + +With a negative argument, the item is shifted out using +`allout-shift-out', instead. + +With an argument greater than one, shift-in the item but not its +offspring, making the item into a sibling of its former children, +and a child of sibling that formerly preceeded it. + +You are not allowed to shift the first offspring of a topic +inwards, because that would yield a \"containment +discontinuity\", where the depth difference between a topic and +its immediate offspring is greater than one. The first topic in +the file can be adjusted to any positive depth, however." + (interactive "p") - (if (> arg 0) - ;; refuse to create a containment discontinuity: - (save-excursion - (allout-back-to-current-heading) - (if (not (bobp)) - (let* ((current-depth (allout-recent-depth)) - (start-point (point)) - (predecessor-depth (progn - (forward-char -1) - (allout-goto-prefix) - (if (< (point) start-point) - (allout-recent-depth) - 0)))) - (if (and (> predecessor-depth 0) - (> (+ current-depth arg) - (1+ predecessor-depth))) - (error (concat "Disallowed shift deeper than" - " containing topic's children."))))))) - (let ((where (point)) - has-successor) - (if (and (< arg 0) - (allout-current-topic-collapsed-p) - (save-excursion (allout-next-sibling))) - (setq has-successor t)) - (allout-rebullet-topic arg) - (when (< arg 0) - (save-excursion - (if (allout-ascend) - (allout-show-children))) - (if has-successor - (allout-show-children))) - (run-hook-with-args 'allout-structure-shifted-hook arg where))) + (if (< arg 0) + (allout-shift-out (* arg -1)) + ;; refuse to create a containment discontinuity: + (save-excursion + (allout-back-to-current-heading) + (if (not (bobp)) + (let* ((current-depth allout-recent-depth) + (start-point (point)) + (predecessor-depth (progn + (forward-char -1) + (allout-goto-prefix-doublechecked) + (if (< (point) start-point) + allout-recent-depth + 0)))) + (if (and (> predecessor-depth 0) + (> (1+ current-depth) + (1+ predecessor-depth))) + (error (concat "Disallowed shift deeper than" + " containing topic's children.")))))) + (let ((where (point))) + (allout-rebullet-topic 1 (and (> arg 1) 'sans-offspring)) + (run-hook-with-args 'allout-structure-shifted-hook arg where)))) ;;;_ > allout-shift-out (arg) (defun allout-shift-out (arg) "Decrease depth of current heading and any topics collapsed within it. - -We disallow shifts that would result in the topic having a depth more than -one level greater than the immediately previous topic, to avoid containment -discontinuity. The first topic in the file can be adjusted to any positive -depth, however." +This will make the item a sibling of its former container. + +With a negative argument, the item is shifted in using +`allout-shift-in', instead. + +With an argument greater than one, shift-out the item's offspring +but not the item itself, making the former children siblings of +the item. + +With an argument greater than 1, the item's offspring are shifted +out without shifting the item. This will make the immediate +subtopics into siblings of the item." (interactive "p") - (allout-shift-in (* arg -1))) + (if (< arg 0) + (allout-shift-in (* arg -1)) + ;; Get proper exposure in this area: + (save-excursion (if (allout-ascend) + (allout-show-children))) + ;; Show collapsed children if there's a successor which will become + ;; their sibling: + (if (and (allout-current-topic-collapsed-p) + (save-excursion (allout-next-sibling))) + (allout-show-children)) + (let ((where (and (allout-depth) allout-recent-prefix-beginning))) + (save-excursion + (if (> arg 1) + ;; Shift the offspring but not the topic: + (let ((children-chart (allout-chart-subtree 1))) + (if (listp (car children-chart)) + ;; whoops: + (setq children-chart (allout-flatten children-chart))) + (save-excursion + (dolist (child-point children-chart) + (goto-char child-point) + (allout-shift-out 1)))) + (allout-rebullet-topic (* arg -1)))) + (run-hook-with-args 'allout-structure-shifted-hook (* arg -1) where)))) ;;;_ : Surgery (kill-ring) functions with special provisions for outlines: ;;;_ > allout-kill-line (&optional arg) (defun allout-kill-line (&optional arg) @@ -3857,27 +4175,32 @@ (kill-line arg) ;; Ah, have to watch out for adjustments: (let* ((beg (point)) + end (beg-hidden (allout-hidden-p)) (end-hidden (save-excursion (allout-end-of-current-line) + (setq end (point)) (allout-hidden-p))) - (depth (allout-depth)) - (collapsed (allout-current-topic-collapsed-p))) - - (if collapsed - (put-text-property beg (1+ beg) 'allout-was-collapsed t) - (remove-text-properties beg (1+ beg) '(allout-was-collapsed t))) + (depth (allout-depth))) + + (allout-annotate-hidden beg end) (if (and (not beg-hidden) (not end-hidden)) (allout-unprotected (kill-line arg)) (kill-line arg)) - ; Provide some feedback: - (sit-for 0) (if allout-numbered-bullet (save-excursion ; Renumber subsequent topics if needed: (if (not (looking-at allout-regexp)) (allout-next-heading)) (allout-renumber-to-depth depth))) (run-hook-with-args 'allout-structure-deleted-hook depth (point))))) +;;;_ > allout-copy-line-as-kill () +(defun allout-copy-line-as-kill () + "Like allout-kill-topic, but save to kill ring instead of deleting." + (interactive) + (let ((buffer-read-only t)) + (condition-case nil + (allout-kill-line) + (buffer-read-only nil)))) ;;;_ > allout-kill-topic () (defun allout-kill-topic () "Kill topic together with subtopics. @@ -3889,20 +4212,13 @@ - would not be added to whitespace already separating the topic from the previous one. -Completely collapsed topics are marked as such, for re-collapse -when yank with allout-yank into an outline as a heading." - - ;; Some finagling is done to make complex topic kills appear faster - ;; than they actually are. A redisplay is performed immediately - ;; after the region is deleted, though the renumbering process - ;; has yet to be performed. This means that there may appear to be - ;; a lag *after* a kill has been performed. +Topic exposure is marked with text-properties, to be used by +allout-yank-processing for exposure recovery." (interactive) (let* ((inhibit-field-text-motion t) - (collapsed (allout-current-topic-collapsed-p)) (beg (prog1 (allout-back-to-current-heading) (beginning-of-line))) - (depth (allout-recent-depth))) + (depth allout-recent-depth)) (allout-end-of-current-subtree) (if (and (/= (current-column) 0) (not (eobp))) (forward-char 1)) @@ -3910,21 +4226,99 @@ (if (and (looking-at "\n") (or (save-excursion (or (not (allout-next-heading)) - (= depth (allout-recent-depth)))) + (= depth allout-recent-depth))) (and (> (- beg (point-min)) 3) (string= (buffer-substring (- beg 2) beg) "\n\n")))) (forward-char 1))) - (if collapsed - (allout-unprotected - (put-text-property beg (1+ beg) 'allout-was-collapsed t)) - (allout-unprotected - (remove-text-properties beg (1+ beg) '(allout-was-collapsed t)))) + (allout-annotate-hidden beg (point)) + (allout-unprotected (kill-region beg (point))) - (sit-for 0) (save-excursion (allout-renumber-to-depth depth)) (run-hook-with-args 'allout-structure-deleted-hook depth (point)))) +;;;_ > allout-copy-topic-as-kill () +(defun allout-copy-topic-as-kill () + "Like allout-kill-topic, but save to kill ring instead of deleting." + (interactive) + (let ((buffer-read-only t)) + (condition-case nil + (allout-kill-topic) + (buffer-read-only (message "Topic copied..."))))) +;;;_ > allout-annotate-hidden (begin end) +(defun allout-annotate-hidden (begin end) + "Qualify text with properties to indicate exposure status." + + (let ((was-modified (buffer-modified-p)) + (buffer-read-only nil)) + (allout-unprotected + (remove-text-properties begin end '(allout-was-hidden t))) + (save-excursion + (goto-char begin) + (let (done next prev overlay) + (while (not done) + ;; at or advance to start of next hidden region: + (if (not (allout-hidden-p)) + (setq next + (max (1+ (point)) + (next-single-char-property-change (point) + 'invisible + nil end)))) + (if (or (not next) (eq prev next)) + ;; still not at start of hidden area - must not be any left. + (setq done t) + (goto-char next) + (setq prev next) + (if (not (allout-hidden-p)) + ;; still not at start of hidden area. + (setq done t) + (setq overlay (allout-get-invisibility-overlay)) + (setq next (overlay-end overlay) + prev next) + ;; advance to end of this hidden area: + (when next + (goto-char next) + (allout-unprotected + (put-text-property (overlay-start overlay) next + 'allout-was-hidden t)))))))) + (set-buffer-modified-p was-modified))) +;;;_ > allout-hide-by-annotation (begin end) +(defun allout-hide-by-annotation (begin end) + "Translate text properties indicating exposure status into actual exposure." + (save-excursion + (goto-char begin) + (let ((was-modified (buffer-modified-p)) + done next prev) + (while (not done) + ;; at or advance to start of next annotation: + (if (not (get-text-property (point) 'allout-was-hidden)) + (setq next (next-single-char-property-change (point) + 'allout-was-hidden + nil end))) + (if (or (not next) (eq prev next)) + ;; no more or not advancing - must not be any left. + (setq done t) + (goto-char next) + (setq prev next) + (if (not (get-text-property (point) 'allout-was-hidden)) + ;; still not at start of annotation. + (setq done t) + ;; advance to just after end of this annotation: + (setq next (next-single-char-property-change (point) + 'allout-was-hidden + nil end)) + (overlay-put (make-overlay prev next) + 'category 'allout-exposure-category) + (allout-unprotected + (remove-text-properties prev next '(allout-was-hidden t))) + (setq prev next) + (if next (goto-char next))))) + (set-buffer-modified-p was-modified)))) +;;;_ > allout-remove-exposure-annotation (begin end) +(defun allout-remove-exposure-annotation (begin end) + "Remove text properties indicating exposure status." + (remove-text-properties begin end '(allout-was-hidden t))) + ;;;_ > allout-yank-processing () (defun allout-yank-processing (&optional arg) @@ -3955,12 +4349,10 @@ (let* ((subj-beg (point)) (into-bol (bolp)) (subj-end (allout-mark-marker t)) - (was-collapsed (get-text-property subj-beg 'allout-was-collapsed)) ;; 'resituate' if yanking an entire topic into topic header: (resituate (and (allout-e-o-prefix-p) - (looking-at (concat "\\(" allout-regexp "\\)")) - (allout-prefix-data (match-beginning 1) - (match-end 1)))) + (looking-at allout-regexp) + (allout-prefix-data))) ;; `rectify-numbering' if resituating (where several topics may ;; be resituating) or yanking a topic into a topic slot (bol): (rectify-numbering (or resituate @@ -3968,7 +4360,7 @@ (if resituate ; The yanked stuff is a topic: (let* ((prefix-len (- (match-end 1) subj-beg)) - (subj-depth (allout-recent-depth)) + (subj-depth allout-recent-depth) (prefix-bullet (allout-recent-bullet)) (adjust-to-depth ;; Nil if adjustment unnecessary, otherwise depth to which @@ -3982,15 +4374,13 @@ (beginning-of-line) (not (= (point) subj-beg))) (looking-at allout-regexp) - (allout-prefix-data (match-beginning 0) - (match-end 0))) - (allout-recent-depth)))) + (allout-prefix-data)) + allout-recent-depth))) (more t)) (setq rectify-numbering allout-numbered-bullet) (if adjust-to-depth ; Do the adjustment: (progn - (message "... yanking") (sit-for 0) (save-restriction (narrow-to-region subj-beg subj-end) ; Trim off excessive blank @@ -4006,7 +4396,7 @@ (while more (allout-back-to-current-heading) ; go as high as we can in each bunch: - (while (allout-ascend-to-depth (1- (allout-depth)))) + (while (allout-ascend)) (save-excursion (allout-rebullet-topic-grunt (- adjust-to-depth subj-depth)) @@ -4015,7 +4405,6 @@ (progn (widen) (forward-char -1) (narrow-to-region subj-beg (point)))))) - (message "") ;; Preserve new bullet if it's a distinctive one, otherwise ;; use old one: (if (string-match (regexp-quote prefix-bullet) @@ -4042,19 +4431,19 @@ (progn (save-excursion ; Give some preliminary feedback: - (message "... reconciling numbers") (sit-for 0) + (message "... reconciling numbers") ; ... and renumber, in case necessary: (goto-char subj-beg) - (if (allout-goto-prefix) + (if (allout-goto-prefix-doublechecked) (allout-rebullet-heading nil ;;; solicit (allout-depth) ;;; depth nil ;;; number-control nil ;;; index t)) (message "")))) - (when (and (or into-bol resituate) was-collapsed) - (remove-text-properties subj-beg (1+ subj-beg) '(allout-was-collapsed)) - (allout-hide-current-subtree)) + (if (or into-bol resituate) + (allout-hide-by-annotation (point) (allout-mark-marker t)) + (allout-remove-exposure-annotation (allout-mark-marker t) (point))) (if (not resituate) (exchange-point-and-mark)) (run-hook-with-args 'allout-structure-added-hook subj-beg subj-end)))) @@ -4139,7 +4528,7 @@ (error "%s not found and can't be created" file-name))) (condition-case failure (find-file-other-window file-name) - ('error failure)) + (error failure)) (error "%s not found" file-name)) ) ) @@ -4198,7 +4587,7 @@ (interactive) (save-excursion (let (beg end) - (allout-goto-prefix) + (allout-goto-prefix-doublechecked) (setq beg (if (allout-hidden-p) (1- (point)) (point))) (setq end (allout-pre-next-prefix)) (allout-flag-region beg end nil) @@ -4235,8 +4624,32 @@ (save-excursion (allout-beginning-of-current-line) (save-restriction - (let* ((chart (allout-chart-subtree (or level 1))) - (to-reveal (allout-chart-to-reveal chart (or level 1)))) + (let* (depth + ;; translate the level spec for this routine to the ones + ;; used by -chart-subtree and -chart-to-reveal: + (chart-level (cond ((not level) 1) + ((eq level t) nil) + (t level))) + (chart (allout-chart-subtree chart-level)) + (to-reveal (or (allout-chart-to-reveal chart chart-level) + ;; interactive, show discontinuous children: + (and chart + (interactive-p) + (save-excursion + (allout-back-to-current-heading) + (setq depth (allout-current-depth)) + (and (allout-next-heading) + (> allout-recent-depth + (1+ depth)))) + (message + "Discontinuous offspring; use `%s %s'%s." + (substitute-command-keys + "\\[universal-argument]") + (substitute-command-keys + "\\[allout-shift-out]") + " to elevate them.") + (allout-chart-to-reveal + chart (- allout-recent-depth depth)))))) (goto-char start-point) (when (and strict (allout-hidden-p)) ;; Concealed root would already have been taken care of, @@ -4267,28 +4680,26 @@ (save-excursion (let ((inhibit-field-text-motion t) (orig-pt (point)) - (orig-pref (allout-goto-prefix)) + (orig-pref (allout-goto-prefix-doublechecked)) (last-at (point)) - bag-it) - (while (or bag-it (allout-hidden-p)) + (bag-it 0)) + (while (or (> bag-it 1) (allout-hidden-p)) (while (allout-hidden-p) - ;; XXX We would use `(move-beginning-of-line 1)', but it gets - ;; stuck on hidden newlines at column 80, as of GNU Emacs 22.0.50. - (beginning-of-line) + (move-beginning-of-line 1) (if (allout-hidden-p) (forward-char -1))) (if (= last-at (setq last-at (point))) - ;; Oops, we're not making any progress! Show the current - ;; topic completely, and bag this try. + ;; Oops, we're not making any progress! Show the current topic + ;; completely, and try one more time here, if we haven't already. (progn (beginning-of-line) (allout-show-current-subtree) (goto-char orig-pt) - (setq bag-it t) - (beep) - (message "%s: %s" - "allout-show-to-offshoot: " - "Aberrant nesting encountered."))) - (allout-show-children) - (goto-char orig-pref)) + (setq bag-it (1+ bag-it)) + (if (> bag-it 1) + (error "allout-show-to-offshoot: %s" + "Stumped by aberrant nesting."))) + (if (> bag-it 0) (setq bag-it 0)) + (allout-show-children) + (goto-char orig-pref))) (goto-char orig-pt))) (if (allout-hidden-p) (allout-show-entry))) @@ -4368,10 +4779,10 @@ (current-exposed (not (allout-current-topic-collapsed-p t)))) (cond (current-exposed (allout-flag-current-subtree t)) (just-close nil) - ((allout-up-current-level 1 t) (allout-hide-current-subtree)) + ((allout-ascend) (allout-hide-current-subtree)) (t (goto-char 0) (message sibs-msg) - (allout-goto-prefix) + (allout-goto-prefix-doublechecked) (allout-expose-topic '(0 :)) (message (concat sibs-msg " Done.")))) (goto-char from))) @@ -4494,7 +4905,10 @@ (cond ((eq curr-elem '*) (allout-show-current-subtree) (if (> allout-recent-end-of-subtree max-pos) (setq max-pos allout-recent-end-of-subtree))) - ((eq curr-elem '+) (allout-show-current-branches) + ((eq curr-elem '+) + (if (not (allout-hidden-p)) + (save-excursion (allout-hide-current-subtree t))) + (allout-show-current-branches) (if (> allout-recent-end-of-subtree max-pos) (setq max-pos allout-recent-end-of-subtree))) ((eq curr-elem '-) (allout-show-current-entry)) @@ -4636,7 +5050,7 @@ level, and expose children of subsequent topics at current level *except* for the last, which should be opened completely." (list 'save-excursion - '(if (not (or (allout-goto-prefix) + '(if (not (or (allout-goto-prefix-doublechecked) (allout-next-heading))) (error "allout-new-exposure: Can't find any outline topics")) (list 'allout-expose-topic (list 'quote spec)))) @@ -4758,20 +5172,20 @@ (goto-char start) (beginning-of-line) ;; Goto initial topic, and register preceeding stuff, if any: - (if (> (allout-goto-prefix) start) + (if (> (allout-goto-prefix-doublechecked) start) ;; First topic follows beginning point - register preliminary stuff: (setq result (list (list 0 "" nil (buffer-substring start (1- (point))))))) (while (and (not done) (not (eobp)) ; Loop until we've covered the region. (not (> (point) end))) - (setq depth (allout-recent-depth) ; Current topics depth, + (setq depth allout-recent-depth ; Current topics depth, bullet (allout-recent-bullet) ; ... bullet, prefix (allout-recent-prefix) beg (progn (allout-end-of-prefix t) (point))) ; and beginning. (setq done ; The boundary for the current topic: (not (allout-next-visible-heading 1))) - (setq new-depth (allout-recent-depth)) + (setq new-depth allout-recent-depth) (setq gone-out out out (< new-depth depth)) (beginning-of-line) @@ -4788,7 +5202,8 @@ (allout-back-to-visible-text))) strings)) (when (< (point) next) ; Resume from after hid text, if any. - (line-move 1)) + (line-move 1) + (beginning-of-line)) (setq beg (point))) ;; Accumulate list for this topic: (setq strings (nreverse strings)) @@ -5040,10 +5455,10 @@ ;;"\\\\\\|\\{\\|\\}\\|\\_\\|\\$\\|\\\"\\|\\&\\|\\^\\|\\-\\|\\*\\|#" end ; bounded by end-of-line 1) ; no matches, move to end & return nil - (goto-char (match-beginning 0)) + (goto-char (match-beginning 2)) (insert "\\") (setq end (1+ end)) - (goto-char (1+ (match-end 0))))))) + (goto-char (1+ (match-end 2))))))) ;;;_ > allout-insert-latex-header (buffer) (defun allout-insert-latex-header (buffer) "Insert initial LaTeX commands at point in BUFFER." @@ -5089,7 +5504,7 @@ (allout-latex-verb-quote (if allout-title (condition-case nil (eval allout-title) - ('error "<unnamed buffer>")) + (error "<unnamed buffer>")) "Unnamed Outline")) "}\n" "\\end{center}\n\n")) @@ -5228,7 +5643,7 @@ default to symmetric encryption - you must manually \(re)encrypt key-pair encrypted topics if you want them to continue to use the key-pair cipher. -Level-1 topics, with prefix consisting solely of an `*' asterisk, cannot be +Level-one topics, with prefix consisting solely of an `*' asterisk, cannot be encrypted. If you want to encrypt the contents of a top-level topic, use \\[allout-shift-in] to increase its depth. @@ -5291,12 +5706,13 @@ (save-excursion (allout-end-of-prefix t) - (if (= (allout-recent-depth) 1) + (if (= allout-recent-depth 1) (error (concat "Cannot encrypt or decrypt level 1 topics -" " shift it in to make it encryptable"))) (let* ((allout-buffer (current-buffer)) ;; Asses location: + (bullet-pos allout-recent-prefix-beginning) (after-bullet-pos (point)) (was-encrypted (progn (if (= (point-max) after-bullet-pos) @@ -5362,12 +5778,9 @@ (delete-char 1)) ;; Add the is-encrypted bullet qualifier: (goto-char after-bullet-pos) - (insert "*")) - ) - ) - ) - ) - ) + (insert "*")))) + (run-hook-with-args 'allout-structure-added-hook + bullet-pos subtree-end)))) ;;;_ > allout-encrypt-string (text decrypt allout-buffer key-type for-key ;;; fetch-pass &optional retried verifying ;;; passphrase) @@ -5512,7 +5925,8 @@ (error "decryption failed"))))) (setq result-text - (buffer-substring 1 (- (point-max) (if decrypt 0 1)))) + (buffer-substring-no-properties + 1 (- (point-max) (if decrypt 0 1)))) ) ;; validate result - non-empty @@ -5924,17 +6338,8 @@ ) ;;;_ #9 miscellaneous -;;;_ > allout-mark-topic () -(defun allout-mark-topic () - "Put the region around topic currently containing point." - (interactive) - (let ((inhibit-field-text-motion t)) - (beginning-of-line)) - (allout-goto-prefix) - (push-mark (point)) - (allout-end-of-current-subtree) - (exchange-point-and-mark)) -;;;_ > outlineify-sticky () +;;;_ : Mode: +;;;_ > outlineify-sticky () ;; outlinify-sticky is correct spelling; provide this alias for sticklers: ;;;###autoload (defalias 'outlinify-sticky 'outlineify-sticky) @@ -5958,7 +6363,7 @@ "`allout-mode' docstring: `^Hm'.")) (allout-adjust-file-variable "allout-layout" (or allout-layout '(-1 : 0)))))) -;;;_ > allout-file-vars-section-data () +;;;_ > allout-file-vars-section-data () (defun allout-file-vars-section-data () "Return data identifying the file-vars section, or nil if none. @@ -5986,7 +6391,7 @@ ) ) ) -;;;_ > allout-adjust-file-variable (varname value) +;;;_ > allout-adjust-file-variable (varname value) (defun allout-adjust-file-variable (varname value) "Adjust the setting of an emacs file variable named VARNAME to VALUE. @@ -6050,7 +6455,38 @@ ) ) ) -;;;_ > solicit-char-in-string (prompt string &optional do-defaulting) +;;;_ > allout-get-configvar-values (varname) +(defun allout-get-configvar-values (configvar-name) + "Return a list of values of the symbols in list bound to CONFIGVAR-NAME. + +The user is prompted for removal of symbols that are unbound, and they +otherwise are ignored. + +CONFIGVAR-NAME should be the name of the configuration variable, +not its value." + + (let ((configvar-value (symbol-value configvar-name)) + got) + (dolist (sym configvar-value) + (if (not (boundp sym)) + (if (yes-or-no-p (format "%s entry `%s' is unbound - remove it? " + configvar-name sym)) + (delq sym (symbol-value configvar-name))) + (push (symbol-value sym) got))) + (reverse got))) +;;;_ : Topics: +;;;_ > allout-mark-topic () +(defun allout-mark-topic () + "Put the region around topic currently containing point." + (interactive) + (let ((inhibit-field-text-motion t)) + (beginning-of-line)) + (allout-goto-prefix-doublechecked) + (push-mark (point)) + (allout-end-of-current-subtree) + (exchange-point-and-mark)) +;;;_ : UI: +;;;_ > solicit-char-in-string (prompt string &optional do-defaulting) (defun solicit-char-in-string (prompt string &optional do-defaulting) "Solicit (with first arg PROMPT) choice of a character from string STRING. @@ -6083,7 +6519,8 @@ ;; got something out of loop - return it: got) ) -;;;_ > regexp-sans-escapes (string) +;;;_ : Strings: +;;;_ > regexp-sans-escapes (string) (defun regexp-sans-escapes (regexp &optional successive-backslashes) "Return a copy of REGEXP with all character escapes stripped out. @@ -6106,7 +6543,7 @@ (regexp-sans-escapes (substring regexp 1))) ;; Exclude first char, but maintain count: (regexp-sans-escapes (substring regexp 1) successive-backslashes)))) -;;;_ > count-trailing-whitespace-region (beg end) +;;;_ > count-trailing-whitespace-region (beg end) (defun count-trailing-whitespace-region (beg end) "Return number of trailing whitespace chars between BEG and END. @@ -6117,29 +6554,25 @@ (goto-char beg) (let ((count 0)) (while (re-search-forward "[ ][ ]*$" end t) - (goto-char (1+ (match-beginning 0))) + (goto-char (1+ (match-beginning 2))) (setq count (1+ count))) count)))) -;;;_ > allout-get-configvar-values (varname) -(defun allout-get-configvar-values (configvar-name) - "Return a list of values of the symbols in list bound to CONFIGVAR-NAME. - -The user is prompted for removal of symbols that are unbound, and they -otherwise are ignored. - -CONFIGVAR-NAME should be the name of the configuration variable, -not its value." - - (let ((configvar-value (symbol-value configvar-name)) - got) - (dolist (sym configvar-value) - (if (not (boundp sym)) - (if (yes-or-no-p (format "%s entry `%s' is unbound - remove it? " - configvar-name sym)) - (delq sym (symbol-value configvar-name))) - (push (symbol-value sym) got))) - (reverse got))) -;;;_ > allout-mark-marker to accommodate divergent emacsen: +;;;_ > allout-format-quote (string) +(defun allout-format-quote (string) + "Return a copy of string with all \"%\" characters doubled." + (apply 'concat + (mapcar (lambda (char) (if (= char ?%) "%%" (char-to-string char))) + string))) +;;;_ : lists +;;;_ > allout-flatten (list) +(defun allout-flatten (list) + "Return a list of all atoms in list." + ;; classic. + (cond ((null list) nil) + ((atom (car list)) (cons (car list) (allout-flatten (cdr list)))) + (t (append (allout-flatten (car list)) (allout-flatten (cdr list)))))) +;;;_ : Compatability: +;;;_ > allout-mark-marker to accommodate divergent emacsen: (defun allout-mark-marker (&optional force buffer) "Accommodate the different signature for `mark-marker' across Emacsen. @@ -6148,7 +6581,7 @@ (if (featurep 'xemacs) (apply 'mark-marker force buffer) (mark-marker))) -;;;_ > subst-char-in-string if necessary +;;;_ > subst-char-in-string if necessary (if (not (fboundp 'subst-char-in-string)) (defun subst-char-in-string (fromchar tochar string &optional inplace) "Replace FROMCHAR with TOCHAR in STRING each time it occurs. @@ -6160,10 +6593,10 @@ (if (eq (aref newstr i) fromchar) (aset newstr i tochar))) newstr))) -;;;_ > wholenump if necessary +;;;_ > wholenump if necessary (if (not (fboundp 'wholenump)) (defalias 'wholenump 'natnump)) -;;;_ > remove-overlays if necessary +;;;_ > remove-overlays if necessary (if (not (fboundp 'remove-overlays)) (defun remove-overlays (&optional beg end name val) "Clear BEG and END of overlays whose property NAME has value VAL. @@ -6190,7 +6623,7 @@ (move-overlay o end (overlay-end o)) (delete-overlay o))))))) ) -;;;_ > copy-overlay if necessary - xemacs ~ 21.4 +;;;_ > copy-overlay if necessary - xemacs ~ 21.4 (if (not (fboundp 'copy-overlay)) (defun copy-overlay (o) "Return a copy of overlay O." @@ -6202,7 +6635,7 @@ (while props (overlay-put o1 (pop props) (pop props))) o1))) -;;;_ > add-to-invisibility-spec if necessary - xemacs ~ 21.4 +;;;_ > add-to-invisibility-spec if necessary - xemacs ~ 21.4 (if (not (fboundp 'add-to-invisibility-spec)) (defun add-to-invisibility-spec (element) "Add ELEMENT to `buffer-invisibility-spec'. @@ -6212,14 +6645,14 @@ (setq buffer-invisibility-spec (list t))) (setq buffer-invisibility-spec (cons element buffer-invisibility-spec)))) -;;;_ > remove-from-invisibility-spec if necessary - xemacs ~ 21.4 +;;;_ > remove-from-invisibility-spec if necessary - xemacs ~ 21.4 (if (not (fboundp 'remove-from-invisibility-spec)) (defun remove-from-invisibility-spec (element) "Remove ELEMENT from `buffer-invisibility-spec'." (if (consp buffer-invisibility-spec) (setq buffer-invisibility-spec (delete element buffer-invisibility-spec))))) -;;;_ > move-beginning-of-line if necessary - older emacs, xemacs +;;;_ > move-beginning-of-line if necessary - older emacs, xemacs (if (not (fboundp 'move-beginning-of-line)) (defun move-beginning-of-line (arg) "Move point to beginning of current line as displayed. @@ -6243,7 +6676,7 @@ (skip-chars-backward "^\n")) (vertical-motion 0)) ) -;;;_ > move-end-of-line if necessary - older emacs, xemacs +;;;_ > move-end-of-line if necessary - older emacs, xemacs (if (not (fboundp 'move-end-of-line)) (defun move-end-of-line (arg) "Move point to end of current line as displayed. @@ -6283,7 +6716,7 @@ (setq arg 1) (setq done t))))))) ) -;;;_ > line-move-invisible-p if necessary +;;;_ > line-move-invisible-p if necessary (if (not (fboundp 'line-move-invisible-p)) (defun line-move-invisible-p (pos) "Return non-nil if the character after POS is currently invisible."
--- a/lisp/apropos.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/apropos.el Sat Oct 14 17:36:28 2006 +0000 @@ -142,7 +142,7 @@ "Apropos pattern as entered by user.") (defvar apropos-pattern-quoted nil - "Apropos pattern passed through `regexp-quoute'.") + "Apropos pattern passed through `regexp-quote'.") (defvar apropos-words () "Current list of apropos words extracted from `apropos-pattern'.")
--- a/lisp/autoinsert.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/autoinsert.el Sat Oct 14 17:36:28 2006 +0000 @@ -215,7 +215,7 @@ ;;; " (file-name-nondirectory (buffer-file-name)) " ends here\n")) "A list specifying text to insert by default into a new file. Elements look like (CONDITION . ACTION) or ((CONDITION . DESCRIPTION) . ACTION). -CONDITION maybe a regexp that must match the new file's name, or it may be +CONDITION may be a regexp that must match the new file's name, or it may be a symbol that must match the major mode for this element to apply. Only the first matching element is effective. Optional DESCRIPTION is a string for filling `auto-insert-prompt'.
--- a/lisp/bindings.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/bindings.el Sat Oct 14 17:36:28 2006 +0000 @@ -345,24 +345,21 @@ (put 'mode-line-position 'standard-value (list `(quote ,standard-mode-line-position)))) -(defvar mode-line-buffer-identification-keymap nil "\ +(defvar mode-line-buffer-identification-keymap + ;; Add menu of buffer operations to the buffer identification part + ;; of the mode line.or header line. + (let ((map (make-sparse-keymap))) + ;; Bind down- events so that the global keymap won't ``shine + ;; through''. + (define-key map [mode-line mouse-1] 'mode-line-previous-buffer) + (define-key map [header-line down-mouse-1] 'ignore) + (define-key map [header-line mouse-1] 'mode-line-previous-buffer) + (define-key map [mode-line mouse-3] 'mode-line-next-buffer) + (define-key map [header-line down-mouse-3] 'ignore) + (define-key map [header-line mouse-3] 'mode-line-next-buffer) + map) "\ Keymap for what is displayed by `mode-line-buffer-identification'.") -;; Add menu of buffer operations to the buffer identification part -;; of the mode line.or header line. -; -(let ((map (make-sparse-keymap))) - ;; Bind down- events so that the global keymap won't ``shine - ;; through''. - (define-key map [mode-line mouse-1] 'mode-line-previous-buffer) - (define-key map [header-line down-mouse-1] 'ignore) - (define-key map [header-line mouse-1] 'mode-line-previous-buffer) - (define-key map [header-line down-mouse-3] 'ignore) - (define-key map [mode-line mouse-3] 'mode-line-next-buffer) - (define-key map [header-line down-mouse-3] 'ignore) - (define-key map [header-line mouse-3] 'mode-line-next-buffer) - (setq mode-line-buffer-identification-keymap map)) - (defun propertized-buffer-identification (fmt) "Return a list suitable for `mode-line-buffer-identification'. FMT is a format specifier such as \"%12b\". This function adds @@ -615,7 +612,7 @@ (let ((l (generic-character-list)) (table (nth 1 global-map))) (while l - (set-char-table-default table (car l) 'self-insert-command) + (aset table (car l) 'self-insert-command) (setq l (cdr l)))) (setq help-event-list '(help f1))
--- a/lisp/calc/calc-lang.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/calc/calc-lang.el Sat Oct 14 17:36:28 2006 +0000 @@ -409,13 +409,54 @@ ( \\mu . calcFunc-moebius ))) (put 'tex 'math-variable-table - '( ( \\pi . var-pi ) - ( \\infty . var-inf ) - ( \\infty . var-uinf ) - ( \\phi . var-phi ) - ( \\gamma . var-gamma ) - ( \\sum . (math-parse-tex-sum calcFunc-sum) ) - ( \\prod . (math-parse-tex-sum calcFunc-prod) ))) + '( + ;; The Greek letters + ( \\alpha . var-alpha ) + ( \\beta . var-beta ) + ( \\gamma . var-gamma ) + ( \\Gamma . var-Gamma ) + ( \\delta . var-delta ) + ( \\Delta . var-Delta ) + ( \\epsilon . var-epsilon ) + ( \\varepsilon . var-varepsilon) + ( \\zeta . var-zeta ) + ( \\eta . var-eta ) + ( \\theta . var-theta ) + ( \\vartheta . var-vartheta ) + ( \\Theta . var-Theta ) + ( \\iota . var-iota ) + ( \\kappa . var-kappa ) + ( \\lambda . var-lambda ) + ( \\Lambda . var-Lambda ) + ( \\mu . var-mu ) + ( \\nu . var-nu ) + ( \\xi . var-xi ) + ( \\Xi . var-Xi ) + ( \\pi . var-pi ) + ( \\varpi . var-varpi ) + ( \\Pi . var-Pi ) + ( \\rho . var-rho ) + ( \\varrho . var-varrho ) + ( \\sigma . var-sigma ) + ( \\sigma . var-varsigma ) + ( \\Sigma . var-Sigma ) + ( \\tau . var-tau ) + ( \\upsilon . var-upsilon ) + ( \\Upsilon . var-Upsilon ) + ( \\phi . var-phi ) + ( \\varphi . var-varphi ) + ( \\Phi . var-Phi ) + ( \\chi . var-chi ) + ( \\psi . var-psi ) + ( \\Psi . var-Psi ) + ( \\omega . var-omega ) + ( \\Omega . var-Omega ) + ;; Others + ( \\ell . var-ell ) + ( \\infty . var-inf ) + ( \\infty . var-uinf ) + ( \\sum . (math-parse-tex-sum calcFunc-sum) ) + ( \\prod . (math-parse-tex-sum calcFunc-prod) ))) (put 'tex 'math-complex-format 'i)
--- a/lisp/calc/calc.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/calc/calc.el Sat Oct 14 17:36:28 2006 +0000 @@ -1101,7 +1101,7 @@ (defun calc-dispatch (&optional arg) "Invoke the GNU Emacs Calculator. See `calc-dispatch-help' for details." (interactive "P") - (sit-for echo-keystrokes) +; (sit-for echo-keystrokes) (condition-case err ; look for other keys bound to calc-dispatch (let ((keys (this-command-keys))) (unless (or (not (stringp keys))
--- a/lisp/calendar/appt.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/calendar/appt.el Sat Oct 14 17:36:28 2006 +0000 @@ -394,8 +394,8 @@ (if (and (< appt-comp-time appt-message-warning-time) (> (+ cur-comp-time appt-message-warning-time) appt-max-time)) - (setq min-to-app (+ (- (1+ appt-max-time) cur-comp-time)) - appt-comp-time)) + (setq min-to-app (+ (- (1+ appt-max-time) cur-comp-time) + appt-comp-time))) ;; issue warning if the appointment time is ;; within appt-message-warning time
--- a/lisp/calendar/calendar.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/calendar/calendar.el Sat Oct 14 17:36:28 2006 +0000 @@ -568,11 +568,20 @@ Names can be capitalized or not, written in full (as specified by the variable `calendar-day-name-array'), or abbreviated (as specified by -`calendar-day-abbrev-array') with or without a period. To take effect, -this variable should be set before the calendar package and its associates -are loaded. Otherwise, use one of the functions `european-calendar' or -`american-calendar' to force the appropriate update." +`calendar-day-abbrev-array') with or without a period. + +Setting this variable directly does not take effect (if the +calendar package is already loaded). Rather, use either +\\[customize] or the functions `european-calendar' and +`american-calendar'." :type 'boolean + ;; Without :initialize (require 'calendar) throws an error because + ;; american-calendar is undefined at this point. + :initialize 'custom-initialize-default + :set (lambda (symbol value) + (if value + (european-calendar) + (american-calendar))) :group 'diary) ;;;###autoload @@ -1582,6 +1591,19 @@ (calendar-only-one-frame-setup arg)) (t (calendar-basic-setup arg)))) +(autoload 'diary-view-entries "diary-lib" + "Prepare and display a buffer with diary entries. +Searches your diary file for entries that match ARG days starting with +the date indicated by the cursor position in the displayed three-month +calendar." + t) + +(autoload 'list-calendar-holidays "holidays" + "Create a buffer containing the holidays for the current calendar window. +The holidays are those in the list `calendar-notable-days'. Returns t if any +holidays are found, nil if not." + t) + (defun calendar-basic-setup (&optional arg) "Display a three-month calendar in another window. The three months appear side by side, with the current month in the middle @@ -1649,13 +1671,6 @@ (list-calendar-holidays))) (run-hooks 'initial-calendar-window-hook)) -(autoload 'diary-view-entries "diary-lib" - "Prepare and display a buffer with diary entries. -Searches your diary file for entries that match ARG days starting with -the date indicated by the cursor position in the displayed three-month -calendar." - t) - (autoload 'view-other-diary-entries "diary-lib" "Prepare and display buffer of diary entries from an alternative diary file. Searches for entries that match ARG days, starting with the date indicated @@ -1930,12 +1945,6 @@ to the date indicated by point." t) -(autoload 'list-calendar-holidays "holidays" - "Create a buffer containing the holidays for the current calendar window. -The holidays are those in the list `calendar-notable-days'. Returns t if any -holidays are found, nil if not." - t) - (autoload 'cal-tex-cursor-month "cal-tex" "Make a buffer with LaTeX commands for the month cursor is on. Optional prefix argument specifies number of months to be produced.
--- a/lisp/comint.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/comint.el Sat Oct 14 17:36:28 2006 +0000 @@ -650,7 +650,10 @@ (make-local-variable 'comint-process-echoes) (make-local-variable 'comint-file-name-chars) (make-local-variable 'comint-file-name-quote-list) - (set (make-local-variable 'comint-accum-marker) (make-marker)) + (make-local-variable 'comint-accum-marker) + (setq comint-accum-marker (make-marker)) + (make-local-variable 'font-lock-defaults) + (setq font-lock-defaults '(nil)) (add-hook 'change-major-mode-hook 'font-lock-defontify nil t) ;; This behavior is not useful in comint buffers, and is annoying (set (make-local-variable 'next-line-add-newlines) nil)) @@ -765,7 +768,8 @@ (format "COLUMNS=%d" (window-width))) (list "TERM=emacs" (format "TERMCAP=emacs:co#%d:tc=unknown:" (window-width)))) - (if (getenv "EMACS") nil (list "EMACS=t")) + (unless (getenv "EMACS") + (list (concat "EMACS=" invocation-directory invocation-name))) process-environment)) (default-directory (if (file-accessible-directory-p default-directory)
--- a/lisp/completion.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/completion.el Sat Oct 14 17:36:28 2006 +0000 @@ -1885,7 +1885,7 @@ (save-excursion (goto-char (point-min)) (catch 'finish-add-completions - (with-syntax-table completion-c-def-syntax-table + (with-syntax-table completion-c-def-syntax-table (while t ;; we loop here only when scan-sexps fails ;; (i.e. unbalance exps.) @@ -1895,8 +1895,7 @@ (cond ((= (preceding-char) ?#) ;; preprocessor macro, see if it's one we handle - (setq string (buffer-substring (point) (+ (point) 6))) - (cond ((member string '("define" "ifdef ")) + (cond ((looking-at "\\(define\\|ifdef\\)\\>") ;; skip forward over definition symbol ;; and add it to database (and (forward-word 2) @@ -1944,9 +1943,9 @@ (throw 'finish-add-completions t)) (error ;; Check for failure in scan-sexps - (if (or (string-equal (nth 1 e) - "Containing expression ends prematurely") - (string-equal (nth 1 e) "Unbalanced parentheses")) + (if (member (nth 1 e) + '("Containing expression ends prematurely" + "Unbalanced parentheses")) ;; unbalanced paren., keep going ;;(ding) (forward-line 1)
--- a/lisp/cus-edit.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/cus-edit.el Sat Oct 14 17:36:28 2006 +0000 @@ -389,7 +389,7 @@ :link '(custom-manual "(emacs)Undo") :group 'editing) -(defgroup modeline nil +(defgroup mode-line nil "Content of the modeline." :group 'environment) @@ -1521,13 +1521,18 @@ (widget-insert description)) (widget-insert (format ". %s buttons; type RET or click mouse-1 to actuate one. -Editing a setting changes only the text in the buffer. -Use the setting's State button to set it or save changes in it. -Saving a change normally works by editing your Emacs init file. -See " +Editing a setting changes only the text in the buffer." (if custom-raised-buttons "`Raised' text indicates" "Square brackets indicate"))) + (if init-file-user + (widget-insert " +Use the setting's State button to set it or save changes in it. +Saving a change normally works by editing your Emacs init file.") + (widget-insert " +\nSince you started Emacs with `-q', which inhibits use of the +Emacs init file, you cannot save settings into the Emacs init file.")) + (widget-insert "\nSee ") (widget-create 'custom-manual :tag "Custom file" "(emacs)Saving Customizations") @@ -4152,6 +4157,8 @@ recentf-exclude))) (old-buffer (find-buffer-visiting filename))) (with-current-buffer (or old-buffer (find-file-noselect filename)) + (unless (eq major-mode 'emacs-lisp-mode) + (emacs-lisp-mode)) (let ((inhibit-read-only t)) (custom-save-variables) (custom-save-faces)) @@ -4255,19 +4262,31 @@ (let ((spec (car-safe (get symbol 'theme-value))) (value (get symbol 'saved-value)) (requests (get symbol 'custom-requests)) - (now (not (or (custom-variable-p symbol) - (and (not (boundp symbol)) - (not (eq (get symbol 'force-value) - 'rogue)))))) + (now (and (not (custom-variable-p symbol)) + (or (boundp symbol) + (eq (get symbol 'force-value) + 'rogue)))) (comment (get symbol 'saved-variable-comment))) - ;; Check `requests'. + ;; Check REQUESTS for validity. (dolist (request requests) (when (and (symbolp request) (not (featurep request))) (message "Unknown requested feature: %s" request) (setq requests (delq request requests)))) + ;; Is there anything customized about this variable? (when (or (and spec (eq (car spec) 'user)) comment (and (null spec) (get symbol 'saved-value))) + ;; Output an element for this variable. + ;; It has the form (SYMBOL VALUE-FORM NOW REQUESTS COMMENT). + ;; SYMBOL is the variable name. + ;; VALUE-FORM is an expression to return the customized value. + ;; NOW if non-nil means always set the variable immediately + ;; when the customizations are reloaded. This is used + ;; for rogue variables + ;; REQUESTS is a list of packages to load before setting the + ;; variable. Each element of it will be passed to `require'. + ;; COMMENT is whatever comment the user has specified + ;; with the customize facility. (unless (bolp) (princ "\n")) (princ " '(") @@ -4383,14 +4402,15 @@ "Ignoring WIDGET, create a menu entry for customization group SYMBOL." `( ,(custom-unlispify-menu-entry symbol t) :filter (lambda (&rest junk) - (let ((menu (custom-menu-create ',symbol))) + (let* ((menu (custom-menu-create ',symbol))) (if (consp menu) (cdr menu) menu))))) ;;;###autoload (defun custom-menu-create (symbol) "Create menu for customization group SYMBOL. The menu is in a format applicable to `easy-menu-define'." - (let* ((item (vector (custom-unlispify-menu-entry symbol) + (let* ((deactivate-mark nil) + (item (vector (custom-unlispify-menu-entry symbol) `(customize-group ',symbol) t))) (if (and (or (not (boundp 'custom-menu-nesting)) @@ -4435,8 +4455,8 @@ ;; Actually, this misfeature of dense keymaps was fixed on 2001-11-26. (let ((map (make-keymap))) (set-keymap-parent map widget-keymap) - (define-key map [remap self-insert-command] 'custom-no-edit) - (define-key map "\^m" 'custom-newline) + (define-key map [remap self-insert-command] 'Custom-no-edit) + (define-key map "\^m" 'Custom-newline) (define-key map " " 'scroll-up) (define-key map "\177" 'scroll-down) (define-key map "\C-c\C-c" 'Custom-set) @@ -4448,12 +4468,12 @@ map) "Keymap for `custom-mode'.") -(defun custom-no-edit (pos &optional event) +(defun Custom-no-edit (pos &optional event) "Invoke button at POS, or refuse to allow editing of Custom buffer." (interactive "@d") (error "You can't edit this part of the Custom buffer")) -(defun custom-newline (pos &optional event) +(defun Custom-newline (pos &optional event) "Invoke button at POS, or refuse to allow editing of Custom buffer." (interactive "@d") (let ((button (get-char-property pos 'button))) @@ -4535,6 +4555,13 @@ (setq widget-documentation-face 'custom-documentation) (make-local-variable 'widget-button-face) (setq widget-button-face custom-button) + + ;; We need this because of the "More" button on docstrings. + ;; Otherwise clicking on "More" can push point offscreen, which + ;; causes the window to recenter on point, which pushes the + ;; newly-revealed docstring offscreen; which is annoying. -- cyd. + (set (make-local-variable 'widget-button-click-moves-point) t) + (set (make-local-variable 'widget-button-pressed-face) custom-button-pressed) (set (make-local-variable 'widget-mouse-face) custom-button-mouse)
--- a/lisp/cus-start.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/cus-start.el Sat Oct 14 17:36:28 2006 +0000 @@ -344,11 +344,11 @@ (scroll-step windows integer) (scroll-conservatively windows integer) (scroll-margin windows integer) - (hscroll-margin windows integer "21.3") - (hscroll-step windows number "21.3") + (hscroll-margin windows integer "22.1") + (hscroll-step windows number "22.1") (truncate-partial-width-windows display boolean) (mode-line-inverse-video modeline boolean) - (mode-line-in-non-selected-windows modeline boolean "21.3") + (mode-line-in-non-selected-windows modeline boolean "22.1") (line-number-display-limit display (choice integer (const :tag "No limit" nil))) @@ -361,17 +361,22 @@ (unibyte-display-via-language-environment mule boolean) (blink-cursor-alist cursor alist "22.1") (overline-margin display integer "22.1") + (mouse-autoselect-window + display (choice + (const :tag "Off (nil)" :value nil) + (const :tag "Immediate" :value t) + (number :tag "Delay by secs" :value 0.5)) "22.1") ;; xfaces.c (scalable-fonts-allowed display boolean) ;; xfns.c (x-bitmap-file-path installation (repeat (directory :format "%v"))) - (x-use-old-gtk-file-dialog menu boolean "22.1") + (x-gtk-use-old-file-dialog menu boolean "22.1") (x-gtk-show-hidden-files menu boolean "22.1") + (x-gtk-file-dialog-help-text menu boolean "22.1") (x-gtk-whole-detached-tool-bar x boolean "22.1") ;; xterm.c - (mouse-autoselect-window display boolean "21.3") - (x-use-underline-position-properties display boolean "21.3") + (x-use-underline-position-properties display boolean "22.1") (x-underline-at-descent-line display boolean "22.1") (x-stretch-cursor display boolean "21.1"))) this symbol group type standard version native-p
--- a/lisp/custom.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/custom.el Sat Oct 14 17:36:28 2006 +0000 @@ -210,11 +210,11 @@ `custom-initialize-reset'. :set VALUE should be a function to set the value of the symbol. It takes two arguments, the symbol to set and the value to - give it. The default choice of function is `custom-set-default'. + give it. The default choice of function is `set-default'. :get VALUE should be a function to extract the value of symbol. The function takes one argument, a symbol, and should return the current value for that symbol. The default choice of function - is `custom-default-value'. + is `default-value'. :require VALUE should be a feature symbol. If you save a value for this option, then when your `.emacs' file loads the value, @@ -874,6 +874,18 @@ EXP itself is saved unevaluated as SYMBOL property `saved-value' and in SYMBOL's list property `theme-value' \(using `custom-push-theme')." (custom-check-theme theme) + + ;; Process all the needed autoloads before anything else, so that the + ;; subsequent code has all the info it needs (e.g. which var corresponds + ;; to a minor mode), regardless of the ordering of the variables. + (dolist (entry args) + (let* ((symbol (indirect-variable (nth 0 entry)))) + (unless (or (get symbol 'standard-value) + (memq (get symbol 'custom-autoload) '(nil noset))) + ;; This symbol needs to be autoloaded, even just for a `set'. + (custom-load-symbol symbol)))) + + ;; Move minor modes and variables with explicit requires to the end. (setq args (sort args (lambda (a1 a2) @@ -904,10 +916,6 @@ (when requests (put symbol 'custom-requests requests) (mapc 'require requests)) - (unless (or (get symbol 'standard-value) - (memq (get symbol 'custom-autoload) '(nil noset))) - ;; This symbol needs to be autoloaded, even just for a `set'. - (custom-load-symbol symbol)) (setq set (or (get symbol 'custom-set) 'custom-set-default)) (put symbol 'saved-value (list value)) (put symbol 'saved-variable-comment comment)
--- a/lisp/delim-col.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/delim-col.el Sat Oct 14 17:36:28 2006 +0000 @@ -5,10 +5,10 @@ ;; Author: Vinicius Jose Latorre <viniciusjl@ig.com.br> ;; Maintainer: Vinicius Jose Latorre <viniciusjl@ig.com.br> -;; Time-stamp: <2006-02-06 13:37:10 ttn> +;; Time-stamp: <2006/09/15 17:35:06 vinicius> ;; Version: 2.1 ;; Keywords: internal -;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/ +;; X-URL: http://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre ;; This file is part of GNU Emacs.
--- a/lisp/desktop.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/desktop.el Sat Oct 14 17:36:28 2006 +0000 @@ -862,8 +862,10 @@ ;; Desktop file found, process it. (let ((desktop-first-buffer nil) (desktop-buffer-ok-count 0) - (desktop-buffer-fail-count 0)) - (setq desktop-lazy-timer nil) + (desktop-buffer-fail-count 0) + ;; Avoid desktop saving during evaluation of desktop buffer. + (desktop-save nil)) + (desktop-lazy-abort) ;; Evaluate desktop buffer. (load (desktop-full-file-name) t t t) ;; `desktop-create-buffer' puts buffers at end of the buffer list.
--- a/lisp/diff-mode.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/diff-mode.el Sat Oct 14 17:36:28 2006 +0000 @@ -1259,6 +1259,7 @@ (t "Hunk %s at offset %d lines")) msg line-offset))) +(defvar diff-apply-hunk-to-backup-file nil) (defun diff-apply-hunk (&optional reverse) "Apply the current hunk to the source file and go to the next. @@ -1275,6 +1276,17 @@ (cond ((null line-offset) (error "Can't find the text to patch")) + ((with-current-buffer buf + (and buffer-file-name + (backup-file-name-p buffer-file-name) + (not diff-apply-hunk-to-backup-file) + (not (set (make-local-variable 'diff-apply-hunk-to-backup-file) + (yes-or-no-p (format "Really apply this hunk to %s? " + (file-name-nondirectory + buffer-file-name))))))) + (error (substitute-command-keys + (format "Use %s\\[diff-apply-hunk] to apply it to the other file" + (if (not reverse) "\\[universal-argument] "))))) ((and switched ;; A reversed patch was detected, perhaps apply it in reverse. (not (save-window-excursion
--- a/lisp/dired-aux.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/dired-aux.el Sat Oct 14 17:36:28 2006 +0000 @@ -39,6 +39,11 @@ ;; We need macros in dired.el to compile properly. (eval-when-compile (require 'dired)) +(defvar dired-create-files-failures nil + "Variable where `dired-create-files' records failing file names. +Functions that operate recursively can store additional names +into this list; they also should call `dired-log' to log the errors.") + ;;; 15K ;;;###begin dired-cmd.el ;; Diffing and compressing @@ -1145,37 +1150,59 @@ ;;;###autoload (defun dired-copy-file (from to ok-flag) (dired-handle-overwrite to) - (condition-case () - (dired-copy-file-recursive from to ok-flag dired-copy-preserve-time t - dired-recursive-copies) - (file-date-error (message "Can't set date") - (sit-for 1)))) + (dired-copy-file-recursive from to ok-flag dired-copy-preserve-time t + dired-recursive-copies)) (defun dired-copy-file-recursive (from to ok-flag &optional preserve-time top recursive) - (let ((attrs (file-attributes from))) + (let ((attrs (file-attributes from)) + dirfailed) (if (and recursive (eq t (car attrs)) (or (eq recursive 'always) (yes-or-no-p (format "Recursive copies of %s? " from)))) ;; This is a directory. - (let ((files (directory-files from nil dired-re-no-dot))) + (let ((files + (condition-case err + (directory-files from nil dired-re-no-dot) + (file-error + (push (dired-make-relative from) + dired-create-files-failures) + (dired-log "Copying error for %s:\n%s\n" from err) + (setq dirfailed t) + nil)))) (if (eq recursive 'top) (setq recursive 'always)) ; Don't ask any more. - (if (file-exists-p to) - (or top (dired-handle-overwrite to)) - (make-directory to)) + (unless dirfailed + (if (file-exists-p to) + (or top (dired-handle-overwrite to)) + (condition-case err + (make-directory to) + (file-error + (push (dired-make-relative from) + dired-create-files-failures) + (setq files nil) + (dired-log "Copying error for %s:\n%s\n" from err))))) (while files (dired-copy-file-recursive (expand-file-name (car files) from) (expand-file-name (car files) to) ok-flag preserve-time nil recursive) - (setq files (cdr files)))) + (pop files))) ;; Not a directory. (or top (dired-handle-overwrite to)) - (if (stringp (car attrs)) - ;; It is a symlink - (make-symbolic-link (car attrs) to ok-flag) - (copy-file from to ok-flag dired-copy-preserve-time))))) + (condition-case err + (if (stringp (car attrs)) + ;; It is a symlink + (make-symbolic-link (car attrs) to ok-flag) + (copy-file from to ok-flag dired-copy-preserve-time)) + (file-date-error + (push (dired-make-relative from) + dired-create-files-failures) + (dired-log "Can't set date on %s:\n%s\n" from err)) + (file-error + (push (dired-make-relative from) + dired-create-files-failures) + (dired-log "Copying error for %s:\n%s\n" from err)))))) ;;;###autoload (defun dired-rename-file (file newname ok-if-already-exists) @@ -1297,7 +1324,8 @@ ;; newfile's entry, or t to use the current marker character if the ;; oldfile was marked. - (let (failures skipped (success-count 0) (total (length fn-list))) + (let (dired-create-files-failures failures + skipped (success-count 0) (total (length fn-list))) (let (to overwrite-query overwrite-backup-query) ; for dired-handle-overwrite (mapcar @@ -1340,16 +1368,25 @@ (dired-add-file to actual-marker-char)) (file-error ; FILE-CREATOR aborted (progn - (setq failures (cons (dired-make-relative from) failures)) + (push (dired-make-relative from) + failures) (dired-log "%s `%s' to `%s' failed:\n%s\n" operation from to err)))))))) fn-list)) (cond + (dired-create-files-failures + (setq failures (nconc failures dired-create-files-failures)) + (dired-log-summary + (format "%s failed for %d file%s in %d requests" + operation (length failures) + (dired-plural-s (length failures)) + total) + failures)) (failures (dired-log-summary (format "%s failed for %d of %d file%s" - operation (length failures) total - (dired-plural-s total)) + operation (length failures) + total (dired-plural-s total)) failures)) (skipped (dired-log-summary
--- a/lisp/dired-x.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/dired-x.el Sat Oct 14 17:36:28 2006 +0000 @@ -958,119 +958,132 @@ (defvar dired-guess-shell-alist-default (list (list "\\.tar$" - '(if dired-guess-shell-gnutar - (concat dired-guess-shell-gnutar " xvf") - "tar xvf") - ;; Extract files into a separate subdirectory - '(if dired-guess-shell-gnutar - (concat "mkdir " (file-name-sans-extension file) - "; " dired-guess-shell-gnutar " -C " - (file-name-sans-extension file) " -xvf") - (concat "mkdir " (file-name-sans-extension file) - "; tar -C " (file-name-sans-extension file) " -xvf"))) + '(if dired-guess-shell-gnutar + (concat dired-guess-shell-gnutar " xvf") + "tar xvf") + ;; Extract files into a separate subdirectory + '(if dired-guess-shell-gnutar + (concat "mkdir " (file-name-sans-extension file) + "; " dired-guess-shell-gnutar " -C " + (file-name-sans-extension file) " -xvf") + (concat "mkdir " (file-name-sans-extension file) + "; tar -C " (file-name-sans-extension file) " -xvf")) + ;; List archive contents. + '(if dired-guess-shell-gnutar + (concat dired-guess-shell-gnutar " tvf") + "tar tvf")) ;; REGEXPS for compressed archives must come before the .Z rule to ;; be recognized: (list "\\.tar\\.Z$" - ;; Untar it. - '(if dired-guess-shell-gnutar - (concat dired-guess-shell-gnutar " zxvf") - (concat "zcat * | tar xvf -")) - ;; Optional conversion to gzip format. - '(concat "znew" (if dired-guess-shell-gzip-quiet " -q") - " " dired-guess-shell-znew-switches)) + ;; Untar it. + '(if dired-guess-shell-gnutar + (concat dired-guess-shell-gnutar " zxvf") + (concat "zcat * | tar xvf -")) + ;; Optional conversion to gzip format. + '(concat "znew" (if dired-guess-shell-gzip-quiet " -q") + " " dired-guess-shell-znew-switches)) ;; gzip'ed archives (list "\\.t\\(ar\\.\\)?gz$" - '(if dired-guess-shell-gnutar - (concat dired-guess-shell-gnutar " zxvf") - (concat "gunzip -qc * | tar xvf -")) - ;; Extract files into a separate subdirectory - '(if dired-guess-shell-gnutar - (concat "mkdir " (file-name-sans-extension file) - "; " dired-guess-shell-gnutar " -C " - (file-name-sans-extension file) " -zxvf") - (concat "mkdir " (file-name-sans-extension file) - "; gunzip -qc * | tar -C " - (file-name-sans-extension file) " -xvf -")) - ;; Optional decompression. - '(concat "gunzip" (if dired-guess-shell-gzip-quiet " -q" ""))) + '(if dired-guess-shell-gnutar + (concat dired-guess-shell-gnutar " zxvf") + (concat "gunzip -qc * | tar xvf -")) + ;; Extract files into a separate subdirectory + '(if dired-guess-shell-gnutar + (concat "mkdir " (file-name-sans-extension file) + "; " dired-guess-shell-gnutar " -C " + (file-name-sans-extension file) " -zxvf") + (concat "mkdir " (file-name-sans-extension file) + "; gunzip -qc * | tar -C " + (file-name-sans-extension file) " -xvf -")) + ;; Optional decompression. + '(concat "gunzip" (if dired-guess-shell-gzip-quiet " -q" "")) + ;; List archive contents. + '(if dired-guess-shell-gnutar + (concat dired-guess-shell-gnutar " ztvf") + (concat "gunzip -qc * | tar tvf -"))) ;; bzip2'ed archives (list "\\.t\\(ar\\.bz2\\|bz\\)$" "bunzip2 -c * | tar xvf -" - ;; Extract files into a separate subdirectory - '(concat "mkdir " (file-name-sans-extension file) - "; bunzip2 -c * | tar -C " - (file-name-sans-extension file) " -xvf -") + ;; Extract files into a separate subdirectory + '(concat "mkdir " (file-name-sans-extension file) + "; bunzip2 -c * | tar -C " + (file-name-sans-extension file) " -xvf -") ;; Optional decompression. - "bunzip2") + "bunzip2") '("\\.shar\\.Z$" "zcat * | unshar") '("\\.shar\\.g?z$" "gunzip -qc * | unshar") '("\\.e?ps$" "ghostview" "xloadimage" "lpr") (list "\\.e?ps\\.g?z$" "gunzip -qc * | ghostview -" - ;; Optional decompression. - '(concat "gunzip" (if dired-guess-shell-gzip-quiet " -q"))) + ;; Optional decompression. + '(concat "gunzip" (if dired-guess-shell-gzip-quiet " -q"))) (list "\\.e?ps\\.Z$" "zcat * | ghostview -" - ;; Optional conversion to gzip format. - '(concat "znew" (if dired-guess-shell-gzip-quiet " -q") - " " dired-guess-shell-znew-switches)) + ;; Optional conversion to gzip format. + '(concat "znew" (if dired-guess-shell-gzip-quiet " -q") + " " dired-guess-shell-znew-switches)) '("\\.patch$" "cat * | patch") (list "\\.patch\\.g?z$" "gunzip -qc * | patch" - ;; Optional decompression. - '(concat "gunzip" (if dired-guess-shell-gzip-quiet " -q"))) + ;; Optional decompression. + '(concat "gunzip" (if dired-guess-shell-gzip-quiet " -q"))) (list "\\.patch\\.Z$" "zcat * | patch" - ;; Optional conversion to gzip format. - '(concat "znew" (if dired-guess-shell-gzip-quiet " -q") - " " dired-guess-shell-znew-switches)) + ;; Optional conversion to gzip format. + '(concat "znew" (if dired-guess-shell-gzip-quiet " -q") + " " dired-guess-shell-znew-switches)) ;; The following four extensions are useful with dired-man ("N" key) (list "\\.\\(?:[0-9]\\|man\\)$" '(progn (require 'man) - (if (Man-support-local-filenames) - "man -l" - "cat * | tbl | nroff -man -h"))) + (if (Man-support-local-filenames) + "man -l" + "cat * | tbl | nroff -man -h"))) (list "\\.\\(?:[0-9]\\|man\\)\\.g?z$" '(progn (require 'man) - (if (Man-support-local-filenames) - "man -l" - "gunzip -qc * | tbl | nroff -man -h")) - ;; Optional decompression. - '(concat "gunzip" (if dired-guess-shell-gzip-quiet " -q"))) + (if (Man-support-local-filenames) + "man -l" + "gunzip -qc * | tbl | nroff -man -h")) + ;; Optional decompression. + '(concat "gunzip" (if dired-guess-shell-gzip-quiet " -q"))) (list "\\.[0-9]\\.Z$" '(progn (require 'man) - (if (Man-support-local-filenames) - "man -l" - "zcat * | tbl | nroff -man -h")) - ;; Optional conversion to gzip format. - '(concat "znew" (if dired-guess-shell-gzip-quiet " -q") - " " dired-guess-shell-znew-switches)) + (if (Man-support-local-filenames) + "man -l" + "zcat * | tbl | nroff -man -h")) + ;; Optional conversion to gzip format. + '(concat "znew" (if dired-guess-shell-gzip-quiet " -q") + " " dired-guess-shell-znew-switches)) '("\\.pod$" "perldoc" "pod2man * | nroff -man") - '("\\.dvi$" "xdvi" "dvips") ; preview and printing - '("\\.au$" "play") ; play Sun audiofiles - '("\\.mpg$" "mpeg_play") - '("\\.uu$" "uudecode") ; for uudecoded files + '("\\.dvi$" "xdvi" "dvips") ; preview and printing + '("\\.au$" "play") ; play Sun audiofiles + '("\\.mpe?g$\\|\\.avi$" "xine -p") + '("\\.wav$" "play") + '("\\.uu$" "uudecode") ; for uudecoded files '("\\.hqx$" "mcvert") - '("\\.sh$" "sh") ; execute shell scripts - '("\\.xbm$" "bitmap") ; view X11 bitmaps + '("\\.sh$" "sh") ; execute shell scripts + '("\\.xbm$" "bitmap") ; view X11 bitmaps '("\\.gp$" "gnuplot") '("\\.p[bgpn]m$" "xloadimage") - '("\\.gif$" "xloadimage") ; view gif pictures + '("\\.gif$" "xloadimage") ; view gif pictures '("\\.tif$" "xloadimage") '("\\.png$" "display") ; xloadimage 4.1 doesn't grok PNG '("\\.jpe?g$" "xloadimage") - '("\\.fig$" "xfig") ; edit fig pictures - '("\\.out$" "xgraph") ; for plotting purposes. + '("\\.fig$" "xfig") ; edit fig pictures + '("\\.out$" "xgraph") ; for plotting purposes. '("\\.tex$" "latex" "tex") '("\\.texi\\(nfo\\)?$" "makeinfo" "texi2dvi") - '("\\.pdf$" "xpdf") ; edit PDF files + '("\\.pdf$" "xpdf") + '("\\.doc$" "antiword" "strings") + '("\\.rpm$" "rpm -qilp" "rpm -ivh") + '("\\.dia$" "dia") + '("\\.mgp$" "mgp") ;; Some other popular archivers. - (list "\\.zip$" "unzip" - ;; Extract files into a separate subdirectory - '(concat "unzip" (if dired-guess-shell-gzip-quiet " -q") - " -d " (file-name-sans-extension file))) + (list "\\.zip$" "unzip" "unzip -l" + ;; Extract files into a separate subdirectory + '(concat "unzip" (if dired-guess-shell-gzip-quiet " -q") + " -d " (file-name-sans-extension file))) '("\\.zoo$" "zoo x//") '("\\.lzh$" "lharc x") '("\\.arc$" "arc x") @@ -1081,10 +1094,11 @@ (list "\\.dz$" "dictunzip") (list "\\.bz2$" "bunzip2") (list "\\.Z$" "uncompress" - ;; Optional conversion to gzip format. - '(concat "znew" (if dired-guess-shell-gzip-quiet " -q") - " " dired-guess-shell-znew-switches)) - ) + ;; Optional conversion to gzip format. + '(concat "znew" (if dired-guess-shell-gzip-quiet " -q") + " " dired-guess-shell-znew-switches)) + + '("\\.sign?$" "gpg --verify")) "Default alist used for shell command guessing. See `dired-guess-shell-alist-user'.")
--- a/lisp/dired.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/dired.el Sat Oct 14 17:36:28 2006 +0000 @@ -2204,40 +2204,40 @@ (concat "\\`" (match-string 1 default-directory))))) (goto-char (point-min)) (setq dired-subdir-alist nil) - (while (and (re-search-forward dired-subdir-regexp nil t) - ;; Avoid taking a file name ending in a colon - ;; as a subdir name. - (not (save-excursion - (goto-char (match-beginning 0)) - (beginning-of-line) - (forward-char 2) - (save-match-data (looking-at dired-re-perms))))) - (save-excursion - (goto-char (match-beginning 1)) - (setq new-dir-name - (buffer-substring-no-properties (point) (match-end 1)) - new-dir-name - (save-match-data - (if (and R-ftp-base-dir-regex - (not (string= new-dir-name default-directory)) - (string-match R-ftp-base-dir-regex new-dir-name)) - (concat default-directory - (substring new-dir-name (match-end 0))) - (expand-file-name new-dir-name)))) - (delete-region (point) (match-end 1)) - (insert new-dir-name)) - (setq count (1+ count)) - (dired-alist-add-1 new-dir-name - ;; Place a sub directory boundary between lines. - (save-excursion - (goto-char (match-beginning 0)) - (beginning-of-line) - (point-marker)))) + (while (re-search-forward dired-subdir-regexp nil t) + ;; Avoid taking a file name ending in a colon + ;; as a subdir name. + (unless (save-excursion + (goto-char (match-beginning 0)) + (beginning-of-line) + (forward-char 2) + (save-match-data (looking-at dired-re-perms))) + (save-excursion + (goto-char (match-beginning 1)) + (setq new-dir-name + (buffer-substring-no-properties (point) (match-end 1)) + new-dir-name + (save-match-data + (if (and R-ftp-base-dir-regex + (not (string= new-dir-name default-directory)) + (string-match R-ftp-base-dir-regex new-dir-name)) + (concat default-directory + (substring new-dir-name (match-end 0))) + (expand-file-name new-dir-name)))) + (delete-region (point) (match-end 1)) + (insert new-dir-name)) + (setq count (1+ count)) + (dired-alist-add-1 new-dir-name + ;; Place a sub directory boundary between lines. + (save-excursion + (goto-char (match-beginning 0)) + (beginning-of-line) + (point-marker))))) (if (and (> count 1) (interactive-p)) - (message "Buffer includes %d directories" count)) - ;; We don't need to sort it because it is in buffer order per - ;; constructionem. Return new alist: - dired-subdir-alist))) + (message "Buffer includes %d directories" count))) + ;; We don't need to sort it because it is in buffer order per + ;; constructionem. Return new alist: + dired-subdir-alist)) (defun dired-alist-add-1 (dir new-marker) ;; Add new DIR at NEW-MARKER. Don't sort. @@ -3043,6 +3043,10 @@ (insert "\f\n"))))))) (defun dired-log-summary (string failures) + "State a summary of a command's failures, in echo area and log buffer. +STRING is an overall summary of the failures. +FAILURES is a list of file names that we failed to operate on, +or nil if file names are not applicable." (if (= (length failures) 1) (message "%s" (with-current-buffer dired-log-buffer
--- a/lisp/dnd.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/dnd.el Sat Oct 14 17:36:28 2006 +0000 @@ -37,11 +37,11 @@ ;;;###autoload (defcustom dnd-protocol-alist - '( - ("^file:///" . dnd-open-local-file) ; XDND format. - ("^file://" . dnd-open-file) ; URL with host - ("^file:" . dnd-open-local-file) ; Old KDE, Motif, Sun - ) + '(("^file:///" . dnd-open-local-file) ; XDND format. + ("^file://" . dnd-open-file) ; URL with host + ("^file:" . dnd-open-local-file) ; Old KDE, Motif, Sun + ("^\\(https?\\|ftp\\|file\\|nfs\\)://" . dnd-open-file) + ) "The functions to call for different protocols when a drop is made. This variable is used by `dnd-handle-one-url' and `dnd-handle-file-name'. @@ -59,6 +59,22 @@ :group 'dnd) +(defcustom dnd-open-remote-file-function + (if (eq system-type 'windows-nt) + 'dnd-open-local-file + 'dnd-open-remote-url) + "The function to call when opening a file on a remote machine. +The function will be called with two arguments; URI and ACTION. See +`dnd-open-file' for details. +If nil, then dragging remote files into Emacs will result in an error. +Predefined functions are `dnd-open-local-file' and `dnd-open-remote-url'. +`dnd-open-local-file' attempts to open a remote file using its UNC name and +is the default on MS-Windows. `dnd-open-remote-url' uses `url-handler-mode' +and is the default except for MS-Windows." + :version "22.1" + :type 'function + :group 'dnd) + (defcustom dnd-open-file-other-window nil "If non-nil, always use find-file-other-window to open dropped files." @@ -75,7 +91,7 @@ If no match is found here, and the value of `browse-url-browser-function' is a pair of (REGEXP . FUNCTION), those regexps are tried for a match. If no match is found, just call `dnd-insert-text'. -WINDOW is where the drop happend, ACTION is the action for the drop, +WINDOW is where the drop happened, ACTION is the action for the drop, URL is what has been dropped. Returns ACTION." (require 'browse-url) @@ -147,7 +163,11 @@ The file is opened in the current window, or a new window if `dnd-open-file-other-window' is set. URI is the url for the file, and must have the format file:file-name or file:///file-name. -The last / in file:/// is part of the file name. ACTION is ignored." +The last / in file:/// is part of the file name. If the system +natively supports unc file names, then remote urls of the form +file://server-name/file-name will also be handled by this function. +An alternative for systems that do not support unc file names is +`dnd-open-remote-url'. ACTION is ignored." (let* ((f (dnd-get-local-file-name uri t))) (if (and f (file-readable-p f)) @@ -158,6 +178,20 @@ 'private) (error "Can not read %s" uri)))) +(defun dnd-open-remote-url (uri action) + "Open a remote file with `find-file' and `url-handler-mode'. +Turns `url-handler-mode' on if not on before. The file is opened in the +current window, or a new window if `dnd-open-file-other-window' is set. +URI is the url for the file. ACTION is ignored." + (progn + (require 'url-handlers) + (or url-handler-mode (url-handler-mode)) + (if dnd-open-file-other-window + (find-file-other-window uri) + (find-file uri)) + 'private)) + + (defun dnd-open-file (uri action) "Open a local or remote file. The file is opened in the current window, or a new window if @@ -169,7 +203,9 @@ ;; file. Otherwise return nil. (let ((local-file (dnd-get-local-file-uri uri))) (if local-file (dnd-open-local-file local-file action) - (error "Remote files not supported")))) + (if dnd-open-remote-file-function + (funcall dnd-open-remote-file-function uri action) + (error "Remote files not supported"))))) (defun dnd-insert-text (window action text)
--- a/lisp/ediff-util.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/ediff-util.el Sat Oct 14 17:36:28 2006 +0000 @@ -4281,6 +4281,11 @@ (setq lis1 (cdr lis1))) (cdr result))) +(defun ediff-add-to-history (history-var newelt) + (if (fboundp 'add-to-history) + (add-to-history history-var newelt) + (set history-var (cons newelt (symbol-value history-var))))) + (if (fboundp 'copy-sequence) (defalias 'ediff-copy-list 'copy-sequence) (defun ediff-copy-list (list)
--- a/lisp/ediff.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/ediff.el Sat Oct 14 17:36:28 2006 +0000 @@ -7,8 +7,8 @@ ;; Created: February 2, 1994 ;; Keywords: comparing, merging, patching, tools, unix -(defconst ediff-version "2.81" "The current version of Ediff") -(defconst ediff-date "February 18, 2006" "Date of last update") +(defconst ediff-version "2.81.1" "The current version of Ediff") +(defconst ediff-date "September 18, 2006" "Date of last update") ;; This file is part of GNU Emacs. @@ -210,11 +210,12 @@ ediff-last-dir-B (file-name-directory f))) (progn - (add-to-history 'file-name-history - (ediff-abbreviate-file-name - (expand-file-name - (file-name-nondirectory f) - dir-B))) + (ediff-add-to-history + 'file-name-history + (ediff-abbreviate-file-name + (expand-file-name + (file-name-nondirectory f) + dir-B))) (ediff-get-default-file-name f 1))) ))) (ediff-files-internal file-A @@ -245,22 +246,24 @@ ediff-last-dir-B (file-name-directory f))) (progn - (add-to-history 'file-name-history - (ediff-abbreviate-file-name - (expand-file-name - (file-name-nondirectory f) - dir-B))) + (ediff-add-to-history + 'file-name-history + (ediff-abbreviate-file-name + (expand-file-name + (file-name-nondirectory f) + dir-B))) (ediff-get-default-file-name f 1)))) (ediff-read-file-name "File C to compare" (setq dir-C (if ediff-use-last-dir ediff-last-dir-C (file-name-directory ff))) (progn - (add-to-history 'file-name-history - (ediff-abbreviate-file-name - (expand-file-name - (file-name-nondirectory ff) - dir-C))) + (ediff-add-to-history + 'file-name-history + (ediff-abbreviate-file-name + (expand-file-name + (file-name-nondirectory ff) + dir-C))) (ediff-get-default-file-name ff 2))) ))) (ediff-files-internal file-A @@ -1103,11 +1106,12 @@ ediff-last-dir-B (file-name-directory f))) (progn - (add-to-history 'file-name-history - (ediff-abbreviate-file-name - (expand-file-name - (file-name-nondirectory f) - dir-B))) + (ediff-add-to-history + 'file-name-history + (ediff-abbreviate-file-name + (expand-file-name + (file-name-nondirectory f) + dir-B))) (ediff-get-default-file-name f 1))) ))) (setq startup-hooks (cons 'ediff-merge-on-startup startup-hooks)) @@ -1146,11 +1150,12 @@ ediff-last-dir-B (file-name-directory f))) (progn - (add-to-history 'file-name-history - (ediff-abbreviate-file-name - (expand-file-name - (file-name-nondirectory f) - dir-B))) + (ediff-add-to-history + 'file-name-history + (ediff-abbreviate-file-name + (expand-file-name + (file-name-nondirectory f) + dir-B))) (ediff-get-default-file-name f 1)))) (ediff-read-file-name "Ancestor file" (setq dir-ancestor @@ -1158,11 +1163,12 @@ ediff-last-dir-ancestor (file-name-directory ff))) (progn - (add-to-history 'file-name-history - (ediff-abbreviate-file-name - (expand-file-name - (file-name-nondirectory ff) - dir-ancestor))) + (ediff-add-to-history + 'file-name-history + (ediff-abbreviate-file-name + (expand-file-name + (file-name-nondirectory ff) + dir-ancestor))) (ediff-get-default-file-name ff 2))) ))) (setq startup-hooks (cons 'ediff-merge-on-startup startup-hooks))
--- a/lisp/emacs-lisp/advice.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emacs-lisp/advice.el Sat Oct 14 17:36:28 2006 +0000 @@ -2409,7 +2409,7 @@ in that CLASS." (interactive (ad-read-advice-specification "Remove advice of")) (if (ad-is-advised function) - (let* ((advice-to-remove (ad-find-advice function class name))) + (let ((advice-to-remove (ad-find-advice function class name))) (if advice-to-remove (ad-set-advice-info-field function class @@ -2747,7 +2747,7 @@ A three-element list is returned, where the 1st element is the list of required arguments, the 2nd is the list of optional arguments, and the 3rd is the name of an optional rest parameter (or nil)." - (let* (required optional rest) + (let (required optional rest) (setq rest (car (cdr (memq '&rest arglist)))) (if rest (setq arglist (reverse (cdr (memq '&rest (reverse arglist)))))) (setq optional (cdr (memq '&optional arglist))) @@ -2958,7 +2958,7 @@ (defun ad-make-mapped-call (source-arglist target-arglist target-function) "Make form to call TARGET-FUNCTION with args from SOURCE-ARGLIST." - (let* ((mapped-form (ad-map-arglists source-arglist target-arglist))) + (let ((mapped-form (ad-map-arglists source-arglist target-arglist))) (if (eq (car mapped-form) 'funcall) (cons target-function (cdr (cdr mapped-form))) (prog1 mapped-form
--- a/lisp/emacs-lisp/bindat.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emacs-lisp/bindat.el Sat Oct 14 17:36:28 2006 +0000 @@ -66,13 +66,13 @@ ;; ;; The corresponding Lisp bindat specification looks like this: ;; -;; (setq header-spec +;; (setq header-bindat-spec ;; '((dest-ip ip) ;; (src-ip ip) ;; (dest-port u16) ;; (src-port u16))) ;; -;; (setq data-spec +;; (setq data-bindat-spec ;; '((type u8) ;; (opcode u8) ;; (length u16r) ;; little endian order @@ -80,12 +80,12 @@ ;; (data vec (length)) ;; (align 4))) ;; -;; (setq packet-spec -;; '((header struct header-spec) +;; (setq packet-bindat-spec +;; '((header struct header-bindat-spec) ;; (items u8) ;; (fill 3) ;; (item repeat (items) -;; (struct data-spec)))) +;; (struct data-bindat-spec)))) ;; ;; ;; A binary data representation may look like @@ -121,6 +121,9 @@ ;; Binary Data Structure Specification Format ;; ------------------------------------------ +;; We recommend using names that end in `-bindat-spec'; such names +;; are recognized automatically as "risky" variables. + ;; The data specification is formatted as follows: ;; SPEC ::= ( ITEM... ) @@ -342,8 +345,8 @@ (defun bindat-unpack (spec bindat-raw &optional bindat-idx) "Return structured data according to SPEC for binary data in BINDAT-RAW. -BINDAT-RAW is a unibyte string or vector. Optional third arg BINDAT-IDX specifies -the starting offset in BINDAT-RAW." +BINDAT-RAW is a unibyte string or vector. +Optional third arg BINDAT-IDX specifies the starting offset in BINDAT-RAW." (when (multibyte-string-p bindat-raw) (error "String is multibyte")) (unless bindat-idx (setq bindat-idx 0))
--- a/lisp/emacs-lisp/checkdoc.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emacs-lisp/checkdoc.el Sat Oct 14 17:36:28 2006 +0000 @@ -2261,7 +2261,8 @@ (re-search-forward "^;;; Code" nil t) (re-search-forward "^(require" nil t) (re-search-forward "^(" nil t)) - (beginning-of-line))) + (beginning-of-line)) + (t (re-search-forward ";;; .* --- .*\n"))) (if (checkdoc-y-or-n-p "You should have a \";;; Commentary:\", add one? ") (insert "\n;;; Commentary:\n;; \n\n")
--- a/lisp/emacs-lisp/cl-macs.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emacs-lisp/cl-macs.el Sat Oct 14 17:36:28 2006 +0000 @@ -2578,21 +2578,7 @@ (cl-const-expr-val (nth 1 keys))))) (cond ((eq test 'eq) (list 'memq a list)) ((eq test 'equal) (list 'member a list)) - ((or (null keys) (eq test 'eql)) - (if (eq (cl-const-expr-p a) t) - (list (if (floatp-safe (cl-const-expr-val a)) 'member 'memq) - a list) - (if (eq (cl-const-expr-p list) t) - (let ((p (cl-const-expr-val list)) (mb nil) (mq nil)) - (if (not (cdr p)) - (and p (list 'eql a (list 'quote (car p)))) - (while p - (if (floatp-safe (car p)) (setq mb t) - (or (integerp (car p)) (symbolp (car p)) (setq mq t))) - (setq p (cdr p))) - (if (not mb) (list 'memq a list) - (if (not mq) (list 'member a list) form)))) - form))) + ((or (null keys) (eq test 'eql)) (list 'memql a list)) (t form)))) (define-compiler-macro assoc* (&whole form a list &rest keys)
--- a/lisp/emacs-lisp/cl.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emacs-lisp/cl.el Sat Oct 14 17:36:28 2006 +0000 @@ -155,7 +155,11 @@ an element already on the list. \nKeywords supported: :test :test-not :key \n(fn X PLACE [KEYWORD VALUE]...)" - (if (symbolp place) (list 'setq place (list* 'adjoin x place keys)) + (if (symbolp place) + (if (null keys) + `(let ((x ,x)) + (if (memql x ,place) ,place (setq ,place (cons x ,place)))) + (list 'setq place (list* 'adjoin x place keys))) (list* 'callf2 'adjoin x place keys))) (defun cl-set-elt (seq n val)
--- a/lisp/emacs-lisp/easy-mmode.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emacs-lisp/easy-mmode.el Sat Oct 14 17:36:28 2006 +0000 @@ -200,7 +200,8 @@ See the command `%s' for a description of this minor-mode." (if body " Setting this variable directly does not take effect; -use either \\[customize] or the function `%s'.")))) +either customize it (see the info node `Easy Customization') +or call the function `%s'.")))) `(defcustom ,mode ,init-value ,(format base-doc-string pretty-name mode mode) ,@set
--- a/lisp/emacs-lisp/eldoc.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emacs-lisp/eldoc.el Sat Oct 14 17:36:28 2006 +0000 @@ -432,7 +432,7 @@ ;; Prime the command list. (eldoc-add-command-completions "backward-" "beginning-of-" "move-beginning-of-" "delete-other-windows" - "delete-window" + "delete-window" "handle-select-window" "end-of-" "move-end-of-" "exchange-point-and-mark" "forward-" "indent-for-tab-command" "goto-" "mark-page" "mark-paragraph" "mouse-set-point" "move-" "pop-global-mark" "next-" "other-window"
--- a/lisp/emacs-lisp/find-func.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emacs-lisp/find-func.el Sat Oct 14 17:36:28 2006 +0000 @@ -64,7 +64,7 @@ (concat "^\\s-*(\\(def\\(ine-skeleton\\|ine-generic-mode\\|ine-derived-mode\\|\ ine\\(?:-global\\)?-minor-mode\\|ine-compilation-mode\\|un-cvs-mode\\|\ -foo\\|[^cfgv]\\(\\w\\|\\s_\\)+\\*?\\)\\|easy-mmode-define-[a-z-]+\\|easy-menu-define\\|\ +foo\\|[^icfgv]\\(\\w\\|\\s_\\)+\\*?\\)\\|easy-mmode-define-[a-z-]+\\|easy-menu-define\\|\ menu-bar-make-toggle\\)" find-function-space-re "\\('\\|\(quote \\)?%s\\(\\s-\\|$\\|\(\\|\)\\)")
--- a/lisp/emacs-lisp/timer.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emacs-lisp/timer.el Sat Oct 14 17:36:28 2006 +0000 @@ -32,9 +32,11 @@ ;; Layout of a timer vector: ;; [triggered-p high-seconds low-seconds usecs repeat-delay ;; function args idle-delay] +;; triggered-p is nil if the timer is active (waiting to be triggered), +;; t if it is inactive ("already triggered", in theory) (defun timer-create () - "Create a timer object." + "Create a timer object which can be passed to `timer-activate'." (let ((timer (make-vector 8 nil))) (aset timer 0 t) timer)) @@ -173,6 +175,10 @@ (defun timer-activate (timer &optional triggered-p reuse-cell) "Put TIMER on the list of active timers. +If TRIGGERED-P is t, that means to make the timer inactive +\(put it on the list, but mark it as already triggered). +To remove from the list, use `cancel-timer'. + REUSE-CELL, if non-nil, is a cons cell to reuse instead of allocating a new one." (if (and (timerp timer) @@ -256,10 +262,10 @@ (setq timer-idle-list (delq timer timer-idle-list)) nil) -;; Remove TIMER from the list of active timers or idle timers. -;; Only to be used in this file. It returns the cons cell -;; that was removed from the list. (defun cancel-timer-internal (timer) + "Remove TIMER from the list of active timers or idle timers. +Only to be used in this file. It returns the cons cell +that was removed from the timer list." (let ((cell1 (memq timer timer-list)) (cell2 (memq timer timer-idle-list))) (if cell1 @@ -270,7 +276,9 @@ ;;;###autoload (defun cancel-function-timers (function) - "Cancel all timers scheduled by `run-at-time' which would run FUNCTION." + "Cancel all timers which would run FUNCTION. +This affects ordinary timers such as are scheduled by `run-at-time', +and idle timers such as are scheduled by `run-with-idle-timer'." (interactive "aCancel timers of function: ") (let ((tail timer-list)) (while tail @@ -284,12 +292,19 @@ (setq tail (cdr tail))))) ;; Record the last few events, for debugging. -(defvar timer-event-last-2 nil) -(defvar timer-event-last-1 nil) -(defvar timer-event-last nil) +(defvar timer-event-last nil + "Last timer that was run.") +(defvar timer-event-last-1 nil + "Next-to-last timer that was run.") +(defvar timer-event-last-2 nil + "Third-to-last timer that was run.") (defvar timer-max-repeats 10 - "*Maximum number of times to repeat a timer, if real time jumps.") + "*Maximum number of times to repeat a timer, if many repeats are delayed. +Timer invocations can be delayed because Emacs is suspended or busy, +or because the system's time changes. If such an occurrence makes it +appear that many invocations are overdue, this variable controls +how many will really happen.") (defun timer-until (timer time) "Calculate number of seconds from when TIMER will run, until TIME. @@ -440,6 +455,7 @@ timer)) (defun with-timeout-handler (tag) + "This is the timer function used for the timer made by `with-timeout'." (throw tag 'timeout)) ;;;###autoload (put 'with-timeout 'lisp-indent-function 1)
--- a/lisp/emacs-lisp/trace.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emacs-lisp/trace.el Sat Oct 14 17:36:28 2006 +0000 @@ -265,11 +265,14 @@ ;;;###autoload (defun trace-function-background (function &optional buffer) "Traces FUNCTION with trace output going quietly to BUFFER. -For every call of FUNCTION Lisp-style trace messages that display argument -and return values will be inserted into BUFFER. This function generates the -trace advice for FUNCTION and activates it together with any other advice -there might be!! Trace output will quietly go to BUFFER without changing -the window or buffer configuration at all." +When this tracing is enabled, every call to FUNCTION writes +a Lisp-style trace message (showing the arguments and return value) +into BUFFER. This function generates advice to trace FUNCTION +and activates it together with any other advice there might be. +The trace output goes to BUFFER quietly, without changing +the window or buffer configuration. + +BUFFER defaults to `trace-buffer'." (interactive (list (intern
--- a/lisp/emulation/cua-base.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emulation/cua-base.el Sat Oct 14 17:36:28 2006 +0000 @@ -1097,73 +1097,79 @@ ;;; Pre-command hook (defun cua--pre-command-handler-1 () - (let ((movement (eq (get this-command 'CUA) 'move))) + ;; Cancel prefix key timeout if user enters another key. + (when cua--prefix-override-timer + (if (timerp cua--prefix-override-timer) + (cancel-timer cua--prefix-override-timer)) + (setq cua--prefix-override-timer nil)) + + (cond + ;; Only symbol commands can have necessary properties + ((not (symbolp this-command)) + nil) - ;; Cancel prefix key timeout if user enters another key. - (when cua--prefix-override-timer - (if (timerp cua--prefix-override-timer) - (cancel-timer cua--prefix-override-timer)) - (setq cua--prefix-override-timer nil)) + ;; Handle delete-selection property on non-movement commands + ((not (eq (get this-command 'CUA) 'move)) + (when (and mark-active (not deactivate-mark)) + (let* ((ds (or (get this-command 'delete-selection) + (get this-command 'pending-delete))) + (nc (cond + ((not ds) nil) + ((eq ds 'yank) + 'cua-paste) + ((eq ds 'kill) + (if cua--rectangle + 'cua-copy-rectangle + 'cua-copy-region)) + ((eq ds 'supersede) + (if cua--rectangle + 'cua-delete-rectangle + 'cua-delete-region)) + (t + (if cua--rectangle + 'cua-delete-rectangle ;; replace? + 'cua-replace-region))))) + (if nc + (setq this-original-command this-command + this-command nc))))) - ;; Handle shifted cursor keys and other movement commands. - ;; If region is not active, region is activated if key is shifted. - ;; If region is active, region is cancelled if key is unshifted (and region not started with C-SPC). - ;; If rectangle is active, expand rectangle in specified direction and ignore the movement. - (if movement - (cond - ((if window-system - (memq 'shift (event-modifiers - (aref (this-single-command-raw-keys) 0))) - (or - (memq 'shift (event-modifiers - (aref (this-single-command-keys) 0))) - ;; See if raw escape sequence maps to a shifted event, e.g. S-up or C-S-home. - (and (boundp 'local-function-key-map) - local-function-key-map - (let ((ev (lookup-key local-function-key-map - (this-single-command-raw-keys)))) - (and (vector ev) - (symbolp (setq ev (aref ev 0))) - (string-match "S-" (symbol-name ev))))))) - (unless mark-active - (push-mark-command nil t)) - (setq cua--last-region-shifted t) - (setq cua--explicit-region-start nil)) - ((or cua--explicit-region-start cua--rectangle) - (unless mark-active - (push-mark-command nil nil))) - (t - ;; If we set mark-active to nil here, the region highlight will not be - ;; removed by the direct_output_ commands. - (setq deactivate-mark t))) + ;; Handle shifted cursor keys and other movement commands. + ;; If region is not active, region is activated if key is shifted. + ;; If region is active, region is cancelled if key is unshifted (and region not started with C-SPC). + ;; If rectangle is active, expand rectangle in specified direction and ignore the movement. + ((if window-system + (memq 'shift (event-modifiers + (aref (this-single-command-raw-keys) 0))) + (or + (memq 'shift (event-modifiers + (aref (this-single-command-keys) 0))) + ;; See if raw escape sequence maps to a shifted event, e.g. S-up or C-S-home. + (and (boundp 'local-function-key-map) + local-function-key-map + (let ((ev (lookup-key local-function-key-map + (this-single-command-raw-keys)))) + (and (vector ev) + (symbolp (setq ev (aref ev 0))) + (string-match "S-" (symbol-name ev))))))) + (unless mark-active + (push-mark-command nil t)) + (setq cua--last-region-shifted t) + (setq cua--explicit-region-start nil)) - ;; Handle delete-selection property on other commands - (if (and mark-active (not deactivate-mark)) - (let* ((ds (or (get this-command 'delete-selection) - (get this-command 'pending-delete))) - (nc (cond - ((not ds) nil) - ((eq ds 'yank) - 'cua-paste) - ((eq ds 'kill) - (if cua--rectangle - 'cua-copy-rectangle - 'cua-copy-region)) - ((eq ds 'supersede) - (if cua--rectangle - 'cua-delete-rectangle - 'cua-delete-region)) - (t - (if cua--rectangle - 'cua-delete-rectangle ;; replace? - 'cua-replace-region))))) - (if nc - (setq this-original-command this-command - this-command nc))))) + ;; Set mark if user explicitly said to do so + ((or cua--explicit-region-start cua--rectangle) + (unless mark-active + (push-mark-command nil nil))) - ;; Detect extension of rectangles by mouse or other movement - (setq cua--buffer-and-point-before-command - (if cua--rectangle (cons (current-buffer) (point)))))) + ;; Else clear mark after this command. + (t + ;; If we set mark-active to nil here, the region highlight will not be + ;; removed by the direct_output_ commands. + (setq deactivate-mark t))) + + ;; Detect extension of rectangles by mouse or other movement + (setq cua--buffer-and-point-before-command + (if cua--rectangle (cons (current-buffer) (point))))) (defun cua--pre-command-handler () (when cua-mode
--- a/lisp/emulation/viper-cmd.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emulation/viper-cmd.el Sat Oct 14 17:36:28 2006 +0000 @@ -892,12 +892,17 @@ (t ;;(setq ch (read-char-exclusive)) (setq ch (aref (read-key-sequence nil) 0)) + (if viper-xemacs-p + (setq ch (event-to-character ch))) ;; replace ^M with the newline (if (eq ch ?\C-m) (setq ch ?\n)) ;; Make sure ^V and ^Q work as quotation chars (if (memq ch '(?\C-v ?\C-q)) - ;;(setq ch (read-char-exclusive)) - (setq ch (aref (read-key-sequence nil) 0)) + (progn + ;;(setq ch (read-char-exclusive)) + (setq ch (aref (read-key-sequence nil) 0)) + (if viper-xemacs-p + (setq ch (event-to-character ch)))) ) (insert ch)) ) @@ -1750,7 +1755,7 @@ ;; Hook used in viper-undo (defun viper-after-change-undo-hook (beg end len) - (if undo-in-progress + (if (and (boundp 'undo-in-progress) undo-in-progress) (setq undo-beg-posn beg undo-end-posn (or end beg)) ;; some other hooks may be changing various text properties in @@ -3093,7 +3098,7 @@ (and (consp widget) (get (widget-type widget) 'widget-type)))) (widget-button-press (point)) - (if (button-at (point)) + (if (and (fboundp 'button-at) (fboundp 'push-button) (button-at (point))) (push-button) ;; not a widget or a button (viper-leave-region-active)
--- a/lisp/emulation/viper.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/emulation/viper.el Sat Oct 14 17:36:28 2006 +0000 @@ -9,7 +9,7 @@ ;; Author: Michael Kifer <kifer@cs.stonybrook.edu> ;; Keywords: emulations -(defconst viper-version "3.12 of February 18, 2006" +(defconst viper-version "3.13 of September 18, 2006" "The current version of Viper") ;; This file is part of GNU Emacs.
--- a/lisp/ezimage.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/ezimage.el Sat Oct 14 17:36:28 2006 +0000 @@ -27,7 +27,7 @@ ;; ;; A few routines for placing an image over text that will work for any ;; Emacs implementation without error. When images are not supported, then -;; they are justnot displayed. +;; they are just not displayed. ;; ;; The idea is that gui buffers (trees, buttons, etc) will have text ;; representations of the GUI elements. These routines will replace the text
--- a/lisp/faces.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/faces.el Sat Oct 14 17:36:28 2006 +0000 @@ -2089,7 +2089,7 @@ (defgroup mode-line-faces nil "Faces used in the mode line." - :group 'modeline + :group 'mode-line :group 'faces :version "22.1")
--- a/lisp/ffap.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/ffap.el Sat Oct 14 17:36:28 2006 +0000 @@ -954,7 +954,7 @@ (substring name 2)))) (defvar ffap-rfc-path - (concat (ffap-host-to-filename "ds.internic.net") "/rfc/rfc%s.txt")) + (concat (ffap-host-to-filename "ftp.rfc-editor.org") "/in-notes/rfc%s.txt")) (defun ffap-rfc (name) (format ffap-rfc-path
--- a/lisp/filecache.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/filecache.el Sat Oct 14 17:36:28 2006 +0000 @@ -266,6 +266,7 @@ ;; Functions to add files to the cache ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;###autoload (defun file-cache-add-directory (directory &optional regexp) "Add DIRECTORY to the file cache. If the optional REGEXP argument is non-nil, only files which match it will @@ -291,6 +292,7 @@ dir-files) (file-cache-add-file-list dir-files)))) +;;;###autoload (defun file-cache-add-directory-list (directory-list &optional regexp) "Add DIRECTORY-LIST (a list of directory names) to the file cache. If the optional REGEXP argument is non-nil, only files which match it @@ -307,6 +309,8 @@ (mapcar 'file-cache-add-file file-list)) ;; Workhorse function + +;;;###autoload (defun file-cache-add-file (file) "Add FILE to the file cache." (interactive "fAdd File: ") @@ -333,6 +337,7 @@ file-cache-alist))) ))) +;;;###autoload (defun file-cache-add-directory-using-find (directory) "Use the `find' command to add files to the file cache. Find is run in DIRECTORY." @@ -355,6 +360,7 @@ "-print") (file-cache-add-from-file-cache-buffer))) +;;;###autoload (defun file-cache-add-directory-using-locate (string) "Use the `locate' command to add files to the file cache. STRING is passed as an argument to the locate command." @@ -366,6 +372,7 @@ string) (file-cache-add-from-file-cache-buffer)) +;;;###autoload (defun file-cache-add-directory-recursively (dir &optional regexp) "Adds DIR and any subdirectories to the file-cache. This function does not use any external programs
--- a/lisp/files.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/files.el Sat Oct 14 17:36:28 2006 +0000 @@ -514,6 +514,9 @@ :type 'boolean :group 'view) +(defvar file-name-history nil + "History list of file names entered in the minibuffer.") + (put 'ange-ftp-completion-hook-function 'safe-magic t) (defun ange-ftp-completion-hook-function (op &rest args) "Provides support for ange-ftp host name completion. @@ -1117,13 +1120,15 @@ (mapcar 'switch-to-buffer (cdr value)))) (switch-to-buffer-other-frame value)))) -(defun find-file-existing (filename &optional wildcards) - "Edit the existing file FILENAME. -Like \\[find-file] but only allow a file that exists." - (interactive (find-file-read-args "Find existing file: " t)) - (unless (file-exists-p filename) (error "%s does not exist" filename)) - (find-file filename wildcards) - (current-buffer)) +(defun find-file-existing (filename) + "Edit the existing file FILENAME. +Like \\[find-file] but only allow a file that exists, and do not allow +file names with wildcards." + (interactive (nbutlast (find-file-read-args "Find existing file: " t))) + (if (and (not (interactive-p)) (not (file-exists-p filename))) + (error "%s does not exist" filename) + (find-file filename) + (current-buffer))) (defun find-file-read-only (filename &optional wildcards) "Edit file FILENAME but don't allow changes. @@ -1310,7 +1315,7 @@ (setq abbreviated-home-dir (let ((abbreviated-home-dir "$foo")) (concat "^" (abbreviate-file-name (expand-file-name "~")) - "\\(/\\|$\\)")))) + "\\(/\\|\\'\\)")))) ;; If FILENAME starts with the abbreviated homedir, ;; make it start with `~' instead. @@ -1365,7 +1370,7 @@ (number (nthcdr 10 attributes)) (list (buffer-list)) found) (and buffer-file-numbers-unique - number + (car-safe number) ;Make sure the inode is not just nil. (while (and (not found) list) (with-current-buffer (car list) (if (and buffer-file-name @@ -1904,7 +1909,7 @@ ("\\.[sS]\\'" . asm-mode) ("\\.asm\\'" . asm-mode) ("[cC]hange\\.?[lL]og?\\'" . change-log-mode) - ("[cC]hange[lL]og\\.[0-9]+\\'" . change-log-mode) + ("[cC]hange[lL]og[-.][0-9]+\\'" . change-log-mode) ("\\$CHANGE_LOG\\$\\.TXT" . change-log-mode) ("\\.scm\\.[0-9]*\\'" . scheme-mode) ("\\.[ck]?sh\\'\\|\\.shar\\'\\|/\\.z?profile\\'" . sh-mode) @@ -2396,10 +2401,10 @@ ;; ;; For variables defined in the C source code the declaration should go here: -;; FIXME: Some variables should be moved according to the rules above. (mapc (lambda (pair) (put (car pair) 'safe-local-variable (cdr pair))) - '((fill-column . integerp) ;; C source code + '((buffer-read-only . booleanp) ;; C source code + (fill-column . integerp) ;; C source code (indent-tabs-mode . booleanp) ;; C source code (left-margin . integerp) ;; C source code (no-update-autoloads . booleanp) @@ -2697,8 +2702,8 @@ * Its name ends with \"hook(s)\", \"function(s)\", \"form(s)\", \"map\", \"program\", \"command(s)\", \"predicate(s)\", \"frame-alist\", - \"mode-alist\", \"font-lock-(syntactic-)keyword*\", or - \"map-alist\"." + \"mode-alist\", \"font-lock-(syntactic-)keyword*\", + \"map-alist\", or \"bindat-spec\"." ;; If this is an alias, check the base name. (condition-case nil (setq sym (indirect-variable sym)) @@ -2707,7 +2712,7 @@ (string-match "-hooks?$\\|-functions?$\\|-forms?$\\|-program$\\|\ -commands?$\\|-predicates?$\\|font-lock-keywords$\\|font-lock-keywords\ -[0-9]+$\\|font-lock-syntactic-keywords$\\|-frame-alist$\\|-mode-alist$\\|\ --map$\\|-map-alist$" (symbol-name sym)))) +-map$\\|-map-alist$\\|-bindat-spec$" (symbol-name sym)))) (defun hack-one-local-variable-quotep (exp) (and (consp exp) (eq (car exp) 'quote) (consp (cdr exp)))) @@ -3729,9 +3734,15 @@ (recursive-edit) ;; Return nil to ask about BUF again. nil) - "view this file") - (?d diff-buffer-with-file - "view changes in file")) + "view this buffer") + (?d (lambda (buf) + (save-window-excursion + (diff-buffer-with-file buf)) + (view-buffer (get-buffer-create "*Diff*") + (lambda (ignore) (exit-recursive-edit))) + (recursive-edit) + nil) + "view changes in this buffer")) "ACTION-ALIST argument used in call to `map-y-or-n-p'.") (defvar buffer-save-without-query nil
--- a/lisp/find-dired.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/find-dired.el Sat Oct 14 17:36:28 2006 +0000 @@ -129,8 +129,17 @@ args (concat find-dired-find-program " . " (if (string= args "") "" - (concat "\\( " args " \\) ")) - (car find-ls-option))) + (concat + (shell-quote-argument "(") + " " args " " + (shell-quote-argument ")") + " ")) + (if (equal (car find-ls-option) "-exec ls -ld {} \\;") + (concat "-exec ls -ld " + (shell-quote-argument "{}") + " " + (shell-quote-argument ";")) + (car find-ls-option)))) ;; Start the find process. (shell-command (concat args "&") (current-buffer)) ;; The next statement will bomb in classic dired (no optional arg allowed) @@ -215,7 +224,10 @@ (find-dired dir (concat "-type f -exec grep " find-grep-options " -e " (shell-quote-argument regexp) - " {} \\\; "))) + " " + (shell-quote-argument "{}") + " " + (shell-quote-argument ";")))) (defun find-dired-filter (proc string) ;; Filter for \\[find-dired] processes.
--- a/lisp/font-lock.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/font-lock.el Sat Oct 14 17:36:28 2006 +0000 @@ -718,7 +718,7 @@ ;; If the keywords were compiled before, compile them again. (if was-compiled (setq font-lock-keywords - (font-lock-compile-keywords font-lock-keywords t))))))) + (font-lock-compile-keywords font-lock-keywords))))))) (defun font-lock-update-removed-keyword-alist (mode keywords how) "Update `font-lock-removed-keywords-alist' when adding new KEYWORDS to MODE." @@ -825,7 +825,7 @@ ;; If the keywords were compiled before, compile them again. (if was-compiled (setq font-lock-keywords - (font-lock-compile-keywords font-lock-keywords t))))))) + (font-lock-compile-keywords font-lock-keywords))))))) ;;; Font Lock Support mode. @@ -1168,7 +1168,12 @@ ;; number of lines. ;; (setq beg (progn (goto-char beg) (line-beginning-position)) ;; end (progn (goto-char end) (line-beginning-position 2))) - ) + (unless (eq end (point-max)) + ;; Rounding up to a whole number of lines should include the + ;; line right after `end'. Typical case: the first char of + ;; the line was deleted. Or a \n was inserted in the middle + ;; of a line. + (setq end (1+ end)))) (font-lock-fontify-region beg end))))) (defvar jit-lock-start) (defvar jit-lock-end) @@ -1205,9 +1210,17 @@ (setq beg (or (previous-single-property-change beg 'font-lock-multiline) (point-min)))) - (setq end (or (text-property-any end (point-max) - 'font-lock-multiline nil) - (point-max))) + (when (< end (point-max)) + (setq end + (if (get-text-property end 'font-lock-multiline) + (or (text-property-any end (point-max) + 'font-lock-multiline nil) + (point-max)) + ;; Rounding up to a whole number of lines should include the + ;; line right after `end'. Typical case: the first char of + ;; the line was deleted. Or a \n was inserted in the middle + ;; of a line. + (1+ end)))) ;; Finally, pre-enlarge the region to a whole number of lines, to try ;; and anticipate what font-lock-default-fontify-region will do, so as to ;; avoid double-redisplay. @@ -1217,11 +1230,11 @@ (when (memq 'font-lock-extend-region-wholelines font-lock-extend-region-functions) (goto-char beg) - (forward-line 0) - (setq jit-lock-start (min jit-lock-start (point))) + (setq jit-lock-start (min jit-lock-start (line-beginning-position))) (goto-char end) - (forward-line 1) - (setq jit-lock-end (max jit-lock-end (point))))))) + (setq jit-lock-end + (max jit-lock-end + (if (bolp) (point) (line-beginning-position 2)))))))) (defun font-lock-fontify-block (&optional arg) "Fontify some lines the way `font-lock-fontify-buffer' would. @@ -1414,7 +1427,8 @@ ;; If `font-lock-syntactic-keywords' is not compiled, compile it. (unless (eq (car font-lock-syntactic-keywords) t) (setq font-lock-syntactic-keywords (font-lock-compile-keywords - font-lock-syntactic-keywords))) + font-lock-syntactic-keywords + t))) ;; Get down to business. (let ((case-fold-search font-lock-keywords-case-fold-search) (keywords (cddr font-lock-syntactic-keywords)) @@ -1570,7 +1584,7 @@ LOUDLY, if non-nil, allows progress-meter bar." (unless (eq (car font-lock-keywords) t) (setq font-lock-keywords - (font-lock-compile-keywords font-lock-keywords t))) + (font-lock-compile-keywords font-lock-keywords))) (let ((case-fold-search font-lock-keywords-case-fold-search) (keywords (cddr font-lock-keywords)) (bufname (buffer-name)) (count 0) @@ -1626,12 +1640,12 @@ ;; Various functions. -(defun font-lock-compile-keywords (keywords &optional regexp) +(defun font-lock-compile-keywords (keywords &optional syntactic-keywords) "Compile KEYWORDS into the form (t KEYWORDS COMPILED...) Here each COMPILED is of the form (MATCHER HIGHLIGHT ...) as shown in the `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 SYNTACTIC-KEYWORDS is non-nil, it means these keywords are used for +`font-lock-syntactic-keywords' rather than for `font-lock-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 @@ -1644,10 +1658,12 @@ (setq keywords (cons t (cons keywords (mapcar 'font-lock-compile-keyword keywords)))) - (if (and regexp - (eq (or syntax-begin-function - font-lock-beginning-of-syntax-function) - 'beginning-of-defun) + (if (and (not syntactic-keywords) + (let ((beg-function + (or font-lock-beginning-of-syntax-function + syntax-begin-function))) + (or (eq beg-function 'beginning-of-defun) + (get beg-function 'font-lock-syntax-paren-check))) (not beginning-of-defun-function)) ;; Try to detect when a string or comment contains something that ;; looks like a defun and would thus confuse font-lock. @@ -1774,7 +1790,7 @@ ;; Now compile the keywords. (unless (eq (car font-lock-keywords) t) (setq font-lock-keywords - (font-lock-compile-keywords font-lock-keywords t)))))) + (font-lock-compile-keywords font-lock-keywords)))))) ;;; Colour etc. support.
--- a/lisp/frame.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/frame.el Sat Oct 14 17:36:28 2006 +0000 @@ -771,7 +771,7 @@ (nreverse frame-initial-geometry-arguments)) (cdr param-list)) -(defcustom focus-follows-mouse t +(defcustom focus-follows-mouse (not (eq window-system 'mac)) "*Non-nil if window system changes focus when you move the mouse. You should set this variable to tell Emacs how your window manager handles focus, since there is no way in general for Emacs to find out @@ -1192,17 +1192,43 @@ (t (frame-width (if (framep display) display (selected-frame))))))) +(defcustom display-mm-dimensions-alist nil + "Alist for specifying screen dimensions in millimeters. +The dimensions will be used for `display-mm-height' and +`display-mm-width' if defined for the respective display. + +Each element of the alist has the form (display . (width . height)), +e.g. (\":0.0\" . (287 . 215)). + +If `display' equals t, it specifies dimensions for all graphical +displays not explicitely specified." + :version "22.1" + :type '(alist :key-type (choice (string :tag "Display name") + (const :tag "Default" t)) + :value-type (cons :tag "Dimensions" + (integer :tag "Width") + (integer :tag "Height"))) + :group 'frames) + (defun display-mm-height (&optional display) "Return the height of DISPLAY's screen in millimeters. +System values can be overriden by `display-mm-dimensions-alist'. If the information is unavailable, value is nil." (and (memq (framep-on-display display) '(x w32 mac)) - (x-display-mm-height display))) + (or (cddr (assoc (or display (frame-parameter nil 'display)) + display-mm-dimensions-alist)) + (cddr (assoc t display-mm-dimensions-alist)) + (x-display-mm-height display)))) (defun display-mm-width (&optional display) "Return the width of DISPLAY's screen in millimeters. +System values can be overriden by `display-mm-dimensions-alist'. If the information is unavailable, value is nil." (and (memq (framep-on-display display) '(x w32 mac)) - (x-display-mm-width display))) + (or (cadr (assoc (or display (frame-parameter nil 'display)) + display-mm-dimensions-alist)) + (cadr (assoc t display-mm-dimensions-alist)) + (x-display-mm-width display)))) (defun display-backing-store (&optional display) "Return the backing store capability of DISPLAY's screen.
--- a/lisp/gnus/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,122 @@ +2006-10-04 Reiner Steib <Reiner.Steib@gmx.de> + + * gnus-sum.el (gnus-summary-make-menu-bar): Clarify + gnus-summary-limit-to-articles. + +2006-10-04 Romain Francoise <romain@orebokech.com> + + * gnus-util.el (gnus-alist-to-hashtable, gnus-hashtable-to-alist): + Moved here (and renamed) from gnus-registry.el. + + * gnus-registry.el: Require gnus-util. + Use `gnus-alist-to-hashtable' and `gnus-hashtable-to-alist'. + +2006-10-04 Reiner Steib <Reiner.Steib@gmx.de> + + * pop3.el (pop3-authentication-scheme): Clarify doc. + (pop3-movemail): Warn about pop3-leave-mail-on-server. + +2006-10-04 Dave Love <fx@gnu.org> + + * pop3.el (pop3-authentication-scheme): Add custom version. + +2006-10-04 Jesper Harder <harder@ifa.au.dk> + + * pop3.el (pop3-leave-mail-on-server): Don't quote nil in + doc string. Improve doc string. + +2006-10-03 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-util.el (gnus-with-local-quit): New macro. + + * gnus-demon.el (gnus-demon): Replace with-local-quit with it. + +2006-09-28 Reiner Steib <Reiner.Steib@gmx.de> + + * gmm-utils.el (gmm): Adjust custom version. + + * mm-util.el (mm-charset-override-alist, mm-charset-eval-alist): Adjust + custom version. + + * gnus-draft.el (gnus-draft-mode): Don't call `mml-mode'. + +2006-09-25 Chong Yidong <cyd@stupidchicken.com> + + * gnus-demon.el (gnus-demon): Use with-local-quit to avoid hangs. + +2006-09-19 Andreas Seltenreich <uwi7@rz.uni-karlsruhe.de> + + * nnslashdot.el (nnslashdot-request-article): Update end-of-article + regexp. Articles containing quotation were cut prematurely. + +2006-09-16 Katsumi Yamaoka <yamaoka@jpl.org> + + * message.el (message-cite-original-without-signature): Use nobody by + default for the value of From header. + (message-cite-original): Ditto. + (message-reply): Ditto. + +2006-09-09 Reiner Steib <Reiner.Steib@gmx.de> + + * pop3.el (pop3-leave-mail-on-server): Mention problem of duplicate + mails in the doc string. Add some URLs in comment. + +2006-09-07 Katsumi Yamaoka <yamaoka@jpl.org> + + * rfc2047.el (rfc2047-quote-special-characters-in-quoted-strings): Fix + backslashes handling and the way to find boundaries of quoted strings. + +2006-09-06 Reiner Steib <Reiner.Steib@gmx.de> + + * gnus-art.el (gnus-button-regexp, gnus-button-marker-list) + (gnus-button-last): Move up. Convert comments into doc strings. + +2006-09-04 Chong Yidong <cyd@stupidchicken.com> + + * message.el (message-send-mail-with-sendmail): Look for sendmail in + several common directories. + +2006-09-04 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-art.el (article-decode-encoded-words): Make it fast. + +2006-09-04 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-art.el (article-decode-encoded-words): Don't infloop in XEmacs. + + * rfc2047.el (rfc2047-strip-backslashes-in-quoted-strings): Decode `\\' + in quoted string into `\'. + +2006-09-01 Katsumi Yamaoka <yamaoka@jpl.org> + + * rfc2047.el (rfc2047-quote-special-characters-in-quoted-strings): + Use standard-syntax-table. + +2006-09-01 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-art.el (gnus-decode-address-function): New variable. + (article-decode-encoded-words): Use it to decode headers which are + assumed to contain addresses. + (gnus-mime-delete-part): Remove useless `or'. + + * gnus-sum.el (gnus-decode-encoded-address-function): New variable. + (gnus-summary-from-or-to-or-newsgroups): Use it to decode To header. + (gnus-nov-parse-line): Use it to decode From header. + (gnus-get-newsgroup-headers): Ditto. + (gnus-summary-enter-digest-group): Use it to decode `to-address'. + + * mail-parse.el (mail-decode-encoded-address-region): New alias. + (mail-decode-encoded-address-string): New alias. + + * rfc2047.el (rfc2047-quote-special-characters-in-quoted-strings): + New function. + (rfc2047-encode-message-header, rfc2047-encode-region): Use it. + (rfc2047-strip-backslashes-in-quoted-strings): New fnction. + (rfc2047-decode-region): Use it; add optional argument `address-mime'. + (rfc2047-decode-string): Ditto. + (rfc2047-decode-address-region): New function. + (rfc2047-decode-address-string): New function. + 2006-08-23 Andreas Seltenreich <uwi7@rz.uni-karlsruhe.de> [ Backported bug fix from No Gnus. ] @@ -389,10 +508,6 @@ * gnus-sum.el (gnus-get-newsgroup-headers-xover): Group is an optional parameter. -2006-04-07 Reiner Steib <Reiner.Steib@gmx.de> - - * pgg-gpg.el: Revert to revision 7.15 to allow the use of gpg-agent. - 2006-04-06 Reiner Steib <Reiner.Steib@gmx.de> * gnus-fun.el (gnus): Require it for gnus-directory. @@ -1191,7 +1306,7 @@ as a buffer-local variable. This avoids creating truncated dribble files as a result of a hang up, eg. -2005-11-04 Ken Manheimer <ken.manheimer@gmail.com> +2005-11-04 Ken Manheimer <ken.manheimer@gmail.com> * pgg-pgp.el (pgg-pgp-encrypt-region, pgg-pgp-decrypt-region) (pgg-pgp-encrypt-symmetric-region, pgg-pgp-encrypt-symmetric) @@ -2826,7 +2941,7 @@ * gnus.el (gnus-group-startup-message): Search for gnus images in etc/images/gnus. - * mm-util.el (mm-find-charset-region): Likewise. + * mm-util.el (mm-image-load-path): Likewise. * smiley.el (smiley-data-directory): Search for smilies in etc/images/smilies. @@ -3935,7 +4050,7 @@ * gnus-sum.el (gnus-summary-insert-subject): Remove list identifiers. -2004-09-03 Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp> (tiny change) +2004-09-03 Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp> (tiny change) * spam-stat.el (spam-stat-reduce-size): Set spam-stat-dirty. (spam-stat-save): Accept prefix argument. @@ -4082,17 +4197,17 @@ * gnus-sum.el (gnus-newsgroup-variables): Doc fix. -2004-08-26 YAGI Tatsuya <ynyaaa@ybb.ne.jp> (tiny change) +2004-08-26 YAGI Tatsuya <ynyaaa@ybb.ne.jp> (tiny change) * gnus-art.el (gnus-article-next-page): Fix the way to find a real end-of-buffer. -2004-08-26 Stefan Wiens <s.wi@gmx.net> (tiny change) +2004-08-26 Stefan Wiens <s.wi@gmx.net> (tiny change) * gnus-sum.el (gnus-read-header): Don't remove a header for the parent article of a sparse article in the thread hashtb. -2004-08-26 David Hedbor <dhedbor@real.com> (tiny change) +2004-08-26 David Hedbor <dhedbor@real.com> (tiny change) * nnmail.el (nnmail-split-lowercase-expanded): New user option. (nnmail-expand-newtext): Lowercase expanded entries if @@ -4288,7 +4403,7 @@ * gnus-msg.el (gnus-summary-followup-with-original): Document yanking of region when active. -2004-04-13 Kevin Greiner <kgreiner@xpediantsolutions.com> +2004-04-13 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el: Merged 7.3 through 7.7 updates into branch. Revision 7.2 changes excluded to maintain compatibility with all
--- a/lisp/gnus/ChangeLog.2 Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/ChangeLog.2 Sat Oct 14 17:36:28 2006 +0000 @@ -1,4 +1,4 @@ -2004-01-04 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2004-01-04 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Gnus v5.10.6 is released. @@ -10,7 +10,7 @@ * gnus.el (gnus-version-number): Bump. -2004-01-04 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2004-01-04 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Gnus v5.10.5 is released. @@ -58,7 +58,7 @@ * gnus.el (gnus-version-number): Bump. -2004-01-03 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2004-01-03 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Gnus v5.10.4 is released. @@ -81,10 +81,9 @@ * gnus-nocem.el (gnus-nocem-enter-article): Use the real group hashtb (tiny patch). -2004-01-02 Kai Grossjohann <kai@emptydomain.de> - - * nnml.el (nnml-save-mail): Grok compressed articles. From - Michael Albinus <Michael.Albinus@alcatel.de>. +2004-01-02 Michael Albinus <Michael.Albinus@alcatel.de> + + * nnml.el (nnml-save-mail): Grok compressed articles. 2004-01-02 Teodor Zlatanov <tzz@lifelogs.com> @@ -144,20 +143,16 @@ (gnus-summary-goto-article): Allow `%40'. (gnus-summary-refer-article): Convert `%40' to `@'. -2003-12-30 Simon Josefsson <jas@extundo.com> +2003-12-30 Arne J,Ax(Brgensen <arne@arnested.dk> * smime.el (smime-crl-check): New. - (smime-verify-region): Use it. From Arne J,Ax(Brgensen - <arne@arnested.dk> in <87llpk9v5q.fsf@seamus.arnested.dk> (tiny - change). + (smime-verify-region): Use it. 2003-12-30 Reiner Steib <Reiner.Steib@gmx.de> - * gnus-score.el (gnus-score-edit-file-at-point): Consider the - whole match element. From Karl Pfl,Ad(Bsterer <sigurd@12move.de>. - (gnus-score-find-trace): Use it. Added `f' and `t' commands, - added quick help. With some suggestions from Karl Pfl,Ad(Bsterer - <sigurd@12move.de>. + (gnus-score-find-trace): Use gnus-score-edit-file-at-point. Added + `f' and `t' commands, added quick help. With some suggestions + from Karl Pfl,Ad(Bsterer <sigurd@12move.de>. * gnus-util.el (gnus-emacs-version): Added doc-string. @@ -165,6 +160,11 @@ (mml-attach-file): Use it. (mml-preview): Added MIME preview to gnus-buffers. +2003-12-30 Karl Pfl,Ad(Bsterer <sigurd@12move.de> + + * gnus-score.el (gnus-score-edit-file-at-point): Consider the + whole match element. + 2003-12-30 Jesper Harder <harder@ifa.au.dk> * gnus-sum.el (gnus-summary-make-menu-bar): Add ellipses. @@ -179,7 +179,7 @@ (gnus-secondary-method-p): Extend servers to methods before comparing. (gnus-secondary-method-p): Revert. -2003-12-30 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-12-30 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Gnus v5.10.3 is released. @@ -189,7 +189,7 @@ Suggested by Steinar Bang <sb@dod.no>. (gnus-agent-auto-agentize-methods): Customize. -2003-12-29 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-12-29 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus.el (gnus-server-to-method): Fixed bug in 2003-12-22 check-in. @@ -210,10 +210,9 @@ * mml1991.el (mml1991-pgg-encrypt): Decode according to CTE before encrypting. -2003-12-28 Jesper Harder <harder@ifa.au.dk> +2003-12-28 Ivan Boldyrev <boldyrev@uiggm.nsc.ru> (tiny change). * mml1991.el (mml1991-pgg-sign): Use unibyte when re-encoding. - From Ivan Boldyrev <boldyrev@uiggm.nsc.ru> (tiny change). 2003-12-26 Katsumi Yamaoka <yamaoka@jpl.org> @@ -243,7 +242,7 @@ * dgnushack.el (dgnushack-compile): Increase the value for max-specpdl-size when compiling Gnus with Emacs 20. -2003-12-22 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-12-22 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-int.el (gnus-open-server): Fixed the server status such that an agentized server, when opened offline, has a status of offline. Also fixes bug whereby the agent's backend was called @@ -268,7 +267,7 @@ * gnus-agent.el (gnus-agent-read-agentview): Use car-less-than-car. -2003-12-20 Artem Chuprina <ran@ran.pp.ru> (tiny change) +2003-12-20 Artem Chuprina <ran@ran.pp.ru> (tiny change) * message.el (message-yank-buffer): Bind message-reply-buffer to a buffer rather than a string. @@ -379,7 +378,7 @@ * pgg.el (pgg-run-at-time): Ditto. -2003-12-11 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-12-11 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-possibly-alter-active): New Function. (gnus-agent-regenerate-group): When necessary, alter the group's @@ -401,17 +400,14 @@ * message.el (message-get-reply-headers): Narrow to headers. -2003-12-10 Teodor Zlatanov <tzz@lifelogs.com> - - * spam.el (spam-disable-spam-split-during-ham-respool): new - variable. From lorentey@elte.hu (L,Bu(Brentey K,Ba(Broly) - (spam-ham-copy-or-move-routine): respect - spam-disable-spam-split-during-ham-respool. From - lorentey@elte.hu (L,Bu(Brentey K,Ba(Broly) - (spam-split-disabled): new variable. From - lorentey@elte.hu (L,Bu(Brentey K,Ba(Broly) - (spam-split): respect spam-split-disabled. From - lorentey@elte.hu (L,Bu(Brentey K,Ba(Broly) +2003-12-10 L,Bu(Brentey K,Ba(Broly <lorentey@elte.hu> + + * spam.el (spam-disable-spam-split-during-ham-respool): New + variable. + (spam-ham-copy-or-move-routine): Respect + spam-disable-spam-split-during-ham-respool. + (spam-split-disabled): New variable. + (spam-split): Respect spam-split-disabled. 2003-12-10 Katsumi Yamaoka <yamaoka@jpl.org> @@ -427,19 +423,21 @@ input. (pgg-decode-armor-region): Don't parse packet if decoding fail. -2003-12-09 Teodor Zlatanov <tzz@lifelogs.com> +2003-12-09 L,Bu(Brentey K,Ba(Broly <lorentey@elte.hu> * spam.el (spam-check-bogofilter): run in the correct buffer. - From lorentey@elte.hu (L,Bu(Brentey K,Ba(Broly). - (spam-bogofilter-database-directory): correct customization - group. From Xavier Maillard <zedek@gnu-rox.org>. + +2003-12-09 Xavier Maillard <zedek@gnu-rox.org> + + * spam.el (spam-bogofilter-database-directory): correct + customization group. 2003-12-09 Per Abrahamsen <abraham@dina.kvl.dk> * nnmail.el (nnmail-lazy, nnmail-split-fancy): New widgets. (nnmail-split-fancy): Use it. -2003-12-08 Joel Ray Holveck <joelh@piquan.org> (tiny change) +2003-12-08 Joel Ray Holveck <joelh@piquan.org> (tiny change) * gnus-sum.el (gnus-summary-save-parts-1): Consider the "name" parameter of Content-Type. @@ -509,32 +507,32 @@ * gnus-util.el: Require alist and provide tm-view when compiling with XEmacs. -2003-12-03 Steve Youngs <sryoungs@bigpond.net.au> +2003-12-03 Jerry James <james@xemacs.org> (tiny change) * gnus-xmas.el: Add autoloads for macros defined in gnus.el. - From Jerry James <james@xemacs.org>. * gnus-util.el: Get rmail definitions when compiling. - From Jerry James <james@xemacs.org>. * dns.el: Require gnus-xmas at compile time instead of trying to autoload `gnus-xmas-open-network-stream' because it wasn't picking up the macro. - From Jerry James <james@xemacs.org>. - -2003-12-01 Kevin Greiner <kgreiner@xpediantsolutions.com> + +2003-12-01 Kevin Greiner <kgreiner@xpediantsolutions.com> + * gnus-agent.el (gnus-agent-consider-all-articles): Updated docstring. (gnus-predicate-implies-unread, gnus-predicate-implies-unread-1): Fixed implementation such that the predicate `true' no longer evaluates to t. -2003-12-01 Teodor Zlatanov <tzz@lifelogs.com> +2003-12-01 Adrian Lanz <lanz@fowi.ethz.ch> (tiny change) * spam.el (spam-check-bogofilter): check the bogofilter headers - AFTER the save-excursion scope is over. From Adrian Lanz - <lanz@fowi.ethz.ch>. - (spam-fetch-field-message-id-fast): doc fix + AFTER the save-excursion scope is over. + +2003-12-01 Teodor Zlatanov <tzz@lifelogs.com> + + * spam.el (spam-fetch-field-message-id-fast): Doc fix 2003-12-01 Simon Josefsson <jas@extundo.com> @@ -549,24 +547,26 @@ (gnus-agent-expire-group-1): Only print a message for an article when there actually was something done to it. + * gnus-agent.el (gnus-agent-expire-unagentized-dirs): Custom fix. + +2003-11-30 Kenichi Handa <handa@m17n.org> + * mm-util.el (mm-enable-multibyte): Call set-buffer-multibyte with 'to argument. Fixes something or other in Emacs 22, and is - backwards compatible. From Kenichi Handa <handa@m17n.org>. - - * gnus-agent.el (gnus-agent-expire-unagentized-dirs): Custom fix. + backwards compatible. 2003-11-30 Lars Magne Ingebrigtsen <larsi@gnus.org> * gnus-agent.el (gnus-agent-covered-methods): Remove nil methods. -2003-11-29 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-11-29 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-start.el (gnus-activate-group): The active range of the group must include the articles known to the agent. * gnus.el (gnus-agent-method-p): Accept a server name as the method being tested. -2003-11-29 Alexander Kreuzer <alex@freesources.org> (tiny change) +2003-11-29 Alexander Kreuzer <alex@freesources.org> (tiny change) * nnrss.el (nnrss-check-group): Set xml when nnrss-use-local is t. @@ -669,7 +669,7 @@ * dgnushack.el (mapc): Add the compiler macro for Emacs 20. -2003-11-24 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-11-24 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-srvr.el (gnus-server-insert-server-line): The server names used in gnus-agent are different (for example, the native server uses the alias "native") from the names in gnus-srvr. @@ -681,7 +681,7 @@ new gnus-server-named-server function to get gnus-agent compatible names from the server buffer. -2003-11-20 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-11-20 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus.el (gnus-agent-covered-methods): Documented use of named servers, not methods, to identity agentized groups. @@ -762,12 +762,12 @@ * gnus-score.el (gnus-decay-score): Return a surely smaller value than the argument in XEmacs. -2003-11-18 Reiner Steib <Reiner.Steib@gmx.de> +2003-11-18 Sam Steingold <sds@gnu.org> * message.el (message-insert-to): Don't use `gnus-message'. (message-header-synonyms): New variable. (message-carefully-insert-headers): Use it (check for synonyms). - Added doc-string. From Sam Steingold <sds@gnu.org>. + Added doc-string. 2003-11-17 Lars Magne Ingebrigtsen <larsi@gnus.org> @@ -848,12 +848,15 @@ 2003-11-10 Reiner Steib <Reiner.Steib@gmx.de> + * message.el (message-mode-field-menu): Moved some entries, added + `message-insert-wide-reply'. + (message-change-subject): Fixed comment. + +2003-11-10 Sam Steingold <sds@gnu.org> + * message.el (message-insert-to): Do error out when the user requested no Cc. Don't insert empty To. Can be added to - `message-setup-hook' now. From Sam Steingold <sds@gnu.org>. - (message-mode-field-menu): Moved some entries, added - `message-insert-wide-reply'. - (message-change-subject): Fixed comment. + `message-setup-hook' now. 2003-11-10 Simon Josefsson <jas@extundo.com> @@ -865,13 +868,12 @@ key id too (for decryption). (pgg-gpg-sign-region): Likewise. -2003-11-09 Simon Josefsson <jas@extundo.com> +2003-11-09 Satyaki Das <satyakid@stanford.edu> * pgg-gpg.el (pgg-gpg-all-secret-keys): New variable. (pgg-gpg-lookup-all-secret-keys): New function. (pgg-gpg-select-matching-key): Likewise. - (pgg-gpg-decrypt-region): Use new functions. From Satyaki Das - <satyakid@stanford.edu>. + (pgg-gpg-decrypt-region): Use new functions. 2003-11-07 Teodor Zlatanov <tzz@lifelogs.com> @@ -1322,8 +1324,9 @@ * gnus-sum.el (gnus-summary-respool-query): Don't narrow to head, it's done by nnmail-article-group. +2003-10-12 Mark Hood <markhood@speakeasy.net> (tiny change) + * gnus-uu.el (gnus-uu-grab-articles): Fix misplaced parens. - From Mark Hood <markhood@speakeasy.net> (tiny change) 2003-10-10 Jesper Harder <harder@ifa.au.dk> @@ -1387,10 +1390,10 @@ * spam.el (spam-install-hooks-function): Added Autoload cookie. -2003-10-02 Jesper Harder <harder@ifa.au.dk> +2003-10-02 Michael Shields <shields@msrl.com> * pgg-def.el (pgg-default-keyserver-address): Change to - subkeys.pgp.net. From Michael Shields <shields@msrl.com> + subkeys.pgp.net. 2003-10-01 Simon Josefsson <jas@extundo.com> @@ -1464,19 +1467,21 @@ * gnus.el (gnus-group-charter-alist): Update. +2003-09-10 Eric Knauel <knauel@informatik.uni-tuebingen.de> + + * spam-report.el: Use mm-url.el functions for external URL loading + when the built-in HTTP GET is insufficient (e.g. proxies are in + the way). + 2003-09-10 Teodor Zlatanov <tzz@lifelogs.com> - * spam-report.el: use mm-url.el functions for external URL - loading when the built-in HTTP GET is insufficient (e.g. proxies - are in the way). From Eric Knauel - <knauel@informatik.uni-tuebingen.de>. - (spam-report-url-ping-function): new option, defaults to the - built-in HTTP GET (spam-report-url-ping-plain) - (spam-report-url-ping): calls spam-report-url-ping-function now - (spam-report-url-ping-plain): new function, does what - spam-report-url-ping used to do - (spam-report-url-ping-mm-url): function that delegates to - mm-url.el (autoloaded) + * spam-report.el (spam-report-url-ping-function): New option, + defaults to the built-in HTTP GET (spam-report-url-ping-plain). + (spam-report-url-ping): Call spam-report-url-ping-function. + (spam-report-url-ping-plain): New function, does what + spam-report-url-ping used to do. + (spam-report-url-ping-mm-url): Function that delegates to + mm-url.el (autoloaded). 2003-09-08 Teodor Zlatanov <tzz@lifelogs.com> @@ -1577,12 +1582,11 @@ (mml-insert-mime-headers): Use it. Based on (tiny) patch from Lars Balker Rasmussen <lars@balker.org>. -2003-08-30 Simon Josefsson <jas@extundo.com> +2003-08-30 Gaute Strokkenes <gs234@srcf.ucam.org> (tiny change) * mail-source.el (mail-source-fetch-imap): Pass correct buffer to imap-open, reverts 2003-03-17 change. Reverse remove before - calling gnus-compress-sequence. From Gaute Strokkenes - <gs234@srcf.ucam.org> (tiny change). + calling gnus-compress-sequence. 2003-08-29 Simon Josefsson <jas@extundo.com> @@ -1602,11 +1606,10 @@ the files it may be using. Reported by David Coe <davidc@debian.org>. -2003-08-27 Jesper Harder <harder@ifa.au.dk> +2003-08-27 Vagn Johansen <v@johansen.mail.dk> (tiny change) * gnus-cache.el (gnus-cache-generate-active): Fix bug in - replacement. From Vagn Johansen <v@johansen.mail.dk> (tiny - change). + replacement. 2003-08-25 Katsumi Yamaoka <yamaoka@jpl.org> @@ -1712,10 +1715,9 @@ * gnus.el (gnus-refer-article-method): Ditto. * message.el (message-courtesy-message): Ditto. -2003-08-06 Jesper Harder <harder@ifa.au.dk> +2003-08-06 Chunyu Wang <spr@db.cs.hit.edu.cn> (tiny patch) * gnus-art.el (gnus-header-face-alist): Fix "Newsgroups" entry. - From Chunyu Wang <spr@db.cs.hit.edu.cn> (tiny patch) 2003-08-05 Katsumi Yamaoka <yamaoka@jpl.org> @@ -1841,8 +1843,7 @@ * imap.el (imap-arrival-filter): Fix test for missing process buffer. -2003-07-09 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> - From Gaute B Strokkenes <gs234@cam.ac.uk> (tiny patch). +2003-07-09 Gaute B Strokkenes <gs234@cam.ac.uk> (tiny patch). * imap.el (imap-wait-for-tag): Clarify comment. Use timeout zero for second, after-process-has-died, accept-process-output. @@ -1898,25 +1899,25 @@ (message-canlock-generate) (message-generate-new-buffer-clone-locals): Docstring fixes. -2003-07-07 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> +2003-07-07 Gaute B Strokkenes <gs234@cam.ac.uk> (tiny patch) * imap.el (imap-wait-for-tag): After the process has died, look - for more output still pending. From Gaute B Strokkenes - <gs234@cam.ac.uk> (tiny patch). + for more output still pending. 2003-07-07 Teodor Zlatanov <tzz@lifelogs.com> * spam.el (spam-bogofilter-score): redisplay article normally after spam-bogofilter-score is called +2003-07-06 Michael Piotrowski <mxp@dynalabs.de> (tiny change) + + * gnus-sum.el (gnus-print-buffer): Apply emphasis. + 2003-07-06 Jesper Harder <harder@ifa.au.dk> * message.el (message-send-mail-with-sendmail): Handle non-numeric return values. - * gnus-sum.el (gnus-print-buffer): Apply emphasis. - From Michael Piotrowski <mxp@dynalabs.de> (tiny change). - * gnus-start.el (gnus-clear-system): Revert change from 2003-06-19. @@ -2013,10 +2014,12 @@ 2003-06-20 Jesper Harder <harder@ifa.au.dk> + * spam.el (spam-spamoracle-learn): insert-string is obsolete. + +2003-06-20 Jan Rychter <jan@rychter.com> + * gnus-msg.el (gnus-configure-posting-styles): Remove unused - variable. From Jan Rychter <jan@rychter.com>. - - * spam.el (spam-spamoracle-learn): insert-string is obsolete. + variable. 2003-06-19 Teodor Zlatanov <tzz@lifelogs.com> @@ -2050,11 +2053,10 @@ * gnus-util.el (gnus-extract-address-components): Added doc-string. -2003-06-16 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> +2003-06-16 Michael Albinus <Michael.Albinus@alcatel.de> * nnml.el (nnml-current-group-article-to-file-alist): Don't read - overview when using compressed files. From Michael Albinus - <Michael.Albinus@alcatel.de>. + overview when using compressed files. 2003-06-16 Katsumi Yamaoka <yamaoka@jpl.org> @@ -2072,8 +2074,7 @@ * gnus-sum.el (gnus-summary-force-verify-and-decrypt): Bind `gnus-article-emulate-mime'. -2003-06-15 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> - From Tommi Vainikainen <thv+gnus@iki.fi>. +2003-06-15 Tommi Vainikainen <thv+gnus@iki.fi> * message.el (message-is-yours-p): New function. Separated common code from message-cancel-news and message-supersede. Added @@ -2081,10 +2082,10 @@ resort. (message-cancel-news, message-supersede): Use message-is-yours-p. -2003-06-13 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> +2003-06-13 Niklas Morberg <niklas.morberg@axis.com> * nnimap.el (nnimap-split-articles): Narrow the right buffer to - the headers. From Niklas Morberg <niklas.morberg@axis.com>. + the headers. 2003-06-12 Dave Love <fx@gnu.org> @@ -2101,9 +2102,7 @@ * spam.el (spam-check-bogofilter-headers): fix for when the score is requested but the message is not spam -2003-06-09 Teodor Zlatanov <tzz@lifelogs.com> - From Eric - <knauel@informatik.uni-tuebingen.de> +2003-06-09 Eric Knauel <knauel@informatik.uni-tuebingen.de> * spam.el (spam-use-spamoracle): new variable (spam-install-hooks): add spamoracle to the list of conditions @@ -2146,8 +2145,7 @@ * gnus-srvr.el (gnus-browse-foreign-server): Parse garbage NNTP groups correctly. -2003-06-06 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> - From Benjamin Rutt <rutt+news@cis.ohio-state.edu>. +2003-06-06 Benjamin Rutt <rutt+news@cis.ohio-state.edu>. * message.el (message-fetch-field): Augment documentation to state the narrowed-to-headers restriction. @@ -2173,11 +2171,9 @@ * rfc2047.el (rfc2047-encode-region): Don't error out on invalid strings. -2003-06-04 Jesper Harder <harder@ifa.au.dk> +2003-06-04 Ivan Boldyrev <boldyrev+nospam@cgitftp.uiggm.nsc.ru> (tiny change) * mml1991.el (mml1991-pgg-sign): Insert pgg output as unibyte. - From: Ivan Boldyrev <boldyrev+nospam@cgitftp.uiggm.nsc.ru> (tiny - change) 2003-06-03 Dave Love <fx@gnu.org> @@ -2204,11 +2200,10 @@ * message.el (message-fetch-field): Mention narrow-to-headers requirement. -2003-06-03 Jesper Harder <harder@ifa.au.dk> +2003-06-03 Eric Eide <eeide@cs.utah.edu> * gnus-xmas.el (gnus-xmas-create-image): Use - insert-file-contents-literally. From: Eric Eide - <eeide@cs.utah.edu> + insert-file-contents-literally. 2003-06-02 Teodor Zlatanov <tzz@lifelogs.com> @@ -2313,7 +2308,7 @@ * dgnushack.el (assq-delete-all): Removed the compiler macro. -2003-05-14 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-05-14 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agentize): Updated documentation to match usage. @@ -2326,7 +2321,7 @@ * gnus.el (gnus-version-number): Bump. -2003-05-14 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-05-14 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Gnus v5.10.2 is released. @@ -2385,7 +2380,7 @@ in message. Suggested by Yoichi NAKAYAMA <yoichi@geiin.org>. * pop3.el (pop3-movemail): Ditto. -2003-05-12 Colin Marquardt <c.marquardt@alcatel.de> (tiny change) +2003-05-12 Colin Marquardt <c.marquardt@alcatel.de> (tiny change) * gnus.el (gnus-agent): Docstring fix. @@ -2397,7 +2392,7 @@ (gnus-registry-add-group): add a modification timestamp to each entry (gnus-registry-install-hooks): new function -2003-05-12 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-05-12 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-cat-name): Eval macro while compiling. (gnus-agent-cat-disable-undownloaded-faces): New function. @@ -2495,13 +2490,15 @@ * gnus-registry.el (gnus-registry-cache-file): new file variable (gnus-registry-cache-read, gnus-registry-cache-save): new functions - (gnus-registry-cache-whitespace): new function. From Dan - Christensen <jdc@chow.mat.jhu.edu> (gnus-registry-save, gnus-registry-read): use the new gnus-registry-cache-{read|save} functions, and change the name from gnus-registry-translate-{from|to}-alist (gnus-registry-clear): fixed so it doesn't refer to old function name +2003-05-09 Dan Christensen <jdc@chow.mat.jhu.edu> + + * gnus-registry.el (gnus-registry-cache-whitespace): new function. + 2003-05-09 Jesper Harder <harder@ifa.au.dk> * gnus-picon.el (gnus-picon-transform-address): Parse the encoded @@ -2516,8 +2513,9 @@ nnmail-split-fancy-with-parent-ignore-groups can be a single regex in addition to a list of regexes. - * spam.el (spam-use-regex-headers): docstring fix. From Niklas - Morberg <niklas.morberg@axis.com> +2003-05-08 Niklas Morberg <niklas.morberg@axis.com> + + * spam.el (spam-use-regex-headers): docstring fix. 2003-05-08 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> @@ -2588,7 +2586,7 @@ * mm-bodies.el (mm-decode-coding-region-safely): Remove. (mm-decode-body): Don't use mm-decode-coding-region-safely. -2003-05-03 Vasily Korytov <deskpot@despammed.com> (tiny change) +2003-05-03 Vasily Korytov <deskpot@despammed.com> (tiny change) * gnus-util.el (gnus-multiple-choice): Add ", ?". @@ -2705,13 +2703,13 @@ * gnus.el (gnus-version-number): Bump. -2003-05-01 Teodor Zlatanov <tzz@lifelogs.com> - - * spam-report.el (spam-report-gmane-regex): docstring fix. From - Jon Ericson <Jon.Ericson@jpl.nasa.gov> (tiny change) +2003-05-01 Jon Ericson <Jon.Ericson@jpl.nasa.gov> (tiny change) + + * spam-report.el (spam-report-gmane-regex): docstring fix. * gnus.el (gnus-install-group-spam-parameters): docstring fix. - From Jon Ericson <Jon.Ericson@jpl.nasa.gov> (tiny change) + +2003-05-01 Teodor Zlatanov <tzz@lifelogs.com> * gnus-registry.el (gnus-registry-fetch-extra) (gnus-registry-store-extra, gnus-registry-group-count): new functions @@ -2719,11 +2717,11 @@ (gnus-registry-add-group): changed to work with extra data element if present -2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Gnus v5.10.1 is released. -2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.24 is released. @@ -2742,7 +2740,7 @@ * gnus.el: Update copyright for several files. -2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.23 is released. @@ -2750,7 +2748,7 @@ * spam-stat.el (spam-stat-test-directory): Compare against zero. -2003-05-01 Trey Jackson <tjackson@ichips.intel.com> (tiny change) +2003-05-01 Trey Jackson <tjackson@ichips.intel.com> (tiny change) * spam-stat.el (spam-stat-test-directory): Skip 0 length files. @@ -2767,11 +2765,11 @@ * gnus.el (gnus-version-number): Bump. -2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.22 is released. -2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.21 is released. @@ -2779,7 +2777,7 @@ * gnus.el (gnus-version-number): Bump. -2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.20 is released. @@ -2872,7 +2870,7 @@ * mm-util.el (mm-charset-to-coding-system): Use user specified charset unless coding-system-get is fboundp. -2003-04-30 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-04-30 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-cat-defaccessor, gnus-agent-cat-name): Wrapped in eval-when-compile. @@ -2978,7 +2976,7 @@ (gnus-mime-display-multipart-related-as-mixed): Added doc-strings, allow customization. -2003-04-27 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-04-27 Kevin Greiner <kgreiner@xpediantsolutions.com> * dgnushack.el (dgnushack-compile-verbosely): New function. Not currently called (See source for explanation). @@ -2991,11 +2989,11 @@ * gnus.el (gnus-version-number): Bump. -2003-04-27 06:47:31 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-04-27 06:47:31 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.19 is released. -2003-04-27 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-04-27 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-registry.el (gnus-register-spool-action): Replaced literal carriage-return character with its escape sequence. @@ -3141,11 +3139,10 @@ * smime.el (smime-decrypt-region): Insert From header. -2003-04-21 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> +2003-04-21 Gaute B Strokkenes <gs234@cam.ac.uk> (tiny change) * gnus-fun.el (gnus-face-from-file, gnus-convert-png-to-face): - Max length of header is 726, not 740. From Gaute B Strokkenes - <gs234@cam.ac.uk>. + Max length of header is 726, not 740. 2003-04-20 Jesper Harder <harder@ifa.au.dk> @@ -3270,7 +3267,7 @@ (spam-summary-prepare-exit): check the report-gmane spam processor and run spam-report-gmane-register-routine if it's active - From John Wiegley <johnw@gnu.org> +2003-04-16 John Wiegley <johnw@gnu.org> * spam.el (spam-bogofilter-score): check bogofilter headers before checking bogofilter itself @@ -3303,7 +3300,7 @@ * nndiary.el (nndiary-compute-reminders): Don't use setf with nthcdr. -2003-04-16 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-04-16 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-make-cat): Added optional parameter to specify a predicate other than false. @@ -3321,13 +3318,11 @@ * spam.el (spam-split): added save-restriction to save-excursion -2003-04-15 Reiner Steib <Reiner.Steib@gmx.de> - From Julien Avarre <julien@avarre.com> +2003-04-15 Julien Avarre <julien@avarre.com> * gnus-fun.el: Fixed autoload cookie. -2003-04-15 Paul Jarc <prj@po.cwru.edu> - From Remi Letot <remi.letot@easynet.be> +2003-04-15 Remi Letot <remi.letot@easynet.be> * nnmaildir.el (nnmaildir-request-scan): Use gnus-remove-if instead of remove-if. @@ -3381,7 +3376,7 @@ * gnus.el (gnus-group-prefixed-name): Clean up. -2003-04-13 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-04-13 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-group-pathname): Bind gnus-command-method so that gnus-agent-directory will always @@ -3397,7 +3392,7 @@ * gnus.el (gnus-version-number): Bump. -2003-04-13 01:12:01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-04-13 01:12:01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.18 is released. @@ -3452,7 +3447,7 @@ (mm-encode-body): Don't corrupt UTF-16. (mm-body-encoding): Pay attention to mm-body-charset-encoding-alist. -2003-04-10 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-04-10 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-get-undownloaded-list): Articles in the CACHE are now detected and handled the same as an article @@ -3478,7 +3473,7 @@ * gnus-sum.el (gnus-summary-make-menu-bar): Disable "Import file" and "Create article" items in non-editable groups. -2003-04-09 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-04-09 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-write-active): Added option of replacing, rather than updating, the agent's active file. Do NOT @@ -3591,7 +3586,7 @@ * gnus-sum.el: XEmacs doesn't support the 5th arg to 'load', so don't use it when loading gnus-sum.el if we're in XEmacs. -2003-04-05 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-04-05 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-start.el (gnus-gnus-to-quick-newsrc-format): Bound print-escape-nonascii to fix more characters in compiled format @@ -3602,7 +3597,7 @@ * gnus-audio.el (gnus-audio-au-player, gnus-audio-wav-player): Fix customization type. -2003-04-04 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-04-04 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-start.el (gnus-gnus-to-quick-newsrc-format): Bound print-quoted, print-readably, print-escape-multibyte, and @@ -3662,7 +3657,7 @@ * nntp.el (nntp-via-rlogin-command-switches): Doc fix. (nntp-open-via-rlogin-and-telnet): Disable the telnet linemode. -2003-03-31 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-03-31 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-start.el (gnus-gnus-to-quick-newsrc-format): Bound print-escape-newlines to print escape sequences rather than @@ -3685,7 +3680,7 @@ * gnus.el (gnus-version-number): Bump. -2003-03-31 20:08:19 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-03-31 20:08:19 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.17 is released. @@ -3768,20 +3763,24 @@ (gnus-read-newsrc-el-file): call the gnus-read-newsrc-el-hook * gnus-registry.el (gnus-registry-translate-to-alist) - (gnus-registry-translate-from-alist, alist-to-hashtable) - (hashtable-to-alist): new functions + (gnus-registry-translate-from-alist: new functions (gnus-register-spool-action): add a spool item to the registry * gnus.el (gnus-variable-list): added gnus-registry-alist to the list of saved variables (gnus-registry-alist): new variable +2003-03-28 Andreas Fuchs <asf@void.at> + + * gnus-registry.el (alist-to-hashtable, hashtable-to-alist): New + functions. + 2003-03-27 Simon Josefsson <jas@extundo.com> * gnus-art.el (article-decode-group-name): Be correct instead of smart. -2003-03-27 Katsumi Yamaoka <yamaoka@jpl.org> +2003-03-27 Katsumi Yamaoka <yamaoka@jpl.org> * lpath.el: Bind url-current-object for Emacs; bind gnus-agent-expire-current-dirs for XEmacs; fbind open-ssl-stream @@ -3796,7 +3795,7 @@ * gnus-msg.el (gnus-mailing-list-groups): Fix customize type and doc string. -2003-03-26 Kevin Ryde <user42@zip.com.au> +2003-03-26 Kevin Ryde <user42@zip.com.au> * gnus-sum.el (gnus-summary-find-for-reselect): Renamed from gnus-summary-find-uncancelled, skip temporary articles inserted by @@ -3806,7 +3805,7 @@ * smiley.el (smiley-buffer): New function. -2003-03-26 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-03-26 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-fetch-selected-article): Replaced gnus-summary-update-line (which updated the article's face) with @@ -3814,7 +3813,7 @@ face by calling gnus-summary-update-line AND updates the download mark to show that the article was fetched). -2003-03-23 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-03-23 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-expire-unagentized-dirs): Provides option of deleting agent directories for groups/servers that are @@ -3879,7 +3878,7 @@ * gnus-art.el (gnus-treat-display-xface): Don't enable if icontopbm isn't available. -2003-03-21 Kevin Greiner <kgreiner@xpediantsolutions.com> +2003-03-21 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-int.el (gnus-open-server): Catch errors in backend's open-server method. Returns nil rather than crashing startup. @@ -3906,7 +3905,7 @@ * message.el (message-split-line): New function. (message-mode-map): Remap split-line to message-split-line. -2003-03-20 Katsumi Yamaoka <yamaoka@jpl.org> +2003-03-20 Katsumi Yamaoka <yamaoka@jpl.org> * message.el (message-make-overlay): Defalias it to make-overlay. (message-delete-overlay): Defalias it to delete-overlay. @@ -3930,7 +3929,7 @@ * nnrss.el (nnrss-fetch): Fetch the local stuff. (nnrss-check-group): Use it. -2003-03-20 Mark A. Hershberger <mah@everybody.org> +2003-03-20 Mark A. Hershberger <mah@everybody.org> * nnrss.el: Primitive XML Name-space support. This means that RSS feeds like Kevin Burton's[1] can now be read in Gnus. @@ -3957,7 +3956,7 @@ * gnus-group.el (gnus-group-make-rss-group): New function. -2003-03-20 Katsumi Yamaoka <yamaoka@jpl.org> +2003-03-20 Katsumi Yamaoka <yamaoka@jpl.org> * message.el (message-idna-to-ascii-rhs-1): Don't use replace-* for highlight overlays. @@ -4054,7 +4053,7 @@ * gnus.el (gnus-version-number): Bump. -2003-03-18 00:38:22 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-03-18 00:38:22 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.16 is released. @@ -4511,7 +4510,6 @@ * spam.el: Fix typo. 2003-03-01 Satyaki Das <satyaki@theforce.stanford.edu> - (Trivial patch.) * pgg-gpg.el (pgg-gpg-process-region): Insert process status into errors-buffer. This produces a nicer error message in case of @@ -4535,7 +4533,7 @@ * message.el (message-make-fqdn): Protect against nil user-mail. -2003-02-28 Vasily Korytov <deskpot@myrealbox.com> +2003-02-28 Vasily Korytov <deskpot@myrealbox.com> * gnus-art.el (gnus-boring-article-headers): New values: 'to-list and 'cc-list. @@ -4617,10 +4615,11 @@ * gnus-start.el (gnus-backup-startup-file): Fixed custom type. -2003-02-24 Ted Zlatanov <tzz@lifelogs.com> +2003-02-24 Ted Zlatanov <tzz@lifelogs.com> + * spam.el: disabled spam-get-article-as-filename - From Michael Shields <shields@msrl.com> +2003-02-24 Michael Shields <shields@msrl.com> * gnus-group.el (gnus-group-is-exiting-without-update-p): New. * gnus-sum.el (gnus-summary-exit-no-update): Use it. @@ -4634,8 +4633,7 @@ no spam. * spam.el (spam-ham-move-routine): New `copy' argument. -2003-02-24 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> - From Martin Thornquist <martint@ifi.uio.no> +2003-02-24 Martin Thornquist <martint@ifi.uio.no> * gnus-topic.el (gnus-topic-select-group): Select last group if after last group. @@ -4752,16 +4750,19 @@ * gnus-start.el (gnus-get-unread-articles-in-group): Make sure the entry for the group exists before we alter it. +2003-02-22 David S Goldberg <david.goldberg6@verizon.net> (tiny change) + + * message.el (message-mode): MML tags separate paragraphs. + 2003-02-22 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> - * message.el (message-mode): MML tags separate paragraphs. Small - change from David S Goldberg <david.goldberg6@verizon.net>. - * gnus-agent.el (gnus-agent-get-undownloaded-list): Sort `gnus-newsgroup-headers'. +2003-02-22 Karl Pfl,Ad(Bsterer <sigurd@12move.de> + * gnus-art.el (gnus-article-refer-article): Grok more message id - formats. From Karl Pfl,Ad(Bsterer <sigurd@12move.de>. + formats. 2003-02-22 Jesper Harder <harder@ifa.au.dk> @@ -4778,8 +4779,7 @@ (gnus-register-spool-action): added hashtable of message ID keys with message motion data -2003-02-21 Florian Weimer <fw@deneb.enyo.de> - From Reiner Steib <Reiner.Steib@gmx.de>. +2003-02-21 Reiner Steib <Reiner.Steib@gmx.de> * gnus-art.el (gnus-button-mid-or-mail-heuristic-alist): New variable, used in `gnus-button-mid-or-mail-heuristic'. @@ -4909,11 +4909,11 @@ (spam-mark-spam-as-expired-and-move-routine): made the article move conditional, so it's not called even if there's nothing to move -2003-02-13 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2003-02-13 Kurt B. Kaiser <kbk@shore.net> * message.el (message-unix-mail-delimiter): Accept any whitespace after the email address and before the date; do not require the - space character. From Kurt B. Kaiser <kbk@shore.net>. + space character. 2003-02-13 Katsumi Yamaoka <yamaoka@jpl.org> @@ -5021,7 +5021,7 @@ * gnus.el (gnus-version-number): Bumped. -2003-02-08 23:23:27 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-02-08 23:23:27 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.15 is released. @@ -5036,8 +5036,9 @@ * gnus-sum.el (gnus-summary-select-article): Remove blink removal code that only worked under Emacs. - * pgg-gpg.el (pgg-gpg-process-region): Don't blink. From Satyaki - Das <satyaki@chicory.stanford.edu>. +2003-02-08 Satyaki Das <satyaki@chicory.stanford.edu> + + * pgg-gpg.el (pgg-gpg-process-region): Don't blink. 2003-02-08 Jesper Harder <harder@ifa.au.dk> @@ -5367,7 +5368,7 @@ * gnus.el (gnus-version-number): Bumped. -2003-01-24 20:32:44 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-01-24 20:32:44 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.14 is released. @@ -5491,7 +5492,7 @@ * gnus.el (gnus-version-number): Bumped version number. -2003-01-21 07:15:41 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-01-21 07:15:41 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.13 is released. @@ -5672,7 +5673,7 @@ * gnus-audio.el (gnus-audio-au-player): Use executable-find. -2003-01-13 Jhair Tocancipa Triana <jhair_tocancipa@@gmx.net> +2003-01-13 Jhair Tocancipa Triana <jhair_tocancipa@@gmx.net> * gnus-audio.el (gnus-audio-au-player, gnus-audio-wav-player): Use /usr/bin/play as default player. @@ -5754,7 +5755,7 @@ * gnus.el (gnus-version-number): Bumped version. (gnus-summary-line-format): Doc fix. -2003-01-12 22:02:49 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-01-12 22:02:49 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.12 is released. @@ -5801,7 +5802,7 @@ * gnus.el (gnus-version-number): Bumped version number. -2003-01-12 13:46:20 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-01-12 13:46:20 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.11 is released. @@ -6277,7 +6278,7 @@ * gnus.el (gnus-version-number): Bump version number. -2003-01-05 01:53:30 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-01-05 01:53:30 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.10 is released. @@ -6285,7 +6286,7 @@ * gnus.el (gnus-version-number): Fix version number. -2003-01-05 01:40:09 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2003-01-05 01:40:09 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.08 is released. @@ -6789,11 +6790,10 @@ * binhex.el (binhex-decoder-program): Fix docstring. -2002-12-21 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-12-21 Laurent Martelli <laurent@bearteam.org> * mm-decode.el (mm-mailcap-command): Do not backslash-quote special chars if the mailcap file uses single quotes around %s. - From Laurent Martelli <laurent@bearteam.org>. 2002-12-19 Paul Jarc <prj@po.cwru.edu> @@ -6834,7 +6834,7 @@ * nntp.el (nntp-with-open-group-first-pass): Do not wrap in eval-when-compile. Suggested by Kevin Greiner. -2002-12-13 Kevin Greiner <kgreiner@xpediantsolutions.com> +2002-12-13 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-max-fetch-size): New, defcustom. (gnus-agent-fetch-headers): Initialize gnus-agent-overview-buffer @@ -6846,13 +6846,13 @@ Multiple chunks in the same group may perform arbitrarily large updates. -2002-12-12 Kevin Greiner <kgreiner@xpediantsolutions.com> +2002-12-12 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-fetch-selected-article): Added call to gnus-summary-update-download-mark to update the article in the summary. -2002-12-11 Kevin Greiner <kgreiner@xpediantsolutions.com> +2002-12-11 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus.el (gnus-summary-high-uncached-face, gnus-summary-normal-uncached-face, gnus-summary-low-uncached-face) @@ -7070,7 +7070,7 @@ * gnus-sum.el (gnus-summary-insert-old-articles): No longer passes compressed range to gnus-summary-insert-articles. -2002-11-26 Kevin Ryde <user42@zip.com.au> +2002-11-26 Kevin Ryde <user42@zip.com.au> * gnus-art.el (gnus-mime-copy-part): Look for filename parameter under content-disposition, not content-type. @@ -7108,7 +7108,7 @@ * gnus-agent.el (gnus-agent-check-overview-buffer): Make debugger print message on entry. - From Kevin Greiner <kgreiner@xpediantsolutions.com>. +2002-11-25 Kevin Greiner <kgreiner@xpediantsolutions.com>. * gnus-range.el (gnus-range-difference): New function. * gnus-sum.el (gnus-summary-insert-old-articles): Use it. @@ -7119,8 +7119,7 @@ gnus-remove-from-range instead of gnus-range-difference which doesn't exist. -2002-11-23 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> - From Kevin Greiner <kgreiner@xpediantsolutions.com>. +2002-11-23 Kevin Greiner <kgreiner@xpediantsolutions.com> * gnus-agent.el (gnus-agent-downloaded-article-face): New face, used for showing which articles have been downloaded. @@ -7230,7 +7229,7 @@ * nnimap.el (nnimap-request-expire-articles): Compress sequence before storing \Deleted mark on expired articles. -2002-11-17 Shenghuo Zhu <zsh@cs.rochester.edu> +2002-11-17 Shenghuo Zhu <zsh@cs.rochester.edu> Trivial patch from Markus Rost <rost@math.ohio-state.edu> * gnus-sum.el (gnus-summary-goto-unread): Doc fix - escape open @@ -7320,19 +7319,18 @@ * gnus-group.el (gnus-group-delete-group): gnus-cache-active-hashtb might be void. -2002-11-02 Simon Josefsson <jas@extundo.com> +2002-11-02 Raymond Scholz <ray-2002@zonix.de> * pgg-gpg.el (pgg-gpg-encrypt-region): Makes PGG respect the - setting of the default user ID. From Raymond Scholz - <ray-2002@zonix.de>. + setting of the default user ID. 2002-11-01 Jesper Harder <harder@ifa.au.dk> * mm-bodies.el (mm-body-encoding): Don't return 8bit for 7bit charset. -2002-10-31 Ted Zlatanov <tzz@lifelogs.com> - From Alex Schroeder <alex@emacswiki.org> +2002-10-31 Alex Schroeder <alex@emacswiki.org> + * spam-stat.el (spam-stat-process-directory): add dir to message (spam-stat-reduce-size): No longer remove words with values close to 0.5, because the default value is 0.2. @@ -7395,8 +7393,7 @@ * mml.el (mml-mode-map): Fixed keybindings for mml-secure-* functions. -2002-10-28 Katsumi Yamaoka <yamaoka@jpl.org> - From mah@everybody.org (Mark A. Hershberger). +2002-10-28 Mark A. Hershberger <mah@everybody.org> * mm-url.el (mm-url-insert-file-contents): Make it return the same type values ("url" size) regardless of the values of @@ -7644,7 +7641,7 @@ * gnus-spec.el (gnus-pad-form): Use gnus-string-width-function. -2002-10-11 Ted Zlatanov <tzz@lifelogs.com> +2002-10-11 Ted Zlatanov <tzz@lifelogs.com> * spam.el (spam-check-ifile): added ifile as a spam checking backend, and spam-use-ifle as the variable to toggle that check. @@ -7654,7 +7651,7 @@ * message.el (message-beginning-of-line): New variable. (message-beginning-of-line): Use it. -2002-10-11 Ted Zlatanov <tzz@lifelogs.com> +2002-10-11 Ted Zlatanov <tzz@lifelogs.com> * spam.el: more compilation fixes for BBDB @@ -7690,7 +7687,7 @@ (mml2015-unabbrev-trust-alist): New. (mml2015-gpg-extract-signature-details): Use it. -2002-10-10 Ted Zlatanov <tzz@lifelogs.com> +2002-10-10 Ted Zlatanov <tzz@lifelogs.com> * spam.el: compilation fixes, spam-check-bbdb function is nil if no BBDB installed @@ -7818,7 +7815,7 @@ * pgg.el, pgg-gpg.el, pgg-pgp5.el: Don't depend on luna.el. -2002-09-29 Daiki Ueno <ueno@unixuser.org> +2002-09-29 Daiki Ueno <ueno@unixuser.org> * pgg.el: Remove dependency on calist.el. @@ -7859,13 +7856,12 @@ * message.el (message-required-mail-headers): Remove Lines:. -2002-10-03 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Jesper Harder. +2002-10-03 Jesper Harder <harder@ifa.au.dk> * gnus-group.el (gnus-group-fetch-charter, gnus-group-fetch-control): Prompt for group if given a prefix argument. - * gnus-sum.el (t): Add gnus-group-fetch-charter and + * gnus-sum.el: Add gnus-group-fetch-charter and gnus-group-fetch-control to summary key map and menu. 2002-10-03 Paul Jarc <prj@po.cwru.edu> @@ -7880,13 +7876,12 @@ (gnus-agent-fetch-selected-article): New function for gnus-select-article-hook or gnus-mark-article-hook. -2002-10-02 Katsumi Yamaoka <yamaoka@jpl.org> - From Peter von der Ahe <nospam2159@daimi.au.dk>. +2002-10-02 Peter von der Ahe <nospam2159@daimi.au.dk> * gnus-ems.el (gnus-x-splash): Set coding-system-for-read to raw-text. -2002-09-30 Ted Zlatanov <tzz@lifelogs.com> +2002-09-30 Ted Zlatanov <tzz@lifelogs.com> * spam.el: merged changes from pinard@iro.umontreal.ca (Fran,Ag(Bois Pinard). @@ -7927,8 +7922,7 @@ * nnimap.el (nnimap-fixup-unread-after-getting-new-news): Remove. -2002-09-27 Katsumi Yamaoka <yamaoka@jpl.org> - From Mats Lidell <matsl@contactor.se>. +2002-09-27 Mats Lidell <matsl@contactor.se> * gnus-art.el (gnus-article-mode-syntax-table): Replace "-" to " ". @@ -8079,20 +8073,19 @@ * nnmaildir.el (nnmaildir--grp-add-art): fix minimum article number when article 1 does not exist. -2002-09-25 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-09-25 Reiner Steib <Reiner.Steib@gmx.de> * gnus-art.el (gnus-button-handle-apropos-variable): Fall back to apropos if apropos-variable does not exist. (gnus-button-guessed-mid-regexp) (gnus-button-handle-describe-prefix, gnus-button-alist): Better - regexes. From Reiner Steib. + regexes. (gnus-button-handle-describe-function) - (gnus-button-handle-describe-variable): Doc fix. From Reiner Steib. + (gnus-button-handle-describe-variable): Doc fix. (gnus-button-handle-describe-key, gnus-button-handle-apropos) - (gnus-button-handle-apropos-command): Doc fix. From Reiner Steib. - -2002-09-25 Mark A. Hershberger <mah@everybody.org> - Trivial patch. + (gnus-button-handle-apropos-command): Doc fix. + +2002-09-25 Mark A. Hershberger <mah@everybody.org> (tiny change) * nnrss.el (nnrss-save-server-data): Save nnrss-group-alist in the file. @@ -8114,22 +8107,19 @@ (mml2015-pgg-encrypt): New functions. (defvar, autoload): Prevent byte-compile warnings. -2002-09-24 Katsumi Yamaoka <yamaoka@jpl.org> - From TSUCHIYA Masatoshi <tsuchiya@namazu.org>. +2002-09-24 TSUCHIYA Masatoshi <tsuchiya@namazu.org>. * gnus-art.el (article-strip-banner): Check for the existence of from header. -2002-09-23 Kai Gro,b_(Bjohann <grossjoh@ls6.informatik.uni-dortmund.de> +2002-09-23 Reiner Steib <Reiner.Steib@gmx.de> * gnus-art.el (gnus-button-guessed-mid-regexp): Improved regexp. (gnus-button-alist): Improved regexp for gnus-button-handle-mid-or-mail (false positives), fixed gnus-button-handle-man entries. - From Reiner Steib. - -2002-09-23 Paul Jarc <prj@po.cwru.edu> - From Josh Huber. + +2002-09-23 Josh Huber <huber@alum.wpi.edu> * nnmaildir.el (nnmaildir--update-nov): fix wrong-type error when nnmail-extra-headers is non-nil. @@ -8158,8 +8148,7 @@ * gnus-sum.el (gnus-summary-next-group): Switch to the summary buffer. -2002-09-20 Kai Gro,b_(Bjohann <grossjoh@ls6.informatik.uni-dortmund.de> - From Reiner Steib. +2002-09-20 Reiner Steib <Reiner.Steib@gmx.de> * gnus-art.el (gnus-button-handle-custom, gnus-button-handle-mid-or-mail, @@ -8185,10 +8174,10 @@ * message.el (message-completion-alist): Add Reply-To, From, etc. -2002-09-18 Simon Josefsson <jas@extundo.com> +2002-09-18 Nevin Kapur <nevin@jhu.edu> * nnimap.el (nnimap-request-expire-articles): Make flag setting - conditional. From Nevin Kapur <nevin@jhu.edu>. + conditional. 2002-09-17 Simon Josefsson <jas@extundo.com> @@ -8198,8 +8187,7 @@ when articles are found. Suggested by Nevin Kapur <nevin@jhu.edu>. -2002-09-17 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Reiner Steib <reiner.steib@gmx.de>. +2002-09-17 Reiner Steib <Reiner.Steib@gmx.de> * message.el (message-strip-subject-trailing-was) (message-change-subject, message-add-archive-header) @@ -8252,8 +8240,7 @@ * gnus-sum.el (gnus-summary-next-group): Semi-exit only when needed. -2002-09-12 Katsumi Yamaoka <yamaoka@jpl.org> - From John Paul Wallington <jpw@shootybangbang.com>. +2002-09-12 John Paul Wallington <jpw@shootybangbang.com>. * gnus.el (gnus-visual, gnus-meta): Fix typo. @@ -8267,8 +8254,7 @@ (nnimap-split-rule): Doc fix. (nnimap-request-expire-articles): Cleanup code. -2002-09-11 Katsumi Yamaoka <yamaoka@jpl.org> - From TSUCHIYA Masatoshi <tsuchiya@namazu.org>. +2002-09-11 TSUCHIYA Masatoshi <tsuchiya@namazu.org>. * gnus-art.el (gnus-article-address-banner-alist): New option. (article-strip-banner): Refer the above option to split banners of @@ -8348,10 +8334,10 @@ * gnus-util.el (gnus-frame-or-window-display-name): Exclude invalid display names. -2002-08-30 Simon Josefsson <jas@extundo.com> +2002-08-30 Reiner Steib <Reiner.Steib@gmx.de> * gnus-group.el (gnus-group-fetch-control): Fix typo in last - commit. From Reiner Steib <4uce.02.r.steib@gmx.net>. + commit. 2002-08-26 Jesper Harder <harder@ifa.au.dk> @@ -8362,10 +8348,9 @@ (gnus-group-fetch-control): New function. Add them to the keymap and menu. Require mm-url. -2002-08-30 Katsumi Yamaoka <yamaoka@jpl.org> +2002-08-30 Alex Schroeder <alex@emacswiki.org>. * gnus-mlspl.el (gnus-group-split-fancy): Doc fix. - From Alex Schroeder <alex@emacswiki.org>. 2002-08-29 Jesper Harder <harder@ifa.au.dk> @@ -8413,10 +8398,10 @@ * lpath.el: Fbind `frame-parameter', `make-frame-on-display', `device-connection' and `dfw-device'. -2002-08-22 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-08-22 Jochen Hein <jochen@jochen.org> (tiny change) * gnus-art.el (gnus-emphasis-alist): Strikethru had a lot of false - positives, make it stricter. From Jochen Hein (trivial change). + positives, make it stricter. 2002-08-21 Katsumi Yamaoka <yamaoka@jpl.org> @@ -8433,8 +8418,7 @@ * lpath.el: Fbind w32-focus-frame and x-focus-frame. -2002-08-20 Katsumi Yamaoka <yamaoka@jpl.org> - From $B>.4X(B $B5HB'(B (KOSEKI Yoshinori) <kose@meadowy.org>. +2002-08-20 $B>.4X(B $B5HB'(B (KOSEKI Yoshinori) <kose@meadowy.org>. * message.el (message-set-auto-save-file-name): Add support for the Cygwin Emacs; the system-type is `cygwin'. @@ -8544,7 +8528,7 @@ * gnus.el (gnus-version-number): Bumped version number. -2002-08-04 01:48:57 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2002-08-04 01:48:57 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.07 is released. @@ -8556,18 +8540,17 @@ (gnus-article-sort-by-random): New function. (gnus-thread-sort-by-random): New function. -2002-08-02 Simon Josefsson <jas@extundo.com> +2002-08-02 Scott A Crosby <scrosby@cs.rice.edu> * gnus-logic.el (gnus-advanced-integer): Swap arguments in - funcall. From Scott A Crosby <scrosby@cs.rice.edu>. + funcall. 2002-07-31 Danny Siu <dsiu@adobe.com> * nnimap.el (nnimap-split-articles): do not call nnmail-fetch-field when splitting malformed messages without message-id -2002-07-28 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Niklas Morberg <niklas.morberg@axis.com>. +2002-07-28 Niklas Morberg <niklas.morberg@axis.com>. * nnweb.el (nnweb-type, nnweb-type-definition) (nnweb-gmane-create-mapping, nnweb-gmane-wash-article) @@ -8611,21 +8594,18 @@ nnmail-expiry-target to 'delete, so that absolute deletion happens when absolute deletion is requested. -2002-07-21 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Nevin Kapur <nevin@jhu.edu>. +2002-07-21 Nevin Kapur <nevin@jhu.edu>. * nnmail.el (nnmail-fancy-expiry-target): Treat nonexisting headers as empty headers. -2002-07-21 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Jochen Hein <jochen@jochen.org>. +2002-07-21 Jochen Hein <jochen@jochen.org>. * gnus-art.el (gnus-emphasis-alist): Add strikethrough and correct typo. (gnus-emphasis-strikethru): New face. -2002-07-20 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Jason Merrill <jason@redhat.com>. +2002-07-20 Jason Merrill <jason@redhat.com>. * nnfolder.el (nnfolder-retrieve-headers): Avoid searching the entire file for each of a sequence of missing articles. @@ -8636,8 +8616,7 @@ * gnus-sum.el (gnus-summary-insert-new-articles): Count down to avoid nreverse. -2002-07-14 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Ted Zlatanov <teodor.zlatanov@divine.com>. +2002-07-14 Ted Zlatanov <teodor.zlatanov@divine.com> * gnus-sum.el (gnus-auto-expirable-marks): Remove `spam'. (gnus-summary-mode-line-format-alist): Add %h for number of @@ -8652,25 +8631,24 @@ (gnus-mark-article-as-read, gnus-mark-article-as-unread) (gnus-mark-article-as-unread, gnus-summary-catchup): Grok spam. -2002-07-10 Simon Josefsson <jas@extundo.com> +2002-07-10 KANEMATSU Daiji <kdaiji@bea.com> * nnimap.el (nnimap-split-to-groups): Allow group string to be a - function. From KANEMATSU Daiji <kdaiji@bea.com>. + function. 2002-07-09 Nevin Kapur <nevin@jhu.edu> * gnus-sum.el (gnus-summary-delete-article): Respect group parameters while expiring. -2002-07-08 Simon Josefsson <jas@extundo.com> - - * gnus-art.el (article-make-date-line): Fix string. From Henrik - Enberg. - -2002-07-08 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-07-08 Henrik Enberg <henrik@enberg.org> + + * gnus-art.el (article-make-date-line): Fix string. + +2002-07-08 Niklas Morberg <niklas.morberg@axis.com> * gnus-art.el (article-unsplit-urls): Only display MIME when this - function is called interactively. From Niklas Morberg. + function is called interactively. 2002-07-06 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -8692,10 +8670,10 @@ * nnmail.el (nnmail-split-methods): fix custom type. -2002-07-02 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-07-02 Niklas Morberg <niklas.morberg@axis.com> * gnus-art.el (article-unsplit-urls): Keep URL buttonized after - unsplitting. From Niklas Morberg <niklas.morberg@axis.com>. + unsplitting. 2002-07-01 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> @@ -8707,13 +8685,12 @@ * nntp.el (nntp-via-rlogin-command-switches): New variable. (nntp-open-via-rlogin-and-telnet): Re-revert; use the var above. -2002-06-28 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-06-28 Katsumi Yamaoka <yamaoka@jpl.org> * message.el (message-font-lock-keywords): Don't fontify headers in the message body, only in the header. (message-font-lock-make-header-matcher): New function, used by message-font-lock-keywords. - From Katsumi Yamaoka <yamaoka@jpl.org>. 2002-06-28 Katsumi Yamaoka <yamaoka@jpl.org> @@ -8766,24 +8743,22 @@ (last, coerce, subseq): Remove compiler macros for those built-in or unused functions. -2002-06-17 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-06-17 Simon Josefsson <jas@extundo.com> * gnus-start.el (gnus-clear-system, gnus-read-newsrc-file): Make sure to write byte-compiled versions of gnus-*-format-alist to - .newsrc.eld. From Simon Josefsson. - -2002-06-16 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> + .newsrc.eld. + +2002-06-16 Bj,Ax(Brn Mork <bmork@dod.no> * gnus-agent.el (gnus-agent-read-servers) (gnus-agent-write-servers): Put server name (string like "nnchoke:frumple") in the file instead of a server specification (Lisp expression like (nnchoke "frumple" ...parameters...)). - From Bj,Ax(Brn Mork <bmork@dod.no>. - -2002-06-16 Simon Josefsson <jas@extundo.com> - - * gnus-cache.el (gnus-cache-remove-article): n is &optional. From - Reiner Steib <4uce.02.r.steib@gmx.net>. + +2002-06-16 Reiner Steib <Reiner.Steib@gmx.de> + + * gnus-cache.el (gnus-cache-remove-article): n is &optional. 2002-06-15 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -8819,8 +8794,10 @@ * gnus-int.el (gnus-request-move-article): Agent expire article if successfuly moved. +2002-06-11 Niklas Morberg <niklas.morberg@axis.com> + * nnweb.el (nnweb-google-create-mapping): Honors the value of - nnweb-max-hits. From Niklas Morberg <niklas.morberg@axis.com>. + nnweb-max-hits. 2002-06-10 Simon Josefsson <jas@extundo.com> @@ -8869,11 +8846,10 @@ * nnmail.el (nnmail-mail-splitting-decodes): New variable. (nnmail-article-group): Use it. -2002-05-30 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-05-30 Jesper Harder <harder@ifa.au.dk> * gnus-msg.el (gnus-inews-yank-articles): Merge split header lines - so that code reading them won't be surprised. From Jesper Harder - <harder@ifa.au.dk>. + so that code reading them won't be surprised. 2002-05-29 Simon Josefsson <jas@extundo.com> @@ -8890,11 +8866,10 @@ * gnus-group.el (gnus-group-line-format): Doc fix. -2002-05-28 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-05-28 Jesper Harder <harder@ifa.au.dk> * gnus-msg.el (gnus-inews-yank-articles): Unfold headers of - original article before yanking. From Jesper Harder - <harder@ifa.au.dk>. + original article before yanking. 2002-05-26 Simon Josefsson <jas@extundo.com> @@ -8920,22 +8895,23 @@ (gnus-summary-prepare-threads): Avoid simplifying every Subject twice by saving the simplified subject string in simp-subject. -2002-05-23 Simon Josefsson <jas@extundo.com> - - * gnus-msg.el (gnus-confirm-mail-reply-to-news): Typo. Trivial - change from Benjamin Rutt <rutt+news@cis.ohio-state.edu>. - - * nnweb.el (nnweb-type): Remove dejanewsold. Trivial change from - Niklas Morberg <niklas.morberg@axis.com>. +2002-05-23 Benjamin Rutt <rutt+news@cis.ohio-state.edu> (tiny change) + + * gnus-msg.el (gnus-confirm-mail-reply-to-news): Typo. + +2002-05-23 Niklas Morberg <niklas.morberg@axis.com> (tiny change) + + * nnweb.el (nnweb-type): Remove dejanewsold. 2002-05-22 Simon Josefsson <jas@extundo.com> * sieve.el (sieve-change-region): Define it before it is used. +2002-05-22 Benjamin Rutt <rutt+news@cis.ohio-state.edu> + * gnus-msg.el (gnus-confirm-mail-reply-to-news) (gnus-summary-reply): Ask for confirmation when replying to news. - Defaults to not ask. From Benjamin Rutt - <rutt+news@cis.ohio-state.edu>. + Defaults to not ask. * nnimap.el (nnimap-nov-is-evil): Improve doc. @@ -8990,10 +8966,13 @@ * nnmail.el (nnmail-cache-insert): Change group to required, removed code which tried to figure out the group. -2002-05-13 Josh Huber <huber@alum.wpi.edu> +2002-05-13 Hans de Graaff <hans@degraaff.org> * mml.el (mml-generate-mime-1): Fix mml generation for signed only - messages. From Hans de Graaff <hans@degraaff.org>. + messages. + +2002-05-13 Josh Huber <huber@alum.wpi.edu> + * nnml.el (nnml-request-accept-article): Pass in the group name to nnmail-cache-insert, since it's available. @@ -9001,8 +8980,7 @@ * nndoc.el (nndoc-mime-digest-type-p): Set proper file-end. -2002-05-08 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Florian Weimer <fw@deneb.enyo.de>. +2002-05-08 Florian Weimer <fw@deneb.enyo.de> * gnus.el (subscribed): New group parameter. (gnus-find-subscribed-addresses): Use it. @@ -9022,16 +9000,15 @@ parenthesis for "<" and ">". Suggested by Andreas Schwab <schwab@suse.de>. -2002-05-07 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-05-07 Josh Huber <huber@alum.wpi.edu> * nnmail.el (nnmail-cache-insert): Prefer group-art over group - when intuiting the group the message is written to. From Josh - Huber <huber@alum.wpi.edu>. - -2002-05-06 Simon Josefsson <jas@extundo.com> + when intuiting the group the message is written to. + +2002-05-06 Matt Armstrong <matt@lickey.com> * gnus-topic.el (gnus-group-topic-parameters): Work when group - buffer doesn't show group. From Matt Armstrong <matt@lickey.com>. + buffer doesn't show group. 2002-05-06 Josh Huber <huber@alum.wpi.edu> @@ -9078,7 +9055,7 @@ server. (nnimap-mailbox-info): defvar instead of defvoo. -2002-05-01 20:09:21 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2002-05-01 20:09:21 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.06 is released. @@ -9188,8 +9165,7 @@ * gnus-art.el (article-unsplit-urls): Allow trailing SPC. -2002-04-24 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Dan Christensen <jdc+news@uwo.ca>. +2002-04-24 Dan Christensen <jdc+news@uwo.ca> * nndoc.el (nndoc-type-alist, nndoc-lanl-gov-announce-type-p) (nndoc-transform-lanl-gov-announce, nndoc-generate-lanl-gov-head): @@ -9211,11 +9187,10 @@ (gnus-netrc-get, gnus-netrc-machine, gnus-parse-netrc): Aliased to new code in netrc.el. -2002-04-23 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-04-23 Matthieu Moy <Matthieu.Moy@imag.fr> * gnus-msg.el (gnus-summary-resend-message-edit): Remove - message-ignored-resent-headers, too. From Matthieu Moy - <Matthieu.Moy@imag.fr>. + message-ignored-resent-headers, too. 2002-04-22 Bj,Av(Brn Torkelsson <torkel@acc.umu.se> @@ -9280,8 +9255,7 @@ * message.el (message-gen-unsubscribed-mft): accept a prefix argument so CC can be included with C-u C-c C-f C-a -2002-04-17 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Ted Zlatanov <teodor.zlatanov@divine.com>. +2002-04-17 Ted Zlatanov <teodor.zlatanov@divine.com> * spam.el (spam-whitelist, spam-blacklist, spam-enter-whitelist): Improve docstring. @@ -9318,11 +9292,10 @@ * nnml.el (nnml-save-nov, nnml-generate-nov-file): * pop3.el (pop3-md5): Don't hardcode point-min == 1. -2002-04-12 Katsumi Yamaoka <yamaoka@jpl.org> +2002-04-12 Daiki Ueno <ueno@unixuser.org> * gnus-srvr.el (gnus-server-set-info): Clear `gnus-server-method-cache' when `gnus-server-alist' is changed. - From Daiki Ueno <ueno@unixuser.org>. 2002-04-11 Simon Josefsson <jas@extundo.com> @@ -9476,20 +9449,18 @@ * message.el (message-mode): Fix doc. -2002-03-25 Simon Josefsson <jas@extundo.com> - - * message.el (message-subject-re-regexp): Skip Re[42]: junk. From - Matthieu Moy <Matthieu.Moy@imag.fr>. +2002-03-25 Matthieu Moy <Matthieu.Moy@imag.fr> + + * message.el (message-subject-re-regexp): Skip Re[42]: junk. 2002-03-24 Jesper Harder <harder@ifa.au.dk> * mml-sec.el (mml-unsecure-message): Add docstring. -2002-03-23 ShengHuo ZHU <zsh@cs.rochester.edu> +2002-03-23 Andre Srinivasan <andre@slamdunknetworks.com> (tiny change) * nnmail.el (nnmail-large-newsgroup): Fix doc, allow non-numeric value. - Trivial change from andre@slamdunknetworks.com 2002-03-22 Josh Huber <huber@alum.wpi.edu> @@ -9517,8 +9488,9 @@ * message.el (message-font-lock-keywords): Support multi-line MML tags. +2002-03-21 L,Bu(Brentey K,Ba(Broly <lorentey@elte.hu> + * gnus-sum.el (gnus-print-buffer): Remove gnus-decoration. - Trivial change from lorentey@elte.hu (L,Bu(Brentey K,Aa(Broly) 2002-03-20 Katsumi Yamaoka <yamaoka@jpl.org> @@ -9542,30 +9514,28 @@ (gnus-sum-thread-tree-leaf-with-other) (gnus-sum-thread-tree-single-leaf): Make customizable. -2002-03-16 Simon Josefsson <jas@extundo.com> +2002-03-16 Francis Litterio <franl@world.std.com> * gnus-util.el (gnus-extract-address-components): Don't break on - names such as James "Kibo" Parry. From Francis Litterio - <franl@world.std.com>. - -2002-03-13 Simon Josefsson <jas@extundo.com> - - * pop3.el (pop3-open-server): Revert multibyte change. From - Pavel@Janik.cz (Pavel Jan,Am(Bk). - - * message.el (message-send-mail-with-qmail): Make it work. From - Pavel@Janik.cz (Pavel Jan,Am(Bk). + names such as James "Kibo" Parry. + +2002-03-13 Pavel Jan,Am(Bk <Pavel@Janik.cz> + + * pop3.el (pop3-open-server): Revert multibyte change. + + * message.el (message-send-mail-with-qmail): Make it work. 2002-03-13 Josh Huber <huber@alum.wpi.edu> * message.el (message-make-mft): Set case-fold-search while generating the MFT. Also, a little cleanup in the MFT code. -2002-03-12 Simon Josefsson <jas@extundo.com> - - * message.el (message-qmail-inject-args): May be function. - (message-send-mail-with-qmail): Call function if m-q-i-a is - function. From fn@hungry.org (Faried Nawaz). +2002-03-12 Faried Nawaz <fn@hungry.org> (tiny change) + + * message.el (message-qmail-inject-args): May be function. Adjust + doc string and custom type. + (message-send-mail-with-qmail): Call function if m-q-i-a is a + function. 2002-03-12 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -9587,26 +9557,26 @@ * nnslashdot.el (nnslashdot-request-article): Remove javascript too. -2002-03-09 ShengHuo ZHU <zsh@cs.rochester.edu> +2002-03-09 Andre Srinivasan <andre@slamdunknetworks.com> (tiny change) * gnus-sum.el (gnus-summary-save-parts-default-mime): Remove duplication. (gnus-summary-save-parts-type-history): Ditto. (gnus-summary-save-parts-last-directory): Ditto. - Trivial change from andre@slamdunknetworks.com 2002-03-09 Paul Jarc <prj@po.cwru.edu> * gnus-start.el (gnus-auto-subscribed-groups): Include nnmaildir. +2002-03-06 Matthieu Moy <Matthieu.Moy@imag.fr> + + * gnus-msg.el (gnus-summary-resend-message-edit): New function. + 2002-03-06 ShengHuo ZHU <zsh@cs.rochester.edu> * nnslashdot.el (nnslashdot-request-article): Use "<!-- no ad 6 -->" as the end of the first article. - * gnus-msg.el (gnus-summary-resend-message-edit): New function. - From Matthieu Moy <Matthieu.Moy@imag.fr> - * message.el (message-add-action): Use add-to-list. (message-delete-action): New function. @@ -9668,17 +9638,15 @@ completing-read. (mm-view-pkcs7-decrypt): CRLF->LF. -2002-03-04 Paul Jarc <prj@po.cwru.edu> +2002-03-04 Teodor Zlatanov <teodor.zlatanov@divine.com> * message.el (message-hierarchical-addresses): New variable. (message-get-reply-headers): Use it. - From Ted Zlatanov <teodor.zlatanov@divine.com> - -2002-03-03 ShengHuo ZHU <zsh@cs.rochester.edu> + +2002-03-03 Geoff Greene <ggreene@wpi.edu> (tiny change) * message.el (message-mode): If buffer-file-name, don't set auto save file name. - Trivial change from Geoff Greene <ggreene@wpi.edu> 2002-03-02 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -9725,11 +9693,12 @@ * gnus-sum.el (gnus-articles-to-read): Use large-newsgroup-initial. (gnus-summary-insert-old-articles): Ditto. -2002-02-26 ShengHuo ZHU <zsh@cs.rochester.edu> +2002-02-26 TSUCHIYA Masatoshi <tsuchiya@namazu.org> * gnus-sum.el (gnus-articles-to-read): `gnus-large-newsgroup' is used as the default answer of the question, "How many articles?". - From TSUCHIYA Masatoshi <tsuchiya@namazu.org> + +2002-02-26 ShengHuo ZHU <zsh@cs.rochester.edu> * nnagent.el (nnagent-retrieve-headers): Remove articles with small numbers. @@ -9738,14 +9707,15 @@ * deuglify.el: Fix comments. +2002-02-23 Andre Srinivasan <andre@slamdunknetworks.com> (tiny change) + + * mml.el (mml-generate-mime-1): Add cdr. + 2002-02-23 ShengHuo ZHU <zsh@cs.rochester.edu> * html2text.el (html2text-clean-anchor): If there is no HREF, insert nothing. - * mml.el (mml-generate-mime-1): Add cdr. - From: andre@slamdunknetworks.com - * mm-view.el (mm-text-html-renderer-alist): Add html2text. (mm-text-html-washer-alist): Ditto. @@ -9761,11 +9731,15 @@ * deuglify.el: Change copy right. Add autoload. Add coding-system. - * deuglify.el: New file. The original file name is - gnus-outlook-deuglify.el from Raymond Scholz <rscholz@zonix.de>. +2002-02-22 Raymond Scholz <rscholz@zonix.de> + + * deuglify.el: New file. The original file name is + gnus-outlook-deuglify.el. + +2002-02-22 Andre Srinivasan <andre@slamdunknetworks.com> (tiny change) * mm-decode.el (mm-display-external): Use - mm-file-name-rewrite-functions. From <andre@slamdunknetworks.com> + mm-file-name-rewrite-functions. 2002-02-22 Paul Jarc <prj@po.cwru.edu> @@ -9801,17 +9775,19 @@ * gnus-art.el (gnus-article-edit-done): Widen the buffer. + * message.el (message-send-mail): Be talkative. + +2002-02-20 TSUCHIYA Masatoshi <tsuchiya@pine.kuee.kyoto-u.ac.jp> + * gnus-group.el (gnus-group-name-decode): Don't test multibyte-string, because it breaks XEmacs. - From: TSUCHIYA Masatoshi <tsuchiya@pine.kuee.kyoto-u.ac.jp> - - * message.el (message-send-mail): Be talkative. + +2002-02-20 Reiner Steib <Reiner.Steib@gmx.de> * mm-decode.el (mm-inlined-types): Add application/x-emacs-lisp. (mm-automatic-display): Ditto. * mailcap.el (mailcap-mime-data): Ditto. - From: Reiner Steib <4uce.02.r.steib@gmx.net> 2002-02-20 Katsumi Yamaoka <yamaoka@jpl.org> @@ -9853,10 +9829,10 @@ * nnultimate.el (nnultimate-retrieve-headers): Clean up. -2002-02-18 Paul Jarc <prj@po.cwru.edu> +2002-02-18 Mark Thomas <mthomas@cmu.edu> * gnus-util.el (gnus-parent-id): Ignore trailing whitespace in the - References header field. From Mark Thomas <mthomas@cmu.edu>. + References header field. 2002-02-18 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -9970,8 +9946,9 @@ * message-utils.el: Adopt the file. +2002-02-15 Holger Schauer <Holger.Schauer@gmx.de> + * message-utils.el: New file. - From Holger Schauer <Holger.Schauer@gmx.de> 2002-02-14 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -10079,9 +10056,6 @@ gnus-decoration property. * gnus-msg.el (gnus-copy-article-buffer): Remove gnus-decoration. - * message.el (message-mode): Set local-abbrev-table. - From Matt Armstrong <matt@lickey.com>. - * gnus-art.el (gnus-article-treat-unfold-headers): Don't remove too many spaces. @@ -10089,8 +10063,13 @@ (rfc2047-decode-region): Don't unfold. Let gnus-article-treat-unfold-headers do it. +2002-02-07 Matt Armstrong <matt@lickey.com>. + + * message.el (message-mode): Set local-abbrev-table. + +2002-02-07 Jesper Harder <harder@ifa.au.dk> + * gnus-sum.el (gnus-dependencies-add-header): Fix typo. - From: Jesper Harder <harder@ifa.au.dk> 2002-02-06 Lars Magne Ingebrigtsen <larsi@gnus.org> @@ -10117,16 +10096,18 @@ * nnweb.el (nnweb-google-parse-1): Use a correct format of date. - * gnus-agent.el (gnus-agent-summary-make-menu-bar): Fix typo. - From Stefan Reich,Av(Br <xsteve@riic.at>. - * nnagent.el (nnagent-request-expire-articles): Don't delete files. -2002-02-05 ShengHuo ZHU <zsh@cs.rochester.edu> +2002-02-06 Stefan Reich,Av(Br <xsteve@riic.at> + + * gnus-agent.el (gnus-agent-summary-make-menu-bar): Fix typo. + +2002-02-05 Sriram Karra <karra@cs.utah.edu> * message.el (message-gen-unsubscribed-mft): New function. - From Sriram Karra <karra@cs.utah.edu>. + +2002-02-05 ShengHuo ZHU <zsh@cs.rochester.edu> * gnus.el (gnus-article-unpropagated-mark-lists): Backslash the open parenthesis. @@ -10168,18 +10149,18 @@ * gnus-art.el (gnus-treatment-function-alist): Move hide-citation, highlight-citation after emphasize. -2002-02-04 Simon Josefsson <jas@extundo.com> - - * nnfolder.el (nnfolder-open-marks): - - * nnml.el (nnml-open-marks): Message when done. From David - Edmondson <dme@sun.com>. +2002-02-04 David Edmondson <dme@sun.com> + + * nnfolder.el (nnfolder-open-marks): Message when done. + + * nnml.el (nnml-open-marks): Ditto. + +2002-02-03 Steinar Bang <sb@dod.no> + + * imap.el (imap-anonymous-auth): Fix typo. 2002-02-03 ShengHuo ZHU <zsh@cs.rochester.edu> - * imap.el (imap-anonymous-auth): Fix typo. - From: Steinar Bang <sb@dod.no> - * gnus-cache.el (gnus-cache-braid-nov): Use set-buffer instead of save-excursion. (gnus-cache-braid-heads): Ditto. @@ -10232,14 +10213,15 @@ * gnus.el (gnus-agent): Make it customizable. - * gnus-dired.el: New file. - From Benjamin Rutt <brutt@bloomington.in.us> - * gnus-cache.el (gnus-cache-articles-in-group): Remove from active if no article. (gnus-cache-possibly-remove-article): Ditto. (gnus-cache-possibly-enter-article): Use gnus-add-to-sorted-list. +2002-02-02 Benjamin Rutt <brutt@bloomington.in.us> + + * gnus-dired.el: New file. + 2002-02-01 Simon Josefsson <jas@extundo.com> * gnus-int.el (gnus-request-accept-article): Use gnus-get-function. @@ -10740,7 +10722,7 @@ * gnus.el (gnus-version-number): Bump version number. -2002-01-20 05:33:30 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2002-01-20 05:33:30 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.05 is released. @@ -10974,8 +10956,9 @@ * message.el (message-newline-and-reformat): Use `newline' instead of inserting \n, so that the newline is marked as hard. +2002-01-13 Jesper Harder <harder@ifa.au.dk> + * gnus-spec.el (gnus-pad-form): Don't evaluate EL multiple times. - From Jesper Harder <harder@ifa.au.dk>. 2002-01-12 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -11199,11 +11182,13 @@ * gnus-group.el (gnus-group-read-ephemeral-group): Restore the old behavior of quit-config. +2002-01-08 Bj,Ax(Brn Mork <bmork@dod.no> (tiny change) + * message.el (message-make-from): Don't quote fullname. - From: Bj,Ax(Brn Mork <bmork@dod.no> + +2002-01-08 Andre Srinivasan <andre@slamdunknetworks.com> (tiny change) * gnus-group.el (gnus-group-suspend): Don't kill message buffers. - From: <andre@slamdunknetworks.com> 2002-01-07 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -11486,10 +11471,10 @@ * gnus-agent.el (gnus-agent-fetch-session): Run hook. -2002-01-03 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-01-03 Dave Love <fx@gnu.org> * gnus-start.el (gnus-read-init-file): Don't force coding system - for ~/.gnus. From Dave Love <fx@gnu.org>. + for ~/.gnus. 2002-01-03 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -11755,7 +11740,7 @@ (message-fix-before-sending): Highlight invisible text and place point there. -2002-01-01 02:32:53 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2002-01-01 02:32:53 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.04 is released. @@ -12094,11 +12079,10 @@ (gnus-update-marks): Use `gnus-range-add' on a uncompressed list instead, it seems to result in shorter ranges. -2001-12-26 11:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-12-26 11:00:00 Jesper Harder <harder@ifa.au.dk> * mm-util.el (mm-iso-8859-x-to-15-region): Use insert-before-markers. - From Jesper Harder <harder@ifa.au.dk> 2001-12-26 Paul Jarc <prj@po.cwru.edu> @@ -12127,12 +12111,11 @@ (nnmaildir-version): Indicate that nnmaildir is now a standard part of Gnus, not separately released. -2001-12-21 08:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-12-21 08:00:00 Pavel Jan,Am(Bk <Pavel@Janik.cz> * gnus-art.el, gnus-picon.el, gnus-sieve.el, gnus-sum.el: * gnus-xmas.el, imap.el, mailcap.el, mm-util.el, nnfolder.el: * nnheader.el, nnmail.el: Nil/NIL vs. nil. - From Pavel Jan,Am(Bk <Pavel@Janik.cz> 2001-12-20 15:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -12145,10 +12128,9 @@ (nnimap-close-group): Don't quote KEYLIST items. Suggested by Brian P Templeton <bpt@tunes.org>. -2001-12-19 17:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-12-19 17:00:00 Paul Jarc <prj@po.cwru.edu> * nnmaildir.el: New file. - From Paul Jarc <prj@po.cwru.edu>. 2001-12-19 16:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -12172,8 +12154,7 @@ * gnus-win.el (gnus-get-buffer-window): Use gnus-delete-if. -2001-12-18 11:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Harald Meland <Harald.Meland@usit.uio.no> +2001-12-18 11:00:00 Harald Meland <Harald.Meland@usit.uio.no> * gnus-win.el (gnus-get-buffer-window): New function. (gnus-all-windows-visible-p): Use it. @@ -12248,11 +12229,10 @@ subscribe-level * gnus-topic.el (gnus-subscribe-topics): use it. -2001-12-13 22:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-12-13 22:00:00 Sean Neakums <sneakums@zork.net> (tiny change) * gnus-msg.el (gnus-summary-mail-forward): Forward all marked - messages. (A small patch with indentation) - From Sean Neakums <sneakums@zork.net>. + messages. * gnus-uu.el (gnus-uu-grab-articles): Set gnus-current-article to nil after shooting down the gnus-original-article-buffer. @@ -12327,12 +12307,11 @@ * mml.el (mime-to-mml): Remove Content-Disposition too. -2001-12-09 08:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-12-09 08:00:00 TSUCHIYA Masatoshi <tsuchiya@namazu.org> * gnus-sum.el (gnus-summary-buffer-name): Decode group name. * gnus-group.el (gnus-group-name-decode): Decode unibyte strings only. - From TSUCHIYA Masatoshi <tsuchiya@namazu.org> 2001-12-08 Nevin Kapur <nevin@jhu.edu> @@ -12433,15 +12412,14 @@ the beginning of lines. (gnus-complex-form-to-spec): Ditto. -2001-12-01 08:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-12-01 08:00:00 Paul Jarc <prj@po.cwru.edu> * message.el (message-make-mft): Fix the m-s-a-file regexp. - From Paul Jarc <prj@po.cwru.edu>. - -2001-11-30 21:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> + +2001-11-30 21:00:00 Paul Jarc <prj@po.cwru.edu> * message.el: New variable message-subscribed-address-file; - use it in message-make-mft. From Paul Jarc <prj@po.cwru.edu>. + use it in message-make-mft. 2001-11-30 12:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -12574,11 +12552,11 @@ * message.el (sha1): eval-and-compile. -2001-11-20 Simon Josefsson <jas@extundo.com> +2001-11-20 Paul Jarc <prj@po.cwru.edu> * message.el (message-allow-no-recipients): New variable. (message-send): Use it, customize the prompting when posting to - Gcc/Fcc alone. From prj@po.cwru.edu (Paul Jarc). + Gcc/Fcc alone. 2001-11-20 09:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -12698,14 +12676,17 @@ * mml2015.el: Mention RFC 3156. - * mml1991.el: New file. From Sascha L,A|(Bdecke <sascha@meta-x.de>. +2001-11-12 Sascha L,A|(Bdecke <sascha@meta-x.de> + + * mml1991.el: New file. 2001-11-12 13:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> * gnus-start.el (gnus-auto-subscribed-groups): Use ^nnml. +2001-11-12 Michael Cook <Michael.Cook@cisco.com> + * gnus-sum.el (gnus-summary-move-article): Use number-to-string. - From <Michael.Cook@cisco.com> 2001-11-11 Simon Josefsson <jas@extundo.com> @@ -12714,10 +12695,9 @@ canlock, no need to require two different hash algs). Suggested by Ferenc Wagner <wferi@bolyai1.elte.hu>. -2001-11-09 Simon Josefsson <jas@extundo.com> - - * gnus.el (gnus-local-domain): Fix doc. From Pavel Jan,Am(Bk - <Pavel@Janik.cz>. +2001-11-09 Pavel Jan,Am(Bk <Pavel@Janik.cz> + + * gnus.el (gnus-local-domain): Fix doc. 2001-11-09 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> @@ -12959,7 +12939,7 @@ mm-with-unibyte-current-buffer-mule4): Use them. (mm-find-mime-charset-region): Treat iso-2022-jp. - From Dave Love <fx@gnu.org>: +2001-10-30 Dave Love <fx@gnu.org> * mm-util.el (mm-mime-mule-charset-alist): Make it correct by construction. @@ -13032,10 +13012,10 @@ * gnus-msg.el (gnus-setup-message): Call post-command-hook. -2001-10-29 Simon Josefsson <jas@extundo.com> +2001-10-29 Jesper Harder <harder@myrealbox.com> * mml.el (mml-preview): Bind message-this-is-news if it is - news. From Jesper Harder <harder@myrealbox.com>. + news. 2001-10-28 Simon Josefsson <jas@extundo.com> @@ -13051,8 +13031,9 @@ * message.el (message-indent-citation): Don't add trailing whitespace when citing text. - * gnus.el (gnus-group-faq-directory): Fix. From Jesper Harder - <harder@ifa.au.dk>. +2001-10-27 Jesper Harder <harder@myrealbox.com> + + * gnus.el (gnus-group-faq-directory): Fix. 2001-10-26 14:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -13129,21 +13110,22 @@ * message.el (message-do-auto-fill): Avoid calling 'rfc822-goto-eoh'. -2001-10-20 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Paul Jarc <prj@po.cwru.edu>. +2001-10-20 Paul Jarc <prj@po.cwru.edu> * message.el (message-get-reply-headers): Restructure the logic - and add comments. From Paul Jarc <prj@po.cwru.edu>. + and add comments. 2001-10-20 Simon Josefsson <jas@extundo.com> * message.el (message-cancel-news): Support cancel-locks. Suggested by Per Abrahamsson. + * nnfolder.el (nnfolder-marks-changed-p): Ditto. + +2001-10-20 David Z Maze <dmaze@MIT.EDU> + * nnml.el (nnml-marks-changed-p): Use `equal' when comparing - conses. From David Z Maze <dmaze@MIT.EDU>. - - * nnfolder.el (nnfolder-marks-changed-p): Ditto. + conses. 2001-10-19 Per Abrahamsen <abraham@dina.kvl.dk> @@ -13174,8 +13156,7 @@ * gnus-sum.el (gnus-group-make-articles-read): Call g-r-set-mark when undoing. -2001-10-18 Simon Josefsson <jas@extundo.com> - From Frank Schmitt <usereplyto@Frank-Schmitt.net> +2001-10-18 Frank Schmitt <usereplyto@Frank-Schmitt.net> * gnus-sum.el (gnus-summary-limit-to-display-predicate): Fix typo. (gnus-summary-make-menu-bar): Ditto. @@ -13185,11 +13166,10 @@ * nnimap.el (nnimap-expiry-target): Make sure it is back to the server. Suggested by ShengHuo ZHU <zsh@cs.rochester.edu>. -2001-10-17 17:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-10-17 17:00:00 Frank Schmitt <usenet@Frank-Schmitt.net> * gnus-sum.el (gnus-summary-line-format-alist): user-date entry. * gnus-util.el (gnus-user-date): New function. - From Frank Schmitt <usenet@Frank-Schmitt.net>. 2001-10-17 Per Abrahamsen <abraham@dina.kvl.dk> @@ -13222,8 +13202,7 @@ * gnus-msg.el (gnus-post-method): Changed two instances of `active' to `current' and one `null' to `not'. -2001-10-16 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Katsumi Yamaoka <yamaoka@jpl.org>. +2001-10-16 Katsumi Yamaoka <yamaoka@jpl.org> * message.el (message-setup-fill-variables): Use `normal-auto-fill-function' instead of `auto-fill-function'. @@ -13279,10 +13258,9 @@ * gnus-art.el (article-emphasize): Set `g-a-wash-types' after doing stuff that clears it. -2001-10-12 Simon Josefsson <jas@extundo.com> +2001-10-12 Eric Marsden <emarsden@laas.fr> * gnus-cache.el (gnus-summary-limit-include-cached): Rewrite. - From Eric Marsden <emarsden@laas.fr>. 2001-10-12 10:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -13484,20 +13462,17 @@ (gnus-topic-catchup-articles): New function. Suggested by Robin S. Socha <robin-dated-1001857693.185e29@socha.net>. -2001-09-27 11:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Gerd M,Av(Bllmann <gerd@gnu.org>. +2001-09-27 11:00:00 Gerd M,Av(Bllmann <gerd@gnu.org>. * gnus-ems.el (gnus-article-display-xface): Insert xface after previous ones. -2001-09-27 07:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Daiki Ueno <ueno@unixuser.org> +2001-09-27 07:00:00 Daiki Ueno <ueno@unixuser.org> * gnus-sum.el (gnus-summary-show-article): The arglist of detect-coding-region is incompatible. -2001-09-26 18:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Katsuhiro Hermit Endo <hermit@koka-in.org> +2001-09-26 18:00:00 Katsuhiro Hermit Endo <hermit@koka-in.org> * gnus-group.el (gnus-group-delete-group): Typo. @@ -13580,10 +13555,9 @@ * gnus-srvr.el (gnus-server-insert-server-line): Don't let an error querying a backend abort the whole process. -2001-09-17 08:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-09-17 08:00:00 Gerd M,Av(Bllmann <gerd@gnu.org> * gnus-srvr.el (gnus-server-mode): Fix bogus fontification. - From Gerd M,Av(Bllmann <gerd@gnu.org>. 2001-09-17 Didier Verna <didier@xemacs.org> @@ -13655,7 +13629,7 @@ * gnus-diary.el (message-mode-map): bind the above to `C-c D c'. * gnus-diary.el (gnus-article-edit-mode-map): ditto. -2001-09-10 TSUCHIYA Masatoshi <tsuchiya@namazu.org> +2001-09-10 TSUCHIYA Masatoshi <tsuchiya@namazu.org> * gnus-sum.el (gnus-select-newsgroup): Make `gnus-current-select-method' buffer-local. @@ -13663,8 +13637,7 @@ * gnus-art.el (gnus-request-article-this-buffer): Refer `gnus-current-select-method' in the current summary buffer. -2001-09-10 Simon Josefsson <jas@extundo.com> - From Daniel Pittman <daniel@rimspace.net> +2001-09-10 Daniel Pittman <daniel@rimspace.net> * gnus-spec.el (gnus-correct-pad-form): Fix. @@ -13715,8 +13688,7 @@ * gnus-agent.el (gnus-agent-fetch-group): If online, actually fetch group. -2001-09-08 Simon Josefsson <jas@extundo.com> - From Daniel Pittman <daniel@rimspace.net> +2001-09-08 Daniel Pittman <daniel@rimspace.net> * gnus-spec.el (gnus-correct-pad-form): New function. (gnus-parse-simple-format): Use it. @@ -13728,7 +13700,7 @@ Putnam <reader@newsguy.com>. (gnus-group-sort-selected-groups): Touch dribble file. -2001-09-07 Raja R Harinath <harinath@cs.umn.edu> +2001-09-07 Raja R Harinath <harinath@cs.umn.edu> * nnml.el (nnml-filenames-are-evil): New variable. (nnml-article-to-file-alist): Rename to ... @@ -13750,10 +13722,9 @@ * gnus-sum.el (gnus-summary-toggle-smiley): New function. Toggles display of graphical smilies. -2001-09-07 02:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-09-07 02:00:00 Bill White <billw@wolfram.com> * gnus-start.el (gnus-setup-news): A typo. - From Bill White <billw@wolfram.com>. 2001-09-06 Simon Josefsson <jas@extundo.com> @@ -13864,8 +13835,7 @@ * nnfolder.el (nnfolder-save-marks): Don't create directory named after group in ~/. -2001-08-25 Simon Josefsson <jas@extundo.com> - From Andreas Jaeger <aj@suse.de> +2001-08-25 Andreas Jaeger <aj@suse.de> * nnfolder.el (nnfolder-open-marks): Fix typo. * nnml.el (nnml-open-marks): Likewise. @@ -13919,11 +13889,12 @@ * mml.el (mml-generate-mime-1): Force as multibyte string. -2001-08-24 12:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-08-24 12:00:00 Martin Kretzschmar <Martin.Kretzschmar@inf.tu-dresden.de> * gnus-sum.el (gnus-summary-insert-line) (gnus-summary-prepare-threads): gnus-tmp-lines should be a string. - From Martin Kretzschmar <Martin.Kretzschmar@inf.tu-dresden.de> + +2001-08-24 12:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> * gnus-spec.el (gnus-correct-substring): Take optional END. @@ -13945,8 +13916,7 @@ * gnus-util.el (gnus-create-info-command): Return an interactive function. -2001-08-23 19:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Katsumi Yamaoka <yamaoka@jpl.org> +2001-08-23 19:00:00 Katsumi Yamaoka <yamaoka@jpl.org> * gnus-spec.el (gnus-parse-complex-format): Use equal. @@ -14100,8 +14070,7 @@ * gnus.el (gnus-server-visual): Add defgroup. -2001-08-19 Simon Josefsson <jas@extundo.com> - From Joe Casadonte <jcasadonte@northbound-train.com> +2001-08-19 Joe Casadonte <jcasadonte@northbound-train.com> * gnus-srvr.el (gnus-server-opened-face, gnus-server-closed-face, gnus-server-denied-face): New. @@ -14261,8 +14230,7 @@ * gnus-delay.el (gnus-delay-article): Allow "01:23" time spec, which specifies a time today or tomorrow. -2001-08-15 Simon Josefsson <jas@extundo.com> - From Pavel@Janik.cz (Pavel Jan,Am(Bk) +2001-08-15 Pavel Jan,Am(Bk <Pavel@Janik.cz> * gnus-agent.el (gnus-agent-make-mode-line-string) (gnus-agent-toggle-plugged): Use new API. @@ -14308,7 +14276,6 @@ * gnus-spec.el (gnus-format-specs): %n is 23 chars. 2001-08-11 09:40:00 Karl Kleinpaste <karl@charcoal.com> - Committed by Kai Gro,b_(Bjohann. * gnus-score.el (gnus-score-string): Fix `match' regexp for `extra' header case. @@ -14389,23 +14356,23 @@ * imap.el (imap-gssapi-auth-p, imap-kerberos4-auth-p): Also check whether `imtest' is installed. -2001-08-04 ShengHuo ZHU <zsh@cs.rochester.edu> - Trivial patch from Nuutti Kotivuori <nuutti.kotivuori@smarttrust.com> +2001-08-04 Nuutti Kotivuori <nuutti.kotivuori@smarttrust.com> * gnus-sum.el (gnus-summary-show-article): Call gnus-summary-update-secondary-secondary-mark. * gnus-sum.el (gnus-summary-edit-article-done): Ditto. * gnus-sum.el (gnus-summary-reparent-thread): Ditto. +2001-08-07 16:00:00 Gerd M,Av(Bllmann <gerd@gnu.org> + + * mm-uu.el (mm-uu-dissect): Autoload. + 2001-08-07 16:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> * gnus-sum.el (gnus-summary-make-menu-bar): Misc -> Gnus. * gnus-group.el (gnus-group-make-menu-bar): Ditto. - * mm-uu.el (mm-uu-dissect): Autoload. From Gerd M,Av(Bllmann - <gerd@gnu.org>. - * gnus-art.el (gnus-output-to-file): Bind file-name-coding-system. * gnus-util.el (gnus-output-to-rmail): Ditto. @@ -14527,8 +14494,7 @@ (mm-pkcs7-enveloped-magic): Ditto. (mm-view-pkcs7-get-type): Don't regexp quote. -2001-08-01 14:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Andreas Fuchs <asf@void.at> +2001-08-01 14:00:00 Andreas Fuchs <asf@void.at> * mml2015.el (mml2015-trust-boundaries-alist): Typo. @@ -14623,13 +14589,11 @@ (smime-dns-server): Fix customize group. (smime-call-openssl-region): Use `smime-extra-arguments'. -2001-07-29 Simon Josefsson <jas@extundo.com> - From Vladimir Volovich <vvv@vsu.ru> +2001-07-29 Vladimir Volovich <vvv@vsu.ru> * smime.el (smime-call-openssl-region): Ignore stderr. -2001-07-29 Simon Josefsson <jas@extundo.com> - From Christoph Conrad <christoph.conrad@gmx.de> +2001-07-29 Christoph Conrad <christoph.conrad@gmx.de> * gnus-agent.el (gnus-agent-save-group-info): Don't destroy active file. @@ -14750,8 +14714,7 @@ * nnimap.el (nnimap-version): Bump version number. -2001-07-26 10:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Steven E. Harris <seh@speakeasy.org> +2001-07-26 10:00:00 Steven E. Harris <seh@speakeasy.org> * nnheader.el (nnheader-translate-file-chars): cygwin32 is running in M$Windows too. @@ -14773,8 +14736,7 @@ * gnus-sum.el (gnus-summary-prepare-threads): Shouldn't do tree display (%B) for threads if threading is off. -2001-07-25 14:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Henrik Enberg <henrik@enberg.org> +2001-07-25 14:00:00 Henrik Enberg <henrik@enberg.org> * gnus-msg.el: Customization patch. @@ -14844,8 +14806,7 @@ * gnus-delay.el (gnus-delay-default-hour): New variable. (gnus-delay-article): Allow specific date in YYYY-MM-DD format. -2001-07-23 22:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Karl Kleinpaste <karl@charcoal.com> +2001-07-23 22:00:00 Karl Kleinpaste <karl@charcoal.com> * gnus-sum.el (gnus-summary-line-format-alist): Add %B. (gnus-summary-prepare-threads): Ditto. @@ -15002,11 +14963,11 @@ * nnrss.el (nnrss-read-group-data): Nuke emacs-lisp-mode-hook. (nnrss-read-server-data): Ditto. -2001-07-13 12:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-07-13 12:00:00 Pavel Jan,Am(Bk <Pavel@Janik.cz> * gnus-setup.el (gnus-use-installed-gnus): Typo. * Cleanup files. - From Pavel@Janik.cz (Pavel Jan,Am(Bk). + 2001-07-13 08:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -15129,8 +15090,7 @@ * nntp.el (nntp-send-command, nntp-send-command-nodelete): (nntp-send-command-and-decode): Use gnus-point-at-bol. -2001-07-09 13:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Paul Jarc <prj@po.cwru.edu> +2001-07-09 13:00:00 Paul Jarc <prj@po.cwru.edu> * message.el (message-use-mail-followup-to): New variable. (message-get-reply-headers): Use it. @@ -15218,8 +15178,7 @@ * gnus-start.el (gnus-check-first-time-used): Use `if' instead of `when'. -2001-07-03 Simon Josefsson <jas@extundo.com> - From Nuutti Kotivuori <nuutti.kotivuori@smarttrust.com> +2001-07-03 Nuutti Kotivuori <nuutti.kotivuori@smarttrust.com> * flow-fill.el (fill-flowed): Use (1+ (point-at-eol)) instead. @@ -15267,8 +15226,7 @@ (rfc2047-encode-message-header): Fold lines even if no QP encoding is done. -2001-06-23 Simon Josefsson <jas@extundo.com> - From Samuel Tardieu <sam@inf.enst.fr> +2001-06-23 Samuel Tardieu <sam@inf.enst.fr> * smime.el (smime-keys): Support additional certificates. (smime-make-certfiles): New function. @@ -15302,8 +15260,7 @@ * message.el (message-goto-body): Return nil if not found. (revert!) -2001-06-21 10:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Fremlin <chief@bandits.org> +2001-06-21 10:00:00 John Fremlin <chief@bandits.org> (tiny change) * message.el (message-goto-body): Some messages have no header. @@ -15385,7 +15342,7 @@ * nnweb.el (nnweb-google-parse-1): Fix Google content regexp. (nnweb-google-wash-article): Ditto. -2001-06-14 Ferenc Wagner <wferi@bolyai1.elte.hu> +2001-06-14 Ferenc Wagner <wferi@bolyai1.elte.hu> * nnweb.el (nnweb-google-parse-1): Fix Google url regexp. @@ -15412,17 +15369,20 @@ * nnrss.el (nnrss-group-alist): Use |fr| instead of [fr]. -2001-06-12 11:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-06-12 11:00:00 Marc Lefranc <Marc.Lefranc@univ-lille1.fr> * gnus-art.el (gnus-plain-save-name): Use file-relative-name. - From Marc Lefranc <Marc.Lefranc@univ-lille1.fr>. + +2001-06-12 11:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> * nnrss.el (nnrss-node-text): Node might be nil. -2001-06-11 10:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> +2001-06-11 10:00:00 Katsumi Yamaoka <yamaoka@jpl.org> * gnus-uu.el (gnus-uu-save-article): Use mml tag instead of - part. From Katsumi Yamaoka <yamaoka@jpl.org>. + part. + +2001-06-11 10:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> * nnrss.el (nnrss-group-alist): More items. @@ -15436,14 +15396,11 @@ * gnus-mlspl.el (gnus-group-split-fancy): Fix generation of split restrict clauses. -2001-06-07 16:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - - From Benjamin Rutt <brutt+news@bloomington.in.us> +2001-06-07 16:00:00 Benjamin Rutt <brutt+news@bloomington.in.us> * message.el (message-wide-reply-confirm-recipients): New variable. -2001-06-06 ShengHuo ZHU <zsh@cs.rochester.edu> - Trivial patch from Mark Thomas <mthomas@edrc.cmu.edu> +2001-06-06 Mark Thomas <mthomas@edrc.cmu.edu> (tiny change) * nnmail.el (nnmail-fix-eudora-headers): Change the In-Reply-To fix so it works with XEmacs. @@ -15457,10 +15414,10 @@ * nnrss.el: Fix a few bugs. -2001-06-05 Simon Josefsson <jas@extundo.com> +2001-06-05 Alex Schroeder <alex@gnu.org> * mm-decode.el (mm-handle-set-external-undisplayer): Don't - generate compiler warnings. From Alex Schroeder <alex@gnu.org>. + generate compiler warnings. 2001-06-04 Hrvoje Niksic <hniksic@arsdigita.com> @@ -15499,20 +15456,17 @@ it is not possible to insert a character after a glyph which is at the end of a buffer. Patch by Lloyd Zusman <ljz@asfast.com>. -2001-05-28 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - - From Jaap-Henk Hoepman (jhh@xs4all.nl). +2001-05-28 Jaap-Henk Hoepman <jhh@xs4all.nl> * mm-decode.el (mm-keep-viewer-alive-types): New variable. (mm-keep-viewer-alive-p, mm-handle-set-external-undisplayer, mm-destroy-postponed-undisplay-list): New functions. (mm-display-external): Use them. -2001-05-27 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-05-27 Raja R. Harinath <harinath@cs.umn.edu> * gnus-salt.el (gnus-tree-highlight-node): Bind `default-high' and `default-low' when evaluating `gnus-summary-highlight'. - From Raja R Harinath <harinath@cs.umn.edu>. 2001-05-27 Simon Josefsson <simon@josefsson.org> @@ -15523,8 +15477,7 @@ as details. (mml2015-mailcrypt-clear-verify): Ditto. -2001-05-24 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> - From Nevin Kapur <nevin@jhu.edu>. +2001-05-24 Nevin Kapur <nevin@jhu.edu> * gnus-sum.el (gnus-summary-default-high-score, gnus-summary-default-low-score): New variables. @@ -15535,8 +15488,7 @@ * message.el (message-mail): pass the 'send-actions argument to `message-setup'. -2001-05-16 Simon Josefsson <simon@josefsson.org> - From Raymond Scholz <ray-2001@zonix.de> +2001-05-16 Raymond Scholz <ray-2001@zonix.de> * gnus-art.el (gnus-mime-view-part-as-charset): (gnus-mime-internalize-part): Doc fixes. @@ -15600,7 +15552,7 @@ correctly. (nnrss-check-group): Use time. -2001-05-01 19:21:19 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2001-05-01 19:21:19 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.03 is released. @@ -15672,12 +15624,11 @@ (smime-decrypt-region): Ditto. 2001-04-12 Jason Merrill <jason_merrill@redhat.com> - Committed by Simon Josefsson <simon@josefsson.org> * imap.el (imap-shell-open): Erase the buffer *after* copying it into the log. -2001-04-14 01:14:42 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> +2001-04-14 01:14:42 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no> * gnus.el: Oort Gnus v0.02 is released. @@ -15705,13 +15656,11 @@ * nnmail.el (nnmail-split-fancy-with-parent): Add docstring. -2001-04-12 19:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Jason Merrill <jason_merrill@redhat.com> +2001-04-12 19:00:00 Jason Merrill <jason_merrill@redhat.com> * gnus-sum.el (gnus-summary-insert-new-articles): Reverse the articles. 2001-04-10 08:01:15 Katsumi Yamaoka <yamaoka@jpl.org> - Committed by ShengHuo ZHU <zsh@cs.rochester.edu> * gnus-msg.el (gnus-post-news): Fill the Newsgroups header by the newsgroup names when the original article is a news message. @@ -15722,7 +15671,6 @@ supported. Suggest by Jim Meyering <jim@meyering.net>. 2001-04-02 Nevin Kapur <nevin@jhu.edu> - Committed by Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>. * nnmail.el (nnmail-split-it): Added check for .* at the end of regexp in nnmail-split-fancy. @@ -15790,13 +15738,11 @@ * qp.el (quoted-printable-decode-region): Just message malformation; don't quit. -2001-03-31 21:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Gerd Moellmann <gerd@gnu.org>. +2001-03-31 21:00:00 Gerd Moellmann <gerd@gnu.org> * gnus.el (gnus-interactive): A typo. 2001-03-26 Juanma Barranquero <lektu@uol.com.br> - Committed by ShengHuo ZHU <zsh@cs.rochester.edu> * gnus-util.el (gnus-delete-alist): Declare it as an alias of `assq-delete-all', if that function exists; otherwise use the old @@ -15914,8 +15860,7 @@ * mml2015.el (mml2015-gpg-extract-from): No error. -2001-03-18 23:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Bj,Ax(Brn Mork <bmork@dod.no>. +2001-03-18 23:00:00 Bj,Ax(Brn Mork <bmork@dod.no> * mml2015.el (mml2015-gpg-extract-from): New function. (mml2015-gpg-verify): Use it. @@ -15957,8 +15902,7 @@ * mailcap.el (mailcap-mime-data): Add application/sieve. (mailcap-mime-extensions): Add .siv, .xls. -2001-03-14 20:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Christoph Conrad <christoph.conrad@gmx.de> +2001-03-14 20:00:00 Christoph Conrad <christoph.conrad@gmx.de> * gnus-score.el (gnus-summary-lower-thread): Typo. @@ -16003,7 +15947,6 @@ * nnrss.el: New file. 2001-03-08 02:41:36 Katsumi Yamaoka <yamaoka@jpl.org> - Committed by ShengHuo ZHU <zsh@cs.rochester.edu> * rfc2047.el (rfc2047-unfold-region): Fix arg of `skip-chars-forward'. @@ -16027,9 +15970,10 @@ directory part. (gnus-score-search-global-directories): Use file-directory-p. +2001-03-06 13:00:00 Adrian Aichner <adrian@xemacs.org> + * gnus-score.el (gnus-score-score-files-1): Use gnus-kill-files-directory. - From Adrian Aichner <adrian@xemacs.org>. 2001-03-05 08:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -16054,8 +15998,7 @@ * gnus-sum.el (gnus-summary-limit-include-expunged): Fix. -2001-03-01 22:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Katsumi Yamaoka <yamaoka@jpl.org>. +2001-03-01 22:00:00 Katsumi Yamaoka <yamaoka@jpl.org> * dgnushack.el (coerce, merge, subseq): defmacro. @@ -16066,7 +16009,6 @@ uncompiled versions. 2001-02-26 11:27:27 Paul Jarc <prj@po.cwru.edu> - Committed by ShengHuo ZHU <zsh@cs.rochester.edu> * gnus-util.el (gnus-split-references): Handle malformed References:. @@ -16074,8 +16016,7 @@ * gnus-art.el (gnus-article-mime-part-status): 1 part. -2001-02-25 10:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From NAGY Andras <nagya@inf.elte.hu>. +2001-02-25 10:00:00 NAGY Andras <nagya@inf.elte.hu> * gnus.el (gnus-parameters): Typo. @@ -16183,13 +16124,11 @@ (gnus-article-sort-functions): Doc fix. Refer to gnus-thread-sort-functions. -2001-02-18 20:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - From Paul Jarc <prj@po.cwru.edu>. +2001-02-18 20:00:00 Paul Jarc <prj@po.cwru.edu> * message.el (message-get-reply-headers): More fixes. 2001-02-17 Paul Jarc <prj@po.cwru.edu> - Committed by ShengHuo ZHU <zsh@cs.rochester.edu> * message.el (message-get-reply-headers): Fix bug with Mail-Followup-To/to-address interaction. @@ -16234,7 +16173,6 @@ (nnml-request-regenerate): Use it. Change to deffoo. 2001-02-14 Katsumi Yamaoka <yamaoka@jpl.org> - Committed by ShengHuo ZHU <zsh@cs.rochester.edu> * gnus.el (gnus-define-group-parameter): Fix. @@ -18187,7 +18125,7 @@ * mml.el (mml-generate-mime-1): Ignore ascii. -2000-11-16 Justin Sheehy <justin@iago.org> +2000-11-16 Justin Sheehy <justin@iago.org> * gnus-sum.el (gnus-summary-make-menu-bar): Fix menu items.
--- a/lisp/gnus/gmm-utils.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/gmm-utils.el Sat Oct 14 17:36:28 2006 +0000 @@ -35,7 +35,7 @@ (defgroup gmm nil "Utility functions for Gnus, Message and MML" :prefix "gmm-" - :version "23.0" ;; No Gnus + :version "22.1" ;; Gnus 5.10.9 :group 'lisp) ;; Helper functions from `gnus-utils.el': gmm-verbose, gmm-message, gmm-error
--- a/lisp/gnus/gnus-art.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/gnus-art.el Sat Oct 14 17:36:28 2006 +0000 @@ -853,6 +853,9 @@ (defvar gnus-decode-header-function 'mail-decode-encoded-word-region "Function used to decode headers.") +(defvar gnus-decode-address-function 'mail-decode-encoded-address-region + "Function used to decode addresses.") + (defvar gnus-article-dumbquotes-map '(("\200" "EUR") ("\202" ",") @@ -2377,10 +2380,24 @@ (set-buffer gnus-summary-buffer) (error)) gnus-newsgroup-ignored-charsets)) - (inhibit-read-only t)) - (save-restriction - (article-narrow-to-head) - (funcall gnus-decode-header-function (point-min) (point-max))))) + (inhibit-read-only t) + end start) + (goto-char (point-min)) + (when (search-forward "\n\n" nil 'move) + (forward-line -1)) + (setq end (point)) + (while (not (bobp)) + (while (progn + (forward-line -1) + (and (not (bobp)) + (memq (char-after) '(?\t ? ))))) + (setq start (point)) + (if (looking-at "\ +\\(?:Resent-\\)?\\(?:From\\|Cc\\|To\\|Bcc\\|\\(?:In-\\)?Reply-To\\|Sender\ +\\|Mail-Followup-To\\|Mail-Copies-To\\|Approved\\):") + (funcall gnus-decode-address-function start end) + (funcall gnus-decode-header-function start end)) + (goto-char (setq end start))))) (defun article-decode-group-name () "Decode group names in `Newsgroups:'." @@ -3923,6 +3940,14 @@ (mm-enable-multibyte) (gnus-run-mode-hooks 'gnus-article-mode-hook)) +;; Internal variables. Are `gnus-button-regexp' and `gnus-button-last' used +;; at all? +(defvar gnus-button-regexp nil) +(defvar gnus-button-marker-list nil + "Regexp matching any of the regexps from `gnus-button-alist'.") +(defvar gnus-button-last nil + "The value of `gnus-button-alist' when `gnus-button-regexp' was build.") + (defun gnus-article-setup-buffer () "Initialize the article buffer." (let* ((name (if gnus-single-article-buffer "*Article*" @@ -4324,9 +4349,8 @@ (handles gnus-article-mime-handles) (none "(none)") (description - (or - (mail-decode-encoded-word-string (or (mm-handle-description data) - none)))) + (mail-decode-encoded-word-string (or (mm-handle-description data) + none))) (filename (or (mail-content-type-get (mm-handle-disposition data) 'filename) none)) @@ -6695,13 +6719,6 @@ :inline t (integer :tag "Regexp group"))))) -(defvar gnus-button-regexp nil) -(defvar gnus-button-marker-list nil) -;; Regexp matching any of the regexps from `gnus-button-alist'. - -(defvar gnus-button-last nil) -;; The value of `gnus-button-alist' when `gnus-button-regexp' was build. - ;;; Commands: (defun gnus-article-push-button (event)
--- a/lisp/gnus/gnus-demon.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/gnus-demon.el Sat Oct 14 17:36:28 2006 +0000 @@ -218,7 +218,7 @@ (< idle gnus-demon-idle-time)) ; Idle timed out. (t (< 0 gnus-demon-idle-time)))) ; Or just need to be idle. ;; So we call the handler. - (progn + (gnus-with-local-quit (ignore-errors (funcall (car handler))) ;; And reset the timer. (setcar (nthcdr 1 handler) @@ -232,14 +232,15 @@ (gnus-demon-is-idle-p)) ;; We want to call this handler each and every time that ;; Emacs is idle. - (ignore-errors (funcall (car handler)))) + (gnus-with-local-quit + (ignore-errors (funcall (car handler))))) (t ;; We want to call this handler only if Emacs has been idle ;; for a specified number of timesteps. (and (not (memq (car handler) gnus-demon-idle-has-been-called)) (< idle gnus-demon-idle-time) (gnus-demon-is-idle-p) - (progn + (gnus-with-local-quit (ignore-errors (funcall (car handler))) ;; Make sure the handler won't be called once more in ;; this idle-cycle.
--- a/lisp/gnus/gnus-draft.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/gnus-draft.el Sat Oct 14 17:36:28 2006 +0000 @@ -76,7 +76,6 @@ (when (gnus-visual-p 'draft-menu 'menu) (gnus-draft-make-menu-bar)) (gnus-add-minor-mode 'gnus-draft-mode " Draft" gnus-draft-mode-map) - (mml-mode) (gnus-run-hooks 'gnus-draft-mode-hook)))) ;;; Commands
--- a/lisp/gnus/gnus-registry.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/gnus-registry.el Sat Oct 14 17:36:28 2006 +0000 @@ -60,6 +60,7 @@ (require 'gnus) (require 'gnus-int) (require 'gnus-sum) +(require 'gnus-util) (require 'nnmail) (defvar gnus-registry-dirty t @@ -243,7 +244,8 @@ (gnus-registry-clean-empty-function)) ;; now trim the registry appropriately (setq gnus-registry-alist (gnus-registry-trim - (hashtable-to-alist gnus-registry-hashtb))) + (gnus-hashtable-to-alist + gnus-registry-hashtb))) ;; really save (gnus-registry-cache-save) (setq gnus-registry-entry-caching caching) @@ -262,7 +264,7 @@ (defun gnus-registry-read () (gnus-registry-cache-read) - (setq gnus-registry-hashtb (alist-to-hashtable gnus-registry-alist)) + (setq gnus-registry-hashtb (gnus-alist-to-hashtable gnus-registry-alist)) (setq gnus-registry-dirty nil)) (defun gnus-registry-trim (alist) @@ -290,26 +292,6 @@ (cdr (gethash (car a) timehash)) (cdr (gethash (car b) timehash)))))))))) -(defun alist-to-hashtable (alist) - "Build a hashtable from the values in ALIST." - (let ((ht (make-hash-table - :size 4096 - :test 'equal))) - (mapc - (lambda (kv-pair) - (puthash (car kv-pair) (cdr kv-pair) ht)) - alist) - ht)) - -(defun hashtable-to-alist (hash) - "Build an alist from the values in HASH." - (let ((list nil)) - (maphash - (lambda (key value) - (setq list (cons (cons key value) list))) - hash) - list)) - (defun gnus-registry-action (action data-header from &optional to method) (let* ((id (mail-header-id data-header)) (subject (gnus-registry-simplify-subject @@ -660,7 +642,7 @@ "Clear the Gnus registry." (interactive) (setq gnus-registry-alist nil) - (setq gnus-registry-hashtb (alist-to-hashtable gnus-registry-alist)) + (setq gnus-registry-hashtb (gnus-alist-to-hashtable gnus-registry-alist)) (setq gnus-registry-dirty t)) ;;;###autoload
--- a/lisp/gnus/gnus-sum.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/gnus-sum.el Sat Oct 14 17:36:28 2006 +0000 @@ -992,7 +992,11 @@ :group 'gnus-summary) (defvar gnus-decode-encoded-word-function 'mail-decode-encoded-word-string - "Variable that says which function should be used to decode a string with encoded words.") + "Function used to decode a string with encoded words.") + +(defvar gnus-decode-encoded-address-function + 'mail-decode-encoded-address-string + "Function used to decode addresses with encoded words.") (defcustom gnus-extra-headers '(To Newsgroups) "*Extra headers to parse." @@ -1001,7 +1005,7 @@ :type '(repeat symbol)) (defcustom gnus-ignored-from-addresses - (and user-mail-address + (and user-mail-address (not (string= user-mail-address "")) (regexp-quote user-mail-address)) "*Regexp of From headers that may be suppressed in favor of To headers." @@ -2434,7 +2438,7 @@ ["Unread" gnus-summary-limit-to-unread t] ["Unseen" gnus-summary-limit-to-unseen t] ["Non-dormant" gnus-summary-limit-exclude-dormant t] - ["Next articles" gnus-summary-limit-to-articles t] + ["Next or process marked articles" gnus-summary-limit-to-articles t] ["Pop limit" gnus-summary-pop-limit t] ["Show dormant" gnus-summary-limit-include-dormant t] ["Hide childless dormant" @@ -3436,7 +3440,7 @@ (concat "-> " (inline (gnus-summary-extract-address-component - (funcall gnus-decode-encoded-word-function to))))) + (funcall gnus-decode-encoded-address-function to))))) ((setq newsgroups (cdr (assq 'Newsgroups extra-headers))) (concat "=> " newsgroups))))) (inline (gnus-summary-extract-address-component gnus-tmp-from))))) @@ -4182,7 +4186,7 @@ (error x)) (condition-case () ; from (gnus-remove-odd-characters - (funcall gnus-decode-encoded-word-function + (funcall gnus-decode-encoded-address-function (setq x (nnheader-nov-field)))) (error x)) (nnheader-nov-field) ; date @@ -5956,7 +5960,7 @@ (progn (goto-char p) (if (search-forward "\nfrom:" nil t) - (funcall gnus-decode-encoded-word-function + (funcall gnus-decode-encoded-address-function (nnheader-header-value)) "(nobody)")) ;; Date. @@ -8449,10 +8453,11 @@ ;; the parent article. (when (setq to-address (or (gnus-fetch-field "reply-to") (gnus-fetch-field "from"))) - (setq params (append - (list (cons 'to-address - (funcall gnus-decode-encoded-word-function - to-address)))))) + (setq params + (append + (list (cons 'to-address + (funcall gnus-decode-encoded-address-function + to-address)))))) (setq dig (nnheader-set-temp-buffer " *gnus digest buffer*")) (insert-buffer-substring gnus-original-article-buffer) ;; Remove lines that may lead nndoc to misinterpret the
--- a/lisp/gnus/gnus-util.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/gnus-util.el Sat Oct 14 17:36:28 2006 +0000 @@ -746,6 +746,28 @@ (unless dir (delete-directory directory))))) +;; The following two functions are used in gnus-registry. +;; They were contributed by Andreas Fuchs <asf@void.at>. +(defun gnus-alist-to-hashtable (alist) + "Build a hashtable from the values in ALIST." + (let ((ht (make-hash-table + :size 4096 + :test 'equal))) + (mapc + (lambda (kv-pair) + (puthash (car kv-pair) (cdr kv-pair) ht)) + alist) + ht)) + +(defun gnus-hashtable-to-alist (hash) + "Build an alist from the values in HASH." + (let ((list nil)) + (maphash + (lambda (key value) + (setq list (cons (cons key value) list))) + hash) + list)) + (defun gnus-strip-whitespace (string) "Return STRING stripped of all whitespace." (while (string-match "[\r\n\t ]+" string) @@ -1616,6 +1638,25 @@ (defalias 'gnus-set-process-query-on-exit-flag 'process-kill-without-query)) +(if (fboundp 'with-local-quit) + (defalias 'gnus-with-local-quit 'with-local-quit) + (defmacro gnus-with-local-quit (&rest body) + "Execute BODY, allowing quits to terminate BODY but not escape further. +When a quit terminates BODY, `gnus-with-local-quit' returns nil but +requests another quit. That quit will be processed as soon as quitting +is allowed once again. (Immediately, if `inhibit-quit' is nil.)" + ;;(declare (debug t) (indent 0)) + `(condition-case nil + (let ((inhibit-quit nil)) + ,@body) + (quit (setq quit-flag t) + ;; This call is to give a chance to handle quit-flag + ;; in case inhibit-quit is nil. + ;; Without this, it will not be handled until the next function + ;; call, and that might allow it to exit thru a condition-case + ;; that intends to handle the quit signal next time. + (eval '(ignore nil)))))) + (provide 'gnus-util) ;;; arch-tag: f94991af-d32b-4c97-8c26-ca12a934de49
--- a/lisp/gnus/mail-parse.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/mail-parse.el Sat Oct 14 17:36:28 2006 +0000 @@ -70,6 +70,8 @@ (defalias 'mail-encode-encoded-word-string 'rfc2047-encode-string) (defalias 'mail-decode-encoded-word-region 'rfc2047-decode-region) (defalias 'mail-decode-encoded-word-string 'rfc2047-decode-string) +(defalias 'mail-decode-encoded-address-region 'rfc2047-decode-address-region) +(defalias 'mail-decode-encoded-address-string 'rfc2047-decode-address-string) (provide 'mail-parse)
--- a/lisp/gnus/message.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/message.el Sat Oct 14 17:36:28 2006 +0000 @@ -3280,7 +3280,7 @@ (message-narrow-to-head-1) (vector 0 (or (message-fetch-field "subject") "none") - (message-fetch-field "from") + (or (message-fetch-field "from") "nobody") (message-fetch-field "date") (message-fetch-field "message-id" t) (message-fetch-field "references") @@ -3329,7 +3329,7 @@ (message-narrow-to-head-1) (vector 0 (or (message-fetch-field "subject") "none") - (message-fetch-field "from") + (or (message-fetch-field "from") "nobody") (message-fetch-field "date") (message-fetch-field "message-id" t) (message-fetch-field "references") @@ -3897,9 +3897,15 @@ 'call-process-region (append (list (point-min) (point-max) - (if (boundp 'sendmail-program) - sendmail-program - "/usr/lib/sendmail") + (cond ((boundp 'sendmail-program) + sendmail-program) + ((file-exists-p "/usr/sbin/sendmail") + "/usr/sbin/sendmail") + ((file-exists-p "/usr/lib/sendmail") + "/usr/lib/sendmail") + ((file-exists-p "/usr/ucblib/sendmail") + "/usr/ucblib/sendmail") + (t "fakemail")) nil errbuf nil "-oi") ;; Always specify who from, ;; since some systems have broken sendmails. @@ -5837,7 +5843,7 @@ (setq message-id (message-fetch-field "message-id" t) references (message-fetch-field "references") date (message-fetch-field "date") - from (message-fetch-field "from") + from (or (message-fetch-field "from") "nobody") subject (or (message-fetch-field "subject") "none")) (when gnus-list-identifiers (setq subject (message-strip-list-identifiers subject)))
--- a/lisp/gnus/mm-util.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/mm-util.el Sat Oct 14 17:36:28 2006 +0000 @@ -253,7 +253,7 @@ :tag "Other options" (cons (symbol :tag "From charset") (symbol :tag "To charset")))) - :version "23.0" ;; No Gnus + :version "22.1" ;; Gnus 5.10.9 :group 'mime) (defcustom mm-charset-eval-alist @@ -270,7 +270,7 @@ evaluated. This allows to load additional libraries providing charsets on demand. If supported by your Emacs version, you could use `autoload-coding-system' here." - :version "23.0" ;; No Gnus + :version "22.1" ;; Gnus 5.10.9 :type '(list (set :inline t (const (windows-1250 . (mm-codepage-setup 1250 t))) (const (windows-1251 . (mm-codepage-setup 1251 t)))
--- a/lisp/gnus/nnslashdot.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/nnslashdot.el Sat Oct 14 17:36:28 2006 +0000 @@ -258,7 +258,9 @@ (setq contents (buffer-substring (search-forward "<div class=\"commentBody\">") - (search-forward "</div>"))))))) + (progn + (search-forward "<div class=\"commentSub\">") + (match-beginning 0)))))))) (search-failed (nnslashdot-lose why))) (when contents
--- a/lisp/gnus/pop3.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/pop3.el Sat Oct 14 17:36:28 2006 +0000 @@ -75,22 +75,26 @@ (defcustom pop3-authentication-scheme 'pass "*POP3 authentication scheme. -Defaults to 'pass, for the standard USER/PASS authentication. Other valid -values are 'apop." +Defaults to `pass', for the standard USER/PASS authentication. The other +valid value is 'apop'." + :type '(choice (const :tag "Normal user/password" pass) + (const :tag "APOP" apop)) :version "22.1" ;; Oort Gnus - :type '(choice (const :tag "USER/PASS" pass) - (const :tag "APOP" apop)) :group 'pop3) (defcustom pop3-leave-mail-on-server nil "*Non-nil if the mail is to be left on the POP server after fetching. -If the `pop3-leave-mail-on-server' is non-`nil' the mail is to be -left on the POP server after fetching. Note that POP servers -maintain no state information between sessions, so what the -client believes is there and what is actually there may not match -up. If they do not, then the whole thing can fall apart and -leave you with a corrupt mailbox." +If `pop3-leave-mail-on-server' is non-nil the mail is to be left +on the POP server after fetching. Note that POP servers maintain +no state information between sessions, so what the client +believes is there and what is actually there may not match up. +If they do not, then you may get duplicate mails or the whole +thing can fall apart and leave you with a corrupt mailbox." + ;; We can't use the UILD support from XEmacs mail-lib or cvs.m17n.org: + ;; http://thread.gmane.org/v9lld8fml4.fsf@marauder.physik.uni-ulm.de + ;; http://thread.gmane.org/b9yy8hzy9ej.fsf@jpl.org + ;; Any volunteer to re-implement this? :version "22.1" ;; Oort Gnus :type 'boolean :group 'pop3) @@ -166,11 +170,14 @@ (unless pop3-leave-mail-on-server (pop3-dele process n)) (setq n (+ 1 n)) - (if pop3-debug (sit-for 1) (sit-for 0.1)) - ) + (if pop3-debug (sit-for 1) (sit-for 0.1))) ; why? + (when (and pop3-leave-mail-on-server + (> n 1)) + (message "pop3.el doesn't support UIDL. Setting `pop3-leave-mail-on-server' +to %s might not give the result you'd expect." pop3-leave-mail-on-server) + (sit-for 1)) (pop3-quit process)) - (kill-buffer crashbuf) - ) + (kill-buffer crashbuf)) t) (defun pop3-get-message-count () @@ -312,6 +319,8 @@ ;; Date: 08 Jul 1996 23:22:24 -0400 ;; should be ;; Tue Jul 9 09:04:21 1996 + + ;; Fixme: This should use timezone on the date field contents. (setq date (cond ((not date) "Tue Jan 1 00:00:0 1900")
--- a/lisp/gnus/rfc2047.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/gnus/rfc2047.el Sat Oct 14 17:36:28 2006 +0000 @@ -171,6 +171,42 @@ (re-search-forward ":[ \t\n]*" nil t) (buffer-substring-no-properties (point) (point-max))))) +(defun rfc2047-quote-special-characters-in-quoted-strings (&optional + encodable-regexp) + "Quote special characters with `\\'s in quoted strings. +Quoting will not be done in a quoted string if it contains characters +matching ENCODABLE-REGEXP." + (goto-char (point-min)) + (let ((tspecials (concat "[" ietf-drums-tspecials "]")) + beg end) + (with-syntax-table (standard-syntax-table) + (while (search-forward "\"" nil t) + (setq beg (match-beginning 0)) + (unless (eq (char-before beg) ?\\) + (goto-char beg) + (setq beg (1+ beg)) + (condition-case nil + (progn + (forward-sexp) + (setq end (1- (point))) + (goto-char beg) + (if (and encodable-regexp + (re-search-forward encodable-regexp end t)) + (goto-char (1+ end)) + (save-restriction + (narrow-to-region beg end) + (while (re-search-forward tspecials nil 'move) + (if (eq (char-before) ?\\) + (if (looking-at tspecials) ;; Already quoted. + (forward-char) + (insert "\\")) + (goto-char (match-beginning 0)) + (insert "\\") + (forward-char)))) + (forward-char))) + (error + (goto-char beg)))))))) + (defvar rfc2047-encoding-type 'address-mime "The type of encoding done by `rfc2047-encode-region'. This should be dynamically bound around calls to @@ -187,8 +223,18 @@ (while (not (eobp)) (save-restriction (rfc2047-narrow-to-field) + (setq method nil + alist rfc2047-header-encoding-alist) + (while (setq elem (pop alist)) + (when (or (and (stringp (car elem)) + (looking-at (car elem))) + (eq (car elem) t)) + (setq alist nil + method (cdr elem)))) (if (not (rfc2047-encodable-p)) - (prog1 + (prog2 + (when (eq method 'address-mime) + (rfc2047-quote-special-characters-in-quoted-strings)) (if (and (eq (mm-body-7-or-8) '8bit) (mm-multibyte-p) (mm-coding-system-p @@ -209,14 +255,6 @@ (point)) (point-max)))) ;; We found something that may perhaps be encoded. - (setq method nil - alist rfc2047-header-encoding-alist) - (while (setq elem (pop alist)) - (when (or (and (stringp (car elem)) - (looking-at (car elem))) - (eq (car elem) t)) - (setq alist nil - method (cdr elem)))) (re-search-forward "^[^:]+: *" nil t) (cond ((eq method 'address-mime) @@ -347,6 +385,7 @@ (rfc2047-encode start (point)) (goto-char end)))) ;; `address-mime' case -- take care of quoted words, comments. + (rfc2047-quote-special-characters-in-quoted-strings encodable-regexp) (with-syntax-table rfc2047-syntax-table (goto-char (point-min)) (condition-case err ; in case of unbalanced quotes @@ -821,6 +860,29 @@ the decoder will fully decode each encoded-word before concatenating them.") +(defun rfc2047-strip-backslashes-in-quoted-strings () + "Strip backslashes in quoted strings. `\\\"' remains." + (goto-char (point-min)) + (let (beg) + (with-syntax-table (standard-syntax-table) + (while (search-forward "\"" nil t) + (unless (eq (char-before) ?\\) + (setq beg (match-end 0)) + (goto-char (match-beginning 0)) + (condition-case nil + (progn + (forward-sexp) + (save-restriction + (narrow-to-region beg (1- (point))) + (goto-char beg) + (while (search-forward "\\" nil 'move) + (unless (memq (char-after) '(?\")) + (delete-backward-char 1)) + (forward-char))) + (forward-char)) + (error + (goto-char beg)))))))) + (defun rfc2047-charset-to-coding-system (charset) "Return coding-system corresponding to MIME CHARSET. If your Emacs implementation can't decode CHARSET, return nil." @@ -898,8 +960,10 @@ ;; and worthwhile (is it more correct or not?), e.g. something like ;; `=?iso-8859-1?q?foo?=@'. -(defun rfc2047-decode-region (start end) - "Decode MIME-encoded words in region between START and END." +(defun rfc2047-decode-region (start end &optional address-mime) + "Decode MIME-encoded words in region between START and END. +If ADDRESS-MIME is non-nil, strip backslashes which precede characters +other than `\"' and `\\' in quoted strings." (interactive "r") (let ((case-fold-search t) (eword-regexp (eval-when-compile @@ -910,6 +974,8 @@ (save-excursion (save-restriction (narrow-to-region start end) + (when address-mime + (rfc2047-strip-backslashes-in-quoted-strings)) (goto-char (setq b start)) ;; Look for the encoded-words. (while (setq match (re-search-forward eword-regexp nil t)) @@ -995,8 +1061,16 @@ (not (eq mail-parse-charset 'gnus-decoded))) (mm-decode-coding-region b (point-max) mail-parse-charset)))))) -(defun rfc2047-decode-string (string) - "Decode the quoted-printable-encoded STRING and return the results." +(defun rfc2047-decode-address-region (start end) + "Decode MIME-encoded words in region between START and END. +Backslashes which precede characters other than `\"' and `\\' in quoted +strings are stripped." + (rfc2047-decode-region start end t)) + +(defun rfc2047-decode-string (string &optional address-mime) + "Decode MIME-encoded STRING and return the result. +If ADDRESS-MIME is non-nil, strip backslashes which precede characters +other than `\"' and `\\' in quoted strings." (let ((m (mm-multibyte-p))) (if (string-match "=\\?" string) (with-temp-buffer @@ -1010,8 +1084,16 @@ (mm-enable-multibyte)) (insert string) (inline - (rfc2047-decode-region (point-min) (point-max))) + (rfc2047-decode-region (point-min) (point-max) address-mime)) (buffer-string)) + (when address-mime + (setq string + (with-temp-buffer + (when (mm-multibyte-string-p string) + (mm-enable-multibyte)) + (insert string) + (rfc2047-strip-backslashes-in-quoted-strings) + (buffer-string)))) ;; Fixme: As above, `m' here is inappropriate. (if (and m mail-parse-charset @@ -1033,6 +1115,12 @@ (mm-decode-coding-string string mail-parse-charset)) (mm-string-as-multibyte string))))) +(defun rfc2047-decode-address-string (string) + "Decode MIME-encoded STRING and return the result. +Backslashes which precede characters other than `\"' and `\\' in quoted +strings are stripped." + (rfc2047-decode-string string t)) + (defun rfc2047-pad-base64 (string) "Pad STRING to quartets." ;; Be more liberal to accept buggy base64 strings. If
--- a/lisp/help-at-pt.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/help-at-pt.el Sat Oct 14 17:36:28 2006 +0000 @@ -246,7 +246,7 @@ (defun scan-buf-move-to-region (prop &optional arg hook) "Go to the start of the next region with non-nil PROP property. Then run HOOK, which should be a quoted symbol that is a normal -hook.variable, or an expression evaluating to such a symbol. +hook variable, or an expression evaluating to such a symbol. Adjacent areas with different non-nil PROP properties are considered different regions.
--- a/lisp/help.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/help.el Sat Oct 14 17:36:28 2006 +0000 @@ -309,7 +309,7 @@ The prefix described consists of all but the last event of the key sequence that ran this command." (interactive) - (let* ((key (this-command-keys))) + (let ((key (this-command-keys))) (describe-bindings (if (stringp key) (substring key 0 (1- (length key))) @@ -535,28 +535,6 @@ (princ string))))) nil) -(defun string-key-binding (key) - "Value is the binding of KEY in a string. -If KEY is an event on a string, and that string has a `local-map' -or `keymap' property, return the binding of KEY in the string's keymap." - (let* ((defn nil) - (start (when (vectorp key) - (if (memq (aref key 0) - '(mode-line header-line left-margin right-margin)) - (event-start (aref key 1)) - (and (consp (aref key 0)) - (event-start (aref key 0)))))) - (string-info (and (consp start) (nth 4 start)))) - (when string-info - (let* ((string (car string-info)) - (pos (cdr string-info)) - (local-map (and (>= pos 0) - (< pos (length string)) - (or (get-text-property pos 'local-map string) - (get-text-property pos 'keymap string))))) - (setq defn (and local-map (lookup-key local-map key))))) - defn)) - (defun help-key-description (key untranslated) (let ((string (key-description key))) (if (or (not untranslated) @@ -589,11 +567,14 @@ (menu-bar-update-yank-menu "(any string)" nil)) (setq key (read-key-sequence "Describe key (or click or menu item): ")) ;; If KEY is a down-event, read and discard the - ;; corresponding up-event. - (if (and (vectorp key) - (eventp (elt key 0)) - (memq 'down (event-modifiers (elt key 0)))) - (read-event)) + ;; corresponding up-event. Note that there are also + ;; down-events on scroll bars and mode lines: the actual + ;; event then is in the second element of the vector. + (and (vectorp key) + (let ((last-idx (1- (length key)))) + (and (eventp (aref key last-idx)) + (memq 'down (event-modifiers (aref key last-idx))))) + (read-event)) (list key (if current-prefix-arg (prefix-numeric-value current-prefix-arg)) @@ -604,46 +585,33 @@ (fset 'yank-menu (cons 'keymap yank-menu)))))) (if (numberp untranslated) (setq untranslated (this-single-command-raw-keys))) - (save-excursion - (let ((modifiers (event-modifiers (aref key 0))) - (standard-output (if insert (current-buffer) t)) - window position) - ;; For a mouse button event, go to the button it applies to - ;; to get the right key bindings. And go to the right place - ;; in case the keymap depends on where you clicked. - (if (or (memq 'click modifiers) (memq 'down modifiers) - (memq 'drag modifiers)) - (setq window (posn-window (event-start (aref key 0))) - position (posn-point (event-start (aref key 0))))) - (if (windowp window) - (progn - (set-buffer (window-buffer window)) - (goto-char position))) - ;; Ok, now look up the key and name the command. - (let ((defn (or (string-key-binding key) - (key-binding key t))) - key-desc) - ;; Handle the case where we faked an entry in "Select and Paste" menu. - (if (and (eq defn nil) - (stringp (aref key (1- (length key)))) - (eq (key-binding (substring key 0 -1)) 'yank-menu)) - (setq defn 'menu-bar-select-yank)) - ;; Don't bother user with strings from (e.g.) the select-paste menu. - (if (stringp (aref key (1- (length key)))) - (aset key (1- (length key)) "(any string)")) - (if (and (> (length untranslated) 0) - (stringp (aref untranslated (1- (length untranslated))))) - (aset untranslated (1- (length untranslated)) - "(any string)")) - ;; Now describe the key, perhaps as changed. - (setq key-desc (help-key-description key untranslated)) - (if (or (null defn) (integerp defn) (equal defn 'undefined)) - (princ (format "%s is undefined" key-desc)) - (princ (format (if (windowp window) - "%s at that spot runs the command %s" - "%s runs the command %s") - key-desc - (if (symbolp defn) defn (prin1-to-string defn))))))))) + (let* ((event (if (and (symbolp (aref key 0)) + (> (length key) 1) + (consp (aref key 1))) + (aref key 1) + (aref key 0))) + (modifiers (event-modifiers event)) + (standard-output (if insert (current-buffer) t)) + (mouse-msg (if (or (memq 'click modifiers) (memq 'down modifiers) + (memq 'drag modifiers)) " at that spot" "")) + (defn (key-binding key t)) + key-desc) + ;; Handle the case where we faked an entry in "Select and Paste" menu. + (if (and (eq defn nil) + (stringp (aref key (1- (length key)))) + (eq (key-binding (substring key 0 -1)) 'yank-menu)) + (setq defn 'menu-bar-select-yank)) + ;; Don't bother user with strings from (e.g.) the select-paste menu. + (if (stringp (aref key (1- (length key)))) + (aset key (1- (length key)) "(any string)")) + (if (and (> (length untranslated) 0) + (stringp (aref untranslated (1- (length untranslated))))) + (aset untranslated (1- (length untranslated)) "(any string)")) + ;; Now describe the key, perhaps as changed. + (setq key-desc (help-key-description key untranslated)) + (if (or (null defn) (integerp defn) (equal defn 'undefined)) + (princ (format "%s%s is undefined" key-desc mouse-msg)) + (princ (format "%s%s runs the command %S" key-desc mouse-msg defn))))) (defun describe-key (&optional key untranslated up-event) "Display documentation of the function invoked by KEY. @@ -673,109 +641,119 @@ (list key (prefix-numeric-value current-prefix-arg) - ;; If KEY is a down-event, read the corresponding up-event - ;; and use it as the third argument. - (if (and (vectorp key) - (eventp (elt key 0)) - (memq 'down (event-modifiers (elt key 0)))) - (read-event)))) + ;; If KEY is a down-event, read and discard the + ;; corresponding up-event. Note that there are also + ;; down-events on scroll bars and mode lines: the actual + ;; event then is in the second element of the vector. + (and (vectorp key) + (let ((last-idx (1- (length key)))) + (and (eventp (aref key last-idx)) + (memq 'down (event-modifiers (aref key last-idx))))) + (or (and (eventp (aref key 0)) + (memq 'down (event-modifiers (aref key 0))) + ;; However, for the C-down-mouse-2 popup + ;; menu, there is no subsequent up-event. In + ;; this case, the up-event is the next + ;; element in the supplied vector. + (= (length key) 1)) + (and (> (length key) 1) + (eventp (aref key 1)) + (memq 'down (event-modifiers (aref key 1))))) + (read-event)))) ;; Put yank-menu back as it was, if we changed it. (when saved-yank-menu (setq yank-menu (copy-sequence saved-yank-menu)) (fset 'yank-menu (cons 'keymap yank-menu)))))) (if (numberp untranslated) (setq untranslated (this-single-command-raw-keys))) - (save-excursion - (let ((modifiers (event-modifiers (aref key 0))) - window position) - ;; For a mouse button event, go to the button it applies to - ;; to get the right key bindings. And go to the right place - ;; in case the keymap depends on where you clicked. - (if (or (memq 'click modifiers) (memq 'down modifiers) - (memq 'drag modifiers)) - (setq window (posn-window (event-start (aref key 0))) - position (posn-point (event-start (aref key 0))))) - (when (windowp window) - (set-buffer (window-buffer window)) - (goto-char position)) - (let ((defn (or (string-key-binding key) (key-binding key t)))) - ;; Handle the case where we faked an entry in "Select and Paste" menu. - (if (and (eq defn nil) - (stringp (aref key (1- (length key)))) - (eq (key-binding (substring key 0 -1)) 'yank-menu)) - (setq defn 'menu-bar-select-yank)) - (if (or (null defn) (integerp defn) (equal defn 'undefined)) - (message "%s is undefined" (help-key-description key untranslated)) - (help-setup-xref (list #'describe-function defn) (interactive-p)) - ;; Don't bother user with strings from (e.g.) the select-paste menu. - (if (stringp (aref key (1- (length key)))) - (aset key (1- (length key)) "(any string)")) - (if (and untranslated - (stringp (aref untranslated (1- (length untranslated))))) - (aset untranslated (1- (length untranslated)) - "(any string)")) - (with-output-to-temp-buffer (help-buffer) - (princ (help-key-description key untranslated)) - (if (windowp window) - (princ " at that spot")) - (princ " runs the command ") - (prin1 defn) - (princ "\n which is ") - (describe-function-1 defn) - (when up-event - (let ((type (event-basic-type up-event)) - (hdr "\n\n-------------- up event ---------------\n\n") - defn sequence - mouse-1-tricky mouse-1-remapped) - (setq sequence (vector up-event)) - (when (and (eq type 'mouse-1) - (windowp window) + (let* ((event (aref key (if (and (symbolp (aref key 0)) + (> (length key) 1) + (consp (aref key 1))) + 1 + 0))) + (modifiers (event-modifiers event)) + (mouse-msg (if (or (memq 'click modifiers) (memq 'down modifiers) + (memq 'drag modifiers)) " at that spot" "")) + (defn (key-binding key t)) + defn-up defn-up-tricky ev-type + mouse-1-remapped mouse-1-tricky) + + ;; Handle the case where we faked an entry in "Select and Paste" menu. + (when (and (eq defn nil) + (stringp (aref key (1- (length key)))) + (eq (key-binding (substring key 0 -1)) 'yank-menu)) + (setq defn 'menu-bar-select-yank)) + (if (or (null defn) (integerp defn) (equal defn 'undefined)) + (message "%s%s is undefined" + (help-key-description key untranslated) mouse-msg) + (help-setup-xref (list #'describe-function defn) (interactive-p)) + ;; Don't bother user with strings from (e.g.) the select-paste menu. + (when (stringp (aref key (1- (length key)))) + (aset key (1- (length key)) "(any string)")) + (when (and untranslated + (stringp (aref untranslated (1- (length untranslated))))) + (aset untranslated (1- (length untranslated)) + "(any string)")) + ;; Need to do this before erasing *Help* buffer in case event + ;; is a mouse click in an existing *Help* buffer. + (when up-event + (setq ev-type (event-basic-type up-event)) + (let ((sequence (vector up-event))) + (when (and (eq ev-type 'mouse-1) + mouse-1-click-follows-link + (not (eq mouse-1-click-follows-link 'double)) + (setq mouse-1-remapped + (mouse-on-link-p (event-start up-event)))) + (setq mouse-1-tricky (and (integerp mouse-1-click-follows-link) + (> mouse-1-click-follows-link 0))) + (cond ((stringp mouse-1-remapped) + (setq sequence mouse-1-remapped)) + ((vectorp mouse-1-remapped) + (setcar up-event (elt mouse-1-remapped 0))) + (t (setcar up-event 'mouse-2)))) + (setq defn-up (key-binding sequence nil nil (event-start up-event))) + (when mouse-1-tricky + (setq sequence (vector up-event)) + (aset sequence 0 'mouse-1) + (setq defn-up-tricky (key-binding sequence nil nil (event-start up-event)))))) + (with-output-to-temp-buffer (help-buffer) + (princ (help-key-description key untranslated)) + (princ (format "\ +%s runs the command %S + which is " + mouse-msg defn)) + (describe-function-1 defn) + (when up-event + (unless (or (null defn-up) + (integerp defn-up) + (equal defn-up 'undefined)) + (princ (format " + +----------------- up-event %s---------------- + +<%S>%s%s runs the command %S + which is " + (if mouse-1-tricky "(short click) " "") + ev-type mouse-msg + (if mouse-1-remapped + " is remapped to <mouse-2>\nwhich" "") + defn-up)) + (describe-function-1 defn-up)) + (unless (or (null defn-up-tricky) + (integerp defn-up-tricky) + (eq defn-up-tricky 'undefined)) + (princ (format " + +----------------- up-event (long click) ---------------- + +Pressing <%S>%s for longer than %d milli-seconds +runs the command %S + which is " + ev-type mouse-msg mouse-1-click-follows-link - (not (eq mouse-1-click-follows-link 'double)) - (setq mouse-1-remapped - (with-current-buffer (window-buffer window) - (mouse-on-link-p (posn-point - (event-start up-event)))))) - (setq mouse-1-tricky (and (integerp mouse-1-click-follows-link) - (> mouse-1-click-follows-link 0))) - (cond ((stringp mouse-1-remapped) - (setq sequence mouse-1-remapped)) - ((vectorp mouse-1-remapped) - (setcar up-event (elt mouse-1-remapped 0))) - (t (setcar up-event 'mouse-2)))) - (setq defn (or (string-key-binding sequence) - (key-binding sequence))) - (unless (or (null defn) (integerp defn) (equal defn 'undefined)) - (princ (if mouse-1-tricky - "\n\n----------------- up-event (short click) ----------------\n\n" - hdr)) - (setq hdr nil) - (princ (symbol-name type)) - (if (windowp window) - (princ " at that spot")) - (if mouse-1-remapped - (princ " is remapped to <mouse-2>\n which" )) - (princ " runs the command ") - (prin1 defn) - (princ "\n which is ") - (describe-function-1 defn)) - (when mouse-1-tricky - (setcar up-event 'mouse-1) - (setq defn (or (string-key-binding (vector up-event)) - (key-binding (vector up-event)))) - (unless (or (null defn) (integerp defn) (eq defn 'undefined)) - (princ (or hdr - "\n\n----------------- up-event (long click) ----------------\n\n")) - (princ "Pressing mouse-1") - (if (windowp window) - (princ " at that spot")) - (princ (format " for longer than %d milli-seconds\n" - mouse-1-click-follows-link)) - (princ " runs the command ") - (prin1 defn) - (princ "\n which is ") - (describe-function-1 defn))))) - (print-help-return-message))))))) + defn-up-tricky)) + (describe-function-1 defn-up-tricky))) + (print-help-return-message))))) (defun describe-mode (&optional buffer) "Display documentation of current major mode and minor modes. @@ -786,7 +764,7 @@ For this to work correctly for a minor mode, the mode's indicator variable \(listed in `minor-mode-alist') must also be a function whose documentation describes the minor mode." - (interactive) + (interactive "@") (unless buffer (setq buffer (current-buffer))) (help-setup-xref (list #'describe-mode buffer) (interactive-p))
--- a/lisp/hl-line.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/hl-line.el Sat Oct 14 17:36:28 2006 +0000 @@ -64,15 +64,36 @@ ;;; Code: +(defvar hl-line-overlay nil + "Overlay used by Hl-Line mode to highlight the current line.") +(make-variable-buffer-local 'hl-line-overlay) + +(defvar global-hl-line-overlay nil + "Overlay used by Global-Hl-Line mode to highlight the current line.") + (defgroup hl-line nil "Highlight the current line." :version "21.1" :group 'editing) -(defcustom hl-line-face 'highlight - "Face with which to highlight the current line." +(defface hl-line + '((t :inherit highlight)) + "Default face for highlighting the current line in Hl-Line mode." + :version "22.1" + :group 'hl-line) + +(defcustom hl-line-face 'hl-line + "Face with which to highlight the current line in Hl-Line mode." :type 'face - :group 'hl-line) + :group 'hl-line + :set (lambda (symbol value) + (set symbol value) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when hl-line-overlay + (overlay-put hl-line-overlay 'face hl-line-face)))) + (when global-hl-line-overlay + (overlay-put global-hl-line-overlay 'face hl-line-face)))) (defcustom hl-line-sticky-flag t "*Non-nil means highlight the current line in all windows. @@ -92,13 +113,6 @@ This variable is expected to be made buffer-local by modes.") -(defvar hl-line-overlay nil - "Overlay used by Hl-Line mode to highlight the current line.") -(make-variable-buffer-local 'hl-line-overlay) - -(defvar global-hl-line-overlay nil - "Overlay used by Global-Hl-Line mode to highlight the current line.") - ;;;###autoload (define-minor-mode hl-line-mode "Buffer-local minor mode to highlight the line about point.
--- a/lisp/ibuf-ext.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/ibuf-ext.el Sat Oct 14 17:36:28 2006 +0000 @@ -370,7 +370,11 @@ "Evaluate FORM in each of the buffers. Does not display the buffer during evaluation. See `ibuffer-do-view-and-eval' for that." - (:interactive "xEval in buffers (form): " + (:interactive + (list + (read-from-minibuffer + "Eval in buffers (form): " + nil read-expression-map t 'read-expression-history)) :opstring "evaluated in" :modifier-p :maybe) (eval form)) @@ -379,7 +383,11 @@ (define-ibuffer-op view-and-eval (form) "Evaluate FORM while displaying each of the marked buffers. To evaluate a form without viewing the buffer, see `ibuffer-do-eval'." - (:interactive "xEval viewing buffers (form): " + (:interactive + (list + (read-from-minibuffer + "Eval viewing in buffers (form): " + nil read-expression-map t 'read-expression-history)) :opstring "evaluated in" :complex t :modifier-p :maybe)
--- a/lisp/ibuffer.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/ibuffer.el Sat Oct 14 17:36:28 2006 +0000 @@ -1972,12 +1972,12 @@ (not (eq ibuffer-buf buf)))))) ;; This function is a special case; it's not defined by -;; `ibuffer-define-sorter'. +;; `define-ibuffer-sorter'. (defun ibuffer-do-sort-by-recency () "Sort the buffers by last view time." (interactive) (setq ibuffer-sorting-mode 'recency) - (ibuffer-redisplay t)) + (ibuffer-update nil t)) (defun ibuffer-update-format () (when (null ibuffer-current-format)
--- a/lisp/icomplete.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/icomplete.el Sat Oct 14 17:36:28 2006 +0000 @@ -157,6 +157,12 @@ (< (length x) (length y)))) ", ") ">")))))) +;;;_ = icomplete-with-completion-tables +(defvar icomplete-with-completion-tables '(internal-complete-buffer) + "Specialized completion tables with which icomplete should operate. + +Icomplete does not operate with any specialized completion tables +except those on this list.") ;;;_ > icomplete-mode (&optional prefix) ;;;###autoload @@ -184,8 +190,9 @@ (and (window-minibuffer-p (selected-window)) (not executing-kbd-macro) minibuffer-completion-table - ;; (or minibuffer-completing-file-name - (not (functionp minibuffer-completion-table)))) ;; ) + (or (not (functionp minibuffer-completion-table)) + (member minibuffer-completion-table + icomplete-with-completion-tables)))) ;;;_ > icomplete-minibuffer-setup () (defun icomplete-minibuffer-setup ()
--- a/lisp/ido.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/ido.el Sat Oct 14 17:36:28 2006 +0000 @@ -2112,7 +2112,7 @@ (defun ido-edit-input () "Edit absolute file name entered so far with ido; terminate by RET." (interactive) - (setq ido-text-init (if ido-matches (car ido-matches) ido-text)) + (setq ido-text-init (if ido-matches (ido-name (car ido-matches)) ido-text)) (setq ido-exit 'edit) (exit-minibuffer)) @@ -2224,7 +2224,6 @@ (let ((ido-current-directory (ido-expand-directory default)) (ido-context-switch-command switch-cmd) ido-directory-nonreadable ido-directory-too-big - (minibuffer-completing-file-name t) filename) (if (or (not ido-mode) (ido-is-slow-ftp-host)) @@ -2268,9 +2267,10 @@ (unless filename (setq ido-saved-vc-hb vc-handled-backends) - (setq filename (ido-read-internal item - (or prompt "Find file: ") - 'ido-file-history nil nil initial))) + (let ((minibuffer-completing-file-name t)) + (setq filename (ido-read-internal item + (or prompt "Find file: ") + 'ido-file-history nil nil initial)))) ;; Choose the file name: either the text typed in, or the head ;; of the list of matches @@ -2426,13 +2426,13 @@ ((and (= 1 (length ido-matches)) (not (and ido-enable-tramp-completion (string-equal ido-current-directory "/") - (string-match "..[@:]\\'" (car ido-matches))))) + (string-match "..[@:]\\'" (ido-name (car ido-matches)))))) ;; only one choice, so select it. (if (not ido-confirm-unique-completion) (exit-minibuffer) (setq ido-rescan (not ido-enable-prefix)) (delete-region (minibuffer-prompt-end) (point)) - (insert (car ido-matches)))) + (insert (ido-name (car ido-matches))))) (t ;; else there could be some completions (setq res ido-common-match-string) @@ -2814,7 +2814,7 @@ "Use first matching item as input text." (interactive) (when ido-matches - (setq ido-text-init (car ido-matches)) + (setq ido-text-init (ido-name (car ido-matches))) (setq ido-exit 'refresh) (exit-minibuffer))) @@ -2828,7 +2828,7 @@ "Move to previous directory in file name, push first match on stack." (interactive) (if ido-matches - (setq ido-text (car ido-matches))) + (setq ido-text (ido-name (car ido-matches)))) (setq ido-exit 'push) (exit-minibuffer)) @@ -3084,12 +3084,14 @@ (let ((oa (ido-file-extension-order a n)) (ob (ido-file-extension-order b n))) (cond - ((= oa ob) - lessp) ((and oa ob) - (if lessp - (> oa ob) - (< oa ob))) + (cond + ((= oa ob) + lessp) + (lessp + (> oa ob)) + (t + (< oa ob)))) (oa (not lessp)) (ob @@ -3136,7 +3138,12 @@ (let ((filenames (split-string (shell-command-to-string - (concat "find " dir " -name \"" (if prefix "" "*") file "*\" -type " (if finddir "d" "f") " -print")))) + (concat "find " + (shell-quote-argument dir) + " -name " + (shell-quote-argument + (concat (if prefix "" "*") file "*")) + " -type " (if finddir "d" "f") " -print")))) filename d f res) (while filenames @@ -3618,7 +3625,7 @@ ((stringp nextstr) (and (>= flen (setq slen (length nextstr))) (string-equal (substring name (- flen slen)) nextstr))) - ((fboundp nextstr) (funcall nextstr name)) + ((functionp nextstr) (funcall nextstr name)) (t nil)) (setq ignorep t ext-list nil @@ -3628,7 +3635,7 @@ (setq nextstr (car re-list)) (if (cond ((stringp nextstr) (string-match nextstr name)) - ((fboundp nextstr) (funcall nextstr name)) + ((functionp nextstr) (funcall nextstr name)) (t nil)) (setq ignorep t re-list nil) @@ -3745,7 +3752,7 @@ "Kill the buffer at the head of `ido-matches'." (interactive) (let ((enable-recursive-minibuffers t) - (buf (car ido-matches))) + (buf (ido-name (car ido-matches)))) (when buf (kill-buffer buf) ;; Check if buffer still exists. @@ -3760,7 +3767,7 @@ "Delete the file at the head of `ido-matches'." (interactive) (let ((enable-recursive-minibuffers t) - (file (car ido-matches))) + (file (ido-name (car ido-matches)))) (if file (setq file (concat ido-current-directory file))) (when (and file @@ -3781,7 +3788,8 @@ (defun ido-visit-buffer (buffer method &optional record) "Switch to BUFFER according to METHOD. Record command in `command-history' if optional RECORD is non-nil." - + (if (bufferp buffer) + (setq buffer (buffer-name buffer))) (let (win newframe) (cond ((eq method 'kill) @@ -4201,7 +4209,7 @@ ((= (length contents) 2) "/") (ido-matches - (concat ido-current-directory (car ido-matches))) + (concat ido-current-directory (ido-name (car ido-matches)))) (t (concat ido-current-directory (substring contents 0 -1))))) (setq ido-text-init (substring contents -1)) @@ -4237,12 +4245,12 @@ ido-matches (or (eq ido-enter-matching-directory 'first) (null (cdr ido-matches))) - (ido-final-slash (car ido-matches)) + (ido-final-slash (ido-name (car ido-matches))) (or try-single-dir-match (eq ido-enter-matching-directory t))) (ido-trace "single match" (car ido-matches)) (ido-set-current-directory - (concat ido-current-directory (car ido-matches))) + (concat ido-current-directory (ido-name (car ido-matches)))) (setq ido-exit 'refresh) (exit-minibuffer))
--- a/lisp/image-mode.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/image-mode.el Sat Oct 14 17:36:28 2006 +0000 @@ -60,16 +60,19 @@ (setq major-mode 'image-mode) (use-local-map image-mode-map) (add-hook 'change-major-mode-hook 'image-toggle-display-text nil t) - (if (not (get-text-property (point-min) 'display)) + (if (and (display-images-p) + (not (get-text-property (point-min) 'display))) (image-toggle-display) ;; Set next vars when image is already displayed but local ;; variables were cleared by kill-all-local-variables (setq cursor-type nil truncate-lines t)) (run-mode-hooks 'image-mode-hook) - (message "%s" (concat (substitute-command-keys - "Type \\[image-toggle-display] to view the image as ") - (if (get-text-property (point-min) 'display) - "text" "an image") "."))) + (if (display-images-p) + (message "%s" (concat + (substitute-command-keys + "Type \\[image-toggle-display] to view the image as ") + (if (get-text-property (point-min) 'display) + "text" "an image") ".")))) ;;;###autoload (define-minor-mode image-minor-mode
--- a/lisp/imenu.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/imenu.el Sat Oct 14 17:36:28 2006 +0000 @@ -967,15 +967,15 @@ (defvar imenu-buffer-menubar nil) (defvar imenu-menubar-modified-tick 0 - "The value of (buffer-modified-tick) as of last call to `imenu-update-menubar'.") + "The value of (buffer-chars-modified-tick) as of the last call +to `imenu-update-menubar'.") (make-variable-buffer-local 'imenu-menubar-modified-tick) (defun imenu-update-menubar () (when (and (current-local-map) (keymapp (lookup-key (current-local-map) [menu-bar index])) - (not (eq (buffer-modified-tick) - imenu-menubar-modified-tick))) - (setq imenu-menubar-modified-tick (buffer-modified-tick)) + (/= (buffer-chars-modified-tick) imenu-menubar-modified-tick)) + (setq imenu-menubar-modified-tick (buffer-chars-modified-tick)) (let ((index-alist (imenu--make-index-alist t))) ;; Don't bother updating if the index-alist has not changed ;; since the last time we did it.
--- a/lisp/info-look.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/info-look.el Sat Oct 14 17:36:28 2006 +0000 @@ -843,12 +843,13 @@ (info-lookup-maybe-add-help :mode 'maxima-mode :ignore-case t - :regexp "[a-zA-Z_%]+" + :regexp "[a-zA-Z0-9_%]+" :doc-spec '( ("(maxima)Function and Variable Index" nil "^ -+ [^:]+:[ ]+\\(\\[[^=]*=[ ]+\\)?" nil))) (info-lookup-maybe-add-help :mode 'inferior-maxima-mode + :regexp "[a-zA-Z0-9_%]+" :other-modes '(maxima-mode)) ;; coreutils and bash builtins overlap in places, eg. printf, so there's a
--- a/lisp/info.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/info.el Sat Oct 14 17:36:28 2006 +0000 @@ -2792,7 +2792,8 @@ Give an empty topic name to go to the Index node itself." (interactive (list - (let ((Info-complete-menu-buffer (clone-buffer)) + (let ((completion-ignore-case t) + (Info-complete-menu-buffer (clone-buffer)) (Info-complete-nodes (Info-index-nodes)) (Info-history-list nil)) (if (equal Info-current-file "dir")
--- a/lisp/international/code-pages.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/international/code-pages.el Sat Oct 14 17:36:28 2006 +0000 @@ -1273,6 +1273,138 @@ ?\â– ?\ ]) +;;;###autoload(autoload-coding-system 'cp858 '(require 'code-pages)) +(cp-make-coding-system + cp858 + [?\Ç + ?\ü + ?\é + ?\â + ?\ä + ?\à + ?\Ã¥ + ?\ç + ?\ê + ?\ë + ?\è + ?\ï + ?\î + ?\ì + ?\Ä + ?\Ã… + ?\É + ?\æ + ?\Æ + ?\ô + ?\ö + ?\ò + ?\û + ?\ù + ?\ÿ + ?\Ö + ?\Ãœ + ?\ø + ?\£ + ?\Ø + ?\× + ?\Æ’ + ?\á + ?\à + ?\ó + ?\ú + ?\ñ + ?\Ñ + ?\ª + ?\º + ?\¿ + ?\® + ?\¬ + ?\½ + ?\¼ + ?\¡ + ?\« + ?\» + ?\â–‘ + ?\â–’ + ?\â–“ + ?\│ + ?\┤ + ?\à + ?\ + ?\À + ?\© + ?\â•£ + ?\â•‘ + ?\â•— + ?\â• + ?\¢ + ?\Â¥ + ?\â” + ?\â”” + ?\â”´ + ?\┬ + ?\├ + ?\─ + ?\┼ + ?\ã + ?\à + ?\â•š + ?\â•” + ?\â•© + ?\╦ + ?\â• + ?\â• + ?\╬ + ?\¤ + ?\ð + ?\à + ?\Ê + ?\Ë + ?\È + ?\€ + ?\à + ?\ÃŽ + ?\à + ?\┘ + ?\┌ + ?\â–ˆ + ?\â–„ + ?\¦ + ?\ÃŒ + ?\â–€ + ?\Ó + ?\ß + ?\Ô + ?\Ã’ + ?\õ + ?\Õ + ?\µ + ?\þ + ?\Þ + ?\Ú + ?\Û + ?\Ù + ?\ý + ?\à + ?\¯ + ?\´ + ?\ + ?\± + ?\‗ + ?\¾ + ?\¶ + ?\§ + ?\÷ + ?\¸ + ?\° + ?\¨ + ?\· + ?\¹ + ?\³ + ?\² + ?\â– + ?\ ]) + ;;;###autoload(autoload-coding-system 'cp860 '(require 'code-pages)) (cp-make-coding-system cp860 @@ -3442,11 +3574,11 @@ ?\Æ’ ?\§ ?\¤ - nil + ?\’ ?\“ ?\« - nil - nil + ?\‹ + ?\› ?\ï¬ ?\fl ?\® @@ -3457,8 +3589,8 @@ ?\¦ ?\¶ ?\• - nil - nil + ?\‚ + ?\„ ?\†?\» ?\… @@ -3804,62 +3936,92 @@ (cp-make-coding-system ;; The base system uses arabic-iso-8bit, but that's not a MIME charset. iso-8859-6 - [nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil - nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil + [nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil + nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil ?\ - ?\¤ - ?\ØŒ - ?\ - ?\Ø› - ?\ØŸ - ?\Ø¡ - ?\Ø¢ - ?\Ø£ - ?\ؤ - ?\Ø¥ - ?\ئ - ?\ا - ?\ب - ?\Ø© - ?\ت - ?\Ø« - ?\ج - ?\Ø - ?\Ø® - ?\د - ?\Ø° - ?\ر - ?\ز - ?\س - ?\Ø´ - ?\ص - ?\ض - ?\Ø· - ?\ظ - ?\ع - ?\غ - ?\Ù€ - ?\Ù - ?\Ù‚ - ?\Ùƒ - ?\Ù„ - ?\Ù… - ?\Ù† - ?\Ù‡ - ?\Ùˆ - ?\Ù‰ - ?\ÙŠ - ?\Ù‹ - ?\ÙŒ - ?\Ù - ?\ÙŽ - ?\Ù - ?\Ù - ?\Ù‘ - ?\Ù’ - nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil - nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil - nil nil nil nil nil nil nil nil nil nil nil] + nil + nil + nil + ?¤ + nil + nil + nil + nil + nil + nil + nil + ?ØŒ + ? + nil + nil + nil + nil + nil + nil + nil + nil + nil + nil + nil + nil + nil + ?Ø› + nil + nil + nil + ?ØŸ + nil + ?Ø¡ + ?Ø¢ + ?Ø£ + ?ؤ + ?Ø¥ + ?ئ + ?ا + ?ب + ?Ø© + ?ت + ?Ø« + ?ج + ?Ø + ?Ø® + ?د + ?Ø° + ?ر + ?ز + ?س + ?Ø´ + ?ص + ?ض + ?Ø· + ?ظ + ?ع + ?غ + nil + nil + nil + nil + nil + ?Ù€ + ?Ù + ?Ù‚ + ?Ùƒ + ?Ù„ + ?Ù… + ?Ù† + ?Ù‡ + ?Ùˆ + ?Ù‰ + ?ÙŠ + ?Ù‹ + ?ÙŒ + ?Ù + ?ÙŽ + ?Ù + ?Ù + ?Ù‘ + ?Ù’ + nil nil nil nil nil nil nil nil nil nil nil nil nil] "Unicode-based Arabic ISO/IEC 8859-6 (MIME: ISO-8859-6)" ?6) (define-coding-system-alias 'arabic-iso-8bit 'iso-8859-6)
--- a/lisp/international/codepage.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/international/codepage.el Sat Oct 14 17:36:28 2006 +0000 @@ -220,16 +220,32 @@ ;; character created by (make-char 'latin-iso8859-1 (+ N 160)). ;; The element nil means there's no corresponding cp850 glyph. [ - 255 173 189 156 207 190 221 245 249 184 166 174 170 240 169 nil + 255 173 189 156 207 190 221 245 249 184 166 174 170 240 169 238 248 241 253 252 239 230 244 250 247 251 167 175 172 171 243 168 183 181 182 199 142 143 146 128 212 144 210 211 222 214 215 216 - 209 165 227 224 226 229 153 158 157 235 233 234 154 237 231 225 + 209 165 227 224 226 229 153 158 157 235 233 234 154 237 232 225 133 160 131 198 132 134 145 135 138 130 136 137 141 161 140 139 - 208 164 149 162 147 228 148 246 155 151 163 150 129 236 232 152] + 208 164 149 162 147 228 148 246 155 151 163 150 129 236 231 152] "Table for converting ISO-8859-1 characters into codepage 850 glyphs.") (setplist 'cp850-decode-table '(charset latin-iso8859-1 language "Latin-1" offset 160)) +;; Multilingual (Latin-9) +(defvar cp858-decode-table + ;; Nth element is the code of a cp858 glyph for the multibyte + ;; character created by (make-char 'latin-iso8859-15 (+ N 160)). + ;; The element nil means there's no corresponding cp858 glyph. + [ + 255 173 189 156 213 190 221 245 249 184 166 174 170 240 169 238 + 248 241 253 252 239 230 244 250 247 251 167 175 172 171 243 168 + 183 181 182 199 142 143 146 128 212 144 210 211 222 214 215 216 + 209 165 227 224 226 229 153 158 157 235 233 234 154 237 232 225 + 133 160 131 198 132 134 145 135 138 130 136 137 141 161 140 139 + 208 164 149 162 147 228 148 246 155 151 163 150 129 236 231 152] + "Table for converting ISO-8859-15 characters into codepage 858 glyphs.") +(setplist 'cp858-decode-table + '(charset latin-iso8859-15 language "Latin-9" offset 160)) + ;; Greek (defvar cp851-decode-table [
--- a/lisp/international/latexenc.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/international/latexenc.el Sat Oct 14 17:36:28 2006 +0000 @@ -63,7 +63,7 @@ ("cp437" . cp437) ; IBM code page 437: 225 is \beta ("cp850" . cp850) ; IBM code page 850 ("cp852" . cp852) ; IBM code page 852 - ;; ("cp858" . undecided) ; IBM code page 850 but with a euro symbol + ("cp858" . cp858) ; IBM code page 850 but with a euro symbol ("cp865" . cp865) ; IBM code page 865 ;; The DECMultinational charaterset used by the OpenVMS system ;; ("decmulti" . undecided)
--- a/lisp/international/mule-cmds.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/international/mule-cmds.el Sat Oct 14 17:36:28 2006 +0000 @@ -216,19 +216,21 @@ ((eq eol-type 'dos) 1) ((eq eol-type 'mac) 2) (t eol-type)))) - (let ((orig-eol-type (coding-system-eol-type coding-system))) - (if (vectorp orig-eol-type) - (if (not eol-type) - coding-system - (aref orig-eol-type eol-type)) - (let ((base (coding-system-base coding-system))) - (if (not eol-type) - base - (if (= eol-type orig-eol-type) - coding-system - (setq orig-eol-type (coding-system-eol-type base)) - (if (vectorp orig-eol-type) - (aref orig-eol-type eol-type)))))))) + ;; We call `coding-system-base' before `coding-system-eol-type', + ;; because the coding-system may not be initialized until then. + (let* ((base (coding-system-base coding-system)) + (orig-eol-type (coding-system-eol-type coding-system))) + (cond ((vectorp orig-eol-type) + (if (not eol-type) + coding-system + (aref orig-eol-type eol-type))) + ((not eol-type) + base) + ((= eol-type orig-eol-type) + coding-system) + ((progn (setq orig-eol-type (coding-system-eol-type base)) + (vectorp orig-eol-type)) + (aref orig-eol-type eol-type))))) (defun coding-system-change-text-conversion (coding-system coding) "Return a coding system which differs from CODING-SYSTEM in text conversion.
--- a/lisp/international/mule.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/international/mule.el Sat Oct 14 17:36:28 2006 +0000 @@ -1871,7 +1871,13 @@ (let ((pos-marker (copy-marker (+ (point) inserted))) ;; Prevent locking. (buffer-file-name nil)) - (set-buffer-multibyte nil) + (if visit + ;; If we're doing this for find-file, + ;; don't record undo info; this counts as + ;; part of producing the buffer's initial contents. + (let ((buffer-undo-list t)) + (set-buffer-multibyte nil)) + (set-buffer-multibyte nil)) (setq inserted (- pos-marker (point))))) (set-buffer-modified-p modified-p)))) inserted)
--- a/lisp/international/quail.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/international/quail.el Sat Oct 14 17:36:28 2006 +0000 @@ -1095,8 +1095,8 @@ Optional 6th arg PROPS is a property list annotating TRANS. See the function `quail-define-rules' for the detail." - (if (null (stringp key)) - "Invalid Quail key `%s'" key) + (if (not (or (stringp key) (vectorp key))) + (error "Invalid Quail key `%s'" key)) (if (not (or (numberp trans) (stringp trans) (vectorp trans) (consp trans) (symbolp trans)
--- a/lisp/international/utf-8.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/international/utf-8.el Sat Oct 14 17:36:28 2006 +0000 @@ -309,7 +309,10 @@ ;; Here we bind coding-system-for-read to nil so that coding tags ;; in the files are respected even if the files are not yet ;; byte-compiled - (let ((coding-system-for-read nil)) + (let ((coding-system-for-read nil) + ;; We must avoid clobbering this variable, in case the load + ;; files below use different coding systems. + (last-coding-system-used last-coding-system-used)) (cond ((string= "Korean" current-language-environment) (load "subst-jis") (load "subst-big5")
--- a/lisp/isearch.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/isearch.el Sat Oct 14 17:36:28 2006 +0000 @@ -1293,23 +1293,18 @@ (defun isearch-mouse-2 (click) "Handle mouse-2 in Isearch mode. For a click in the echo area, invoke `isearch-yank-x-selection'. -Otherwise invoke whatever mouse-2 is bound to outside of Isearch." +Otherwise invoke whatever the calling mouse-2 command sequence +is bound to outside of Isearch." (interactive "e") (let* ((w (posn-window (event-start click))) (overriding-terminal-local-map nil) - (key (vector (event-basic-type click))) - ;; FIXME: `key-binding' should accept an event as argument - ;; and do all the overlay/text-properties lookup etc... - (binding (with-current-buffer - (if (window-live-p w) (window-buffer w) (current-buffer)) - (key-binding key)))) + (binding (key-binding (this-command-keys-vector) t))) (if (and (window-minibuffer-p w) (not (minibuffer-window-active-p w))) ; in echo area (isearch-yank-x-selection) (when (functionp binding) (call-interactively binding))))) - (defun isearch-yank-internal (jumpform) "Pull the text from point to the point reached by JUMPFORM. JUMPFORM is a lambda expression that takes no arguments and returns a @@ -1807,8 +1802,6 @@ ((eq char ?|) (isearch-fallback t nil t))) ;; Append the char to the search string, update the message and re-search. - (if (char-table-p translation-table-for-input) - (setq char (or (aref translation-table-for-input char) char))) (isearch-process-search-string (char-to-string char) (if (>= char ?\200) @@ -1993,6 +1986,36 @@ (t (if isearch-forward 'search-forward 'search-backward))))) +(defun isearch-search-string (string bound noerror) + ;; Search for the first occurance of STRING or its translation. If + ;; found, move point to the end of the occurance, update + ;; isearch-match-beg and isearch-match-end, and return point. + (let ((func (isearch-search-fun)) + (len (length string)) + pos1 pos2) + (setq pos1 (save-excursion (funcall func string bound noerror))) + (if (and (char-table-p translation-table-for-input) + (> (string-bytes string) len)) + (let (translated match-data) + (dotimes (i len) + (let ((x (aref translation-table-for-input (aref string i)))) + (when x + (or translated (setq translated (copy-sequence string))) + (aset translated i x)))) + (when translated + (save-match-data + (save-excursion + (if (setq pos2 (funcall func translated bound noerror)) + (setq match-data (match-data t))))) + (when (and pos2 + (or (not pos1) + (if isearch-forward (< pos2 pos1) (> pos2 pos1)))) + (setq pos1 pos2) + (set-match-data match-data))))) + (if pos1 + (goto-char pos1)) + pos1)) + (defun isearch-search () ;; Do the search with the current search string. (isearch-message nil t) @@ -2008,9 +2031,7 @@ (setq isearch-error nil) (while retry (setq isearch-success - (funcall - (isearch-search-fun) - isearch-string nil t)) + (isearch-search-string isearch-string nil t)) ;; Clear RETRY unless we matched some invisible text ;; and we aren't supposed to do that. (if (or (eq search-invisible t) @@ -2353,7 +2374,7 @@ (isearch-regexp isearch-lazy-highlight-regexp) (search-spaces-regexp search-whitespace-regexp)) (condition-case nil - (funcall (isearch-search-fun) + (isearch-search-string isearch-lazy-highlight-last-string (if isearch-forward (min (or isearch-lazy-highlight-end-limit (point-max))
--- a/lisp/jit-lock.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/jit-lock.el Sat Oct 14 17:36:28 2006 +0000 @@ -349,7 +349,7 @@ ;; Fontify chunks beginning at START. The end of a ;; chunk is either `end', or the start of a region ;; before `end' that has already been fontified. - (while start + (while (and start (< start end)) ;; Determine the end of this chunk. (setq next (or (text-property-any start end 'fontified t) end)) @@ -397,19 +397,21 @@ ;; eagerly extend the refontified region with ;; jit-lock-after-change-extend-region-functions. (when (< start orig-start) - (lexical-let ((start start) - (orig-start orig-start) - (buf (current-buffer))) - (run-with-timer - 0 nil (lambda () - (with-current-buffer buf - (with-buffer-prepared-for-jit-lock - (put-text-property start orig-start - 'fontified t))))))) + (run-with-timer 0 nil 'jit-lock-force-redisplay + (current-buffer) start orig-start)) ;; Find the start of the next chunk, if any. (setq start (text-property-any next end 'fontified nil)))))))) +(defun jit-lock-force-redisplay (buf start end) + "Force the display engine to re-render buffer BUF from START to END." + (with-current-buffer buf + (with-buffer-prepared-for-jit-lock + ;; Don't cause refontification (it's already been done), but just do + ;; some random buffer change, so as to force redisplay. + (put-text-property start end 'fontified t)))) + + ;;; Stealth fontification.
--- a/lisp/language/european.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/language/european.el Sat Oct 14 17:36:28 2006 +0000 @@ -37,7 +37,7 @@ (set-language-info-alist "Latin-1" '((charset ascii latin-iso8859-1) (coding-system iso-latin-1) - (coding-priority iso-latin-1) + (coding-priority iso-latin-1 windows-1252) (nonascii-translation . latin-iso8859-1) (unibyte-syntax . "latin-1") (unibyte-display . iso-latin-1) @@ -278,7 +278,7 @@ "German" '((tutorial . "TUTORIAL.de") (charset ascii latin-iso8859-1) (coding-system iso-latin-1 iso-latin-9) - (coding-priority iso-latin-1) + (coding-priority iso-latin-1 windows-1252) (input-method . "german-postfix") (nonascii-translation . latin-iso8859-1) (unibyte-syntax . "latin-1")
--- a/lisp/locate.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/locate.el Sat Oct 14 17:36:28 2006 +0000 @@ -114,6 +114,7 @@ ;; Variables +(defvar locate-current-search nil) (defvar locate-current-filter nil) (defgroup locate nil @@ -289,29 +290,36 @@ (run-locate-command (or (and current-prefix-arg (not locate-prompt-for-command)) (and (not current-prefix-arg) locate-prompt-for-command))) + locate-buffer ) ;; Find the Locate buffer - (save-window-excursion - (set-buffer (get-buffer-create locate-buffer-name)) + (setq locate-buffer (if (eq major-mode 'locate-mode) + (current-buffer) + (get-buffer-create locate-buffer-name))) + + (save-excursion + (set-buffer locate-buffer) (locate-mode) + (let ((inhibit-read-only t) - (buffer-undo-list t)) - (erase-buffer) - - (setq locate-current-filter filter) + (buffer-undo-list t)) + (erase-buffer) - (if run-locate-command - (shell-command search-string locate-buffer-name) - (apply 'call-process locate-cmd nil t nil locate-cmd-args)) + (set (make-local-variable 'locate-current-search) search-string) + (set (make-local-variable 'locate-current-filter) filter) + + (if run-locate-command + (shell-command search-string) + (apply 'call-process locate-cmd nil t nil locate-cmd-args)) - (and filter - (locate-filter-output filter)) + (and filter + (locate-filter-output filter)) - (locate-do-setup search-string) - )) - (and (not (string-equal (buffer-name) locate-buffer-name)) - (switch-to-buffer-other-window locate-buffer-name)) + (locate-do-setup search-string))) + + (unless (eq (current-buffer) locate-buffer) + (switch-to-buffer-other-window locate-buffer)) (run-hooks 'dired-mode-hook) (dired-next-line 3) ;move to first matching file. @@ -461,6 +469,7 @@ default-directory "/" buffer-read-only t selective-display t) + (buffer-disable-undo) (dired-alist-add-1 default-directory (point-min-marker)) (set (make-local-variable 'dired-directory) "/") (set (make-local-variable 'dired-subdir-switches) locate-ls-subdir-switches) @@ -492,11 +501,12 @@ ;; Nothing returned from locate command? (and (eobp) (progn - (kill-buffer locate-buffer-name) - (if locate-current-filter - (error "Locate: no match for %s in database using filter %s" - search-string locate-current-filter) - (error "Locate: no match for %s in database" search-string)))) + (let ((filter locate-current-filter)) ; local + (kill-buffer (current-buffer)) + (if filter + (error "Locate: no match for %s in database using filter %s" + search-string filter) + (error "Locate: no match for %s in database" search-string))))) (locate-insert-header search-string) @@ -580,15 +590,14 @@ "Revert the *Locate* buffer. If `locate-update-when-revert' is non-nil, offer to update the locate database using the shell command in `locate-update-command'." - (let ((str (car locate-history-list))) - (and locate-update-when-revert - (yes-or-no-p "Update locate database (may take a few seconds)? ") - ;; `expand-file-name' is used in order to autoload Tramp if - ;; necessary. It cannot be loaded when `default-directory' - ;; is remote. - (let ((default-directory (expand-file-name locate-update-path))) - (shell-command locate-update-command))) - (locate str))) + (and locate-update-when-revert + (yes-or-no-p "Update locate database (may take a few seconds)? ") + ;; `expand-file-name' is used in order to autoload Tramp if + ;; necessary. It cannot be loaded when `default-directory' + ;; is remote. + (let ((default-directory (expand-file-name locate-update-path))) + (shell-command locate-update-command))) + (locate locate-current-search locate-current-filter)) ;;; Modified three functions from `dired.el': ;;; dired-find-directory,
--- a/lisp/longlines.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/longlines.el Sat Oct 14 17:36:28 2006 +0000 @@ -410,7 +410,7 @@ (defun longlines-window-change-function () "Re-wrap the buffer if the window width has changed. -This is called by `window-size-change-functions'." +This is called by `window-configuration-change-hook'." (when (/= fill-column (- (window-width) window-min-width)) (setq fill-column (- (window-width) window-min-width)) (let ((mod (buffer-modified-p)))
--- a/lisp/lpr.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/lpr.el Sat Oct 14 17:36:28 2006 +0000 @@ -140,8 +140,9 @@ ;; Berkeley systems support -F, and GNU pr supports both -f and -F, ;; So it looks like -F is a better default. -(defcustom lpr-page-header-switches '("-F") +(defcustom lpr-page-header-switches '("-h %s" "-F") "*List of strings to use as options for the page-header-generating program. +If `%s' appears in one of the strings, it is substituted by the page title. The variable `lpr-page-header-program' specifies the program to use." :type '(repeat string) :group 'lpr) @@ -243,8 +244,8 @@ (let ((new-coords (print-region-new-buffer start end))) (apply 'call-process-region (car new-coords) (cdr new-coords) lpr-page-header-program t t nil - (nconc (list "-h" title) - lpr-page-header-switches))) + (mapcar (lambda (e) (format e title)) + lpr-page-header-switches))) (setq start (point-min) end (point-max)))) (apply (or print-region-function 'call-process-region)
--- a/lisp/mail/feedmail.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/mail/feedmail.el Sat Oct 14 17:36:28 2006 +0000 @@ -1340,7 +1340,15 @@ (set-buffer prepped) (apply 'call-process-region (append (list (point-min) (point-max) - (if (boundp 'sendmail-program) sendmail-program "/usr/lib/sendmail") + (cond ((boundp 'sendmail-program) + sendmail-program) + ((file-exists-p "/usr/sbin/sendmail") + "/usr/sbin/sendmail") + ((file-exists-p "/usr/lib/sendmail") + "/usr/lib/sendmail") + ((file-exists-p "/usr/ucblib/sendmail") + "/usr/ucblib/sendmail") + (t "fakemail")) nil errors-to nil "-oi" "-t") ;; provide envelope "from" to sendmail; results will vary (list "-f" user-mail-address)
--- a/lisp/mail/rmail-spam-filter.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/mail/rmail-spam-filter.el Sat Oct 14 17:36:28 2006 +0000 @@ -134,12 +134,11 @@ :group 'rmail-spam-filter ) (defcustom rsf-min-region-to-spam-list 7 - "*User may highlight a region in an incomming message and use - the menubar to add this region to the spam definitions. This - variable specifies the minimum size of region that may be added - to spam list, to avoid accidentally adding a too short region - which would result in false positive identification of spam - messages." + "*Minimum size of region that you can add to the spam list. +This is a size limit on text that you can specify as +indicating a message is spam. The aim is to avoid +accidentally adding a too short region, which would result +in false positive identification of spam." :type 'integer :group 'rmail-spam-filter ) @@ -212,8 +211,8 @@ :group 'rmail-spam-filter) (defvar rsf-scanning-messages-now nil - "Non nil when rmail-spam-filter scans messages, -for interaction with `rsf-bbdb-auto-delete-spam-entries'") + "Non nil when `rmail-spam-filter' scans messages. +This is for interaction with `rsf-bbdb-auto-delete-spam-entries'.") ;; the advantage over the automatic filter definitions is the AND conjunction ;; of in-one-definition-elements @@ -596,8 +595,8 @@ (define-key rmail-mode-map "\C-cSt" 'rsf-add-subject-to-spam-list) (defun rsf-add-content-type-field () - "Maintain backward compatibility with previous versions of rmail-spam-filter. -The most recent version of rmai-spam-filter checks the contents + "Maintain backward compatibility for `rmail-spam-filter'. +The most recent version of `rmail-spam-filter' checks the contents field of the incoming mail to see if it spam. The format of `rsf-definitions-alist' has therefore changed. This function checks to see if old format is used, and if it is, it converts
--- a/lisp/mail/rmail.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/mail/rmail.el Sat Oct 14 17:36:28 2006 +0000 @@ -623,7 +623,7 @@ ;;;###autoload (defvar rmail-mime-charset-pattern - (concat "^content-type:[ ]*text/plain;" + (concat "^content-type:[ \t]*text/plain;" "\\(?:[ \t\n]*\\(?:format\\|delsp\\)=\"?[-a-z0-9]+\"?;\\)*" "[ \t\n]*charset=\"?\\([^ \t\n\";]+\\)\"?") "Regexp to match MIME-charset specification in a header of message. @@ -1677,12 +1677,15 @@ (if (and (featurep 'rmail-spam-filter) rmail-use-spam-filter (> rsf-number-of-spam 0)) - (if (= 1 new-messages) - ", and found to be a spam message" - (if (> rsf-number-of-spam 1) - (format ", %d of which found to be spam messages" - rsf-number-of-spam) - ", one of which found to be a spam message")) + (cond ((= 1 new-messages) + ", and appears to be spam") + ((= rsf-number-of-spam new-messages) + ", and all appear to be spam") + ((> rsf-number-of-spam 1) + (format ", and %d appear to be spam" + rsf-number-of-spam)) + (t + ", and 1 appears to be spam")) "")) (if (and (featurep 'rmail-spam-filter) rmail-use-spam-filter @@ -1900,6 +1903,7 @@ (defun rmail-convert-to-babyl-format () (let ((count 0) start (case-fold-search nil) + (buffer-undo-list t) (invalid-input-resync (function (lambda () (message "Invalid Babyl format in inbox!") @@ -2173,6 +2177,7 @@ ;; may still be in use. -- rms, 7 May 1993. ((eolp) (delete-char 1)) (t (error "Cannot convert to babyl format"))))) + (setq buffer-undo-list nil) count)) ;; Delete the "From ..." line, creating various other headers with @@ -2870,6 +2875,12 @@ (coding-system-change-eol-conversion coding (coding-system-eol-type old-coding))) + ;; If old-coding is `undecided', encode-coding-region + ;; will not encode the text at all. Find a proper + ;; non-trivial encoding to use. + (if (memq (coding-system-base old-coding) '(nil undecided)) + (setq old-coding + (car (find-coding-systems-region msgbeg msgend)))) (setq x-coding-header (point-marker)) (narrow-to-region msgbeg msgend) (encode-coding-region (point) msgend old-coding)
--- a/lisp/mail/sendmail.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/mail/sendmail.el Sat Oct 14 17:36:28 2006 +0000 @@ -48,6 +48,16 @@ :group 'sendmail :version "22.1") +(defcustom sendmail-program + (cond + ((file-exists-p "/usr/sbin/sendmail") "/usr/sbin/sendmail") + ((file-exists-p "/usr/lib/sendmail") "/usr/lib/sendmail") + ((file-exists-p "/usr/ucblib/sendmail") "/usr/ucblib/sendmail") + (t "fakemail")) ;In ../etc, to interface to /bin/mail. + "Program used to send messages." + :group 'mail + :type 'file) + ;;;###autoload (defcustom mail-from-style 'angles "Specifies how \"From:\" fields look.
--- a/lisp/mail/smtpmail.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/mail/smtpmail.el Sat Oct 14 17:36:28 2006 +0000 @@ -176,7 +176,12 @@ (defcustom smtpmail-starttls-credentials '(("" 25 "" "")) "Specify STARTTLS keys and certificates for servers. This is a list of four-element list with `servername' (a string), -`port' (an integer), `key' (a filename) and `certificate' (a filename)." +`port' (an integer), `key' (a filename) and `certificate' (a +filename). +If you do not have a certificate/key pair, leave the `key' and +`certificate' fields as `nil'. A key/certificate pair is only +needed if you want to use X.509 client authenticated +connections." :type '(repeat (list (string :tag "Server") (integer :tag "Port") (file :tag "Key") @@ -536,7 +541,7 @@ (decoded (base64-decode-string challenge)) (hash (rfc2104-hash 'md5 64 16 passwd decoded)) (response (concat (smtpmail-cred-user cred) " " hash)) - (encoded (base64-encode-string response))) + (encoded (base64-encode-string response t))) (smtpmail-send-command process (format "%s" encoded)) (if (or (null (car (setq ret (smtpmail-read-response process)))) (not (integerp (car ret))) @@ -549,12 +554,12 @@ (>= (car ret) 400)) (throw 'done nil)) (smtpmail-send-command - process (base64-encode-string (smtpmail-cred-user cred))) + process (base64-encode-string (smtpmail-cred-user cred) t)) (if (or (null (car (setq ret (smtpmail-read-response process)))) (not (integerp (car ret))) (>= (car ret) 400)) (throw 'done nil)) - (smtpmail-send-command process (base64-encode-string passwd)) + (smtpmail-send-command process (base64-encode-string passwd t)) (if (or (null (car (setq ret (smtpmail-read-response process)))) (not (integerp (car ret))) (>= (car ret) 400)) @@ -571,7 +576,7 @@ (concat "\0" (smtpmail-cred-user cred) "\0" - passwd)))) + passwd) t))) (if (or (null (car (setq ret (smtpmail-read-response process)))) (not (integerp (car ret))) (not (equal (car ret) 235)))
--- a/lisp/man.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/man.el Sat Oct 14 17:36:28 2006 +0000 @@ -388,6 +388,8 @@ /\e\\[[0-9][0-9]*m/ s///g" "Script for berkeley-like sed to nuke backspaces and ANSI codes from manpages.") +(defvar Man-topic-history nil "Topic read history.") + (defvar man-mode-syntax-table (let ((table (copy-syntax-table (standard-syntax-table)))) (modify-syntax-entry ?. "w" table) @@ -686,7 +688,7 @@ (if (string= default-entry "") ": " (format " (default %s): " default-entry))) - nil nil default-entry))) + nil 'Man-topic-history default-entry))) (if (string= input "") (error "No man args given") input))))
--- a/lisp/menu-bar.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/menu-bar.el Sat Oct 14 17:36:28 2006 +0000 @@ -510,7 +510,7 @@ (defun clipboard-yank () "Insert the clipboard contents, or the last stretch of killed text." - (interactive) + (interactive "*") (let ((x-select-enable-clipboard t)) (yank)))
--- a/lisp/mh-e/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/mh-e/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,18 @@ +2006-09-25 Stephen Gildea <gildea@stop.mail-abuse.org> + + * mh-junk.el (mh-spamassassin-whitelist): Add two missing + quotation marks, so that the last two arguments of sa-learn + are separated properly (closes SF #1565460). + + * (mh-spamassassin-blacklist): In example .procmailrc, add + PATH element to find mhparam on Debian. + +2006-09-24 Stephen Gildea <gildea@stop.mail-abuse.org> + + * mh-comp.el (mh-send-args): Initialize to "" instead of nil + so that we always have a valid string for split-string even if + nothing is added in mh-send-letter (closes SF #1564742). + 2006-07-03 Bill Wohler <wohler@newt.com> Release MH-E version 8.0.2.
--- a/lisp/mh-e/mh-comp.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/mh-e/mh-comp.el Sat Oct 14 17:36:28 2006 +0000 @@ -127,7 +127,7 @@ (make-syntax-table text-mode-syntax-table)) (modify-syntax-entry ?% "." mh-letter-mode-syntax-table)) -(defvar mh-send-args nil +(defvar mh-send-args "" "Extra args to pass to \"send\" command.") (defvar mh-annotate-char nil
--- a/lisp/mh-e/mh-junk.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/mh-e/mh-junk.el Sat Oct 14 17:36:28 2006 +0000 @@ -115,6 +115,9 @@ To use SpamAssassin, add the following recipes to \".procmailrc\": + # Append to $PATH the location of mhparam in some distros. + PATH=$PATH:/usr/bin/mh + MAILDIR=$HOME/`mhparam Path` # Fight spam with SpamAssassin. @@ -244,7 +247,7 @@ (when mh-sa-learn-executable (message "Recategorizing this message as ham...") (call-process mh-sa-learn-executable msg-file mh-temp-buffer nil - "--single" "--ham" "--local --no-rebuild")) + "--single" "--ham" "--local" "--no-rebuild")) (message "Whitelisting message %d..." msg) (setq from (car (mh-funcall-if-exists
--- a/lisp/mouse-sel.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/mouse-sel.el Sat Oct 14 17:36:28 2006 +0000 @@ -702,7 +702,7 @@ using double-clicks." (and initial final mouse-1-click-follows-link (eq (car initial) 'down-mouse-1) - (mouse-on-link-p (posn-point (event-start initial))) + (mouse-on-link-p (event-start initial)) (= (posn-point (event-start initial)) (posn-point (event-end final))) (= (event-click-count initial) 1) @@ -737,7 +737,8 @@ (mouse-set-point event)) (when mouse-sel-get-selection-function (push-mark (point) 'nomsg) - (insert (or (funcall mouse-sel-get-selection-function selection) "")))) + (insert-for-yank + (or (funcall mouse-sel-get-selection-function selection) "")))) ;;=== Handle loss of selections ===========================================
--- a/lisp/mouse.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/mouse.el Sat Oct 14 17:36:28 2006 +0000 @@ -556,7 +556,7 @@ (echo-keystrokes 0) (start-event-frame (window-frame (car (car (cdr start-event))))) (start-event-window (car (car (cdr start-event)))) - event mouse x left right edges wconfig growth + event mouse x left right edges growth (which-side (or (cdr (assq 'vertical-scroll-bars (frame-parameters start-event-frame))) 'right))) @@ -775,6 +775,24 @@ (mouse-drag-track start-event t)))) +(defun mouse-posn-property (pos property) + "Look for a property at click position. +POS may be either a buffer position or a click position like +those returned from `event-start'. If the click position is on +a string, the text property PROPERTY is examined. +If this is nil or the click is not on a string, then +the corresponding buffer position is searched for PROPERTY. +If PROPERTY is encountered in one of those places, +its value is returned." + (if (consp pos) + (let ((w (posn-window pos)) (pt (posn-point pos)) + (str (posn-string pos))) + (or (and str + (get-text-property (cdr str) property (car str))) + (and pt + (get-char-property pt property w)))) + (get-char-property pos property))) + (defun mouse-on-link-p (pos) "Return non-nil if POS is on a link in the current buffer. POS must be a buffer position in the current buffer or a mouse @@ -814,24 +832,23 @@ - Otherwise, the mouse-1 event is translated into a mouse-2 event at the same position." - (let ((w (and (consp pos) (posn-window pos)))) - (if (consp pos) - (setq pos (and (or mouse-1-click-in-non-selected-windows - (eq (selected-window) w)) - (posn-point pos)))) - (when pos - (with-current-buffer (window-buffer w) - (let ((action - (or (get-char-property pos 'follow-link) - (save-excursion - (goto-char pos) - (key-binding [follow-link] nil t))))) - (cond - ((eq action 'mouse-face) - (and (get-char-property pos 'mouse-face) t)) - ((functionp action) - (funcall action pos)) - (t action))))))) + (let ((action + (and (or (not (consp pos)) + mouse-1-click-in-non-selected-windows + (eq (selected-window) (posn-window pos))) + (or (mouse-posn-property pos 'follow-link) + (key-binding [follow-link] nil t pos))))) + (cond + ((eq action 'mouse-face) + (and (mouse-posn-property pos 'mouse-face) t)) + ((functionp action) + ;; FIXME: This seems questionable if the click is not in a buffer. + ;; Should we instead decide that `action' takes a `posn'? + (if (consp pos) + (with-current-buffer (window-buffer (posn-window pos)) + (funcall action (posn-point pos))) + (funcall action pos))) + (t action)))) (defun mouse-fixup-help-message (msg) "Fix help message MSG for `mouse-1-click-follows-link'." @@ -904,7 +921,7 @@ ;; Use start-point before the intangibility ;; treatment, in case we click on a link inside an ;; intangible text. - (mouse-on-link-p start-point))) + (mouse-on-link-p start-posn))) (click-count (1- (event-click-count start-event))) (remap-double-click (and on-link (eq mouse-1-click-follows-link 'double)
--- a/lisp/net/ldap.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/net/ldap.el Sat Oct 14 17:36:28 2006 +0000 @@ -490,9 +490,11 @@ for each matching entry. If nil, return all available attributes. `attrsonly', if non-nil, indicates that only attributes are retrieved, not their associated values. + `auth' is one of the symbols `simple', `krbv41' or `krbv42'. `base' is the base for the search as described in RFC 1779. `scope' is one of the three symbols `sub', `base' or `one'. `binddn' is the distinguished name of the user to bind as (in RFC 1779 syntax). + `auth' is one of the symbols `simple', `krbv41' or `krbv42' `passwd' is the password to use for simple authentication. `deref' is one of the symbols `never', `always', `search' or `find'. `timelimit' is the timeout limit for the connection in seconds. @@ -512,6 +514,7 @@ ldap-default-base)) (scope (plist-get search-plist 'scope)) (binddn (plist-get search-plist 'binddn)) + (auth (plist-get search-plist 'auth)) (passwd (plist-get search-plist 'passwd)) (deref (plist-get search-plist 'deref)) (timelimit (plist-get search-plist 'timelimit)) @@ -541,6 +544,9 @@ (if (and binddn (not (equal "" binddn))) (setq arglist (nconc arglist (list (format "-D%s" binddn))))) + (if (and auth + (equal 'simple auth)) + (setq arglist (nconc arglist (list "-x")))) (if (and passwd (not (equal "" passwd))) (setq arglist (nconc arglist (list (format "-w%s" passwd)))))
--- a/lisp/net/rcirc.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/net/rcirc.el Sat Oct 14 17:36:28 2006 +0000 @@ -142,9 +142,11 @@ (integer :tag "Number of lines")) :group 'rcirc) -(defcustom rcirc-show-maximum-output t +(defcustom rcirc-scroll-show-maximum-output t "*If non-nil, scroll buffer to keep the point at the bottom of -the window.") +the window." + :type 'boolean + :group 'rcirc) (defcustom rcirc-authinfo nil "List of authentication passwords. @@ -200,6 +202,11 @@ :initialize 'custom-initialize-default :group 'rcirc) +(defcustom rcirc-keywords nil + "List of keywords to highlight in message text." + :type '(repeat string) + :group 'rcirc) + (defcustom rcirc-ignore-list () "List of ignored nicks. Use /ignore to list them, use /ignore NICK to add or remove a nick." @@ -212,16 +219,16 @@ Nicks will be removed from the automatic list on follow-up renamings or parts.") -(defcustom rcirc-bright-nick-regexp nil - "Regexp matching nicks to be emphasized. +(defcustom rcirc-bright-nicks nil + "List of nicks to be emphasized. See `rcirc-bright-nick' face." - :type 'regexp + :type '(repeat string) :group 'rcirc) -(defcustom rcirc-dim-nick-regexp nil - "Regexp matching nicks to be deemphasized. +(defcustom rcirc-dim-nicks nil + "List of nicks to be deemphasized. See `rcirc-dim-nick' face." - :type 'regexp + :type '(repeat string) :group 'rcirc) (defcustom rcirc-print-hooks nil @@ -246,7 +253,7 @@ :group 'rcirc) (defcustom rcirc-coding-system-alist nil - "Alist to decide a coding system to use for a file I/O operation. + "Alist to decide a coding system to use for a channel I/O operation. The format is ((PATTERN . VAL) ...). PATTERN is either a string or a cons of strings. If PATTERN is a string, it is used to match a target. @@ -528,10 +535,14 @@ process cmd sender args text))) (message "UNHANDLED: %s" text))) -(defun rcirc-handler-generic (process command sender args text) +(defvar rcirc-responses-no-activity '("305" "306") + "Responses that don't trigger activity in the mode-line indicator.") + +(defun rcirc-handler-generic (process response sender args text) "Generic server response handler." - (rcirc-print process sender command nil - (mapconcat 'identity (cdr args) " ") t)) + (rcirc-print process sender response nil + (mapconcat 'identity (cdr args) " ") + (not (member response rcirc-responses-no-activity)))) (defun rcirc-send-string (process string) "Send PROCESS a STRING plus a newline." @@ -748,13 +759,8 @@ ;; if the user changes the major mode or kills the buffer, there is ;; cleanup work to do - (make-local-variable 'change-major-mode-hook) - (add-hook 'change-major-mode-hook 'rcirc-change-major-mode-hook) - (make-local-variable 'kill-buffer-hook) - (add-hook 'kill-buffer-hook 'rcirc-kill-buffer-hook) - - (make-local-variable 'window-scroll-functions) - (add-hook 'window-scroll-functions 'rcirc-scroll-to-bottom) + (add-hook 'change-major-mode-hook 'rcirc-change-major-mode-hook nil t) + (add-hook 'kill-buffer-hook 'rcirc-kill-buffer-hook nil t) ;; add to buffer list, and update buffer abbrevs (when target ; skip server buffer @@ -941,7 +947,7 @@ (if (fboundp fun) (funcall fun args process rcirc-target) (rcirc-send-string process - (concat command " " args))))))) + (concat command " :" args))))))) (defvar rcirc-parent-buffer nil) (defvar rcirc-window-configuration nil) @@ -1073,7 +1079,8 @@ "%") ((or (eq key ?n) (eq key ?N)) ;; %n/%N -- nick - (let ((nick (concat (if (string= (with-rcirc-process-buffer process + (let ((nick (concat (if (string= (with-rcirc-process-buffer + process rcirc-server) sender) "" @@ -1084,26 +1091,26 @@ face (cond ((string= sender (rcirc-nick process)) 'rcirc-my-nick) - ((and rcirc-bright-nick-regexp - (string-match rcirc-bright-nick-regexp sender)) + ((and rcirc-bright-nicks + (string-match + (regexp-opt rcirc-bright-nicks) + sender)) 'rcirc-bright-nick) - ((and rcirc-dim-nick-regexp - (string-match rcirc-dim-nick-regexp sender)) + ((and rcirc-dim-nicks + (string-match + (regexp-opt rcirc-dim-nicks) + sender)) 'rcirc-dim-nick) (t 'rcirc-other-nick)))))) - ((eq key ?T) + ((eq key ?T) ;; %T -- timestamp (rcirc-facify (format-time-string rcirc-time-format (current-time)) 'rcirc-timestamp)) ((eq key ?m) ;; %m -- message text - ;; We add the text property `rcirc-text' to identify this - ;; as the body text. - (propertize - (rcirc-mangle-text process (rcirc-facify text face)) - 'rcirc-text text)) + (rcirc-markup-text process sender response (rcirc-facify text face))) ((eq key ?t) ;; %t -- target (rcirc-facify (or rcirc-target "") face)) @@ -1152,20 +1159,10 @@ ((or (rcirc-get-buffer process target) (rcirc-any-buffer process)))))) -(defvar rcirc-activity-type nil) -(make-variable-buffer-local 'rcirc-activity-type) +(defvar rcirc-activity-types nil) +(make-variable-buffer-local 'rcirc-activity-types) (defvar rcirc-last-sender nil) (make-variable-buffer-local 'rcirc-last-sender) -(defvar rcirc-gray-toggle nil) -(make-variable-buffer-local 'rcirc-gray-toggle) - -(defun rcirc-scroll-to-bottom (window display-start) - "Scroll window to show maximum output if `rcirc-show-maximum-output' is -non-nil." - (when rcirc-show-maximum-output - (with-selected-window window - (when (>= (window-point) rcirc-prompt-end-marker) - (recenter -1))))) (defun rcirc-print (process sender response target text &optional activity) "Print TEXT in the buffer associated with TARGET. @@ -1245,42 +1242,45 @@ ;; set the window point for buffers show in windows (walk-windows (lambda (w) - (unless (eq (selected-window) w) - (when (and (eq (current-buffer) - (window-buffer w)) - (>= (window-point w) - rcirc-prompt-end-marker)) - (set-window-point w (point-max))))) + (when (and (not (eq (selected-window) w)) + (eq (current-buffer) + (window-buffer w)) + (>= (window-point w) + rcirc-prompt-end-marker)) + (set-window-point w (point-max)))) nil t) ;; restore the point (goto-char (if moving rcirc-prompt-end-marker old-point)) + ;; keep window on bottom line if it was already there + (when rcirc-scroll-show-maximum-output + (walk-windows (lambda (w) + (when (eq (window-buffer w) (current-buffer)) + (with-current-buffer (window-buffer w) + (when (eq major-mode 'rcirc-mode) + (with-selected-window w + (when (<= (- (window-height) + (count-screen-lines + (window-point) + (window-start)) + 1) + 0) + (recenter -1))))))) + nil t)) + ;; flush undo (can we do something smarter here?) (buffer-disable-undo) (buffer-enable-undo)) ;; record modeline activity - (when activity - (let ((nick-match - (with-syntax-table rcirc-nick-syntax-table - (string-match (concat "\\b" - (regexp-quote (rcirc-nick process)) - "\\b") - text)))) - (when (if rcirc-ignore-buffer-activity-flag - ;; - Always notice when our nick is mentioned - nick-match - ;; - unless our nick is mentioned, don't bother us - ;; - with dim-nicks - (or nick-match - (not (and rcirc-dim-nick-regexp sender - (string-match rcirc-dim-nick-regexp sender))))) - (rcirc-record-activity - (current-buffer) - (when (or nick-match (and (not (rcirc-channel-p rcirc-target)) - (not rcirc-low-priority-flag))) - 'nick))))) + (when (and activity + (not rcirc-ignore-buffer-activity-flag) + (not (and rcirc-dim-nicks sender + (string-match (regexp-opt rcirc-dim-nicks) sender)))) + (rcirc-record-activity (current-buffer) + (when (not (rcirc-channel-p rcirc-target)) + 'nick))) (sit-for 0) ; displayed text before hook (run-hook-with-args 'rcirc-print-hooks @@ -1501,8 +1501,7 @@ (let ((t1 (with-current-buffer b1 rcirc-last-post-time)) (t2 (with-current-buffer b2 rcirc-last-post-time))) (time-less-p t2 t1))))) - (if (not rcirc-activity-type) - (setq rcirc-activity-type type)) + (pushnew type rcirc-activity-types) (rcirc-update-activity-string))) (run-hook-with-args 'rcirc-activity-hooks buffer)) @@ -1510,7 +1509,7 @@ "Clear the BUFFER activity." (setq rcirc-activity (delete buffer rcirc-activity)) (with-current-buffer buffer - (setq rcirc-activity-type nil))) + (setq rcirc-activity-types nil))) (defun rcirc-split-activity (activity) "Return a cons cell with ACTIVITY split into (lopri . hipri)." @@ -1518,7 +1517,7 @@ (dolist (buf rcirc-activity) (with-current-buffer buf (if (and rcirc-low-priority-flag - (not (eq rcirc-activity-type 'nick))) + (not (member 'nick rcirc-activity-types))) (add-to-list 'lopri buf t) (add-to-list 'hipri buf t)))) (cons lopri hipri))) @@ -1547,11 +1546,15 @@ (defun rcirc-activity-string (buffers) (mapconcat (lambda (b) - (let ((s (rcirc-short-buffer-name b))) + (let ((s (substring-no-properties (rcirc-short-buffer-name b)))) (with-current-buffer b - (if (not (eq rcirc-activity-type 'nick)) - s - (rcirc-facify s 'rcirc-mode-line-nick))))) + (dolist (type rcirc-activity-types) + (rcirc-add-face 0 (length s) + (case type + (nick 'rcirc-track-nick) + (keyword 'rcirc-track-keyword)) + s))) + s)) buffers ",")) (defun rcirc-short-buffer-name (buffer) @@ -1566,15 +1569,18 @@ (let ((current-now-hidden t)) (walk-windows (lambda (w) (let ((buf (window-buffer w))) - (when (eq major-mode 'rcirc-mode) - (rcirc-clear-activity buf) + (with-current-buffer buf + (when (eq major-mode 'rcirc-mode) + (rcirc-clear-activity buf))) (when (eq buf rcirc-current-buffer) - (setq current-now-hidden nil)))))) + (setq current-now-hidden nil))))) ;; add overlay arrow if the buffer isn't displayed - (when (and rcirc-current-buffer current-now-hidden) + (when (and current-now-hidden + rcirc-current-buffer + (buffer-live-p rcirc-current-buffer)) (with-current-buffer rcirc-current-buffer - (when (eq major-mode 'rcirc-mode) - (marker-position overlay-arrow-position) + (when (and (eq major-mode 'rcirc-mode) + (marker-position overlay-arrow-position)) (set-marker overlay-arrow-position nil))))) ;; remove any killed buffers from list @@ -1792,17 +1798,21 @@ (rcirc-send-string process (format "PRIVMSG %s :\C-aACTION %s\C-a" target args))) +(defun rcirc-add-or-remove (set &optional elt) + (if (and elt (not (string= "" elt))) + (if (member-ignore-case elt set) + (delete elt set) + (cons elt set)) + set)) + (defun-rcirc-command ignore (nick) "Manage the ignore list. Ignore NICK, unignore NICK if already ignored, or list ignored nicks when no NICK is given. When listing ignored nicks, the ones added to the list automatically are marked with an asterisk." (interactive "sToggle ignoring of nick: ") - (when (not (string= "" nick)) - (if (member-ignore-case nick rcirc-ignore-list) - (setq rcirc-ignore-list (delete nick rcirc-ignore-list)) - (setq rcirc-ignore-list (cons nick rcirc-ignore-list)))) - (rcirc-print process (rcirc-nick process) "IGNORE" target + (setq rcirc-ignore-list (rcirc-add-or-remove rcirc-ignore-list nick)) + (rcirc-print process nil "IGNORE" target (mapconcat (lambda (nick) (concat nick @@ -1810,14 +1820,47 @@ "*" ""))) rcirc-ignore-list " "))) +(defun-rcirc-command bright (nick) + "Manage the bright nick list." + (interactive "sToggle emphasis of nick: ") + (setq rcirc-bright-nicks (rcirc-add-or-remove rcirc-bright-nicks nick)) + (rcirc-print process nil "BRIGHT" target + (mapconcat 'identity rcirc-bright-nicks " "))) + +(defun-rcirc-command dim (nick) + "Manage the dim nick list." + (interactive "sToggle deemphasis of nick: ") + (setq rcirc-dim-nicks (rcirc-add-or-remove rcirc-dim-nicks nick)) + (rcirc-print process nil "DIM" target + (mapconcat 'identity rcirc-dim-nicks " "))) + +(defun-rcirc-command keyword (keyword) + "Manage the keyword list. +Mark KEYWORD, unmark KEYWORD if already marked, or list marked +keywords when no KEYWORD is given." + (interactive "sToggle highlighting of keyword: ") + (setq rcirc-keywords (rcirc-add-or-remove rcirc-keywords keyword)) + (rcirc-print process nil "KEYWORD" target + (mapconcat 'identity rcirc-keywords " "))) + -(defun rcirc-message-leader (sender face) - "Return a string with SENDER propertized with FACE." - (rcirc-facify (concat "<" sender "> ") face)) +(defun rcirc-add-face (start end name &optional object) + "Add face NAME to the face text property of the text from START to END." + (when name + (let ((pos start) + next prop) + (while (< pos end) + (setq prop (get-text-property pos 'face object) + next (next-single-property-change pos 'face object end)) + (unless (member name (get-text-property pos 'face object)) + (add-text-properties pos next (list 'face (cons name prop)) object)) + (setq pos next))))) (defun rcirc-facify (string face) "Return a copy of STRING with FACE property added." - (propertize (or string "") 'face face 'rear-nonsticky t)) + (let ((string (or string ""))) + (rcirc-add-face 0 (length string) face string) + string)) (defvar rcirc-url-regexp (rx-to-string @@ -1835,8 +1878,8 @@ word-boundary)) (optional (and "/" - (1+ (char "-a-zA-Z0-9_=!?#$\@~`%&*+|\\/:;.,{}[]")) - (char "-a-zA-Z0-9_=#$\@~`%&*+|\\/:;{}[]"))))) + (1+ (char "-a-zA-Z0-9_=!?#$\@~`%&*+|\\/:;.,{}[]()")) + (char "-a-zA-Z0-9_=#$\@~`%&*+|\\/:;{}[]()"))))) "Regexp matching URLs. Set to nil to disable URL features in rcirc.") (defun rcirc-browse-url (&optional arg) @@ -1863,68 +1906,99 @@ (with-current-buffer (window-buffer (posn-window position)) (rcirc-browse-url-at-point (posn-point position))))) -(defun rcirc-map-regexp (function regexp string) - "Return a copy of STRING after calling FUNCTION for each REGEXP match. -FUNCTION takes 3 arguments, MATCH-START, MATCH-END, and STRING." - (let ((start 0)) - (while (string-match regexp string start) - (setq start (match-end 0)) - (funcall function (match-beginning 0) (match-end 0) string))) - string) + +(defvar rcirc-markup-text-functions + '(rcirc-markup-body-text + rcirc-markup-attributes + rcirc-markup-my-nick + rcirc-markup-urls + rcirc-markup-keywords + rcirc-markup-bright-nicks) + "List of functions used to manipulate text before it is printed. -(defun rcirc-mangle-text (process text) +Each function takes three arguments, PROCESS, SENDER, RESPONSE +and CHANNEL-BUFFER. The current buffer is temporary buffer that +contains the text to manipulate. Each function works on the text +in this buffer.") + +(defun rcirc-markup-text (process sender response text) "Return TEXT with properties added based on various patterns." - ;; ^B - (setq text - (rcirc-map-regexp - (lambda (start end string) - (let ((orig-face (get-text-property start 'face string))) - (add-text-properties - start end - (list 'face (if (listp orig-face) - (append orig-face - (list 'bold)) - (list orig-face 'bold)) - 'rear-nonsticky t) - string))) - ".*?" - text)) - ;; TODO: deal with ^_ and ^C colors sequences - (while (string-match "\\(.*\\)[]\\(.*\\)" text) - (setq text (concat (match-string 1 text) - (match-string 2 text)))) - ;; my nick - (setq text - (with-syntax-table rcirc-nick-syntax-table - (rcirc-map-regexp (lambda (start end string) - (add-text-properties - start end - (list 'face 'rcirc-nick-in-message - 'rear-nonsticky t) - string)) - (concat "\\b" - (regexp-quote (rcirc-nick process)) - "\\b") - text))) - ;; urls - (setq text - (rcirc-map-regexp - (lambda (start end string) - (let ((orig-face (get-text-property start 'face string))) - (add-text-properties start end - (list 'face (if (listp orig-face) - (append orig-face - (list 'bold)) - (list orig-face 'bold)) - 'rear-nonsticky t - 'mouse-face 'highlight - 'keymap rcirc-browse-url-map) - string)) - (push (substring-no-properties string start end) rcirc-urls)) - rcirc-url-regexp - text)) - text) + (let ((channel-buffer (current-buffer))) + (with-temp-buffer + (insert text) + (goto-char (point-min)) + (dolist (fn rcirc-markup-text-functions) + (save-excursion + (funcall fn process sender response channel-buffer))) + (buffer-substring (point-min) (point-max))))) + +(defun rcirc-markup-body-text (process sender response channel-buffer) + ;; We add the text property `rcirc-text' to identify this as the + ;; body text. + (add-text-properties (point-min) (point-max) + (list 'rcirc-text (buffer-substring-no-properties + (point-min) (point-max))))) + +(defun rcirc-markup-attributes (process sender response channel-buffer) + (while (re-search-forward "\\([\C-b\C-_\C-v]\\).*?\\(\\1\\|\C-o\\)" nil t) + (rcirc-add-face (match-beginning 0) (match-end 0) + (case (char-after (match-beginning 1)) + (?\C-b 'bold) + (?\C-v 'italic) + (?\C-_ 'underline))) + ;; keep the ^O since it could terminate other attributes + (when (not (eq ?\C-o (char-before (match-end 2)))) + (delete-region (match-beginning 2) (match-end 2))) + (delete-region (match-beginning 1) (match-end 1)) + (goto-char (1+ (match-beginning 1)))) + ;; remove the ^O characters now + (while (re-search-forward "\C-o+" nil t) + (delete-region (match-beginning 0) (match-end 0)))) +(defun rcirc-markup-my-nick (process sender response channel-buffer) + (with-syntax-table rcirc-nick-syntax-table + (while (re-search-forward (concat "\\b" + (regexp-quote (rcirc-nick process)) + "\\b") + nil t) + (rcirc-add-face (match-beginning 0) (match-end 0) + 'rcirc-nick-in-message) + (when (string= response "PRIVMSG") + (rcirc-add-face (point-min) (point-max) 'rcirc-nick-in-message-full-line) + (rcirc-record-activity channel-buffer 'nick))))) + +(defun rcirc-markup-urls (process sender response channel-buffer) + (while (re-search-forward rcirc-url-regexp nil t) + (let ((start (match-beginning 0)) + (end (match-end 0))) + (rcirc-add-face start end 'rcirc-url) + (add-text-properties start end (list 'mouse-face 'highlight + 'keymap rcirc-browse-url-map)) + ;; record the url + (let ((url (buffer-substring-no-properties start end))) + (with-current-buffer channel-buffer + (push url rcirc-urls)))))) + +(defun rcirc-markup-keywords (process sender response channel-buffer) + (let* ((target (with-current-buffer channel-buffer (or rcirc-target ""))) + (keywords (delq nil (mapcar (lambda (keyword) + (when (not (string-match keyword target)) + keyword)) + rcirc-keywords)))) + (when keywords + (while (re-search-forward (regexp-opt keywords 'words) nil t) + (rcirc-add-face (match-beginning 0) (match-end 0) 'rcirc-keyword) + (when (and (string= response "PRIVMSG") + (not (string= sender (rcirc-nick process)))) + (rcirc-record-activity channel-buffer 'keyword)))))) + +(defun rcirc-markup-bright-nicks (process sender response channel-buffer) + (when (and rcirc-bright-nicks + (string= response "NAMES")) + (with-syntax-table rcirc-nick-syntax-table + (while (re-search-forward (regexp-opt rcirc-bright-nicks 'words) nil t) + (rcirc-add-face (match-beginning 0) (match-end 0) + 'rcirc-bright-nick))))) ;;; handlers ;; these are called with the server PROCESS, the SENDER, which is a @@ -2275,12 +2349,12 @@ (((class color) (min-colors 16) (background dark)) (:foreground "Aquamarine")) (((class color) (min-colors 8)) (:foreground "magenta")) (t (:weight bold :underline t))) - "Face used for nicks matched by `rcirc-bright-nick-regexp'." + "Face used for nicks matched by `rcirc-bright-nicks'." :group 'rcirc-faces) (defface rcirc-dim-nick '((t :inherit default)) - "Face used for nicks matched by `rcirc-dim-nick-regexp'." + "Face used for nicks in `rcirc-dim-nicks'." :group 'rcirc-faces) (defface rcirc-server ; font-lock-comment-face @@ -2329,9 +2403,14 @@ (((class color) (min-colors 16) (background dark)) (:foreground "Cyan")) (((class color) (min-colors 8)) (:foreground "cyan" :weight bold)) (t (:weight bold))) - "The face used to highlight instances of nick within messages." + "The face used to highlight instances of your nick within messages." :group 'rcirc-faces) +(defface rcirc-nick-in-message-full-line + '((t (:bold t))) + "The face used emphasize the entire message when your nick is mentioned." + :group 'rcirc-faces) + (defface rcirc-prompt ; comint-highlight-prompt '((((min-colors 88) (background dark)) (:foreground "cyan1")) (((background dark)) (:foreground "cyan")) @@ -2339,9 +2418,24 @@ "The face used to highlight prompts." :group 'rcirc-faces) -(defface rcirc-mode-line-nick +(defface rcirc-track-nick + '((t (:inverse-video t))) + "The face used in the mode-line when your nick is mentioned." + :group 'rcirc-faces) + +(defface rcirc-track-keyword + '((t (:bold t ))) + "The face used in the mode-line when keywords are mentioned." + :group 'rcirc-faces) + +(defface rcirc-url '((t (:bold t))) - "The face used indicate activity directed at you." + "The face used to highlight urls." + :group 'rcirc-faces) + +(defface rcirc-keyword + '((t (:inherit highlight))) + "The face used to highlight keywords." :group 'rcirc-faces)
--- a/lisp/net/tramp.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/net/tramp.el Sat Oct 14 17:36:28 2006 +0000 @@ -3888,37 +3888,50 @@ (defun tramp-handle-make-auto-save-file-name () "Like `make-auto-save-file-name' for tramp files. Returns a file name in `tramp-auto-save-directory' for autosaving this file." - (when tramp-auto-save-directory - (unless (file-exists-p tramp-auto-save-directory) - (make-directory tramp-auto-save-directory t))) - ;; jka-compr doesn't like auto-saving, so by appending "~" to the - ;; file name we make sure that jka-compr isn't used for the - ;; auto-save file. - (let ((buffer-file-name - (if tramp-auto-save-directory - (expand-file-name - (tramp-subst-strs-in-string - '(("_" . "|") - ("/" . "_a") - (":" . "_b") - ("|" . "__") - ("[" . "_l") - ("]" . "_r")) - (buffer-file-name)) - tramp-auto-save-directory) - (buffer-file-name)))) - ;; Run plain `make-auto-save-file-name'. There might be an advice when - ;; it is not a magic file name operation (since Emacs 22). - ;; We must deactivate it temporarily. - (if (not (ad-is-active 'make-auto-save-file-name)) - (tramp-run-real-handler - 'make-auto-save-file-name nil) - ;; else - (ad-deactivate 'make-auto-save-file-name) - (prog1 - (tramp-run-real-handler - 'make-auto-save-file-name nil) - (ad-activate 'make-auto-save-file-name))))) + (let ((tramp-auto-save-directory tramp-auto-save-directory)) + ;; File name must be unique. This is ensured with Emacs 22 (see + ;; UNIQUIFY element of `auto-save-file-name-transforms'); but for + ;; all other cases we must do it ourselves. + (when (boundp 'auto-save-file-name-transforms) + (mapcar + '(lambda (x) + (when (and (string-match (car x) buffer-file-name) + (not (car (cddr x)))) + (setq tramp-auto-save-directory + (or tramp-auto-save-directory temporary-file-directory)))) + (symbol-value 'auto-save-file-name-transforms))) + ;; Create directory. + (when tramp-auto-save-directory + (unless (file-exists-p tramp-auto-save-directory) + (make-directory tramp-auto-save-directory t))) + ;; jka-compr doesn't like auto-saving, so by appending "~" to the + ;; file name we make sure that jka-compr isn't used for the + ;; auto-save file. + (let ((buffer-file-name + (if tramp-auto-save-directory + (expand-file-name + (tramp-subst-strs-in-string + '(("_" . "|") + ("/" . "_a") + (":" . "_b") + ("|" . "__") + ("[" . "_l") + ("]" . "_r")) + (buffer-file-name)) + tramp-auto-save-directory) + (buffer-file-name)))) + ;; Run plain `make-auto-save-file-name'. There might be an advice when + ;; it is not a magic file name operation (since Emacs 22). + ;; We must deactivate it temporarily. + (if (not (ad-is-active 'make-auto-save-file-name)) + (tramp-run-real-handler + 'make-auto-save-file-name nil) + ;; else + (ad-deactivate 'make-auto-save-file-name) + (prog1 + (tramp-run-real-handler + 'make-auto-save-file-name nil) + (ad-activate 'make-auto-save-file-name)))))) ;; CCC grok APPEND, LOCKNAME, CONFIRM @@ -4333,7 +4346,12 @@ "Add tramp file name handlers to `file-name-handler-alist'." (add-to-list 'file-name-handler-alist (cons tramp-file-name-regexp 'tramp-file-name-handler)) - (when (or partial-completion-mode (featurep 'ido)) + ;; `partial-completion-mode' is unknown in XEmacs. So we should + ;; load it unconditionally there. In the GNU Emacs case, method/ + ;; user/host name completion shall be bound to `partial-completion-mode'. + (when (or (not (boundp 'partial-completion-mode)) + (symbol-value 'partial-completion-mode) + (featurep 'ido)) (add-to-list 'file-name-handler-alist (cons tramp-completion-file-name-regexp 'tramp-completion-file-name-handler)) @@ -6749,8 +6767,8 @@ ;; Set file's gid change bit. Possible only when id-format is 'integer. (when (numberp (nth 3 attr)) (setcar (nthcdr 9 attr) - (not (= (nth 3 attr) - (tramp-get-remote-gid multi-method method user host))))) + (not (eql (nth 3 attr) + (tramp-get-remote-gid multi-method method user host))))) ;; Set virtual device number. (setcar (nthcdr 11 attr) (tramp-get-device multi-method method user host)) @@ -7200,10 +7218,7 @@ (defun tramp-time-diff (t1 t2) "Return the difference between the two times, in seconds. -T1 and T2 are time values (as returned by `current-time' for example). - -NOTE: This function will fail if the time difference is too large to -fit in an integer." +T1 and T2 are time values (as returned by `current-time' for example)." ;; Pacify byte-compiler with `symbol-function'. (cond ((and (fboundp 'subtract-time) (fboundp 'float-time)) @@ -7214,10 +7229,9 @@ (funcall (symbol-function 'time-to-seconds) (funcall (symbol-function 'subtract-time) t1 t2))) ((fboundp 'itimer-time-difference) - (floor (funcall - (symbol-function 'itimer-time-difference) - (if (< (length t1) 3) (append t1 '(0)) t1) - (if (< (length t2) 3) (append t2 '(0)) t2)))) + (funcall (symbol-function 'itimer-time-difference) + (if (< (length t1) 3) (append t1 '(0)) t1) + (if (< (length t2) 3) (append t2 '(0)) t2))) (t ;; snarfed from Emacs 21 time-date.el; combining ;; time-to-seconds and subtract-time
--- a/lisp/net/trampver.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/net/trampver.el Sat Oct 14 17:36:28 2006 +0000 @@ -30,7 +30,7 @@ ;; are auto-frobbed from configure.ac, so you should edit that file and run ;; "autoconf && ./configure" to change them. -(defconst tramp-version "2.0.53" +(defconst tramp-version "2.0.54" "This version of Tramp.") (defconst tramp-bug-report-address "tramp-devel@gnu.org"
--- a/lisp/newcomment.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/newcomment.el Sat Oct 14 17:36:28 2006 +0000 @@ -238,7 +238,7 @@ (defcustom comment-empty-lines nil "If nil, `comment-region' does not comment out empty lines. If t, it always comments out empty lines. -if `eol' it only comments out empty lines if comments are +If `eol' it only comments out empty lines if comments are terminated by the end of line (i.e. `comment-end' is empty)." :type '(choice (const :tag "Never" nil) (const :tag "Always" t) @@ -1124,12 +1124,44 @@ :group 'comment) (defun comment-valid-prefix-p (prefix compos) - (or - ;; Accept any prefix if the current comment is not EOL-terminated. - (save-excursion (goto-char compos) (comment-forward) (not (bolp))) - ;; Accept any prefix that starts with a comment-start marker. - (string-match (concat "\\`[ \t]*\\(?:" comment-start-skip "\\)") - prefix))) + "Check that the adaptive-fill-prefix is consistent with the context. +PREFIX is the prefix (presumably guessed by `adaptive-fill-mode'). +COMPOS is the position of the beginning of the comment we're in, or nil +if we're not inside a comment." + ;; This consistency checking is mostly needed to workaround the limitation + ;; of auto-fill-mode whose paragraph-determination doesn't pay attention + ;; to comment boundaries. + (if (null compos) + ;; We're not inside a comment: the prefix shouldn't match + ;; a comment-starter. + (not (and comment-start comment-start-skip + (string-match comment-start-skip prefix))) + (or + ;; Accept any prefix if the current comment is not EOL-terminated. + (save-excursion (goto-char compos) (comment-forward) (not (bolp))) + ;; Accept any prefix that starts with the same comment-start marker + ;; as the current one. + (when (string-match (concat "\\`[ \t]*\\(?:" comment-start-skip "\\)") + prefix) + (let ((prefix-com (comment-string-strip (match-string 0 prefix) nil t))) + (string-match "\\`[ \t]*" prefix-com) + (let* ((prefix-space (match-string 0 prefix-com)) + (prefix-indent (string-width prefix-space)) + (prefix-comstart (substring prefix-com (match-end 0)))) + (save-excursion + (goto-char compos) + ;; The comstart marker is the same. + (and (looking-at (regexp-quote prefix-comstart)) + ;; The indentation as well. + (or (= prefix-indent + (- (current-column) (current-left-margin))) + ;; Check the indentation in two different ways, just + ;; to try and avoid most of the potential funny cases. + (equal prefix-space + (buffer-substring (point) + (progn (move-to-left-margin) + (point))))))))))))) + ;;;###autoload (defun comment-indent-new-line (&optional soft) @@ -1182,8 +1214,7 @@ ;; If there's an adaptive prefix, use it unless we're inside ;; a comment and the prefix is not a comment starter. ((and fill-prefix - (or (not compos) - (comment-valid-prefix-p fill-prefix compos))) + (comment-valid-prefix-p fill-prefix compos)) (indent-to-left-margin) (insert-and-inherit fill-prefix)) ;; If we're not inside a comment, just try to indent.
--- a/lisp/novice.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/novice.el Sat Oct 14 17:36:28 2006 +0000 @@ -44,6 +44,8 @@ ;;;###autoload (define-obsolete-variable-alias 'disabled-command-hook 'disabled-command-function "22.1") +;; It is ok here to assume that this-command is a symbol +;; because we won't get called otherwise. ;;;###autoload (defun disabled-command-function (&rest ignore) (let (char)
--- a/lisp/obsolete/fast-lock.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/obsolete/fast-lock.el Sat Oct 14 17:36:28 2006 +0000 @@ -623,9 +623,9 @@ ;; Compile all keywords in case some are and some aren't. (when font-lock-syntactic-keywords (setq font-lock-syntactic-keywords (font-lock-compile-keywords - font-lock-syntactic-keywords))) + font-lock-syntactic-keywords t))) (when syntactic-keywords - (setq syntactic-keywords (font-lock-compile-keywords syntactic-keywords))) + (setq syntactic-keywords (font-lock-compile-keywords syntactic-keywords t))) (setq font-lock-keywords (font-lock-compile-keywords font-lock-keywords) keywords (font-lock-compile-keywords keywords)) ;; Use the Font Lock cache SYNTACTIC-PROPERTIES and FACE-PROPERTIES if we're
--- a/lisp/paths.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/paths.el Sat Oct 14 17:36:28 2006 +0000 @@ -159,16 +159,6 @@ "Name of directory used by system mailer for delivering new mail. Its name should end with a slash.") -(defcustom sendmail-program - (cond - ((file-exists-p "/usr/sbin/sendmail") "/usr/sbin/sendmail") - ((file-exists-p "/usr/lib/sendmail") "/usr/lib/sendmail") - ((file-exists-p "/usr/ucblib/sendmail") "/usr/ucblib/sendmail") - (t "fakemail")) ;In ../etc, to interface to /bin/mail. - "Program used to send messages." - :group 'mail - :type 'file) - (defcustom remote-shell-program (cond ;; Some systems use rsh for the remote shell; others use that name for the
--- a/lisp/pcvs-defs.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/pcvs-defs.el Sat Oct 14 17:36:28 2006 +0000 @@ -98,7 +98,7 @@ There is no need to set this if $CVSROOT is set to a correct value.") (defcustom cvs-auto-remove-handled nil - "*If up-to-date files should be acknowledged automatically. + "If up-to-date files should be acknowledged automatically. If T, they will be removed from the *cvs* buffer after every command. If DELAYED, they will be removed from the *cvs* buffer before every command. If STATUS, they will only be removed after a `cvs-mode-status' command. @@ -107,24 +107,24 @@ :type '(choice (const nil) (const status) (const delayed) (const t))) (defcustom cvs-auto-remove-directories 'handled - "*If ALL, directory entries will never be shown. + "If ALL, directory entries will never be shown. If HANDLED, only non-handled directories will be shown. If EMPTY, only non-empty directories will be shown." :group 'pcl-cvs :type '(choice (const :tag "No" nil) (const all) (const handled) (const empty))) (defcustom cvs-auto-revert t - "*Non-nil if changed files should automatically be reverted." + "Non-nil if changed files should automatically be reverted." :group 'pcl-cvs :type '(boolean)) (defcustom cvs-sort-ignore-file t - "*Non-nil if `cvs-mode-ignore' should sort the .cvsignore automatically." + "Non-nil if `cvs-mode-ignore' should sort the .cvsignore automatically." :group 'pcl-cvs :type '(boolean)) (defcustom cvs-force-dir-tag t - "*If non-nil, tagging can only be applied to directories. + "If non-nil, tagging can only be applied to directories. Tagging should generally be applied a directory at a time, but sometimes it is useful to be able to tag a single file. The normal way to do that is to use `cvs-mode-force-command' so as to temporarily override the restrictions," @@ -132,7 +132,7 @@ :type '(boolean)) (defcustom cvs-default-ignore-marks nil - "*Non-nil if cvs mode commands should ignore any marked files. + "Non-nil if cvs mode commands should ignore any marked files. Normally they run on the files that are marked (with `cvs-mode-mark'), or the file under the cursor if no files are marked. If this variable is set to a non-nil value they will by default run on the file on the @@ -151,7 +151,7 @@ (when (and cvs-force-dir-tag (not cvs-default-ignore-marks)) (push "tag" l)) l) - "*List of cvs commands that invert the default ignore-mark behavior. + "List of cvs commands that invert the default ignore-mark behavior. Commands in this set will use the opposite default from the one set in `cvs-default-ignore-marks'." :group 'pcl-cvs @@ -160,7 +160,7 @@ (const "ignore"))) (defcustom cvs-confirm-removals t - "*Ask for confirmation before removing files. + "Ask for confirmation before removing files. Non-nil means that PCL-CVS will ask confirmation before removing files except for files whose content can readily be recovered from the repository. A value of `list' means that the list of files to be deleted will be @@ -171,7 +171,7 @@ (const nil))) (defcustom cvs-add-default-message nil - "*Default message to use when adding files. + "Default message to use when adding files. If set to nil, `cvs-mode-add' will always prompt for a message." :group 'pcl-cvs :type '(choice (const :tag "Prompt" nil) @@ -195,7 +195,7 @@ ("tree" "*cvs-info*" cvs-status-mode) ("message" "*cvs-commit*" nil log-edit) ("log" "*cvs-info*" log-view-mode)) - "*Buffer name and mode to be used for each command. + "Buffer name and mode to be used for each command. This is a list of elements of the form (CMD BUFNAME MODE &optional POSTPROC) @@ -250,7 +250,7 @@ (if (fboundp 'ediff) '(cvs-ediff-diff . cvs-ediff-merge) '(cvs-emerge-diff . cvs-emerge-merge)) - "*Pair of functions to be used for resp. diff'ing and merg'ing interactively." + "Pair of functions to be used for resp. diff'ing and merg'ing interactively." :group 'pcl-cvs :type '(choice (const :tag "Ediff" (cvs-ediff-diff . cvs-ediff-merge)) (const :tag "Emerge" (cvs-emerge-diff . cvs-emerge-merge))))
--- a/lisp/pcvs.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/pcvs.el Sat Oct 14 17:36:28 2006 +0000 @@ -618,7 +618,6 @@ (str (car hf)) (done "") (tin (ewoc-nth cvs-cookies 0))) - (if (eq (length str) 2) (setq str "")) ;; look for the first *real* fileinfo (to determine emptyness) (while (and tin @@ -626,14 +625,17 @@ '(MESSAGE DIRCHANGE))) (setq tin (ewoc-next cvs-cookies tin))) (if add - (setq str (concat "-- Running " cmd " ...\n" str)) + (progn + ;; Remove the default empty line, if applicable. + (if (not (string-match "." str)) (setq str "\n")) + (setq str (concat "-- Running " cmd " ...\n" str))) (if (not (string-match (concat "^-- Running " (regexp-quote cmd) " \\.\\.\\.\n") str)) (error "Internal PCL-CVS error while removing message") (setq str (replace-match "" t t str)) - (if (zerop (length str)) (setq str "\n")) - (setq done (concat "-- last cmd: " cmd " --")))) - (setq str (concat str "\n") done (concat done "\n")) + ;; Re-add the default empty line, if applicable. + (if (not (string-match "." str)) (setq str "\n\n")) + (setq done (concat "-- last cmd: " cmd " --\n")))) ;; set the new header and footer (ewoc-set-hf cvs-cookies str (concat "\n--------------------- "
--- a/lisp/pgg-def.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/pgg-def.el Sat Oct 14 17:36:28 2006 +0000 @@ -71,6 +71,13 @@ :group 'pgg :type 'integer) +(defcustom pgg-passphrase-coding-system + (if (boundp 'locale-coding-system) + locale-coding-system) + "Coding system to encode passphrase." + :group 'pgg + :type 'coding-system) + (defvar pgg-messages-coding-system nil "Coding system used when reading from a PGP external process.")
--- a/lisp/pgg-gpg.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/pgg-gpg.el Sat Oct 14 17:36:28 2006 +0000 @@ -74,23 +74,39 @@ (errors-buffer pgg-errors-buffer) (orig-mode (default-file-modes)) (process-connection-type nil) - exit-status) + (inhibit-redisplay t) + process status exit-status + passphrase-with-newline + encoded-passphrase-with-new-line) (with-current-buffer (get-buffer-create errors-buffer) (buffer-disable-undo) (erase-buffer)) (unwind-protect (progn (set-default-file-modes 448) - (let ((coding-system-for-write 'binary) - (input (buffer-substring-no-properties start end)) - (default-enable-multibyte-characters nil)) - (with-temp-buffer - (when passphrase - (insert passphrase "\n")) - (insert input) - (setq exit-status - (apply #'call-process-region (point-min) (point-max) program - nil errors-buffer nil args)))) + (let ((coding-system-for-write 'binary)) + (setq process + (apply #'start-process "*GnuPG*" errors-buffer + program args))) + (set-process-sentinel process #'ignore) + (when passphrase + (setq passphrase-with-newline (concat passphrase "\n")) + (if pgg-passphrase-coding-system + (progn + (setq encoded-passphrase-with-new-line + (encode-coding-string passphrase-with-newline + pgg-passphrase-coding-system)) + (pgg-clear-string passphrase-with-newline)) + (setq encoded-passphrase-with-new-line passphrase-with-newline + passphrase-with-newline nil)) + (process-send-string process encoded-passphrase-with-new-line)) + (process-send-region process start end) + (process-send-eof process) + (while (eq 'run (process-status process)) + (accept-process-output process 5)) + (setq status (process-status process) + exit-status (process-exit-status process)) + (delete-process process) (with-current-buffer (get-buffer-create output-buffer) (buffer-disable-undo) (erase-buffer) @@ -100,9 +116,16 @@ 'binary))) (insert-file-contents output-file-name))) (set-buffer errors-buffer) - (if (not (equal exit-status 0)) - (insert (format "\n%s exited abnormally: '%s'\n" - program exit-status))))) + (if (memq status '(stop signal)) + (error "%s exited abnormally: '%s'" program exit-status)) + (if (= 127 exit-status) + (error "%s could not be found" program)))) + (if passphrase-with-newline + (pgg-clear-string passphrase-with-newline)) + (if encoded-passphrase-with-new-line + (pgg-clear-string encoded-passphrase-with-new-line)) + (if (and process (eq 'run (process-status process))) + (interrupt-process process)) (if (file-exists-p output-file-name) (delete-file output-file-name)) (set-default-file-modes orig-mode))))
--- a/lisp/pgg.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/pgg.el Sat Oct 14 17:36:28 2006 +0000 @@ -148,6 +148,11 @@ #'pgg-remove-passphrase-from-cache key notruncate)))) +(if (fboundp 'clear-string) + (defalias 'pgg-clear-string 'clear-string) + (defun pgg-clear-string (string) + (fillarray string ?_))) + (defun pgg-remove-passphrase-from-cache (key &optional notruncate) "Omit passphrase associated with KEY in time-limited passphrase cache. @@ -166,7 +171,7 @@ (interned-timer-key (intern-soft key pgg-pending-timers)) (old-timer (symbol-value interned-timer-key))) (when passphrase - (fillarray passphrase ?_) + (pgg-clear-string passphrase) (unintern key pgg-passphrase-cache)) (when old-timer (pgg-cancel-timer old-timer)
--- a/lisp/play/life.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/play/life.el Sat Oct 14 17:36:28 2006 +0000 @@ -56,7 +56,28 @@ " @@ " " @@ " " @@ " " @@") ("@@@@@@@@@" "@ @ @" "@ @@@@@ @" "@ @ @ @" "@@@ @@@" - "@ @ @ @" "@ @@@@@ @" "@ @ @" "@@@@@@@@@")] + "@ @ @ @" "@ @@@@@ @" "@ @ @" "@@@@@@@@@") + (" @ " + " @ @ " + " @@ @@ @@" + " @ @ @@ @@" + "@@ @ @ @@ " + "@@ @ @ @@ @ @ " + " @ @ @ " + " @ @ " + " @@ ") + (" @ " + " @ @@" + " @ @ " + " @ " + " @ " + "@ @ ") + ("@@@ @" + "@ " + " @@" + " @@ @" + "@ @ @") + ("@@@@@@@@ @@@@@ @@@ @@@@@@@ @@@@@")] "Vector of rectangles containing some Life startup patterns.") ;; Macros are used macros for manifest constants instead of variables @@ -128,6 +149,7 @@ mode-name "Life" major-mode 'life-mode truncate-lines t + show-trailing-whitespace nil life-current-generation 0 life-generation-string "0" mode-line-buffer-identification '("Life: generation " @@ -269,7 +291,8 @@ (recenter 0) ;; Redisplay; if the user has hit a key, exit the loop. - (or (eq t (sit-for sleeptime)) + (or (and (sit-for sleeptime) (< 0 sleeptime)) + (not (input-pending-p)) (throw 'life-exit nil))) (defun life-extinct-quit ()
--- a/lisp/printing.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/printing.el Sat Oct 14 17:36:28 2006 +0000 @@ -5,10 +5,10 @@ ;; Author: Vinicius Jose Latorre <viniciusjl@ig.com.br> ;; Maintainer: Vinicius Jose Latorre <viniciusjl@ig.com.br> -;; Time-stamp: <2006-02-06 15:06:40 ttn> +;; Time-stamp: <2006/09/15 18:53:14 vinicius> ;; Keywords: wp, print, PostScript ;; Version: 6.8.4 -;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/ +;; X-URL: http://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre (defconst pr-version "6.8.4" "printing.el, v 6.8.4 <2005/06/11 vinicius> @@ -2799,7 +2799,7 @@ (defalias 'pr-get-symbol - (if (fboundp 'easy-menu-intern) + (if (fboundp 'easy-menu-intern) ; hacked from easymenu.el 'easy-menu-intern (lambda (s) (if (stringp s) (intern s) s))))
--- a/lisp/progmodes/cfengine.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/progmodes/cfengine.el Sat Oct 14 17:36:28 2006 +0000 @@ -85,6 +85,12 @@ ;; File, acl &c in group: { token ... } ("{[ \t]*\\([^ \t\n]+\\)" 1 font-lock-constant-face))) +(defconst cfengine-font-lock-syntactic-keywords + ;; In the main syntax-table, backslash is marked as a punctuation, because + ;; of its use in DOS-style directory separators. Here we try to recognize + ;; the cases where backslash is used as an escape inside strings. + '(("\\(\\(?:\\\\\\)+\\)\"" . "\\"))) + (defvar cfengine-imenu-expression `((nil ,(concat "^[ \t]*" (eval-when-compile (regexp-opt cfengine-actions t)) @@ -218,7 +224,7 @@ ;; variable substitution: (modify-syntax-entry ?$ "." cfengine-mode-syntax-table) ;; Doze path separators: - (modify-syntax-entry ?\\ "_" cfengine-mode-syntax-table) + (modify-syntax-entry ?\\ "." cfengine-mode-syntax-table) ;; Otherwise, syntax defaults seem OK to give reasonable word ;; movement. @@ -237,7 +243,9 @@ ;; functions in evaluated classes to string syntax, and then obey ;; syntax properties. (setq font-lock-defaults - '(cfengine-font-lock-keywords nil nil nil beginning-of-line)) + '(cfengine-font-lock-keywords nil nil nil beginning-of-line + (font-lock-syntactic-keywords + . cfengine-font-lock-syntactic-keywords))) (setq imenu-generic-expression cfengine-imenu-expression) (set (make-local-variable 'beginning-of-defun-function) #'cfengine-beginning-of-defun) @@ -249,5 +257,5 @@ (provide 'cfengine) -;;; arch-tag: 6b931be2-1505-4124-afa6-9675971e26d4 +;; arch-tag: 6b931be2-1505-4124-afa6-9675971e26d4 ;;; cfengine.el ends here
--- a/lisp/progmodes/compile.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/progmodes/compile.el Sat Oct 14 17:36:28 2006 +0000 @@ -218,10 +218,6 @@ nil 1 nil 2 0 (2 (compilation-face '(3)))) - (gcc-include - "^\\(?:In file included\\| \\) from \ -\\(.+\\):\\([0-9]+\\)\\(?:\\(:\\)\\|\\(,\\)\\)?" 1 2 nil (3 . 4)) - (gnu ;; I have no idea what this first line is supposed to match, but it ;; makes things ambiguous with output such as "foo:344:50:blabla" since @@ -233,7 +229,7 @@ ;; the last line tries to rule out message where the info after the ;; line number starts with "SS". --Stef "^\\(?:[[:alpha:]][-[:alnum:].]+: ?\\)?\ -\\([0-9]*[^0-9\n].*?\\): ?\ +\\([0-9]*[^0-9\n]\\(?:[^\n ]\\| [^-\n]\\)*?\\): ?\ \\([0-9]+\\)\\(?:\\([.:]\\)\\([0-9]+\\)\\)?\ \\(?:-\\([0-9]+\\)?\\(?:\\3\\([0-9]+\\)\\)?\\)?:\ \\(?: *\\(\\(?:Future\\|Runtime\\)?[Ww]arning\\|W:\\)\\|\ @@ -241,6 +237,12 @@ \[0-9]?\\(?:[^0-9\n]\\|$\\)\\|[0-9][0-9][0-9]\\)" 1 (2 . 5) (4 . 6) (7 . 8)) + ;; The `gnu' style above can incorrectly match gcc's "In file + ;; included from" message, so we process that first. -- cyd + (gcc-include + "^\\(?:In file included\\| \\) from \ +\\(.+\\):\\([0-9]+\\)\\(?:\\(:\\)\\|\\(,\\)\\)?" 1 2 nil (3 . 4)) + (lcc "^\\(?:E\\|\\(W\\)\\), \\([^(\n]+\\)(\\([0-9]+\\),[ \t]*\\([0-9]+\\)" 2 3 4 (1)) @@ -623,7 +625,7 @@ (cons (match-string-no-properties idx) dir)) mouse-face highlight keymap compilation-button-map - help-echo "mouse-2: visit current directory"))) + help-echo "mouse-2: visit this directory"))) ;; Data type `reverse-ordered-alist' retriever. This function retrieves the ;; KEY element from the ALIST, creating it in the right position if not already @@ -1066,7 +1068,8 @@ (window-width)))) ;; Set the EMACS variable, but ;; don't override users' setting of $EMACS. - (unless (getenv "EMACS") '("EMACS=t")) + (unless (getenv "EMACS") + (list (concat "EMACS=" invocation-directory invocation-name))) (copy-sequence process-environment)))) (set (make-local-variable 'compilation-arguments) (list command mode name-function highlight-regexp)) @@ -1781,17 +1784,31 @@ (current-buffer))) (move-overlay compilation-highlight-overlay (point) end (current-buffer))) - (if (numberp next-error-highlight) - (setq next-error-highlight-timer - (run-at-time next-error-highlight nil 'delete-overlay - compilation-highlight-overlay))) - (if (not (or (eq next-error-highlight t) - (numberp next-error-highlight))) - (delete-overlay compilation-highlight-overlay)))))) + (if (or (eq next-error-highlight t) + (numberp next-error-highlight)) + ;; We want highlighting: delete overlay on next input. + (add-hook 'pre-command-hook + 'compilation-goto-locus-delete-o) + ;; We don't want highlighting: delete overlay now. + (delete-overlay compilation-highlight-overlay)) + ;; We want highlighting for a limited time: + ;; set up a timer to delete it. + (when (numberp next-error-highlight) + (setq next-error-highlight-timer + (run-at-time next-error-highlight nil + 'compilation-goto-locus-delete-o))))))) (when (and (eq next-error-highlight 'fringe-arrow)) + ;; We want a fringe arrow (instead of highlighting). (setq next-error-overlay-arrow-position (copy-marker (line-beginning-position)))))) +(defun compilation-goto-locus-delete-o () + (delete-overlay compilation-highlight-overlay) + ;; Get rid of timer and hook that would try to do this again. + (if (timerp next-error-highlight-timer) + (cancel-timer next-error-highlight-timer)) + (remove-hook 'pre-command-hook + 'compilation-goto-locus-delete-o)) (defun compilation-find-file (marker filename directory &rest formats) "Find a buffer for file FILENAME.
--- a/lisp/progmodes/cperl-mode.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/progmodes/cperl-mode.el Sat Oct 14 17:36:28 2006 +0000 @@ -5,7 +5,7 @@ ;; Free Software Foundation, Inc. ;; Author: Ilya Zakharevich and Bob Olson -;; Maintainer: Ilya Zakharevich <cperl@ilyaz.org> +;; Maintainer: Ilya Zakharevich <ilyaz@cpan.org> ;; Keywords: languages, Perl ;; This file is part of GNU Emacs. @@ -25,7 +25,7 @@ ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. -;;; Corrections made by Ilya Zakharevich cperl@ilyaz.org +;;; Corrections made by Ilya Zakharevich ilyaz@cpan.org ;;; Commentary: @@ -67,67 +67,89 @@ ;; likewise with m, tr, y, q, qX instead of s ;;; Code: - + (defvar vc-rcs-header) (defvar vc-sccs-header) -;; Some macros are needed for `defcustom' (eval-when-compile - (condition-case nil - (require 'man) - (error nil)) - (defconst cperl-xemacs-p (string-match "XEmacs\\|Lucid" emacs-version)) - (defvar cperl-can-font-lock - (or cperl-xemacs-p - (and (boundp 'emacs-major-version) - (or window-system - (> emacs-major-version 20))))) - (if cperl-can-font-lock - (require 'font-lock)) - (defvar msb-menu-cond) - (defvar gud-perldb-history) - (defvar font-lock-background-mode) ; not in Emacs - (defvar font-lock-display-type) ; ditto - (defmacro cperl-is-face (arg) ; Takes quoted arg - (cond ((fboundp 'find-face) - `(find-face ,arg)) - (;;(and (fboundp 'face-list) - ;; (face-list)) - (fboundp 'face-list) - `(member ,arg (and (fboundp 'face-list) - (face-list)))) - (t - `(boundp ,arg)))) - (defmacro cperl-make-face (arg descr) ; Takes unquoted arg - (cond ((fboundp 'make-face) - `(make-face (quote ,arg))) - (t - `(defvar ,arg (quote ,arg) ,descr)))) - (defmacro cperl-force-face (arg descr) ; Takes unquoted arg - `(progn - (or (cperl-is-face (quote ,arg)) - (cperl-make-face ,arg ,descr)) - (or (boundp (quote ,arg)) ; We use unquoted variants too - (defvar ,arg (quote ,arg) ,descr)))) - (if cperl-xemacs-p - (defmacro cperl-etags-snarf-tag (file line) - `(progn - (beginning-of-line 2) - (list ,file ,line))) - (defmacro cperl-etags-snarf-tag (file line) - `(etags-snarf-tag))) - (if cperl-xemacs-p - (defmacro cperl-etags-goto-tag-location (elt) - ;;(progn - ;; (switch-to-buffer (get-file-buffer (elt (, elt) 0))) - ;; (set-buffer (get-file-buffer (elt (, elt) 0))) - ;; Probably will not work due to some save-excursion??? - ;; Or save-file-position? - ;; (message "Did I get to line %s?" (elt (, elt) 1)) - `(goto-line (string-to-number (elt ,elt 1)))) - ;;) - (defmacro cperl-etags-goto-tag-location (elt) - `(etags-goto-tag-location ,elt)))) + (condition-case nil + (require 'custom) + (error nil)) + (condition-case nil + (require 'man) + (error nil)) + (defconst cperl-xemacs-p (string-match "XEmacs\\|Lucid" emacs-version)) + (defvar cperl-can-font-lock + (or cperl-xemacs-p + (and (boundp 'emacs-major-version) + (or window-system + (> emacs-major-version 20))))) + (if cperl-can-font-lock + (require 'font-lock)) + (defvar msb-menu-cond) + (defvar gud-perldb-history) + (defvar font-lock-background-mode) ; not in Emacs + (defvar font-lock-display-type) ; ditto + (defvar paren-backwards-message) ; Not in newer XEmacs? + (or (fboundp 'defgroup) + (defmacro defgroup (name val doc &rest arr) + nil)) + (or (fboundp 'custom-declare-variable) + (defmacro defcustom (name val doc &rest arr) + (` (defvar (, name) (, val) (, doc))))) + (or (and (fboundp 'custom-declare-variable) + (string< "19.31" emacs-version)) ; Checked with 19.30: defface does not work + (defmacro defface (&rest arr) + nil)) + ;; Avoid warning (tmp definitions) + (or (fboundp 'x-color-defined-p) + (defmacro x-color-defined-p (col) + (cond ((fboundp 'color-defined-p) (` (color-defined-p (, col)))) + ;; XEmacs >= 19.12 + ((fboundp 'valid-color-name-p) (` (valid-color-name-p (, col)))) + ;; XEmacs 19.11 + ((fboundp 'x-valid-color-name-p) (` (x-valid-color-name-p (, col)))) + (t '(error "Cannot implement color-defined-p"))))) + (defmacro cperl-is-face (arg) ; Takes quoted arg + (cond ((fboundp 'find-face) + (` (find-face (, arg)))) + (;;(and (fboundp 'face-list) + ;; (face-list)) + (fboundp 'face-list) + (` (member (, arg) (and (fboundp 'face-list) + (face-list))))) + (t + (` (boundp (, arg)))))) + (defmacro cperl-make-face (arg descr) ; Takes unquoted arg + (cond ((fboundp 'make-face) + (` (make-face (quote (, arg))))) + (t + (` (defvar (, arg) (quote (, arg)) (, descr)))))) + (defmacro cperl-force-face (arg descr) ; Takes unquoted arg + (` (progn + (or (cperl-is-face (quote (, arg))) + (cperl-make-face (, arg) (, descr))) + (or (boundp (quote (, arg))) ; We use unquoted variants too + (defvar (, arg) (quote (, arg)) (, descr)))))) + (if cperl-xemacs-p + (defmacro cperl-etags-snarf-tag (file line) + (` (progn + (beginning-of-line 2) + (list (, file) (, line))))) + (defmacro cperl-etags-snarf-tag (file line) + (` (etags-snarf-tag)))) + (if cperl-xemacs-p + (defmacro cperl-etags-goto-tag-location (elt) + (`;;(progn + ;; (switch-to-buffer (get-file-buffer (elt (, elt) 0))) + ;; (set-buffer (get-file-buffer (elt (, elt) 0))) + ;; Probably will not work due to some save-excursion??? + ;; Or save-file-position? + ;; (message "Did I get to line %s?" (elt (, elt) 1)) + (goto-line (string-to-int (elt (, elt) 1))))) + ;;) + (defmacro cperl-etags-goto-tag-location (elt) + (` (etags-goto-tag-location (, elt)))))) (defconst cperl-xemacs-p (string-match "XEmacs\\|Lucid" emacs-version)) @@ -251,6 +273,12 @@ :type 'integer :group 'cperl-indentation-details) +(defcustom cperl-indent-wrt-brace t + "*Non-nil means indent statements in if/etc block relative brace, not if/etc. +Versions 5.2 ... 5.20 behaved as if this were `nil'." + :type 'boolean + :group 'cperl-indentation-details) + (defcustom cperl-auto-newline nil "*Non-nil means automatically newline before and after braces, and after colons and semicolons, inserted in CPerl code. The following @@ -347,20 +375,26 @@ :type 'integer :group 'cperl-indentation-details) -(defvar cperl-vc-header-alist nil) -(make-obsolete-variable - 'cperl-vc-header-alist - "use cperl-vc-rcs-header or cperl-vc-sccs-header instead.") +(defcustom cperl-indent-comment-at-column-0 nil + "*Non-nil means that comment started at column 0 should be indentable." + :type 'boolean + :group 'cperl-indentation-details) (defcustom cperl-vc-sccs-header '("($sccs) = ('%W\%' =~ /(\\d+(\\.\\d+)+)/) ;") "*Special version of `vc-sccs-header' that is used in CPerl mode buffers." :type '(repeat string) :group 'cperl) -(defcustom cperl-vc-rcs-header '("($rcs) = (' $Id\$ ' =~ /(\\d+(\\.\\d+)+)/) ;") +(defcustom cperl-vc-rcs-header '("($rcs) = (' $Id\$ ' =~ /(\\d+(\\.\\d+)+)/);") "*Special version of `vc-rcs-header' that is used in CPerl mode buffers." :type '(repeat string) - :group 'cperl) + :group 'cperl) + +;; This became obsolete... +(defvar cperl-vc-header-alist nil) +(make-obsolete-variable + 'cperl-vc-header-alist + "use cperl-vc-rcs-header or cperl-vc-sccs-header instead.") (defcustom cperl-clobber-mode-lists (not @@ -408,8 +442,15 @@ :type 'face :group 'cperl-faces) -(defcustom cperl-invalid-face 'underline - "*Face for highlighting trailing whitespace." +;;; Some double-evaluation happened with font-locks... Needed with 21.2... +(defvar cperl-singly-quote-face cperl-xemacs-p) + +(defcustom cperl-invalid-face ; Does not customize with '' on XEmacs + (if cperl-singly-quote-face + 'underline ''underline) ; On older Emacsen was evaluated by `font-lock' + (if cperl-singly-quote-face + "*This face is used for highlighting trailing whitespace." + "*Face for highlighting trailing whitespace.") :type 'face :version "21.1" :group 'cperl-faces) @@ -441,7 +482,14 @@ (defcustom cperl-regexp-scan t "*Not-nil means make marking of regular expression more thorough. -Effective only with `cperl-pod-here-scan'. Not implemented yet." +Effective only with `cperl-pod-here-scan'." + :type 'boolean + :group 'cperl-speed) + +(defcustom cperl-hook-after-change t + "*Not-nil means install hook to know which regions of buffer are changed. +May significantly speed up delayed fontification. Changes take effect +after reload." :type 'boolean :group 'cperl-speed) @@ -564,17 +612,25 @@ :type 'boolean :group 'cperl-speed) +(defcustom cperl-syntaxify-for-menu + t + "*Non-nil means that CPerl syntaxifies up to the point before showing menu. +This way enabling/disabling of menu items is more correct." + :type 'boolean + :group 'cperl-speed) + (defcustom cperl-ps-print-face-properties '((font-lock-keyword-face nil nil bold shadow) (font-lock-variable-name-face nil nil bold) (font-lock-function-name-face nil nil bold italic box) (font-lock-constant-face nil "LightGray" bold) - (cperl-array nil "LightGray" bold underline) - (cperl-hash nil "LightGray" bold italic underline) + (cperl-array-face nil "LightGray" bold underline) + (cperl-hash-face nil "LightGray" bold italic underline) (font-lock-comment-face nil "LightGray" italic) (font-lock-string-face nil nil italic underline) - (cperl-nonoverridable nil nil italic underline) + (cperl-nonoverridable-face nil nil italic underline) (font-lock-type-face nil nil underline) + (font-lock-warning-face nil "LightGray" bold italic box) (underline nil "LightGray" strikeout)) "List given as an argument to `ps-extend-face-list' in `cperl-ps-print'." :type '(repeat (cons symbol @@ -588,7 +644,7 @@ (defvar cperl-dark-foreground (cperl-choose-color "orchid1" "orange")) -(defface cperl-nonoverridable +(defface cperl-nonoverridable-face `((((class grayscale) (background light)) (:background "Gray90" :slant italic :underline t)) (((class grayscale) (background dark)) @@ -600,10 +656,8 @@ (t (:weight bold :underline t))) "Font Lock mode face used non-overridable keywords and modifiers of regexps." :group 'cperl-faces) -;; backward-compatibility alias -(put 'cperl-nonoverridable-face 'face-alias 'cperl-nonoverridable) - -(defface cperl-array + +(defface cperl-array-face `((((class grayscale) (background light)) (:background "Gray90" :weight bold)) (((class grayscale) (background dark)) @@ -615,10 +669,8 @@ (t (:weight bold))) "Font Lock mode face used to highlight array names." :group 'cperl-faces) -;; backward-compatibility alias -(put 'cperl-array-face 'face-alias 'cperl-array) - -(defface cperl-hash + +(defface cperl-hash-face `((((class grayscale) (background light)) (:background "Gray90" :weight bold :slant italic)) (((class grayscale) (background dark)) @@ -630,8 +682,6 @@ (t (:weight bold :slant italic))) "Font Lock mode face used to highlight hash names." :group 'cperl-faces) -;; backward-compatibility alias -(put 'cperl-hash-face 'face-alias 'cperl-hash) @@ -639,9 +689,7 @@ (defvar cperl-tips 'please-ignore-this-line "Get maybe newer version of this package from - ftp://ftp.math.ohio-state.edu/pub/users/ilya/emacs -and/or - ftp://ftp.math.ohio-state.edu/pub/users/ilya/perl + http://ilyaz.org/software/emacs Subdirectory `cperl-mode' may contain yet newer development releases and/or patches to related files. @@ -666,9 +714,9 @@ (defalias 'perl-mode 'cperl-mode) Get perl5-info from - $CPAN/doc/manual/info/perl-info.tar.gz -older version was on - http://www.metronet.com:70/9/perlinfo/perl5/manual/perl5-info.tar.gz + $CPAN/doc/manual/info/perl5-old/perl5-info.tar.gz +Also, one can generate a newer documentation running `pod2texi' converter + $CPAN/doc/manual/info/perl5/pod2texi-0.1.tar.gz If you use imenu-go, run imenu on perl5-info buffer (you can do it from Perl menu). If many files are related, generate TAGS files from @@ -700,11 +748,18 @@ "Description of problems in CPerl mode. Some faces will not be shown on some versions of Emacs unless you install choose-color.el, available from - ftp://ftp.math.ohio-state.edu/pub/users/ilya/emacs/ + http://ilyaz.org/software/emacs `fill-paragraph' on a comment may leave the point behind the -paragraph. Parsing of lines with several <<EOF is not implemented -yet. +paragraph. It also triggers a bug in some versions of Emacs (CPerl tries +to detect it and bulk out). + +See documentation of a variable `cperl-problems-old-emaxen' for the +problems which disappear if you upgrade Emacs to a reasonably new +version (20.3 for Emacs, and those of 2004 for XEmacs).") + +(defvar cperl-problems-old-emaxen 'please-ignore-this-line + "Description of problems in CPerl mode specific for older Emacs versions. Emacs had a _very_ restricted syntax parsing engine until version 20.1. Most problems below are corrected starting from this version of @@ -812,6 +867,13 @@ o) Highlights trailing whitespace; p) Is able to manipulate Perl Regular Expressions to ease conversion to a more readable form. + q) Can ispell POD sections and HERE-DOCs. + r) Understands comments and character classes inside regular + expressions; can find matching () and [] in a regular expression. + s) Allows indentation of //x-style regular expressions; + t) Highlights different symbols in regular expressions according + to their function; much less problems with backslashitis; + u) Allows to find regular expressions which contain interpolated parts. 5) The indentation engine was very smart, but most of tricks may be not needed anymore with the support for `syntax-table' property. Has @@ -829,7 +891,10 @@ line-breaks/spacing between elements of the construct. 10) Uses a linear-time algorith for indentation of regions (on Emaxen with -capable syntax engines).") +capable syntax engines). + +11) Syntax-highlight, indentation, sexp-recognition inside regular expressions. +") (defvar cperl-speed 'please-ignore-this-line "This is an incomplete compendium of what is available in other parts @@ -878,19 +943,19 @@ (defvar cperl-tips-faces 'please-ignore-this-line "CPerl mode uses following faces for highlighting: - `cperl-array' Array names - `cperl-hash' Hash names + `cperl-array-face' Array names + `cperl-hash-face' Hash names `font-lock-comment-face' Comments, PODs and whatever is considered syntaxically to be not code `font-lock-constant-face' HERE-doc delimiters, labels, delimiters of 2-arg operators s/y/tr/ or of RExen, - `font-lock-function-name-face' Special-cased m// and s//foo/, _ as - a target of a file tests, file tests, + `font-lock-warning-face' Special-cased m// and s//foo/, + `font-lock-function-name-face' _ as a target of a file tests, file tests, subroutine names at the moment of definition (except those conflicting with Perl operators), package names (when recognized), format names `font-lock-keyword-face' Control flow switch constructs, declarators - `cperl-nonoverridable' Non-overridable keywords, modifiers of RExen + `cperl-nonoverridable-face' Non-overridable keywords, modifiers of RExen `font-lock-string-face' Strings, qw() constructs, RExen, POD sections, literal parts and the terminator of formats and whatever is syntaxically considered @@ -908,7 +973,25 @@ Help with best setup of these faces for printout requested (for each of the faces: please specify bold, italic, underline, shadow and box.) -\(Not finished.)") +In regular expressions (except character classes): + `font-lock-string-face' \"Normal\" stuff and non-0-length constructs + `font-lock-constant-face': Delimiters + `font-lock-warning-face' Special-cased m// and s//foo/, + Mismatched closing delimiters, parens + we couldn't match, misplaced quantifiers, + unrecognized escape sequences + `cperl-nonoverridable-face' Modifiers, as gism in m/REx/gism + `font-lock-type-face' POSIX classes inside charclasses, + escape sequences with arguments (\x \23 \p \N) + and others match-a-char escape sequences + `font-lock-keyword-face' Capturing parens, and | + `font-lock-function-name-face' Special symbols: $ ^ . [ ] [^ ] (?{ }) (??{ }) + `font-lock-builtin-face' \"Remaining\" 0-length constructs, executable + parts of a REx, not-capturing parens + `font-lock-variable-name-face' Interpolated constructs, embedded code + `font-lock-comment-face' Embedded comments + +") @@ -985,6 +1068,25 @@ (cperl-hairy (or hairy t)) (t (symbol-value symbol)))) + +(defun cperl-make-indent (column &optional minimum keep) + "Makes indent of the current line the requested amount. +Unless KEEP, removes the old indentation. Works around a bug in ancient +versions of Emacs." + (let ((prop (get-text-property (point) 'syntax-type))) + (or keep + (delete-horizontal-space)) + (indent-to column minimum) + ;; In old versions (e.g., 19.33) `indent-to' would not inherit properties + (and prop + (> (current-column) 0) + (save-excursion + (beginning-of-line) + (or (get-text-property (point) 'syntax-type) + (and (looking-at "\\=[ \t]") + (put-text-property (point) (match-end 0) + 'syntax-type prop))))))) + ;;; Probably it is too late to set these guys already, but it can help later: ;;;(and cperl-clobber-mode-lists @@ -1035,7 +1137,16 @@ (cperl-define-key "\C-c\C-w" 'cperl-toggle-construct-fix) (cperl-define-key "\C-c\C-f" 'auto-fill-mode) (cperl-define-key "\C-c\C-e" 'cperl-toggle-electric) + (cperl-define-key "\C-c\C-b" 'cperl-find-bad-style) + (cperl-define-key "\C-c\C-p" 'cperl-pod-spell) + (cperl-define-key "\C-c\C-d" 'cperl-here-doc-spell) + (cperl-define-key "\C-c\C-n" 'cperl-narrow-to-here-doc) + (cperl-define-key "\C-c\C-v" 'cperl-next-interpolated-REx) + (cperl-define-key "\C-c\C-x" 'cperl-next-interpolated-REx-0) + (cperl-define-key "\C-c\C-y" 'cperl-next-interpolated-REx-1) (cperl-define-key "\C-c\C-ha" 'cperl-toggle-autohelp) + (cperl-define-key "\C-c\C-hp" 'cperl-perldoc) + (cperl-define-key "\C-c\C-hP" 'cperl-perldoc-at-point) (cperl-define-key "\e\C-q" 'cperl-indent-exp) ; Usually not bound (cperl-define-key [?\C-\M-\|] 'cperl-lineup [(control meta |)]) @@ -1074,9 +1185,13 @@ (<= emacs-minor-version 11) (<= emacs-major-version 19)) (progn ;; substitute-key-definition is usefulness-deenhanced... - (cperl-define-key "\M-q" 'cperl-fill-paragraph) + ;;;;;(cperl-define-key "\M-q" 'cperl-fill-paragraph) (cperl-define-key "\e;" 'cperl-indent-for-comment) (cperl-define-key "\e\C-\\" 'cperl-indent-region)) + (or (boundp 'fill-paragraph-function) + (substitute-key-definition + 'fill-paragraph 'cperl-fill-paragraph + cperl-mode-map global-map)) (substitute-key-definition 'indent-sexp 'cperl-indent-exp cperl-mode-map global-map) @@ -1094,52 +1209,101 @@ (progn (require 'easymenu) (easy-menu-define - cperl-menu cperl-mode-map "Menu for CPerl mode" - '("Perl" - ["Beginning of function" beginning-of-defun t] - ["End of function" end-of-defun t] - ["Mark function" mark-defun t] - ["Indent expression" cperl-indent-exp t] + cperl-menu cperl-mode-map "Menu for CPerl mode" + '("Perl" + ["Beginning of function" beginning-of-defun t] + ["End of function" end-of-defun t] + ["Mark function" mark-defun t] + ["Indent expression" cperl-indent-exp t] ["Fill paragraph/comment" fill-paragraph t] + "----" + ["Line up a construction" cperl-lineup (cperl-use-region-p)] + ["Invert if/unless/while etc" cperl-invert-if-unless t] + ("Regexp" + ["Beautify" cperl-beautify-regexp + cperl-use-syntax-table-text-property] + ["Beautify one level deep" (cperl-beautify-regexp 1) + cperl-use-syntax-table-text-property] + ["Beautify a group" cperl-beautify-level + cperl-use-syntax-table-text-property] + ["Beautify a group one level deep" (cperl-beautify-level 1) + cperl-use-syntax-table-text-property] + ["Contract a group" cperl-contract-level + cperl-use-syntax-table-text-property] + ["Contract groups" cperl-contract-levels + cperl-use-syntax-table-text-property] "----" - ["Line up a construction" cperl-lineup (cperl-use-region-p)] - ["Invert if/unless/while etc" cperl-invert-if-unless t] - ("Regexp" - ["Beautify" cperl-beautify-regexp - cperl-use-syntax-table-text-property] - ["Beautify one level deep" (cperl-beautify-regexp 1) - cperl-use-syntax-table-text-property] - ["Beautify a group" cperl-beautify-level - cperl-use-syntax-table-text-property] - ["Beautify a group one level deep" (cperl-beautify-level 1) - cperl-use-syntax-table-text-property] - ["Contract a group" cperl-contract-level - cperl-use-syntax-table-text-property] - ["Contract groups" cperl-contract-levels - cperl-use-syntax-table-text-property]) - ["Refresh \"hard\" constructions" cperl-find-pods-heres t] + ["Find next interpolated" cperl-next-interpolated-REx + (next-single-property-change (point-min) 'REx-interpolated)] + ["Find next interpolated (no //o)" + cperl-next-interpolated-REx-0 + (or (text-property-any (point-min) (point-max) 'REx-interpolated t) + (text-property-any (point-min) (point-max) 'REx-interpolated 1))] + ["Find next interpolated (neither //o nor whole-REx)" + cperl-next-interpolated-REx-1 + (text-property-any (point-min) (point-max) 'REx-interpolated t)]) + ["Insert spaces if needed to fix style" cperl-find-bad-style t] + ["Refresh \"hard\" constructions" cperl-find-pods-heres t] + "----" + ["Indent region" cperl-indent-region (cperl-use-region-p)] + ["Comment region" cperl-comment-region (cperl-use-region-p)] + ["Uncomment region" cperl-uncomment-region (cperl-use-region-p)] + "----" + ["Run" mode-compile (fboundp 'mode-compile)] + ["Kill" mode-compile-kill (and (fboundp 'mode-compile-kill) + (get-buffer "*compilation*"))] + ["Next error" next-error (get-buffer "*compilation*")] + ["Check syntax" cperl-check-syntax (fboundp 'mode-compile)] + "----" + ["Debugger" cperl-db t] + "----" + ("Tools" + ["Imenu" imenu (fboundp 'imenu)] + ["Imenu on Perl Info" cperl-imenu-on-info (featurep 'imenu)] "----" - ["Indent region" cperl-indent-region (cperl-use-region-p)] - ["Comment region" cperl-comment-region (cperl-use-region-p)] - ["Uncomment region" cperl-uncomment-region (cperl-use-region-p)] - "----" - ["Run" mode-compile (fboundp 'mode-compile)] - ["Kill" mode-compile-kill (and (fboundp 'mode-compile-kill) - (get-buffer "*compilation*"))] - ["Next error" next-error (get-buffer "*compilation*")] - ["Check syntax" cperl-check-syntax (fboundp 'mode-compile)] + ["Ispell PODs" cperl-pod-spell + ;; Better not to update syntaxification here: + ;; debugging syntaxificatio can be broken by this??? + (or + (get-text-property (point-min) 'in-pod) + (< (progn + (and cperl-syntaxify-for-menu + (cperl-update-syntaxification (point-max) (point-max))) + (next-single-property-change (point-min) 'in-pod nil (point-max))) + (point-max)))] + ["Ispell HERE-DOCs" cperl-here-doc-spell + (< (progn + (and cperl-syntaxify-for-menu + (cperl-update-syntaxification (point-max) (point-max))) + (next-single-property-change (point-min) 'here-doc-group nil (point-max))) + (point-max))] + ["Narrow to this HERE-DOC" cperl-narrow-to-here-doc + (eq 'here-doc (progn + (and cperl-syntaxify-for-menu + (cperl-update-syntaxification (point) (point))) + (get-text-property (point) 'syntax-type)))] + ["Select this HERE-DOC or POD section" + cperl-select-this-pod-or-here-doc + (memq (progn + (and cperl-syntaxify-for-menu + (cperl-update-syntaxification (point) (point))) + (get-text-property (point) 'syntax-type)) + '(here-doc pod))] "----" - ["Debugger" cperl-db t] + ["CPerl pretty print (exprmntl)" cperl-ps-print + (fboundp 'ps-extend-face-list)] "----" - ("Tools" - ["Imenu" imenu (fboundp 'imenu)] - ["Insert spaces if needed" cperl-find-bad-style t] - ["Class Hierarchy from TAGS" cperl-tags-hier-init t] - ;;["Update classes" (cperl-tags-hier-init t) tags-table-list] - ["CPerl pretty print (exprmntl)" cperl-ps-print - (fboundp 'ps-extend-face-list)] - ["Imenu on info" cperl-imenu-on-info (featurep 'imenu)] - ("Tags" + ["Syntaxify region" cperl-find-pods-heres-region + (cperl-use-region-p)] + ["Profile syntaxification" cperl-time-fontification t] + ["Debug errors in delayed fontification" cperl-emulate-lazy-lock t] + ["Debug unwind for syntactic scan" cperl-toggle-set-debug-unwind t] + ["Debug backtrace on syntactic scan (BEWARE!!!)" + (cperl-toggle-set-debug-unwind nil t) t] + "----" + ["Class Hierarchy from TAGS" cperl-tags-hier-init t] + ;;["Update classes" (cperl-tags-hier-init t) tags-table-list] + ("Tags" ;;; ["Create tags for current file" cperl-etags t] ;;; ["Add tags for current file" (cperl-etags t) t] ;;; ["Create tags for Perl files in directory" (cperl-etags nil t) t] @@ -1186,10 +1350,10 @@ ["PerlStyle" (cperl-set-style "PerlStyle") t] ["GNU" (cperl-set-style "GNU") t] ["C++" (cperl-set-style "C++") t] - ["FSF" (cperl-set-style "FSF") t] + ["K&R" (cperl-set-style "K&R") t] ["BSD" (cperl-set-style "BSD") t] ["Whitesmith" (cperl-set-style "Whitesmith") t] - ["Current" (cperl-set-style "Current") t] + ["Memorize Current" (cperl-set-style "Current") t] ["Memorized" (cperl-set-style-back) cperl-old-style]) ("Micro-docs" ["Tips" (describe-variable 'cperl-tips) t] @@ -1208,12 +1372,73 @@ The expansion is entirely correct because it uses the C preprocessor." t) +;;; These two must be unwound, otherwise take exponential time +(defconst cperl-maybe-white-and-comment-rex "[ \t\n]*\\(#[^\n]*\n[ \t\n]*\\)*" +"Regular expression to match optional whitespace with interpspersed comments. +Should contain exactly one group.") + +;;; This one is tricky to unwind; still very inefficient... +(defconst cperl-white-and-comment-rex "\\([ \t\n]\\|#[^\n]*\n\\)+" +"Regular expression to match whitespace with interpspersed comments. +Should contain exactly one group.") + + +;;; Is incorporated in `cperl-imenu--function-name-regexp-perl' +;;; `cperl-outline-regexp', `defun-prompt-regexp'. +;;; Details of groups in this may be used in several functions; see comments +;;; near mentioned above variable(s)... +;;; sub($$):lvalue{} sub:lvalue{} Both allowed... +(defsubst cperl-after-sub-regexp (named attr) ; 9 groups without attr... + "Match the text after `sub' in a subroutine declaration. +If NAMED is nil, allows anonymous subroutines. Matches up to the first \":\" +of attributes (if present), or end of the name or prototype (whatever is +the last)." + (concat ; Assume n groups before this... + "\\(" ; n+1=name-group + cperl-white-and-comment-rex ; n+2=pre-name + "\\(::[a-zA-Z_0-9:']+\\|[a-zA-Z_'][a-zA-Z_0-9:']*\\)" ; n+3=name + "\\)" ; END n+1=name-group + (if named "" "?") + "\\(" ; n+4=proto-group + cperl-maybe-white-and-comment-rex ; n+5=pre-proto + "\\(([^()]*)\\)" ; n+6=prototype + "\\)?" ; END n+4=proto-group + "\\(" ; n+7=attr-group + cperl-maybe-white-and-comment-rex ; n+8=pre-attr + "\\(" ; n+9=start-attr + ":" + (if attr (concat + "\\(" + cperl-maybe-white-and-comment-rex ; whitespace-comments + "\\(\\sw\\|_\\)+" ; attr-name + ;; attr-arg (1 level of internal parens allowed!) + "\\((\\(\\\\.\\|[^\\\\()]\\|([^\\\\()]*)\\)*)\\)?" + "\\(" ; optional : (XXX allows trailing???) + cperl-maybe-white-and-comment-rex ; whitespace-comments + ":\\)?" + "\\)+") + "[^:]") + "\\)" + "\\)?" ; END n+6=proto-group + )) + +;;; Details of groups in this are used in `cperl-imenu--create-perl-index' +;;; and `cperl-outline-level'. +;;;; Was: 2=sub|package; now 2=package-group, 5=package-name 8=sub-name (+3) (defvar cperl-imenu--function-name-regexp-perl (concat - "^\\(" - "[ \t]*\\(sub\\|package\\)[ \t\n]+\\([a-zA-Z_0-9:']+\\)[ \t]*\\(([^()]*)[ \t]*\\)?" - "\\|" - "=head\\([12]\\)[ \t]+\\([^\n]+\\)$" + "^\\(" ; 1 = all + "\\([ \t]*package" ; 2 = package-group + "\\(" ; 3 = package-name-group + cperl-white-and-comment-rex ; 4 = pre-package-name + "\\([a-zA-Z_0-9:']+\\)\\)?\\)" ; 5 = package-name + "\\|" + "[ \t]*sub" + (cperl-after-sub-regexp 'named nil) ; 8=name 11=proto 14=attr-start + cperl-maybe-white-and-comment-rex ; 15=pre-block + "\\|" + "=head\\([1-4]\\)[ \t]+" ; 16=level + "\\([^\n]+\\)$" ; 17=text "\\)")) (defvar cperl-outline-regexp @@ -1225,6 +1450,12 @@ (defvar cperl-string-syntax-table nil "Syntax table in use in CPerl mode string-like chunks.") +(defsubst cperl-1- (p) + (max (point-min) (1- p))) + +(defsubst cperl-1+ (p) + (min (point-max) (1+ p))) + (if cperl-mode-syntax-table () (setq cperl-mode-syntax-table (make-syntax-table)) @@ -1249,6 +1480,8 @@ (modify-syntax-entry ?| "." cperl-mode-syntax-table) (setq cperl-string-syntax-table (copy-syntax-table cperl-mode-syntax-table)) (modify-syntax-entry ?$ "." cperl-string-syntax-table) + (modify-syntax-entry ?\{ "." cperl-string-syntax-table) + (modify-syntax-entry ?\} "." cperl-string-syntax-table) (modify-syntax-entry ?# "." cperl-string-syntax-table)) ; (?# comment ) @@ -1257,6 +1490,10 @@ ;; Fix for msb.el (defvar cperl-msb-fixed nil) (defvar cperl-use-major-mode 'cperl-mode) +(defvar cperl-font-lock-multiline-start nil) +(defvar cperl-font-lock-multiline nil) +(defvar cperl-compilation-error-regexp-alist nil) +(defvar cperl-font-locking nil) ;;;###autoload (defun cperl-mode () @@ -1402,16 +1639,24 @@ `cperl-min-label-indent' Minimal indentation for line that is a label. -Settings for K&R and BSD indentation styles are - `cperl-indent-level' 5 8 - `cperl-continued-statement-offset' 5 8 - `cperl-brace-offset' -5 -8 - `cperl-label-offset' -5 -8 +Settings for classic indent-styles: K&R BSD=C++ GNU PerlStyle=Whitesmith + `cperl-indent-level' 5 4 2 4 + `cperl-brace-offset' 0 0 0 0 + `cperl-continued-brace-offset' -5 -4 0 0 + `cperl-label-offset' -5 -4 -2 -4 + `cperl-continued-statement-offset' 5 4 2 4 CPerl knows several indentation styles, and may bulk set the corresponding variables. Use \\[cperl-set-style] to do this. Use \\[cperl-set-style-back] to restore the memorized preexisting values -\(both available from menu). +\(both available from menu). See examples in `cperl-style-examples'. + +Part of the indentation style is how different parts of if/elsif/else +statements are broken into lines; in CPerl, this is reflected on how +templates for these constructs are created (controlled by +`cperl-extra-newline-before-brace'), and how reflow-logic should treat \"continuation\" blocks of else/elsif/continue, controlled by the same variable, +and by `cperl-extra-newline-before-brace-multiline', +`cperl-merge-trailing-else', `cperl-indent-region-fix-constructs'. If `cperl-indent-level' is 0, the statement after opening brace in column 0 is indented on @@ -1465,8 +1710,12 @@ ("head2" "head2" cperl-electric-pod 0))) (setq abbrevs-changed prev-a-c))) (setq local-abbrev-table cperl-mode-abbrev-table) - (abbrev-mode (if (cperl-val 'cperl-electric-keywords) 1 0)) + (if (cperl-val 'cperl-electric-keywords) + (abbrev-mode 1)) (set-syntax-table cperl-mode-syntax-table) + ;; Until Emacs is multi-threaded, we do not actually need it local: + (make-local-variable 'cperl-font-lock-multiline-start) + (make-local-variable 'cperl-font-locking) (make-local-variable 'outline-regexp) ;; (setq outline-regexp imenu-example--function-name-regexp-perl) (setq outline-regexp cperl-outline-regexp) @@ -1478,7 +1727,10 @@ (setq paragraph-separate paragraph-start) (make-local-variable 'paragraph-ignore-fill-prefix) (setq paragraph-ignore-fill-prefix t) - (set (make-local-variable 'fill-paragraph-function) 'cperl-fill-paragraph) + (if cperl-xemacs-p + (progn + (make-local-variable 'paren-backwards-message) + (set 'paren-backwards-message t))) (make-local-variable 'indent-line-function) (setq indent-line-function 'cperl-indent-line) (make-local-variable 'require-final-newline) @@ -1492,9 +1744,22 @@ (make-local-variable 'comment-start-skip) (setq comment-start-skip "#+ *") (make-local-variable 'defun-prompt-regexp) - (setq defun-prompt-regexp "^[ \t]*sub[ \t\n]+\\([^ \t\n{(;]+\\)\\([ \t\n]*([^()]*)[ \t\n]*\\)?[ \t\n]*") +;;; "[ \t]*sub" +;;; (cperl-after-sub-regexp 'named nil) ; 8=name 11=proto 14=attr-start +;;; cperl-maybe-white-and-comment-rex ; 15=pre-block + (setq defun-prompt-regexp + (concat "^[ \t]*\\(sub" + (cperl-after-sub-regexp 'named 'attr-groups) + "\\|" ; per toke.c + "\\(BEGIN\\|CHECK\\|INIT\\|END\\|AUTOLOAD\\|DESTROY\\)" + "\\)" + cperl-maybe-white-and-comment-rex)) (make-local-variable 'comment-indent-function) (setq comment-indent-function 'cperl-comment-indent) + (and (boundp 'fill-paragraph-function) + (progn + (make-local-variable 'fill-paragraph-function) + (set 'fill-paragraph-function 'cperl-fill-paragraph))) (make-local-variable 'parse-sexp-ignore-comments) (setq parse-sexp-ignore-comments t) (make-local-variable 'indent-region-function) @@ -1509,21 +1774,40 @@ (set 'vc-rcs-header cperl-vc-rcs-header) (make-local-variable 'vc-sccs-header) (set 'vc-sccs-header cperl-vc-sccs-header) + ;; This one is obsolete... + (make-local-variable 'vc-header-alist) + (set 'vc-header-alist (or cperl-vc-header-alist ; Avoid warning + (` ((SCCS (, (car cperl-vc-sccs-header))) + (RCS (, (car cperl-vc-rcs-header))))))) + (cond ((boundp 'compilation-error-regexp-alist-alist);; xemacs 20.x + (make-local-variable 'compilation-error-regexp-alist-alist) + (set 'compilation-error-regexp-alist-alist + (cons (cons 'cperl cperl-compilation-error-regexp-alist) + (symbol-value 'compilation-error-regexp-alist-alist))) + (if (fboundp 'compilation-build-compilation-error-regexp-alist) + (let ((f 'compilation-build-compilation-error-regexp-alist)) + (funcall f)) + (push 'cperl compilation-error-regexp-alist))) + ((boundp 'compilation-error-regexp-alist);; xmeacs 19.x + (make-local-variable 'compilation-error-regexp-alist) + (set 'compilation-error-regexp-alist + (cons cperl-compilation-error-regexp-alist + (symbol-value 'compilation-error-regexp-alist))))) (make-local-variable 'font-lock-defaults) (setq font-lock-defaults (cond ((string< emacs-version "19.30") - '(cperl-font-lock-keywords-2)) + '(cperl-font-lock-keywords-2 nil nil ((?_ . "w")))) ((string< emacs-version "19.33") ; Which one to use? '((cperl-font-lock-keywords cperl-font-lock-keywords-1 - cperl-font-lock-keywords-2))) + cperl-font-lock-keywords-2) nil nil ((?_ . "w")))) (t '((cperl-load-font-lock-keywords cperl-load-font-lock-keywords-1 - cperl-load-font-lock-keywords-2) - nil nil ((?_ . "w")))))) + cperl-load-font-lock-keywords-2) nil nil ((?_ . "w")))))) (make-local-variable 'cperl-syntax-state) + (setq cperl-syntax-state nil) ; reset syntaxification cache (if cperl-use-syntax-table-text-property (progn (make-local-variable 'parse-sexp-lookup-properties) @@ -1533,10 +1817,12 @@ (or (boundp 'font-lock-unfontify-region-function) (set 'font-lock-unfontify-region-function 'font-lock-default-unfontify-region)) - (make-local-variable 'font-lock-unfontify-region-function) - (set 'font-lock-unfontify-region-function ; not present with old Emacs - 'cperl-font-lock-unfontify-region-function) + (unless cperl-xemacs-p ; Our: just a plug for wrong font-lock + (make-local-variable 'font-lock-unfontify-region-function) + (set 'font-lock-unfontify-region-function ; not present with old Emacs + 'cperl-font-lock-unfontify-region-function)) (make-local-variable 'cperl-syntax-done-to) + (setq cperl-syntax-done-to nil) ; reset syntaxification cache (make-local-variable 'font-lock-syntactic-keywords) (setq font-lock-syntactic-keywords (if cperl-syntaxify-by-font-lock @@ -1546,10 +1832,20 @@ ;; to make font-lock think that font-lock-syntactic-keywords ;; are defined. '(t))))) + (if (boundp 'font-lock-multiline) ; Newer font-lock; use its facilities + (progn + (setq cperl-font-lock-multiline t) ; Not localized... + (set 'font-lock-multiline t)) ; not present with old Emacs; auto-local + (make-local-variable 'font-lock-fontify-region-function) + (set 'font-lock-fontify-region-function ; not present with old Emacs + 'cperl-font-lock-fontify-region-function)) + (make-local-variable 'font-lock-fontify-region-function) + (set 'font-lock-fontify-region-function ; not present with old Emacs + 'cperl-font-lock-fontify-region-function) (make-local-variable 'cperl-old-style) (if (boundp 'normal-auto-fill-function) ; 19.33 and later (set (make-local-variable 'normal-auto-fill-function) - 'cperl-do-auto-fill) ; RMS has it as #'cperl-do-auto-fill ??? + 'cperl-do-auto-fill) (or (fboundp 'cperl-old-auto-fill-mode) (progn (fset 'cperl-old-auto-fill-mode (symbol-function 'auto-fill-mode)) @@ -1562,12 +1858,18 @@ (if (cperl-val 'cperl-font-lock) (progn (or cperl-faces-init (cperl-init-faces)) (font-lock-mode 1)))) + (set (make-local-variable 'facemenu-add-face-function) + 'cperl-facemenu-add-face-function) ; XXXX What this guy is for??? (and (boundp 'msb-menu-cond) (not cperl-msb-fixed) (cperl-msb-fix)) (if (featurep 'easymenu) (easy-menu-add cperl-menu)) ; A NOP in Emacs. (run-mode-hooks 'cperl-mode-hook) + (if cperl-hook-after-change + (progn + (make-local-hook 'after-change-functions) + (add-hook 'after-change-functions 'cperl-after-change-function nil t))) ;; After hooks since fontification will break this (if cperl-pod-here-scan (or cperl-syntaxify-by-font-lock @@ -1616,31 +1918,37 @@ (defvar cperl-st-ket '(5 . ?\<)) -(defun cperl-comment-indent () +(defun cperl-comment-indent () ; called at point at supposed comment (let ((p (point)) (c (current-column)) was phony) - (if (looking-at "^#") 0 ; Existing comment at bol stays there. + (if (and (not cperl-indent-comment-at-column-0) + (looking-at "^#")) + 0 ; Existing comment at bol stays there. ;; Wrong comment found (save-excursion (setq was (cperl-to-comment-or-eol) phony (eq (get-text-property (point) 'syntax-table) cperl-st-cfence)) (if phony - (progn + (progn ; Too naive??? (re-search-forward "#\\|$") ; Hmm, what about embedded #? (if (eq (preceding-char) ?\#) (forward-char -1)) (setq was nil))) - (if (= (point) p) + (if (= (point) p) ; Our caller found a correct place (progn (skip-chars-backward " \t") - (max (1+ (current-column)) ; Else indent at comment column - comment-column)) + (setq was (current-column)) + (if (eq was 0) + comment-column + (max (1+ was) ; Else indent at comment column + comment-column))) + ;; No, the caller found a random place; we need to edit ourselves (if was nil (insert comment-start) (backward-char (length comment-start))) (setq cperl-wrong-comment t) - (indent-to comment-column 1) ; Indent minimum 1 - c))))) ; except leave at least one space. + (cperl-make-indent comment-column 1) ; Indent min 1 + c))))) ;;;(defun cperl-comment-indent-fallback () ;;; "Is called if the standard comment-search procedure fails. @@ -1666,7 +1974,7 @@ (interactive) (let (cperl-wrong-comment) (indent-for-comment) - (if cperl-wrong-comment + (if cperl-wrong-comment ; set by `cperl-comment-indent' (progn (cperl-to-comment-or-eol) (forward-char (length comment-start)))))) @@ -1966,15 +2274,10 @@ (or (get-text-property (point) 'in-pod) (cperl-after-expr-p nil "{;:") - (and (re-search-backward - ;; "\\(\\`\n?\\|\n\n\\)=\\sw+" - "\\(\\`\n?\\|^\n\\)=\\sw+" - (point-min) t) - (not (or - (looking-at "=cut") - (and cperl-use-syntax-table-text-property - (not (eq (get-text-property (point) 'syntax-type) - 'pod))))))))) + (and (re-search-backward "\\(\\`\n?\\|^\n\\)=\\sw+" (point-min) t) + (not (looking-at "\n*=cut")) + (or (not cperl-use-syntax-table-text-property) + (eq (get-text-property (point) 'syntax-type) 'pod)))))) (progn (save-excursion (setq notlast (re-search-forward "^\n=" nil t))) @@ -2252,7 +2555,7 @@ (put 'cperl-electric-backspace 'delete-selection 'supersede) -(defun cperl-inside-parens-p () +(defun cperl-inside-parens-p () ;; NOT USED???? (condition-case () (save-excursion (save-restriction @@ -2332,8 +2635,9 @@ (zerop shift-amt)) (if (> (- (point-max) pos) (point)) (goto-char (- (point-max) pos))) - (delete-region beg (point)) - (indent-to indent) + ;;;(delete-region beg (point)) + ;;;(indent-to indent) + (cperl-make-indent indent) ;; If initial point was within line's indentation, ;; position after the indentation. Else stay at same point in text. (if (> (- (point-max) pos) (point)) @@ -2380,29 +2684,314 @@ (or state (setq state (parse-partial-sexp start start-point -1 nil start-state))) (list start state depth prestart)))) -(defun cperl-block-p () ; Do not C-M-q ! One string contains ";" ! - ;; Positions is before ?\{. Checks whether it starts a block. - ;; No save-excursion! - (cperl-backward-to-noncomment (point-min)) - (or (memq (preceding-char) (append ";){}$@&%\C-@" nil)) ; Or label! \C-@ at bobp - ; Label may be mixed up with `$blah :' - (save-excursion (cperl-after-label)) - (and (memq (char-syntax (preceding-char)) '(?w ?_)) - (progn - (backward-sexp) - ;; Need take into account `bless', `return', `tr',... - (or (and (looking-at "[a-zA-Z0-9_:]+[ \t\n\f]*[{#]") ; Method call syntax - (not (looking-at "\\(bless\\|return\\|q[wqrx]?\\|tr\\|[smy]\\)\\>"))) - (progn - (skip-chars-backward " \t\n\f") - (and (memq (char-syntax (preceding-char)) '(?w ?_)) - (progn - (backward-sexp) - (looking-at - "sub[ \t]+[a-zA-Z0-9_:]+[ \t\n\f]*\\(([^()]*)[ \t\n\f]*\\)?[#{]"))))))))) - (defvar cperl-look-for-prop '((pod in-pod) (here-doc-delim here-doc-group))) +(defun cperl-beginning-of-property (p prop &optional lim) + "Given that P has a property PROP, find where the property starts. +Will not look before LIM." + ;;; XXXX What to do at point-max??? + (or (previous-single-property-change (cperl-1+ p) prop lim) + (point-min)) +;;; (cond ((eq p (point-min)) +;;; p) +;;; ((and lim (<= p lim)) +;;; p) +;;; ((not (get-text-property (1- p) prop)) +;;; p) +;;; (t (or (previous-single-property-change p look-prop lim) +;;; (point-min)))) + ) + +(defun cperl-sniff-for-indent (&optional parse-data) ; was parse-start + ;; Old workhorse for calculation of indentation; the major problem + ;; is that it mixes the sniffer logic to understand what the current line + ;; MEANS with the logic to actually calculate where to indent it. + ;; The latter part should be eventually moved to `cperl-calculate-indent'; + ;; actually, this is mostly done now... + (cperl-update-syntaxification (point) (point)) + (let ((res (get-text-property (point) 'syntax-type))) + (save-excursion + (cond + ((and (memq res '(pod here-doc here-doc-delim format)) + (not (get-text-property (point) 'indentable))) + (vector res)) + ;; before start of POD - whitespace found since do not have 'pod! + ((looking-at "[ \t]*\n=") + (error "Spaces before POD section!")) + ((and (not cperl-indent-left-aligned-comments) + (looking-at "^#")) + [comment-special:at-beginning-of-line]) + ((get-text-property (point) 'in-pod) + [in-pod]) + (t + (beginning-of-line) + (let* ((indent-point (point)) + (char-after-pos (save-excursion + (skip-chars-forward " \t") + (point))) + (char-after (char-after char-after-pos)) + (pre-indent-point (point)) + p prop look-prop is-block delim) + (save-excursion ; Know we are not in POD, find appropriate pos before + (cperl-backward-to-noncomment nil) + (setq p (max (point-min) (1- (point))) + prop (get-text-property p 'syntax-type) + look-prop (or (nth 1 (assoc prop cperl-look-for-prop)) + 'syntax-type)) + (if (memq prop '(pod here-doc format here-doc-delim)) + (progn + (goto-char (cperl-beginning-of-property p look-prop)) + (beginning-of-line) + (setq pre-indent-point (point))))) + (goto-char pre-indent-point) ; Orig line skipping preceeding pod/etc + (let* ((case-fold-search nil) + (s-s (cperl-get-state (car parse-data) (nth 1 parse-data))) + (start (or (nth 2 parse-data) ; last complete sexp terminated + (nth 0 s-s))) ; Good place to start parsing + (state (nth 1 s-s)) + (containing-sexp (car (cdr state))) + old-indent) + (if (and + ;;containing-sexp ;; We are buggy at toplevel :-( + parse-data) + (progn + (setcar parse-data pre-indent-point) + (setcar (cdr parse-data) state) + (or (nth 2 parse-data) + (setcar (cddr parse-data) start)) + ;; Before this point: end of statement + (setq old-indent (nth 3 parse-data)))) + (cond ((get-text-property (point) 'indentable) + ;; indent to "after" the surrounding open + ;; (same offset as `cperl-beautify-regexp-piece'), + ;; skip blanks if we do not close the expression. + (setq delim ; We do not close the expression + (get-text-property + (cperl-1+ char-after-pos) 'indentable) + p (1+ (cperl-beginning-of-property + (point) 'indentable)) + is-block ; misused for: preceeding line in REx + (save-excursion ; Find preceeding line + (cperl-backward-to-noncomment p) + (beginning-of-line) + (if (<= (point) p) + (progn ; get indent from the first line + (goto-char p) + (skip-chars-forward " \t") + (if (memq (char-after (point)) + (append "#\n" nil)) + nil ; Can't use intentation of this line... + (point))) + (skip-chars-forward " \t") + (point))) + prop (parse-partial-sexp p char-after-pos)) + (cond ((not delim) ; End the REx, ignore is-block + (vector 'indentable 'terminator p is-block)) + (is-block ; Indent w.r.t. preceeding line + (vector 'indentable 'cont-line char-after-pos + is-block char-after p)) + (t ; No preceeding line... + (vector 'indentable 'first-line p)))) + ((get-text-property char-after-pos 'REx-part2) + (vector 'REx-part2 (point))) + ((nth 3 state) + [comment]) + ((nth 4 state) + [string]) + ;; XXXX Do we need to special-case this? + ((null containing-sexp) + ;; Line is at top level. May be data or function definition, + ;; or may be function argument declaration. + ;; Indent like the previous top level line + ;; unless that ends in a closeparen without semicolon, + ;; in which case this line is the first argument decl. + (skip-chars-forward " \t") + (cperl-backward-to-noncomment (or old-indent (point-min))) + (setq state + (or (bobp) + (eq (point) old-indent) ; old-indent was at comment + (eq (preceding-char) ?\;) + ;; Had ?\) too + (and (eq (preceding-char) ?\}) + (cperl-after-block-and-statement-beg + (point-min))) ; Was start - too close + (memq char-after (append ")]}" nil)) + (and (eq (preceding-char) ?\:) ; label + (progn + (forward-sexp -1) + (skip-chars-backward " \t") + (looking-at "[ \t]*[a-zA-Z_][a-zA-Z_0-9]*[ \t]*:"))) + (get-text-property (point) 'first-format-line))) + + ;; Look at previous line that's at column 0 + ;; to determine whether we are in top-level decls + ;; or function's arg decls. Set basic-indent accordingly. + ;; Now add a little if this is a continuation line. + (and state + parse-data + (not (eq char-after ?\C-j)) + (setcdr (cddr parse-data) + (list pre-indent-point))) + (vector 'toplevel start char-after state (nth 2 s-s))) + ((not + (or (setq is-block + (and (setq delim (= (char-after containing-sexp) ?{)) + (save-excursion ; Is it a hash? + (goto-char containing-sexp) + (cperl-block-p)))) + cperl-indent-parens-as-block)) + ;; group is an expression, not a block: + ;; indent to just after the surrounding open parens, + ;; skip blanks if we do not close the expression. + (goto-char (1+ containing-sexp)) + (or (memq char-after + (append (if delim "}" ")]}") nil)) + (looking-at "[ \t]*\\(#\\|$\\)") + (skip-chars-forward " \t")) + (setq old-indent (point)) ; delim=is-brace + (vector 'in-parens char-after (point) delim containing-sexp)) + (t + ;; Statement level. Is it a continuation or a new statement? + ;; Find previous non-comment character. + (goto-char pre-indent-point) ; Skip one level of POD/etc + (cperl-backward-to-noncomment containing-sexp) + ;; Back up over label lines, since they don't + ;; affect whether our line is a continuation. + ;; (Had \, too) + (while;;(or (eq (preceding-char) ?\,) + (and (eq (preceding-char) ?:) + (or;;(eq (char-after (- (point) 2)) ?\') ; ???? + (memq (char-syntax (char-after (- (point) 2))) + '(?w ?_)))) + ;;) + ;; This is always FALSE? + (if (eq (preceding-char) ?\,) + ;; Will go to beginning of line, essentially. + ;; Will ignore embedded sexpr XXXX. + (cperl-backward-to-start-of-continued-exp containing-sexp)) + (beginning-of-line) + (cperl-backward-to-noncomment containing-sexp)) + ;; Now we get non-label preceeding the indent point + (if (not (or (eq (1- (point)) containing-sexp) + (memq (preceding-char) + (append (if is-block " ;{" " ,;{") '(nil))) + (and (eq (preceding-char) ?\}) + (cperl-after-block-and-statement-beg + containing-sexp)) + (get-text-property (point) 'first-format-line))) + ;; This line is continuation of preceding line's statement; + ;; indent `cperl-continued-statement-offset' more than the + ;; previous line of the statement. + ;; + ;; There might be a label on this line, just + ;; consider it bad style and ignore it. + (progn + (cperl-backward-to-start-of-continued-exp containing-sexp) + (vector 'continuation (point) char-after is-block delim)) + ;; This line starts a new statement. + ;; Position following last unclosed open brace + (goto-char containing-sexp) + ;; Is line first statement after an open-brace? + (or + ;; If no, find that first statement and indent like + ;; it. If the first statement begins with label, do + ;; not believe when the indentation of the label is too + ;; small. + (save-excursion + (forward-char 1) + (let ((colon-line-end 0)) + (while + (progn (skip-chars-forward " \t\n") + (looking-at "#\\|[a-zA-Z0-9_$]*:[^:]\\|=[a-zA-Z]")) + ;; Skip over comments and labels following openbrace. + (cond ((= (following-char) ?\#) + (forward-line 1)) + ((= (following-char) ?\=) + (goto-char + (or (next-single-property-change (point) 'in-pod) + (point-max)))) ; do not loop if no syntaxification + ;; label: + (t + (save-excursion (end-of-line) + (setq colon-line-end (point))) + (search-forward ":")))) + ;; We are at beginning of code (NOT label or comment) + ;; First, the following code counts + ;; if it is before the line we want to indent. + (and (< (point) indent-point) + (vector 'have-prev-sibling (point) colon-line-end + containing-sexp)))) + (progn + ;; If no previous statement, + ;; indent it relative to line brace is on. + + ;; For open-braces not the first thing in a line, + ;; add in cperl-brace-imaginary-offset. + + ;; If first thing on a line: ????? + ;; Move back over whitespace before the openbrace. + (setq ; brace first thing on a line + old-indent (progn (skip-chars-backward " \t") (bolp))) + ;; Should we indent w.r.t. earlier than start? + ;; Move to start of control group, possibly on a different line + (or cperl-indent-wrt-brace + (cperl-backward-to-noncomment (point-min))) + ;; If the openbrace is preceded by a parenthesized exp, + ;; move to the beginning of that; + (if (eq (preceding-char) ?\)) + (progn + (forward-sexp -1) + (cperl-backward-to-noncomment (point-min)))) + ;; In the case it starts a subroutine, indent with + ;; respect to `sub', not with respect to the + ;; first thing on the line, say in the case of + ;; anonymous sub in a hash. + (if (and;; Is it a sub in group starting on this line? + (cond ((get-text-property (point) 'attrib-group) + (goto-char (cperl-beginning-of-property + (point) 'attrib-group))) + ((eq (preceding-char) ?b) + (forward-sexp -1) + (looking-at "sub\\>"))) + (setq p (nth 1 ; start of innermost containing list + (parse-partial-sexp + (save-excursion (beginning-of-line) + (point)) + (point))))) + (progn + (goto-char (1+ p)) ; enclosing block on the same line + (skip-chars-forward " \t") + (vector 'code-start-in-block containing-sexp char-after + (and delim (not is-block)) ; is a HASH + old-indent ; brace first thing on a line + t (point) ; have something before... + ) + ;;(current-column) + ) + ;; Get initial indentation of the line we are on. + ;; If line starts with label, calculate label indentation + (vector 'code-start-in-block containing-sexp char-after + (and delim (not is-block)) ; is a HASH + old-indent ; brace first thing on a line + nil (point) ; nothing interesting before + )))))))))))))) + +(defvar cperl-indent-rules-alist + '((pod nil) ; via `syntax-type' property + (here-doc nil) ; via `syntax-type' property + (here-doc-delim nil) ; via `syntax-type' property + (format nil) ; via `syntax-type' property + (in-pod nil) ; via `in-pod' property + (comment-special:at-beginning-of-line nil) + (string t) + (comment nil)) + "Alist of indentation rules for CPerl mode. +The values mean: + nil: do not indent; + number: add this amount of indentation. + +Not finished.") + (defun cperl-calculate-indent (&optional parse-data) ; was parse-start "Return appropriate indentation for current line as Perl code. In usual case returns an integer: the column to indent to. @@ -2410,471 +2999,338 @@ Will not correct the indentation for labels, but will correct it for braces and closing parentheses and brackets." - (cperl-update-syntaxification (point) (point)) + ;; This code is still a broken architecture: in some cases we need to + ;; compensate for some modifications which `cperl-indent-line' will add later (save-excursion - (if (or - (and (memq (get-text-property (point) 'syntax-type) - '(pod here-doc here-doc-delim format)) - (not (get-text-property (point) 'indentable))) - ;; before start of POD - whitespace found since do not have 'pod! - (and (looking-at "[ \t]*\n=") - (error "Spaces before POD section!")) - (and (not cperl-indent-left-aligned-comments) - (looking-at "^#"))) - nil - (beginning-of-line) - (let ((indent-point (point)) - (char-after (save-excursion - (skip-chars-forward " \t") - (following-char))) - (in-pod (get-text-property (point) 'in-pod)) - (pre-indent-point (point)) - p prop look-prop is-block delim) + (let ((i (cperl-sniff-for-indent parse-data)) what p) + (cond + ;;((or (null i) (eq i t) (numberp i)) + ;; i) + ((vectorp i) + (setq what (assoc (elt i 0) cperl-indent-rules-alist)) (cond - (in-pod - ;; In the verbatim part, probably code example. What to do??? - ) + (what (cadr what)) ; Load from table + ;; + ;; Indenters for regular expressions with //x and qw() + ;; + ((eq 'REx-part2 (elt i 0)) ;; [self start] start of /REP in s//REP/x + (goto-char (elt i 1)) + (condition-case nil ; Use indentation of the 1st part + (forward-sexp -1)) + (current-column)) + ((eq 'indentable (elt i 0)) ; Indenter for REGEXP qw() etc + (cond ;;; [indentable terminator start-pos is-block] + ((eq 'terminator (elt i 1)) ; Lone terminator of "indentable string" + (goto-char (elt i 2)) ; After opening parens + (1- (current-column))) + ((eq 'first-line (elt i 1)); [indentable first-line start-pos] + (goto-char (elt i 2)) + (+ (or cperl-regexp-indent-step cperl-indent-level) + -1 + (current-column))) + ((eq 'cont-line (elt i 1)); [indentable cont-line pos prev-pos first-char start-pos] + ;; Indent as the level after closing parens + (goto-char (elt i 2)) ; indent line + (skip-chars-forward " \t)") ; Skip closing parens + (setq p (point)) + (goto-char (elt i 3)) ; previous line + (skip-chars-forward " \t)") ; Skip closing parens + ;; Number of parens in between: + (setq p (nth 0 (parse-partial-sexp (point) p)) + what (elt i 4)) ; First char on current line + (goto-char (elt i 3)) ; previous line + (+ (* p (or cperl-regexp-indent-step cperl-indent-level)) + (cond ((eq what ?\) ) + (- cperl-close-paren-offset)) ; compensate + ((eq what ?\| ) + (- (or cperl-regexp-indent-step cperl-indent-level))) + (t 0)) + (if (eq (following-char) ?\| ) + (or cperl-regexp-indent-step cperl-indent-level) + 0) + (current-column))) + (t + (error "Unrecognized value of indent: %s" i)))) + ;; + ;; Indenter for stuff at toplevel + ;; + ((eq 'toplevel (elt i 0)) ;; [toplevel start char-after state immed-after-block] + (+ (save-excursion ; To beg-of-defun, or end of last sexp + (goto-char (elt i 1)) ; start = Good place to start parsing + (- (current-indentation) ; + (if (elt i 4) cperl-indent-level 0))) ; immed-after-block + (if (eq (elt i 2) ?{) cperl-continued-brace-offset 0) ; char-after + ;; Look at previous line that's at column 0 + ;; to determine whether we are in top-level decls + ;; or function's arg decls. Set basic-indent accordingly. + ;; Now add a little if this is a continuation line. + (if (elt i 3) ; state (XXX What is the semantic???) + 0 + cperl-continued-statement-offset))) + ;; + ;; Indenter for stuff in "parentheses" (or brackets, braces-as-hash) + ;; + ((eq 'in-parens (elt i 0)) + ;; in-parens char-after old-indent-point is-brace containing-sexp + + ;; group is an expression, not a block: + ;; indent to just after the surrounding open parens, + ;; skip blanks if we do not close the expression. + (+ (progn + (goto-char (elt i 2)) ; old-indent-point + (current-column)) + (if (and (elt i 3) ; is-brace + (eq (elt i 1) ?\})) ; char-after + ;; Correct indentation of trailing ?\} + (+ cperl-indent-level cperl-close-paren-offset) + 0))) + ;; + ;; Indenter for continuation lines + ;; + ((eq 'continuation (elt i 0)) + ;; [continuation statement-start char-after is-block is-brace] + (goto-char (elt i 1)) ; statement-start + (+ (if (memq (elt i 2) (append "}])" nil)) ; char-after + 0 ; Closing parenth + cperl-continued-statement-offset) + (if (or (elt i 3) ; is-block + (not (elt i 4)) ; is-brace + (not (eq (elt i 2) ?\}))) ; char-after + 0 + ;; Now it is a hash reference + (+ cperl-indent-level cperl-close-paren-offset)) + ;; Labels do not take :: ... + (if (looking-at "\\(\\w\\|_\\)+[ \t]*:") + (if (> (current-indentation) cperl-min-label-indent) + (- (current-indentation) cperl-label-offset) + ;; Do not move `parse-data', this should + ;; be quick anyway (this comment comes + ;; from different location): + (cperl-calculate-indent)) + (current-column)) + (if (eq (elt i 2) ?\{) ; char-after + cperl-continued-brace-offset 0))) + ;; + ;; Indenter for lines in a block which are not leading lines + ;; + ((eq 'have-prev-sibling (elt i 0)) + ;; [have-prev-sibling sibling-beg colon-line-end block-start] + (goto-char (elt i 1)) + (if (> (elt i 2) (point)) ; colon-line-end; After-label, same line + (if (> (current-indentation) + cperl-min-label-indent) + (- (current-indentation) cperl-label-offset) + ;; Do not believe: `max' was involved in calculation of indent + (+ cperl-indent-level + (save-excursion + (goto-char (elt i 3)) ; block-start + (current-indentation)))) + (current-column))) + ;; + ;; Indenter for the first line in a block + ;; + ((eq 'code-start-in-block (elt i 0)) + ;;[code-start-in-block before-brace char-after + ;; is-a-HASH-ref brace-is-first-thing-on-a-line + ;; group-starts-before-start-of-sub start-of-control-group] + (goto-char (elt i 1)) + ;; For open brace in column zero, don't let statement + ;; start there too. If cperl-indent-level=0, + ;; use cperl-brace-offset + cperl-continued-statement-offset instead. + (+ (if (and (bolp) (zerop cperl-indent-level)) + (+ cperl-brace-offset cperl-continued-statement-offset) + cperl-indent-level) + (if (and (elt i 3) ; is-a-HASH-ref + (eq (elt i 2) ?\})) ; char-after: End of a hash reference + (+ cperl-indent-level cperl-close-paren-offset) + 0) + ;; Unless openbrace is the first nonwhite thing on the line, + ;; add the cperl-brace-imaginary-offset. + (if (elt i 4) 0 ; brace-is-first-thing-on-a-line + cperl-brace-imaginary-offset) + (progn + (goto-char (elt i 6)) ; start-of-control-group + (if (elt i 5) ; group-starts-before-start-of-sub + (current-column) + ;; Get initial indentation of the line we are on. + ;; If line starts with label, calculate label indentation + (if (save-excursion + (beginning-of-line) + (looking-at "[ \t]*[a-zA-Z_][a-zA-Z_0-9]*:[^:]")) + (if (> (current-indentation) cperl-min-label-indent) + (- (current-indentation) cperl-label-offset) + ;; Do not move `parse-data', this should + ;; be quick anyway: + (cperl-calculate-indent)) + (current-indentation)))))) (t - (save-excursion - ;; Not in POD - (cperl-backward-to-noncomment nil) - (setq p (max (point-min) (1- (point))) - prop (get-text-property p 'syntax-type) - look-prop (or (nth 1 (assoc prop cperl-look-for-prop)) - 'syntax-type)) - (if (memq prop '(pod here-doc format here-doc-delim)) - (progn - (goto-char (or (previous-single-property-change p look-prop) - (point-min))) - (beginning-of-line) - (setq pre-indent-point (point))))))) - (goto-char pre-indent-point) - (let* ((case-fold-search nil) - (s-s (cperl-get-state (car parse-data) (nth 1 parse-data))) - (start (or (nth 2 parse-data) - (nth 0 s-s))) - (state (nth 1 s-s)) - (containing-sexp (car (cdr state))) - old-indent) - (if (and - ;;containing-sexp ;; We are buggy at toplevel :-( - parse-data) - (progn - (setcar parse-data pre-indent-point) - (setcar (cdr parse-data) state) - (or (nth 2 parse-data) - (setcar (cddr parse-data) start)) - ;; Before this point: end of statement - (setq old-indent (nth 3 parse-data)))) - (cond ((get-text-property (point) 'indentable) - ;; indent to just after the surrounding open, - ;; skip blanks if we do not close the expression. - (goto-char (1+ (previous-single-property-change (point) 'indentable))) - (or (memq char-after (append ")]}" nil)) - (looking-at "[ \t]*\\(#\\|$\\)") - (skip-chars-forward " \t")) - (current-column)) - ((or (nth 3 state) (nth 4 state)) - ;; return nil or t if should not change this line - (nth 4 state)) - ;; XXXX Do we need to special-case this? - ((null containing-sexp) - ;; Line is at top level. May be data or function definition, - ;; or may be function argument declaration. - ;; Indent like the previous top level line - ;; unless that ends in a closeparen without semicolon, - ;; in which case this line is the first argument decl. - (skip-chars-forward " \t") - (+ (save-excursion - (goto-char start) - (- (current-indentation) - (if (nth 2 s-s) cperl-indent-level 0))) - (if (= char-after ?{) cperl-continued-brace-offset 0) - (progn - (cperl-backward-to-noncomment (or old-indent (point-min))) - ;; Look at previous line that's at column 0 - ;; to determine whether we are in top-level decls - ;; or function's arg decls. Set basic-indent accordingly. - ;; Now add a little if this is a continuation line. - (if (or (bobp) - (eq (point) old-indent) ; old-indent was at comment - (eq (preceding-char) ?\;) - ;; Had ?\) too - (and (eq (preceding-char) ?\}) - (cperl-after-block-and-statement-beg - (point-min))) ; Was start - too close - (memq char-after (append ")]}" nil)) - (and (eq (preceding-char) ?\:) ; label + (error "Unrecognized value of indent: %s" i)))) + (t + (error "Got strange value of indent: %s" i)))))) + +(defvar cperl-indent-alist + '((string nil) + (comment nil) + (toplevel 0) + (toplevel-after-parenth 2) + (toplevel-continued 2) + (expression 1)) + "Alist of indentation rules for CPerl mode. +The values mean: + nil: do not indent; + number: add this amount of indentation. + +Not finished, not used.") + +(defun cperl-where-am-i (&optional parse-start start-state) + ;; Unfinished + "Return a list of lists ((TYPE POS)...) of good points before the point. +POS may be nil if it is hard to find, say, when TYPE is `string' or `comment'. + +Not finished, not used." + (save-excursion + (let* ((start-point (point)) unused + (s-s (cperl-get-state)) + (start (nth 0 s-s)) + (state (nth 1 s-s)) + (prestart (nth 3 s-s)) + (containing-sexp (car (cdr state))) + (case-fold-search nil) + (res (list (list 'parse-start start) (list 'parse-prestart prestart)))) + (cond ((nth 3 state) ; In string + (setq res (cons (list 'string nil (nth 3 state)) res))) ; What started string + ((nth 4 state) ; In comment + (setq res (cons '(comment) res))) + ((null containing-sexp) + ;; Line is at top level. + ;; Indent like the previous top level line + ;; unless that ends in a closeparen without semicolon, + ;; in which case this line is the first argument decl. + (cperl-backward-to-noncomment (or parse-start (point-min))) + ;;(skip-chars-backward " \t\f\n") + (cond + ((or (bobp) + (memq (preceding-char) (append ";}" nil))) + (setq res (cons (list 'toplevel start) res))) + ((eq (preceding-char) ?\) ) + (setq res (cons (list 'toplevel-after-parenth start) res))) + (t + (setq res (cons (list 'toplevel-continued start) res))))) + ((/= (char-after containing-sexp) ?{) + ;; line is expression, not statement: + ;; indent to just after the surrounding open. + ;; skip blanks if we do not close the expression. + (setq res (cons (list 'expression-blanks (progn - (forward-sexp -1) - (skip-chars-backward " \t") - (looking-at "[ \t]*[a-zA-Z_][a-zA-Z_0-9]*[ \t]*:"))) - (get-text-property (point) 'first-format-line)) - (progn - (if (and parse-data - (not (eq char-after ?\C-j))) - (setcdr (cddr parse-data) - (list pre-indent-point))) - 0) - cperl-continued-statement-offset)))) - ((not - (or (setq is-block - (and (setq delim (= (char-after containing-sexp) ?{)) - (save-excursion ; Is it a hash? - (goto-char containing-sexp) - (cperl-block-p)))) - cperl-indent-parens-as-block)) - ;; group is an expression, not a block: - ;; indent to just after the surrounding open parens, - ;; skip blanks if we do not close the expression. - (goto-char (1+ containing-sexp)) - (or (memq char-after - (append (if delim "}" ")]}") nil)) - (looking-at "[ \t]*\\(#\\|$\\)") - (skip-chars-forward " \t")) - (+ (current-column) - (if (and delim - (eq char-after ?\})) - ;; Correct indentation of trailing ?\} - (+ cperl-indent-level cperl-close-paren-offset) - 0))) -;;; ((and (/= (char-after containing-sexp) ?{) -;;; (not cperl-indent-parens-as-block)) -;;; ;; line is expression, not statement: -;;; ;; indent to just after the surrounding open, -;;; ;; skip blanks if we do not close the expression. -;;; (goto-char (1+ containing-sexp)) -;;; (or (memq char-after (append ")]}" nil)) -;;; (looking-at "[ \t]*\\(#\\|$\\)") -;;; (skip-chars-forward " \t")) -;;; (current-column)) -;;; ((progn -;;; ;; Containing-expr starts with \{. Check whether it is a hash. -;;; (goto-char containing-sexp) -;;; (and (not (cperl-block-p)) -;;; (not cperl-indent-parens-as-block))) -;;; (goto-char (1+ containing-sexp)) -;;; (or (eq char-after ?\}) -;;; (looking-at "[ \t]*\\(#\\|$\\)") -;;; (skip-chars-forward " \t")) -;;; (+ (current-column) ; Correct indentation of trailing ?\} -;;; (if (eq char-after ?\}) (+ cperl-indent-level -;;; cperl-close-paren-offset) -;;; 0))) - (t - ;; Statement level. Is it a continuation or a new statement? - ;; Find previous non-comment character. - (goto-char pre-indent-point) - (cperl-backward-to-noncomment containing-sexp) - ;; Back up over label lines, since they don't - ;; affect whether our line is a continuation. - ;; (Had \, too) - (while ;;(or (eq (preceding-char) ?\,) - (and (eq (preceding-char) ?:) - (or ;;(eq (char-after (- (point) 2)) ?\') ; ???? - (memq (char-syntax (char-after (- (point) 2))) - '(?w ?_)))) - ;;) - (if (eq (preceding-char) ?\,) - ;; Will go to beginning of line, essentially. - ;; Will ignore embedded sexpr XXXX. - (cperl-backward-to-start-of-continued-exp containing-sexp)) - (beginning-of-line) - (cperl-backward-to-noncomment containing-sexp)) - ;; Now we get the answer. - (if (not (or (eq (1- (point)) containing-sexp) - (memq (preceding-char) - (append (if is-block " ;{" " ,;{") '(nil))) - (and (eq (preceding-char) ?\}) - (cperl-after-block-and-statement-beg - containing-sexp)) - (get-text-property (point) 'first-format-line))) - ;; This line is continuation of preceding line's statement; - ;; indent `cperl-continued-statement-offset' more than the - ;; previous line of the statement. - ;; - ;; There might be a label on this line, just - ;; consider it bad style and ignore it. - (progn - (cperl-backward-to-start-of-continued-exp containing-sexp) - (+ (if (memq char-after (append "}])" nil)) - 0 ; Closing parenth - cperl-continued-statement-offset) - (if (or is-block - (not delim) - (not (eq char-after ?\}))) - 0 - ;; Now it is a hash reference - (+ cperl-indent-level cperl-close-paren-offset)) - (if (looking-at "\\w+[ \t]*:") - (if (> (current-indentation) cperl-min-label-indent) - (- (current-indentation) cperl-label-offset) - ;; Do not move `parse-data', this should - ;; be quick anyway (this comment comes - ;; from different location): - (cperl-calculate-indent)) - (current-column)) - (if (eq char-after ?\{) - cperl-continued-brace-offset 0))) - ;; This line starts a new statement. - ;; Position following last unclosed open. - (goto-char containing-sexp) - ;; Is line first statement after an open-brace? - (or - ;; If no, find that first statement and indent like - ;; it. If the first statement begins with label, do - ;; not believe when the indentation of the label is too - ;; small. - (save-excursion - (forward-char 1) - (setq old-indent (current-indentation)) - (let ((colon-line-end 0)) - (while - (progn (skip-chars-forward " \t\n") - (looking-at "#\\|[a-zA-Z0-9_$]*:[^:]\\|=[a-zA-Z]")) - ;; Skip over comments and labels following openbrace. - (cond ((= (following-char) ?\#) - (forward-line 1)) - ((= (following-char) ?\=) - (goto-char - (or (next-single-property-change (point) 'in-pod) - (point-max)))) ; do not loop if no syntaxification - ;; label: - (t - (save-excursion (end-of-line) - (setq colon-line-end (point))) - (search-forward ":")))) - ;; The first following code counts - ;; if it is before the line we want to indent. - (and (< (point) indent-point) - (if (> colon-line-end (point)) ; After label - (if (> (current-indentation) - cperl-min-label-indent) - (- (current-indentation) cperl-label-offset) - ;; Do not believe: `max' is involved - (+ old-indent cperl-indent-level)) - (current-column))))) - ;; If no previous statement, - ;; indent it relative to line brace is on. - ;; For open brace in column zero, don't let statement - ;; start there too. If cperl-indent-level is zero, - ;; use cperl-brace-offset + cperl-continued-statement-offset instead. - ;; For open-braces not the first thing in a line, - ;; add in cperl-brace-imaginary-offset. - - ;; If first thing on a line: ????? - (+ (if (and (bolp) (zerop cperl-indent-level)) - (+ cperl-brace-offset cperl-continued-statement-offset) - cperl-indent-level) - (if (or is-block - (not delim) - (not (eq char-after ?\}))) - 0 - ;; Now it is a hash reference - (+ cperl-indent-level cperl-close-paren-offset)) - ;; Move back over whitespace before the openbrace. - ;; If openbrace is not first nonwhite thing on the line, - ;; add the cperl-brace-imaginary-offset. - (progn (skip-chars-backward " \t") - (if (bolp) 0 cperl-brace-imaginary-offset)) - ;; If the openbrace is preceded by a parenthesized exp, - ;; move to the beginning of that; - ;; possibly a different line - (progn - (if (eq (preceding-char) ?\)) - (forward-sexp -1)) - ;; In the case it starts a subroutine, indent with - ;; respect to `sub', not with respect to the - ;; first thing on the line, say in the case of - ;; anonymous sub in a hash. - ;; - (skip-chars-backward " \t") - (if (and (eq (preceding-char) ?b) - (progn - (forward-sexp -1) - (looking-at "sub\\>")) - (setq old-indent - (nth 1 - (parse-partial-sexp - (save-excursion (beginning-of-line) (point)) - (point))))) - (progn (goto-char (1+ old-indent)) - (skip-chars-forward " \t") - (current-column)) - ;; Get initial indentation of the line we are on. - ;; If line starts with label, calculate label indentation - (if (save-excursion - (beginning-of-line) - (looking-at "[ \t]*[a-zA-Z_][a-zA-Z_0-9]*:[^:]")) - (if (> (current-indentation) cperl-min-label-indent) - (- (current-indentation) cperl-label-offset) - ;; Do not move `parse-data', this should - ;; be quick anyway: - (cperl-calculate-indent)) - (current-indentation)))))))))))))) - -;; (defvar cperl-indent-alist -;; '((string nil) -;; (comment nil) -;; (toplevel 0) -;; (toplevel-after-parenth 2) -;; (toplevel-continued 2) -;; (expression 1)) -;; "Alist of indentation rules for CPerl mode. -;; The values mean: -;; nil: do not indent; -;; number: add this amount of indentation. - -;; Not finished, not used.") - -;; (defun cperl-where-am-i (&optional parse-start start-state) -;; ;; Unfinished -;; "Return a list of lists ((TYPE POS)...) of good points before the point. -;; ;; POS may be nil if it is hard to find, say, when TYPE is `string' or `comment'. - -;; ;; Not finished, not used." -;; (save-excursion -;; (let* ((start-point (point)) -;; (s-s (cperl-get-state)) -;; (start (nth 0 s-s)) -;; (state (nth 1 s-s)) -;; (prestart (nth 3 s-s)) -;; (containing-sexp (car (cdr state))) -;; (case-fold-search nil) -;; (res (list (list 'parse-start start) (list 'parse-prestart prestart)))) -;; (cond ((nth 3 state) ; In string -;; (setq res (cons (list 'string nil (nth 3 state)) res))) ; What started string -;; ((nth 4 state) ; In comment -;; (setq res (cons '(comment) res))) -;; ((null containing-sexp) -;; ;; Line is at top level. -;; ;; Indent like the previous top level line -;; ;; unless that ends in a closeparen without semicolon, -;; ;; in which case this line is the first argument decl. -;; (cperl-backward-to-noncomment (or parse-start (point-min))) -;; ;;(skip-chars-backward " \t\f\n") -;; (cond -;; ((or (bobp) -;; (memq (preceding-char) (append ";}" nil))) -;; (setq res (cons (list 'toplevel start) res))) -;; ((eq (preceding-char) ?\) ) -;; (setq res (cons (list 'toplevel-after-parenth start) res))) -;; (t -;; (setq res (cons (list 'toplevel-continued start) res))))) -;; ((/= (char-after containing-sexp) ?{) -;; ;; line is expression, not statement: -;; ;; indent to just after the surrounding open. -;; ;; skip blanks if we do not close the expression. -;; (setq res (cons (list 'expression-blanks -;; (progn -;; (goto-char (1+ containing-sexp)) -;; (or (looking-at "[ \t]*\\(#\\|$\\)") -;; (skip-chars-forward " \t")) -;; (point))) -;; (cons (list 'expression containing-sexp) res)))) -;; ((progn -;; ;; Containing-expr starts with \{. Check whether it is a hash. -;; (goto-char containing-sexp) -;; (not (cperl-block-p))) -;; (setq res (cons (list 'expression-blanks -;; (progn -;; (goto-char (1+ containing-sexp)) -;; (or (looking-at "[ \t]*\\(#\\|$\\)") -;; (skip-chars-forward " \t")) -;; (point))) -;; (cons (list 'expression containing-sexp) res)))) -;; (t -;; ;; Statement level. -;; (setq res (cons (list 'in-block containing-sexp) res)) -;; ;; Is it a continuation or a new statement? -;; ;; Find previous non-comment character. -;; (cperl-backward-to-noncomment containing-sexp) -;; ;; Back up over label lines, since they don't -;; ;; affect whether our line is a continuation. -;; ;; Back up comma-delimited lines too ????? -;; (while (or (eq (preceding-char) ?\,) -;; (save-excursion (cperl-after-label))) -;; (if (eq (preceding-char) ?\,) -;; ;; Will go to beginning of line, essentially -;; ;; Will ignore embedded sexpr XXXX. -;; (cperl-backward-to-start-of-continued-exp containing-sexp)) -;; (beginning-of-line) -;; (cperl-backward-to-noncomment containing-sexp)) -;; ;; Now we get the answer. -;; (if (not (memq (preceding-char) (append ";}{" '(nil)))) ; Was ?\, -;; ;; This line is continuation of preceding line's statement. -;; (list (list 'statement-continued containing-sexp)) -;; ;; This line starts a new statement. -;; ;; Position following last unclosed open. -;; (goto-char containing-sexp) -;; ;; Is line first statement after an open-brace? -;; (or -;; ;; If no, find that first statement and indent like -;; ;; it. If the first statement begins with label, do -;; ;; not believe when the indentation of the label is too -;; ;; small. -;; (save-excursion -;; (forward-char 1) -;; (let ((colon-line-end 0)) -;; (while (progn (skip-chars-forward " \t\n" start-point) -;; (and (< (point) start-point) -;; (looking-at -;; "#\\|[a-zA-Z_][a-zA-Z0-9_]*:[^:]"))) -;; ;; Skip over comments and labels following openbrace. -;; (cond ((= (following-char) ?\#) -;; ;;(forward-line 1) -;; (end-of-line)) -;; ;; label: -;; (t -;; (save-excursion (end-of-line) -;; (setq colon-line-end (point))) -;; (search-forward ":")))) -;; ;; Now at the point, after label, or at start -;; ;; of first statement in the block. -;; (and (< (point) start-point) -;; (if (> colon-line-end (point)) -;; ;; Before statement after label -;; (if (> (current-indentation) -;; cperl-min-label-indent) -;; (list (list 'label-in-block (point))) -;; ;; Do not believe: `max' is involved -;; (list -;; (list 'label-in-block-min-indent (point)))) -;; ;; Before statement -;; (list 'statement-in-block (point)))))) -;; ;; If no previous statement, -;; ;; indent it relative to line brace is on. -;; ;; For open brace in column zero, don't let statement -;; ;; start there too. If cperl-indent-level is zero, -;; ;; use cperl-brace-offset + cperl-continued-statement-offset instead. -;; ;; For open-braces not the first thing in a line, -;; ;; add in cperl-brace-imaginary-offset. - -;; ;; If first thing on a line: ????? -;; (+ (if (and (bolp) (zerop cperl-indent-level)) -;; (+ cperl-brace-offset cperl-continued-statement-offset) -;; cperl-indent-level) -;; ;; Move back over whitespace before the openbrace. -;; ;; If openbrace is not first nonwhite thing on the line, -;; ;; add the cperl-brace-imaginary-offset. -;; (progn (skip-chars-backward " \t") -;; (if (bolp) 0 cperl-brace-imaginary-offset)) -;; ;; If the openbrace is preceded by a parenthesized exp, -;; ;; move to the beginning of that; -;; ;; possibly a different line -;; (progn -;; (if (eq (preceding-char) ?\)) -;; (forward-sexp -1)) -;; ;; Get initial indentation of the line we are on. -;; ;; If line starts with label, calculate label indentation -;; (if (save-excursion -;; (beginning-of-line) -;; (looking-at "[ \t]*[a-zA-Z_][a-zA-Z_0-9]*:[^:]")) -;; (if (> (current-indentation) cperl-min-label-indent) -;; (- (current-indentation) cperl-label-offset) -;; (cperl-calculate-indent)) -;; (current-indentation)))))))) -;; res))) + (goto-char (1+ containing-sexp)) + (or (looking-at "[ \t]*\\(#\\|$\\)") + (skip-chars-forward " \t")) + (point))) + (cons (list 'expression containing-sexp) res)))) + ((progn + ;; Containing-expr starts with \{. Check whether it is a hash. + (goto-char containing-sexp) + (not (cperl-block-p))) + (setq res (cons (list 'expression-blanks + (progn + (goto-char (1+ containing-sexp)) + (or (looking-at "[ \t]*\\(#\\|$\\)") + (skip-chars-forward " \t")) + (point))) + (cons (list 'expression containing-sexp) res)))) + (t + ;; Statement level. + (setq res (cons (list 'in-block containing-sexp) res)) + ;; Is it a continuation or a new statement? + ;; Find previous non-comment character. + (cperl-backward-to-noncomment containing-sexp) + ;; Back up over label lines, since they don't + ;; affect whether our line is a continuation. + ;; Back up comma-delimited lines too ????? + (while (or (eq (preceding-char) ?\,) + (save-excursion (cperl-after-label))) + (if (eq (preceding-char) ?\,) + ;; Will go to beginning of line, essentially + ;; Will ignore embedded sexpr XXXX. + (cperl-backward-to-start-of-continued-exp containing-sexp)) + (beginning-of-line) + (cperl-backward-to-noncomment containing-sexp)) + ;; Now we get the answer. + (if (not (memq (preceding-char) (append ";}{" '(nil)))) ; Was ?\, + ;; This line is continuation of preceding line's statement. + (list (list 'statement-continued containing-sexp)) + ;; This line starts a new statement. + ;; Position following last unclosed open. + (goto-char containing-sexp) + ;; Is line first statement after an open-brace? + (or + ;; If no, find that first statement and indent like + ;; it. If the first statement begins with label, do + ;; not believe when the indentation of the label is too + ;; small. + (save-excursion + (forward-char 1) + (let ((colon-line-end 0)) + (while (progn (skip-chars-forward " \t\n" start-point) + (and (< (point) start-point) + (looking-at + "#\\|[a-zA-Z_][a-zA-Z0-9_]*:[^:]"))) + ;; Skip over comments and labels following openbrace. + (cond ((= (following-char) ?\#) + ;;(forward-line 1) + (end-of-line)) + ;; label: + (t + (save-excursion (end-of-line) + (setq colon-line-end (point))) + (search-forward ":")))) + ;; Now at the point, after label, or at start + ;; of first statement in the block. + (and (< (point) start-point) + (if (> colon-line-end (point)) + ;; Before statement after label + (if (> (current-indentation) + cperl-min-label-indent) + (list (list 'label-in-block (point))) + ;; Do not believe: `max' is involved + (list + (list 'label-in-block-min-indent (point)))) + ;; Before statement + (list 'statement-in-block (point)))))) + ;; If no previous statement, + ;; indent it relative to line brace is on. + ;; For open brace in column zero, don't let statement + ;; start there too. If cperl-indent-level is zero, + ;; use cperl-brace-offset + cperl-continued-statement-offset instead. + ;; For open-braces not the first thing in a line, + ;; add in cperl-brace-imaginary-offset. + + ;; If first thing on a line: ????? + (setq unused ; This is not finished... + (+ (if (and (bolp) (zerop cperl-indent-level)) + (+ cperl-brace-offset cperl-continued-statement-offset) + cperl-indent-level) + ;; Move back over whitespace before the openbrace. + ;; If openbrace is not first nonwhite thing on the line, + ;; add the cperl-brace-imaginary-offset. + (progn (skip-chars-backward " \t") + (if (bolp) 0 cperl-brace-imaginary-offset)) + ;; If the openbrace is preceded by a parenthesized exp, + ;; move to the beginning of that; + ;; possibly a different line + (progn + (if (eq (preceding-char) ?\)) + (forward-sexp -1)) + ;; Get initial indentation of the line we are on. + ;; If line starts with label, calculate label indentation + (if (save-excursion + (beginning-of-line) + (looking-at "[ \t]*[a-zA-Z_][a-zA-Z_0-9]*:[^:]")) + (if (> (current-indentation) cperl-min-label-indent) + (- (current-indentation) cperl-label-offset) + (cperl-calculate-indent)) + (current-indentation))))))))) + res))) (defun cperl-calculate-indent-within-comment () "Return the indentation amount for line, assuming that @@ -2894,14 +3350,22 @@ (defun cperl-to-comment-or-eol () "Go to position before comment on the current line, or to end of line. -Returns true if comment is found." - (let (state stop-in cpoint (lim (progn (end-of-line) (point)))) +Returns true if comment is found. In POD will not move the point." + ;; If the line is inside other syntax groups (qq-style strings, HERE-docs) + ;; then looks for literal # or end-of-line. + (let (state stop-in cpoint (lim (progn (end-of-line) (point))) pr e) + (or cperl-font-locking + (cperl-update-syntaxification lim lim)) (beginning-of-line) - (if (or - (eq (get-text-property (point) 'syntax-type) 'pod) - (re-search-forward "\\=[ \t]*\\(#\\|$\\)" lim t)) + (if (setq pr (get-text-property (point) 'syntax-type)) + (setq e (next-single-property-change (point) 'syntax-type nil (point-max)))) + (if (or (eq pr 'pod) + (if (or (not e) (> e lim)) ; deep inside a group + (re-search-forward "\\=[ \t]*\\(#\\|$\\)" lim t))) (if (eq (preceding-char) ?\#) (progn (backward-char 1) t)) - ;; Else + ;; Else - need to do it the hard way + (and (and e (<= e lim)) + (goto-char e)) (while (not stop-in) (setq state (parse-partial-sexp (point) lim nil nil nil t)) ; stop at comment @@ -2933,17 +3397,11 @@ (setq stop-in t))) ; Finish (nth 4 state)))) -(defsubst cperl-1- (p) - (max (point-min) (1- p))) - -(defsubst cperl-1+ (p) - (min (point-max) (1+ p))) - (defsubst cperl-modify-syntax-type (at how) (if (< at (point-max)) (progn (put-text-property at (1+ at) 'syntax-table how) - (put-text-property at (1+ at) 'rear-nonsticky t)))) + (put-text-property at (1+ at) 'rear-nonsticky '(syntax-table))))) (defun cperl-protect-defun-start (s e) ;; C code looks for "^\\s(" to skip comment backward in "hard" situations @@ -2978,35 +3436,53 @@ ( ?\{ . ?\} ) ( ?\< . ?\> ))) -(defun cperl-forward-re (lim end is-2arg set-st st-l err-l argument +(defun cperl-cached-syntax-table (st) + "Get a syntax table cached in ST, or create and cache into ST a syntax table. +All the entries of the syntax table are \".\", except for a backslash, which +is quoting." + (if (car-safe st) + (car st) + (setcar st (make-syntax-table)) + (setq st (car st)) + (let ((i 0)) + (while (< i 256) + (modify-syntax-entry i "." st) + (setq i (1+ i)))) + (modify-syntax-entry ?\\ "\\" st) + st)) + +(defun cperl-forward-re (lim end is-2arg st-l err-l argument &optional ostart oend) - ;; Works *before* syntax recognition is done - ;; May modify syntax-type text property if the situation is too hard - (let (b starter ender st i i2 go-forward reset-st) +"Find the end of a regular expression or a stringish construct (q[] etc). +The point should be before the starting delimiter. + +Goes to LIM if none is found. If IS-2ARG is non-nil, assumes that it +is s/// or tr/// like expression. If END is nil, generates an error +message if needed. If SET-ST is non-nil, will use (or generate) a +cached syntax table in ST-L. If ERR-L is non-nil, will store the +error message in its CAR (unless it already contains some error +message). ARGUMENT should be the name of the construct (used in error +messages). OSTART, OEND may be set in recursive calls when processing +the second argument of 2ARG construct. + +Works *before* syntax recognition is done. In IS-2ARG situation may +modify syntax-type text property if the situation is too hard." + (let (b starter ender st i i2 go-forward reset-st set-st) (skip-chars-forward " \t") ;; ender means matching-char matcher. (setq b (point) starter (if (eobp) 0 (char-after b)) ender (cdr (assoc starter cperl-starters))) ;; What if starter == ?\\ ???? - (if set-st - (if (car st-l) - (setq st (car st-l)) - (setcar st-l (make-syntax-table)) - (setq i 0 st (car st-l)) - (while (< i 256) - (modify-syntax-entry i "." st) - (setq i (1+ i))) - (modify-syntax-entry ?\\ "\\" st))) + (setq st (cperl-cached-syntax-table st-l)) (setq set-st t) ;; Whether we have an intermediate point (setq i nil) ;; Prepare the syntax table: - (and set-st - (if (not ender) ; m/blah/, s/x//, s/x/y/ - (modify-syntax-entry starter "$" st) - (modify-syntax-entry starter (concat "(" (list ender)) st) - (modify-syntax-entry ender (concat ")" (list starter)) st))) + (if (not ender) ; m/blah/, s/x//, s/x/y/ + (modify-syntax-entry starter "$" st) + (modify-syntax-entry starter (concat "(" (list ender)) st) + (modify-syntax-entry ender (concat ")" (list starter)) st)) (condition-case bb (progn ;; We use `$' syntax class to find matching stuff, but $$ @@ -3053,7 +3529,7 @@ (modify-syntax-entry starter (if (eq starter ?\\) "\\" ".") st) (if ender (modify-syntax-entry ender "." st)) (setq set-st nil) - (setq ender (cperl-forward-re lim end nil t st-l err-l + (setq ender (cperl-forward-re lim end nil st-l err-l argument starter ender) ender (nth 2 ender))))) (error (goto-char lim) @@ -3078,6 +3554,33 @@ ;; go-forward: has 2 args, and the second part is empty (list i i2 ender starter go-forward))) +(defun cperl-forward-group-in-re (&optional st-l) + "Find the end of a group in a REx. +Return the error message (if any). Does not work if delimiter is `)'. +Works before syntax recognition is done." + ;; Works *before* syntax recognition is done + (or st-l (setq st-l (list nil))) ; Avoid overwriting '() + (let (st b reset-st) + (condition-case b + (progn + (setq st (cperl-cached-syntax-table st-l)) + (modify-syntax-entry ?\( "()" st) + (modify-syntax-entry ?\) ")(" st) + (setq reset-st (syntax-table)) + (set-syntax-table st) + (forward-sexp 1)) + (error (message + "cperl-forward-group-in-re: error %s" b))) + ;; now restore the initial state + (if st + (progn + (modify-syntax-entry ?\( "." st) + (modify-syntax-entry ?\) "." st))) + (if reset-st + (set-syntax-table reset-st)) + b)) + + (defvar font-lock-string-face) ;;(defvar font-lock-reference-face) (defvar font-lock-constant-face) @@ -3103,13 +3606,24 @@ ;; d) 'Q'uoted string: ;; part between markers inclusive is marked `syntax-type' ==> `string' ;; part between `q' and the first marker is marked `syntax-type' ==> `prestring' +;; second part of s///e is marked `syntax-type' ==> `multiline' +;; e) Attributes of subroutines: `attrib-group' ==> t +;; (or 0 if declaration); up to `{' or ';': `syntax-type' => `sub-decl'. +;; f) Multiline my/our declaration lists etc: `syntax-type' => `multiline' + +;;; In addition, some parts of RExes may be marked as `REx-interpolated' +;;; (value: 0 in //o, 1 if "interpolated variable" is whole-REx, t otherwise). (defun cperl-unwind-to-safe (before &optional end) ;; if BEFORE, go to the previous start-of-line on each step of unwinding (let ((pos (point)) opos) - (setq opos pos) - (while (and pos (get-text-property pos 'syntax-type)) - (setq pos (previous-single-property-change pos 'syntax-type)) + (while (and pos (progn + (beginning-of-line) + (get-text-property (setq pos (point)) 'syntax-type))) + (setq opos pos + pos (cperl-beginning-of-property pos 'syntax-type)) + (if (eq pos (point-min)) + (setq pos nil)) (if pos (if before (progn @@ -3126,32 +3640,117 @@ (setq pos (point)) (if end ;; Do the same for end, going small steps - (progn + (save-excursion (while (and end (get-text-property end 'syntax-type)) (setq pos end - end (next-single-property-change end 'syntax-type))) + end (next-single-property-change end 'syntax-type nil (point-max))) + (if end (progn (goto-char end) + (or (bolp) (forward-line 1)) + (setq end (point))))) (or end pos))))) +;;; These are needed for byte-compile (at least with v19) (defvar cperl-nonoverridable-face) +(defvar font-lock-variable-name-face) (defvar font-lock-function-name-face) +(defvar font-lock-keyword-face) +(defvar font-lock-builtin-face) +(defvar font-lock-type-face) (defvar font-lock-comment-face) - -(defun cperl-find-pods-heres (&optional min max non-inter end ignore-max) +(defvar font-lock-warning-face) + +(defun cperl-find-sub-attrs (&optional st-l b-fname e-fname pos) + "Syntaxically mark (and fontify) attributes of a subroutine. +Should be called with the point before leading colon of an attribute." + ;; Works *before* syntax recognition is done + (or st-l (setq st-l (list nil))) ; Avoid overwriting '() + (let (st b p reset-st after-first (start (point)) start1 end1) + (condition-case b + (while (looking-at + (concat + "\\(" ; 1=optional? colon + ":" cperl-maybe-white-and-comment-rex ; 2=whitespace/comment? + "\\)" + (if after-first "?" "") + ;; No space between name and paren allowed... + "\\(\\sw+\\)" ; 3=name + "\\((\\)?")) ; 4=optional paren + (and (match-beginning 1) + (cperl-postpone-fontification + (match-beginning 0) (cperl-1+ (match-beginning 0)) + 'face font-lock-constant-face)) + (setq start1 (match-beginning 3) end1 (match-end 3)) + (cperl-postpone-fontification start1 end1 + 'face font-lock-constant-face) + (goto-char end1) ; end or before `(' + (if (match-end 4) ; Have attribute arguments... + (progn + (if st nil + (setq st (cperl-cached-syntax-table st-l)) + (modify-syntax-entry ?\( "()" st) + (modify-syntax-entry ?\) ")(" st)) + (setq reset-st (syntax-table) p (point)) + (set-syntax-table st) + (forward-sexp 1) + (set-syntax-table reset-st) + (setq reset-st nil) + (cperl-commentify p (point) t))) ; mark as string + (forward-comment (buffer-size)) + (setq after-first t)) + (error (message + "L%d: attribute `%s': %s" + (count-lines (point-min) (point)) + (and start1 end1 (buffer-substring start1 end1)) b) + (setq start nil))) + (and start + (progn + (put-text-property start (point) + 'attrib-group (if (looking-at "{") t 0)) + (and pos + (< 1 (count-lines (+ 3 pos) (point))) ; end of `sub' + ;; Apparently, we do not need `multiline': faces added now + (put-text-property (+ 3 pos) (cperl-1+ (point)) + 'syntax-type 'sub-decl)) + (and b-fname ; Fontify here: the following condition + (cperl-postpone-fontification ; is too hard to determine by + b-fname e-fname 'face ; a REx, so do it here + (if (looking-at "{") + font-lock-function-name-face + font-lock-variable-name-face))))) + ;; now restore the initial state + (if st + (progn + (modify-syntax-entry ?\( "." st) + (modify-syntax-entry ?\) "." st))) + (if reset-st + (set-syntax-table reset-st)))) + +(defsubst cperl-look-at-leading-count (is-x-REx e) + (if (re-search-forward (concat "\\=" (if is-x-REx "[ \t\n]*" "") "[{?+*]") + (1- e) t) ; return nil on failure, no moving + (if (eq ?\{ (preceding-char)) nil + (cperl-postpone-fontification + (1- (point)) (point) + 'face font-lock-warning-face)))) + +;;; Debugging this may require (setq max-specpdl-size 2000)... +(defun cperl-find-pods-heres (&optional min max non-inter end ignore-max end-of-here-doc) "Scans the buffer for hard-to-parse Perl constructions. If `cperl-pod-here-fontify' is not-nil after evaluation, will fontify the sections using `cperl-pod-head-face', `cperl-pod-face', `cperl-here-face'." (interactive) - (or min (setq min (point-min) + (or min (setq min (point-min) cperl-syntax-state nil cperl-syntax-done-to min)) (or max (setq max (point-max))) (let* ((cperl-pod-here-fontify (eval cperl-pod-here-fontify)) go tmpend face head-face here-face b e bb tag qtag b1 e1 argument i c tail tb - is-REx is-x-REx REx-comment-start REx-comment-end was-comment i2 + is-REx is-x-REx REx-subgr-start REx-subgr-end was-subgr i2 hairy-RE (case-fold-search nil) (inhibit-read-only t) (buffer-undo-list t) - (modified (buffer-modified-p)) + (modified (buffer-modified-p)) overshoot is-o-REx (after-change-functions nil) + (cperl-font-locking t) (use-syntax-state (and cperl-syntax-state (>= min (car cperl-syntax-state)))) (state-point (if use-syntax-state @@ -3162,33 +3761,62 @@ ;; (st-l '(nil)) (err-l '(nil)) ; Would overwrite - propagates from a function call to a function call! (st-l (list nil)) (err-l (list nil)) ;; Somehow font-lock may be not loaded yet... + ;; (e.g., when building TAGS via command-line call) (font-lock-string-face (if (boundp 'font-lock-string-face) font-lock-string-face 'font-lock-string-face)) - (font-lock-constant-face (if (boundp 'font-lock-constant-face) + (my-cperl-delimiters-face (if (boundp 'font-lock-constant-face) font-lock-constant-face 'font-lock-constant-face)) - (font-lock-function-name-face + (my-cperl-REx-spec-char-face ; [] ^.$ and wrapper-of ({}) (if (boundp 'font-lock-function-name-face) font-lock-function-name-face 'font-lock-function-name-face)) + (font-lock-variable-name-face ; interpolated vars and ({})-code + (if (boundp 'font-lock-variable-name-face) + font-lock-variable-name-face + 'font-lock-variable-name-face)) + (font-lock-function-name-face ; used in `cperl-find-sub-attrs' + (if (boundp 'font-lock-function-name-face) + font-lock-function-name-face + 'font-lock-function-name-face)) + (font-lock-constant-face ; used in `cperl-find-sub-attrs' + (if (boundp 'font-lock-constant-face) + font-lock-constant-face + 'font-lock-constant-face)) + (my-cperl-REx-0length-face ; 0-length, (?:)etc, non-literal \ + (if (boundp 'font-lock-builtin-face) + font-lock-builtin-face + 'font-lock-builtin-face)) (font-lock-comment-face (if (boundp 'font-lock-comment-face) font-lock-comment-face 'font-lock-comment-face)) - (cperl-nonoverridable-face + (font-lock-warning-face + (if (boundp 'font-lock-warning-face) + font-lock-warning-face + 'font-lock-warning-face)) + (my-cperl-REx-ctl-face ; (|) + (if (boundp 'font-lock-keyword-face) + font-lock-keyword-face + 'font-lock-keyword-face)) + (my-cperl-REx-modifiers-face ; //gims (if (boundp 'cperl-nonoverridable-face) cperl-nonoverridable-face - 'cperl-nonoverridable)) + 'cperl-nonoverridable-face)) + (my-cperl-REx-length1-face ; length=1 escaped chars, POSIX classes + (if (boundp 'font-lock-type-face) + font-lock-type-face + 'font-lock-type-face)) (stop-point (if ignore-max (point-max) max)) (search (concat - "\\(\\`\n?\\|^\n\\)=" + "\\(\\`\n?\\|^\n\\)=" ; POD "\\|" ;; One extra () before this: - "<<" + "<<" ; HERE-DOC "\\(" ; 1 + 1 ;; First variant "BLAH" or just ``. "[ \t]*" ; Yes, whitespace is allowed! @@ -3204,36 +3832,44 @@ "\\)" "\\|" ;; 1+6 extra () before this: - "^[ \t]*\\(format\\)[ \t]*\\([a-zA-Z0-9_]+\\)?[ \t]*=[ \t]*$" + "^[ \t]*\\(format\\)[ \t]*\\([a-zA-Z0-9_]+\\)?[ \t]*=[ \t]*$" ;FRMAT (if cperl-use-syntax-table-text-property (concat "\\|" ;; 1+6+2=9 extra () before this: - "\\<\\(q[wxqr]?\\|[msy]\\|tr\\)\\>" + "\\<\\(q[wxqr]?\\|[msy]\\|tr\\)\\>" ; QUOTED CONSTRUCT "\\|" ;; 1+6+2+1=10 extra () before this: "\\([?/<]\\)" ; /blah/ or ?blah? or <file*glob> "\\|" - ;; 1+6+2+1+1=11 extra () before this: - "\\<sub\\>[ \t]*\\([a-zA-Z_:'0-9]+[ \t]*\\)?\\(([^()]*)\\)" - "\\|" - ;; 1+6+2+1+1+2=13 extra () before this: - "\\$\\(['{]\\)" + ;; 1+6+2+1+1=11 extra () before this + "\\<sub\\>" ; sub with proto/attr + "\\(" + cperl-white-and-comment-rex + "\\(::[a-zA-Z_:'0-9]*\\|[a-zA-Z_'][a-zA-Z_:'0-9]*\\)\\)?" ; name + "\\(" + cperl-maybe-white-and-comment-rex + "\\(([^()]*)\\|:[^:]\\)\\)" ; prototype or attribute start "\\|" - ;; 1+6+2+1+1+2+1=14 extra () before this: - "\\(\\<sub[ \t\n\f]+\\|[&*$@%]\\)[a-zA-Z0-9_]*'" - ;; 1+6+2+1+1+2+1+1=15 extra () before this: + ;; 1+6+2+1+1+6=17 extra () before this: + "\\$\\(['{]\\)" ; $' or ${foo} "\\|" - "__\\(END\\|DATA\\)__" - ;; 1+6+2+1+1+2+1+1+1=16 extra () before this: + ;; 1+6+2+1+1+6+1=18 extra () before this (old pack'var syntax; + ;; we do not support intervening comments...): + "\\(\\<sub[ \t\n\f]+\\|[&*$@%]\\)[a-zA-Z0-9_]*'" + ;; 1+6+2+1+1+6+1+1=19 extra () before this: "\\|" - "\\\\\\(['`\"($]\\)") + "__\\(END\\|DATA\\)__" ; __END__ or __DATA__ + ;; 1+6+2+1+1+6+1+1+1=20 extra () before this: + "\\|" + "\\\\\\(['`\"($]\\)") ; BACKWACKED something-hairy "")))) (unwind-protect (progn (save-excursion (or non-inter (message "Scanning for \"hard\" Perl constructions...")) + ;;(message "find: %s --> %s" min max) (and cperl-pod-here-fontify ;; We had evals here, do not know why... (setq face cperl-pod-face @@ -3241,16 +3877,22 @@ here-face cperl-here-face)) (remove-text-properties min max '(syntax-type t in-pod t syntax-table t + attrib-group t + REx-interpolated t cperl-postpone t syntax-subtype t rear-nonsticky t + front-sticky t here-doc-group t first-format-line t + REx-part2 t indentable t)) ;; Need to remove face as well... (goto-char min) (and (eq system-type 'emx) - (looking-at "extproc[ \t]") ; Analogue of #! + (eq (point) 1) + (let ((case-fold-search t)) + (looking-at "extproc[ \t]")) ; Analogue of #! (cperl-commentify min (save-excursion (end-of-line) (point)) nil)) @@ -3258,11 +3900,38 @@ (< (point) max) (re-search-forward search max t)) (setq tmpend nil) ; Valid for most cases + (setq b (match-beginning 0) + state (save-excursion (parse-partial-sexp + state-point b nil nil state)) + state-point b) (cond + ;; 1+6+2+1+1+6=17 extra () before this: + ;; "\\$\\(['{]\\)" + ((match-beginning 18) ; $' or ${foo} + (if (eq (preceding-char) ?\') ; $' + (progn + (setq b (1- (point)) + state (parse-partial-sexp + state-point (1- b) nil nil state) + state-point (1- b)) + (if (nth 3 state) ; in string + (cperl-modify-syntax-type (1- b) cperl-st-punct)) + (goto-char (1+ b))) + ;; else: ${ + (setq bb (match-beginning 0)) + (cperl-modify-syntax-type bb cperl-st-punct))) + ;; No processing in strings/comments beyond this point: + ((or (nth 3 state) (nth 4 state)) + t) ; Do nothing in comment/string ((match-beginning 1) ; POD section ;; "\\(\\`\n?\\|^\n\\)=" - (if (looking-at "cut\\>") - (if ignore-max + (setq b (match-beginning 0) + state (parse-partial-sexp + state-point b nil nil state) + state-point b) + (if (or (nth 3 state) (nth 4 state) + (looking-at "cut\\>")) + (if (or (nth 3 state) (nth 4 state) ignore-max) nil ; Doing a chunk only (message "=cut is not preceded by a POD section") (or (car err-l) (setcar err-l (point)))) @@ -3288,11 +3957,15 @@ (progn (remove-text-properties max e '(syntax-type t in-pod t syntax-table t + attrib-group t + REx-interpolated t cperl-postpone t syntax-subtype t here-doc-group t rear-nonsticky t + front-sticky t first-format-line t + REx-part2 t indentable t)) (setq tmpend tb))) (put-text-property b e 'in-pod t) @@ -3335,7 +4008,8 @@ (or (eq e (point-max)) (forward-char -1)))) ; Prepare for immediate POD start. ;; Here document - ;; We do only one here-per-line + ;; We can do many here-per-line; + ;; but multiline quote on the same line as <<HERE confuses us... ;; ;; One extra () before this: ;;"<<" ;; "\\(" ; 1 + 1 @@ -3352,21 +4026,42 @@ ;; "\\(\\)" ; To preserve count of pars :-( 6 + 1 ;; "\\)" ((match-beginning 2) ; 1 + 1 - ;; Abort in comment: - (setq b (point)) - (setq state (parse-partial-sexp state-point b nil nil state) - state-point b + (setq b (point) tb (match-beginning 0) - i (or (nth 3 state) (nth 4 state))) - (if i - (setq c t) - (setq c (and - (match-beginning 5) - (not (match-beginning 6)) ; Empty - (looking-at - "[ \t]*[=0-9$@%&(]")))) + c (and ; not HERE-DOC + (match-beginning 5) + (save-match-data + (or (looking-at "[ \t]*(") ; << function_call() + (save-excursion ; 1 << func_name, or $foo << 10 + (condition-case nil + (progn + (goto-char tb) + ;;; XXX What to do: foo <<bar ??? + ;;; XXX Need to support print {a} <<B ??? + (forward-sexp -1) + (save-match-data + ; $foo << b; $f .= <<B; + ; ($f+1) << b; a($f) . <<B; + ; foo 1, <<B; $x{a} <<b; + (cond + ((looking-at "[0-9$({]") + (forward-sexp 1) + (and + (looking-at "[ \t]*<<") + (condition-case nil + ;; print $foo <<EOF + (progn + (forward-sexp -2) + (not + (looking-at "\\(printf?\\|system\\|exec\\|sort\\)\\>"))) + (error t))))))) + (error nil))) ; func(<<EOF) + (and (not (match-beginning 6)) ; Empty + (looking-at + "[ \t]*[=0-9$@%&(]")))))) (if c ; Not here-doc nil ; Skip it. + (setq c (match-end 2)) ; 1 + 1 (if (match-beginning 5) ;4 + 1 (setq b1 (match-beginning 5) ; 4 + 1 e1 (match-end 5)) ; 4 + 1 @@ -3376,15 +4071,20 @@ qtag (regexp-quote tag)) (cond (cperl-pod-here-fontify ;; Highlight the starting delimiter - (cperl-postpone-fontification b1 e1 'face font-lock-constant-face) + (cperl-postpone-fontification + b1 e1 'face my-cperl-delimiters-face) (cperl-put-do-not-fontify b1 e1 t))) (forward-line) + (setq i (point)) + (if end-of-here-doc + (goto-char end-of-here-doc)) (setq b (point)) ;; We do not search to max, since we may be called from ;; some hook of fontification, and max is random (or (and (re-search-forward (concat "^" qtag "$") stop-point 'toend) - (eq (following-char) ?\n)) + ;;;(eq (following-char) ?\n) ; XXXX WHY??? + ) (progn ; Pretend we matched at the end (goto-char (point-max)) (re-search-forward "\\'") @@ -3393,8 +4093,9 @@ (if cperl-pod-here-fontify (progn ;; Highlight the ending delimiter - (cperl-postpone-fontification (match-beginning 0) (match-end 0) - 'face font-lock-constant-face) + (cperl-postpone-fontification + (match-beginning 0) (match-end 0) + 'face my-cperl-delimiters-face) (cperl-put-do-not-fontify b (match-end 0) t) ;; Highlight the HERE-DOC (cperl-postpone-fontification b (match-beginning 0) @@ -3404,10 +4105,21 @@ 'syntax-type 'here-doc) (put-text-property (match-beginning 0) e1 'syntax-type 'here-doc-delim) - (put-text-property b e1 - 'here-doc-group t) + (put-text-property b e1 'here-doc-group t) + ;; This makes insertion at the start of HERE-DOC update + ;; the whole construct: + (put-text-property b (cperl-1+ b) 'front-sticky '(syntax-type)) (cperl-commentify b e1 nil) (cperl-put-do-not-fontify b (match-end 0) t) + ;; Cache the syntax info... + (setq cperl-syntax-state (cons state-point state)) + ;; ... and process the rest of the line... + (setq overshoot + (elt ; non-inter ignore-max + (cperl-find-pods-heres c i t end t e1) 1)) + (if (and overshoot (> overshoot (point))) + (goto-char overshoot) + (setq overshoot e1)) (if (> e1 max) (setq tmpend tb)))) ;; format @@ -3462,7 +4174,7 @@ (if (> (point) max) (setq tmpend tb)) (put-text-property b (point) 'syntax-type 'format)) - ;; Regexp: + ;; qq-like String or Regexp: ((or (match-beginning 10) (match-beginning 11)) ;; 1+6+2=9 extra () before this: ;; "\\<\\(q[wxqr]?\\|[msy]\\|tr\\)\\>" @@ -3471,10 +4183,10 @@ (setq b1 (if (match-beginning 10) 10 11) argument (buffer-substring (match-beginning b1) (match-end b1)) - b (point) + b (point) ; end of qq etc i b c (char-after (match-beginning b1)) - bb (char-after (1- (match-beginning b1))) ; tmp holder + bb (char-after (1- (match-beginning b1))) ; tmp holder ;; bb == "Not a stringy" bb (if (eq b1 10) ; user variables/whatever (and (memq bb (append "$@%*#_:-&>" nil)) ; $#y) @@ -3488,7 +4200,7 @@ (- (match-beginning b1) 2)) ?\-)) ((eq bb ?\&) - (not (eq (char-after ; &&m/blah/ + (not (eq (char-after ; &&m/blah/ (- (match-beginning b1) 2)) ?\&))) (t t))) @@ -3506,41 +4218,40 @@ (setq argument "" b1 nil bb ; Not a regexp? - (progn - (not - ;; What is below: regexp-p? - (and - (or (memq (preceding-char) - (append (if (memq c '(?\? ?\<)) - ;; $a++ ? 1 : 2 - "~{(=|&*!,;:" - "~{(=|&+-*!,;:") nil)) - (and (eq (preceding-char) ?\}) - (cperl-after-block-p (point-min))) - (and (eq (char-syntax (preceding-char)) ?w) - (progn - (forward-sexp -1) + (not + ;; What is below: regexp-p? + (and + (or (memq (preceding-char) + (append (if (memq c '(?\? ?\<)) + ;; $a++ ? 1 : 2 + "~{(=|&*!,;:[" + "~{(=|&+-*!,;:[") nil)) + (and (eq (preceding-char) ?\}) + (cperl-after-block-p (point-min))) + (and (eq (char-syntax (preceding-char)) ?w) + (progn + (forward-sexp -1) ;; After these keywords `/' starts a RE. One should add all the ;; functions/builtins which expect an argument, but ... - (if (eq (preceding-char) ?-) - ;; -d ?foo? is a RE - (looking-at "[a-zA-Z]\\>") - (and - (not (memq (preceding-char) - '(?$ ?@ ?& ?%))) - (looking-at - "\\(while\\|if\\|unless\\|until\\|and\\|or\\|not\\|xor\\|split\\|grep\\|map\\|print\\)\\>"))))) - (and (eq (preceding-char) ?.) - (eq (char-after (- (point) 2)) ?.)) - (bobp)) - ;; m|blah| ? foo : bar; - (not - (and (eq c ?\?) - cperl-use-syntax-table-text-property - (not (bobp)) - (progn - (forward-char -1) - (looking-at "\\s|"))))))) + (if (eq (preceding-char) ?-) + ;; -d ?foo? is a RE + (looking-at "[a-zA-Z]\\>") + (and + (not (memq (preceding-char) + '(?$ ?@ ?& ?%))) + (looking-at + "\\(while\\|if\\|unless\\|until\\|and\\|or\\|not\\|xor\\|split\\|grep\\|map\\|print\\)\\>"))))) + (and (eq (preceding-char) ?.) + (eq (char-after (- (point) 2)) ?.)) + (bobp)) + ;; m|blah| ? foo : bar; + (not + (and (eq c ?\?) + cperl-use-syntax-table-text-property + (not (bobp)) + (progn + (forward-char -1) + (looking-at "\\s|")))))) b (1- b)) ;; s y tr m ;; Check for $a -> y @@ -3550,13 +4261,9 @@ (eq (char-after (- go 2)) ?-)) ;; Not a regexp (setq bb t)))) - (or bb (setq state (parse-partial-sexp - state-point b nil nil state) - state-point b)) - (setq bb (or bb (nth 3 state) (nth 4 state))) - (goto-char b) (or bb (progn + (goto-char b) (if (looking-at "[ \t\n\f]+\\(#[^\n]*\n[ \t\n\f]*\\)+") (goto-char (match-end 0)) (skip-chars-forward " \t\n\f")) @@ -3593,6 +4300,8 @@ (skip-chars-backward " \t\n\f") (memq (preceding-char) (append "$@%&*" nil)))) + (setq bb t)) + ((eobp) (setq bb t))))) (if bb (goto-char i) @@ -3605,15 +4314,16 @@ ;; qtag means two-arg matcher, may be reset to ;; 2 or 3 later if some special quoting is needed. ;; e1 means matching-char matcher. - (setq b (point) + (setq b (point) ; before the first delimiter ;; has 2 args i2 (string-match "^\\([sy]\\|tr\\)$" argument) ;; We do not search to max, since we may be called from ;; some hook of fontification, and max is random i (cperl-forward-re stop-point end i2 - t st-l err-l argument) - ;; Note that if `go', then it is considered as 1-arg + st-l err-l argument) + ;; If `go', then it is considered as 1-arg, `b1' is nil + ;; as in s/foo//x; the point is before final "slash" b1 (nth 1 i) ; start of the second part tag (nth 2 i) ; ender-char, true if second part ; is with matching chars [] @@ -3625,13 +4335,18 @@ (1- e1)) e (if i i e1) ; end of the first part qtag nil ; need to preserve backslashitis - is-x-REx nil) ; REx has //x modifier + is-x-REx nil is-o-REx nil); REx has //x //o modifiers + ;; If s{} (), then b/b1 are at "{", "(", e1/i after ")", "}" ;; Commenting \\ is dangerous, what about ( ? (and i tail (eq (char-after i) ?\\) (setq qtag t)) - (if (looking-at "\\sw*x") ; qr//x - (setq is-x-REx t)) + (and (if go (looking-at ".\\sw*x") + (looking-at "\\sw*x")) ; qr//x + (setq is-x-REx t)) + (and (if go (looking-at ".\\sw*o") + (looking-at "\\sw*o")) ; //o + (setq is-o-REx t)) (if (null i) ;; Considered as 1arg form (progn @@ -3648,9 +4363,11 @@ (cperl-commentify b i t) (if (looking-at "\\sw*e") ; s///e (progn + ;; Cache the syntax info... + (setq cperl-syntax-state (cons state-point state)) (and ;; silent: - (cperl-find-pods-heres b1 (1- (point)) t end) + (car (cperl-find-pods-heres b1 (1- (point)) t end)) ;; Error (goto-char (1+ max))) (if (and tag (eq (preceding-char) ?\>)) @@ -3658,6 +4375,7 @@ (cperl-modify-syntax-type (1- (point)) cperl-st-ket) (cperl-modify-syntax-type i cperl-st-bra))) (put-text-property b i 'syntax-type 'string) + (put-text-property i (point) 'syntax-type 'multiline) (if is-x-REx (put-text-property b i 'indentable t))) (cperl-commentify b1 (point) t) @@ -3673,7 +4391,7 @@ (forward-word 1) ; skip modifiers s///s (if tail (cperl-commentify tail (point) t)) (cperl-postpone-fontification - e1 (point) 'face 'cperl-nonoverridable))) + e1 (point) 'face my-cperl-REx-modifiers-face))) ;; Check whether it is m// which means "previous match" ;; and highlight differently (setq is-REx @@ -3691,7 +4409,7 @@ (not (looking-at "split\\>"))) (error t)))) (cperl-postpone-fontification - b e 'face font-lock-function-name-face) + b e 'face font-lock-warning-face) (if (or i2 ; Has 2 args (and cperl-fontify-m-as-s (or @@ -3700,135 +4418,417 @@ (not (eq ?\< (char-after b))))))) (progn (cperl-postpone-fontification - b (cperl-1+ b) 'face font-lock-constant-face) + b (cperl-1+ b) 'face my-cperl-delimiters-face) (cperl-postpone-fontification - (1- e) e 'face font-lock-constant-face))) + (1- e) e 'face my-cperl-delimiters-face))) (if (and is-REx cperl-regexp-scan) - ;; Process RExen better + ;; Process RExen: embedded comments, charclasses and ] +;;;/\3333\xFg\x{FFF}a\ppp\PPP\qqq\C\99f(?{ foo })(??{ foo })/; +;;;/a\.b[^a[:ff:]b]x$ab->$[|$,$ab->[cd]->[ef]|$ab[xy].|^${a,b}{c,d}/; +;;;/(?<=foo)(?<!bar)(x)(?:$ab|\$\/)$|\\\b\x888\776\[\:$/xxx; +;;;m?(\?\?{b,a})? + m/(??{aa})(?(?=xx)aa|bb)(?#aac)/; +;;;m$(^ab[c]\$)$ + m+(^ab[c]\$\+)+ + m](^ab[c\]$|.+)] + m)(^ab[c]$|.+\)); +;;;m^a[\^b]c^ + m.a[^b]\.c.; (save-excursion (goto-char (1+ b)) + ;; First + (cperl-look-at-leading-count is-x-REx e) + (setq hairy-RE + (concat + (if is-x-REx + (if (eq (char-after b) ?\#) + "\\((\\?\\\\#\\)\\|\\(\\\\#\\)" + "\\((\\?#\\)\\|\\(#\\)") + ;; keep the same count: add a fake group + (if (eq (char-after b) ?\#) + "\\((\\?\\\\#\\)\\(\\)" + "\\((\\?#\\)\\(\\)")) + "\\|" + "\\(\\[\\)" ; 3=[ + "\\|" + "\\(]\\)" ; 4=] + "\\|" + ;; XXXX Will not be able to use it in s))) + (if (eq (char-after b) ?\) ) + "\\())))\\)" ; Will never match + (if (eq (char-after b) ?? ) + ;;"\\((\\\\\\?\\(\\\\\\?\\)?{\\)" + "\\((\\\\\\?\\\\\\?{\\|()\\\\\\?{\\)" + "\\((\\?\\??{\\)")) ; 5= (??{ (?{ + "\\|" ; 6= 0-length, 7: name, 8,9:code, 10:group + "\\(" ;; XXXX 1-char variables, exc. |()\s + "[$@]" + "\\(" + "[_a-zA-Z:][_a-zA-Z0-9:]*" + "\\|" + "{[^{}]*}" ; only one-level allowed + "\\|" + "[^{(|) \t\r\n\f]" + "\\)" + "\\(" ;;8,9:code part of array/hash elt + "\\(" "->" "\\)?" + "\\[[^][]*\\]" + "\\|" + "{[^{}]*}" + "\\)*" + ;; XXXX: what if u is delim? + "\\|" + "[)^|$.*?+]" + "\\|" + "{[0-9]+}" + "\\|" + "{[0-9]+,[0-9]*}" + "\\|" + "\\\\[luLUEQbBAzZG]" + "\\|" + "(" ; Group opener + "\\(" ; 10 group opener follower + "\\?\\((\\?\\)" ; 11: in (?(?=C)A|B) + "\\|" + "\\?[:=!>?{]" ; "?" something + "\\|" + "\\?[-imsx]+[:)]" ; (?i) (?-s:.) + "\\|" + "\\?([0-9]+)" ; (?(1)foo|bar) + "\\|" + "\\?<[=!]" + ;;;"\\|" + ;;; "\\?" + "\\)?" + "\\)" + "\\|" + "\\\\\\(.\\)" ; 12=\SYMBOL + )) (while - (and (< (point) e) - (re-search-forward - (if is-x-REx - (if (eq (char-after b) ?\#) - "\\((\\?\\\\#\\)\\|\\(\\\\#\\)" - "\\((\\?#\\)\\|\\(#\\)") - (if (eq (char-after b) ?\#) - "\\((\\?\\\\#\\)" - "\\((\\?#\\)")) - (1- e) 'to-end)) + (and (< (point) (1- e)) + (re-search-forward hairy-RE (1- e) 'to-end)) (goto-char (match-beginning 0)) - (setq REx-comment-start (point) - was-comment t) - (if (save-excursion - (and - ;; XXX not working if outside delimiter is # - (eq (preceding-char) ?\\) - (= (% (skip-chars-backward "$\\\\") 2) -1))) - ;; Not a comment, avoid loop: - (progn (setq was-comment nil) - (forward-char 1)) - (if (match-beginning 2) + (setq REx-subgr-start (point) + was-subgr (following-char)) + (cond + ((match-beginning 6) ; 0-length builtins, groups + (goto-char (match-end 0)) + (if (match-beginning 11) + (goto-char (match-beginning 11))) + (if (>= (point) e) + (goto-char (1- e))) + (cperl-postpone-fontification + (match-beginning 0) (point) + 'face + (cond + ((eq was-subgr ?\) ) + (condition-case nil + (save-excursion + (forward-sexp -1) + (if (> (point) b) + (if (if (eq (char-after b) ?? ) + (looking-at "(\\\\\\?") + (eq (char-after (1+ (point))) ?\?)) + my-cperl-REx-0length-face + my-cperl-REx-ctl-face) + font-lock-warning-face)) + (error font-lock-warning-face))) + ((eq was-subgr ?\| ) + my-cperl-REx-ctl-face) + ((eq was-subgr ?\$ ) + (if (> (point) (1+ REx-subgr-start)) + (progn + (put-text-property + (match-beginning 0) (point) + 'REx-interpolated + (if is-o-REx 0 + (if (and (eq (match-beginning 0) + (1+ b)) + (eq (point) + (1- e))) 1 t))) + font-lock-variable-name-face) + my-cperl-REx-spec-char-face)) + ((memq was-subgr (append "^." nil) ) + my-cperl-REx-spec-char-face) + ((eq was-subgr ?\( ) + (if (not (match-beginning 10)) + my-cperl-REx-ctl-face + my-cperl-REx-0length-face)) + (t my-cperl-REx-0length-face))) + (if (and (memq was-subgr (append "(|" nil)) + (not (string-match "(\\?[-imsx]+)" + (match-string 0)))) + (cperl-look-at-leading-count is-x-REx e)) + (setq was-subgr nil)) ; We do stuff here + ((match-beginning 12) ; \SYMBOL + (forward-char 2) + (if (>= (point) e) + (goto-char (1- e)) + ;; How many chars to not highlight: + ;; 0-len special-alnums in other branch => + ;; Generic: \non-alnum (1), \alnum (1+face) + ;; Is-delim: \non-alnum (1/spec-2) alnum-1 (=what hai) + (setq REx-subgr-start (point) + qtag (preceding-char)) + (cperl-postpone-fontification + (- (point) 2) (- (point) 1) 'face + (if (memq qtag + (append "ghijkmoqvFHIJKMORTVY" nil)) + font-lock-warning-face + my-cperl-REx-0length-face)) + (if (and (eq (char-after b) qtag) + (memq qtag (append ".])^$|*?+" nil))) + (progn + (if (and cperl-use-syntax-table-text-property + (eq qtag ?\) )) + (put-text-property + REx-subgr-start (1- (point)) + 'syntax-table cperl-st-punct)) + (cperl-postpone-fontification + (1- (point)) (point) 'face + ; \] can't appear below + (if (memq qtag (append ".]^$" nil)) + 'my-cperl-REx-spec-char-face + (if (memq qtag (append "*?+" nil)) + 'my-cperl-REx-0length-face + 'my-cperl-REx-ctl-face))))) ; )| + ;; Test for arguments: + (cond + ;; This is not pretty: the 5.8.7 logic: + ;; \0numx -> octal (up to total 3 dig) + ;; \DIGIT -> backref unless \0 + ;; \DIGITs -> backref if legal + ;; otherwise up to 3 -> octal + ;; Do not try to distinguish, we guess + ((or (and (memq qtag (append "01234567" nil)) + (re-search-forward + "\\=[01234567]?[01234567]?" + (1- e) 'to-end)) + (and (memq qtag (append "89" nil)) + (re-search-forward + "\\=[0123456789]*" (1- e) 'to-end)) + (and (eq qtag ?x) + (re-search-forward + "\\=[0-9a-fA-F][0-9a-fA-F]?\\|\\={[0-9a-fA-F]+}" + (1- e) 'to-end)) + (and (memq qtag (append "pPN" nil)) + (re-search-forward "\\={[^{}]+}\\|." + (1- e) 'to-end)) + (eq (char-syntax qtag) ?w)) + (cperl-postpone-fontification + (1- REx-subgr-start) (point) + 'face my-cperl-REx-length1-face)))) + (setq was-subgr nil)) ; We do stuff here + ((match-beginning 3) ; [charclass] + (forward-char 1) + (if (eq (char-after b) ?^ ) + (and (eq (following-char) ?\\ ) + (eq (char-after (cperl-1+ (point))) + ?^ ) + (forward-char 2)) + (and (eq (following-char) ?^ ) + (forward-char 1))) + (setq argument b ; continue? + tag nil ; list of POSIX classes + qtag (point)) + (if (eq (char-after b) ?\] ) + (and (eq (following-char) ?\\ ) + (eq (char-after (cperl-1+ (point))) + ?\] ) + (setq qtag (1+ qtag)) + (forward-char 2)) + (and (eq (following-char) ?\] ) + (forward-char 1))) + ;; Apparently, I can't put \] into a charclass + ;; in m]]: m][\\\]\]] produces [\\]] +;;; POSIX? [:word:] [:^word:] only inside [] +;;; "\\=\\(\\\\.\\|[^][\\\\]\\|\\[:\\^?\sw+:]\\|\\[[^:]\\)*]") + (while + (and argument + (re-search-forward + (if (eq (char-after b) ?\] ) + "\\=\\(\\\\[^]]\\|[^]\\\\]\\)*\\\\]" + "\\=\\(\\\\.\\|[^]\\\\]\\)*]") + (1- e) 'toend)) + ;; Is this ] an end of POSIX class? + (if (save-excursion + (and + (search-backward "[" argument t) + (< REx-subgr-start (point)) + (not + (and ; Should work with delim = \ + (eq (preceding-char) ?\\ ) + (= (% (skip-chars-backward + "\\\\") 2) 0))) + (looking-at + (cond + ((eq (char-after b) ?\] ) + "\\\\*\\[:\\^?\\sw+:\\\\\\]") + ((eq (char-after b) ?\: ) + "\\\\*\\[\\\\:\\^?\\sw+\\\\:]") + ((eq (char-after b) ?^ ) + "\\\\*\\[:\\(\\\\\\^\\)?\\sw+:\]") + ((eq (char-syntax (char-after b)) + ?w) + (concat + "\\\\*\\[:\\(\\\\\\^\\)?\\(\\\\" + (char-to-string (char-after b)) + "\\|\\sw\\)+:\]")) + (t "\\\\*\\[:\\^?\\sw*:]"))) + (setq argument (point)))) + (setq tag (cons (cons argument (point)) + tag) + argument (point)) ; continue + (setq argument nil))) + (and argument + (message "Couldn't find end of charclass in a REx, pos=%s" + REx-subgr-start)) + (if (and cperl-use-syntax-table-text-property + (> (- (point) 2) REx-subgr-start)) + (put-text-property + (1+ REx-subgr-start) (1- (point)) + 'syntax-table cperl-st-punct)) + (cperl-postpone-fontification + REx-subgr-start qtag + 'face my-cperl-REx-spec-char-face) + (cperl-postpone-fontification + (1- (point)) (point) 'face + my-cperl-REx-spec-char-face) + (if (eq (char-after b) ?\] ) + (cperl-postpone-fontification + (- (point) 2) (1- (point)) + 'face my-cperl-REx-0length-face)) + (while tag + (cperl-postpone-fontification + (car (car tag)) (cdr (car tag)) + 'face my-cperl-REx-length1-face) + (setq tag (cdr tag))) + (setq was-subgr nil)) ; did facing already + ;; Now rare stuff: + ((and (match-beginning 2) ; #-comment + (/= (match-beginning 2) (match-end 2))) + (beginning-of-line 2) + (if (> (point) e) + (goto-char (1- e)))) + ((match-beginning 4) ; character "]" + (setq was-subgr nil) ; We do stuff here + (goto-char (match-end 0)) + (if cperl-use-syntax-table-text-property + (put-text-property + (1- (point)) (point) + 'syntax-table cperl-st-punct)) + (cperl-postpone-fontification + (1- (point)) (point) + 'face font-lock-warning-face)) + ((match-beginning 5) ; before (?{}) (??{}) + (setq tag (match-end 0)) + (if (or (setq qtag + (cperl-forward-group-in-re st-l)) + (and (>= (point) e) + (setq qtag "no matching `)' found")) + (and (not (eq (char-after (- (point) 2)) + ?\} )) + (setq qtag "Can't find })"))) (progn - (beginning-of-line 2) - (if (> (point) e) - (goto-char (1- e)))) - ;; Works also if the outside delimiters are (). - (or (search-forward ")" (1- e) 'toend) - (message - "Couldn't find end of (?#...)-comment in a REx, pos=%s" - REx-comment-start)))) + (goto-char (1- e)) + (message qtag)) + (cperl-postpone-fontification + (1- tag) (1- (point)) + 'face font-lock-variable-name-face) + (cperl-postpone-fontification + REx-subgr-start (1- tag) + 'face my-cperl-REx-spec-char-face) + (cperl-postpone-fontification + (1- (point)) (point) + 'face my-cperl-REx-spec-char-face) + (if cperl-use-syntax-table-text-property + (progn + (put-text-property + (- (point) 2) (1- (point)) + 'syntax-table cperl-st-cfence) + (put-text-property + (+ REx-subgr-start 2) + (+ REx-subgr-start 3) + 'syntax-table cperl-st-cfence)))) + (setq was-subgr nil)) + (t ; (?#)-comment + ;; Inside "(" and "\" arn't special in any way + ;; Works also if the outside delimiters are (). + (or;;(if (eq (char-after b) ?\) ) + ;;(re-search-forward + ;; "[^\\\\]\\(\\\\\\\\\\)*\\\\)" + ;; (1- e) 'toend) + (search-forward ")" (1- e) 'toend) + ;;) + (message + "Couldn't find end of (?#...)-comment in a REx, pos=%s" + REx-subgr-start)))) (if (>= (point) e) (goto-char (1- e))) - (if was-comment - (progn - (setq REx-comment-end (point)) - (cperl-commentify - REx-comment-start REx-comment-end nil) - (cperl-postpone-fontification - REx-comment-start REx-comment-end - 'face font-lock-comment-face)))))) + (cond + (was-subgr + (setq REx-subgr-end (point)) + (cperl-commentify + REx-subgr-start REx-subgr-end nil) + (cperl-postpone-fontification + REx-subgr-start REx-subgr-end + 'face font-lock-comment-face)))))) (if (and is-REx is-x-REx) (put-text-property (1+ b) (1- e) 'syntax-subtype 'x-REx))) (if i2 (progn (cperl-postpone-fontification - (1- e1) e1 'face font-lock-constant-face) + (1- e1) e1 'face my-cperl-delimiters-face) (if (assoc (char-after b) cperl-starters) - (cperl-postpone-fontification - b1 (1+ b1) 'face font-lock-constant-face)))) + (progn + (cperl-postpone-fontification + b1 (1+ b1) 'face my-cperl-delimiters-face) + (put-text-property b1 (1+ b1) + 'REx-part2 t))))) (if (> (point) max) (setq tmpend tb)))) - ((match-beginning 13) ; sub with prototypes - (setq b (match-beginning 0)) + ((match-beginning 17) ; sub with prototype or attribute + ;; 1+6+2+1+1=11 extra () before this (sub with proto/attr): + ;;"\\<sub\\>\\(" ;12 + ;; cperl-white-and-comment-rex ;13 + ;; "\\([a-zA-Z_:'0-9]+\\)\\)?" ; name ;14 + ;;"\\(" cperl-maybe-white-and-comment-rex ;15,16 + ;; "\\(([^()]*)\\|:[^:]\\)\\)" ; 17:proto or attribute start + (setq b1 (match-beginning 14) e1 (match-end 14)) (if (memq (char-after (1- b)) '(?\$ ?\@ ?\% ?\& ?\*)) nil - (setq state (parse-partial-sexp - state-point b nil nil state) - state-point b) - (if (or (nth 3 state) (nth 4 state)) - nil - ;; Mark as string - (cperl-commentify (match-beginning 13) (match-end 13) t)) - (goto-char (match-end 0)))) - ;; 1+6+2+1+1+2=13 extra () before this: - ;; "\\$\\(['{]\\)" - ((and (match-beginning 14) - (eq (preceding-char) ?\')) ; $' - (setq b (1- (point)) - state (parse-partial-sexp - state-point (1- b) nil nil state) - state-point (1- b)) - (if (nth 3 state) ; in string - (cperl-modify-syntax-type (1- b) cperl-st-punct)) - (goto-char (1+ b))) - ;; 1+6+2+1+1+2=13 extra () before this: - ;; "\\$\\(['{]\\)" - ((match-beginning 14) ; ${ - (setq bb (match-beginning 0)) - (cperl-modify-syntax-type bb cperl-st-punct)) - ;; 1+6+2+1+1+2+1=14 extra () before this: + (goto-char b) + (if (eq (char-after (match-beginning 17)) ?\( ) + (progn + (cperl-commentify ; Prototypes; mark as string + (match-beginning 17) (match-end 17) t) + (goto-char (match-end 0)) + ;; Now look for attributes after prototype: + (forward-comment (buffer-size)) + (and (looking-at ":[^:]") + (cperl-find-sub-attrs st-l b1 e1 b))) + ;; treat attributes without prototype + (goto-char (match-beginning 17)) + (cperl-find-sub-attrs st-l b1 e1 b)))) + ;; 1+6+2+1+1+6+1=18 extra () before this: ;; "\\(\\<sub[ \t\n\f]+\\|[&*$@%]\\)[a-zA-Z0-9_]*'") - ((match-beginning 15) ; old $abc'efg syntax - (setq bb (match-end 0) - b (match-beginning 0) - state (parse-partial-sexp - state-point b nil nil state) - state-point b) - (if (nth 3 state) ; in string - nil - (put-text-property (1- bb) bb 'syntax-table cperl-st-word)) + ((match-beginning 19) ; old $abc'efg syntax + (setq bb (match-end 0)) + ;;;(if (nth 3 state) nil ; in string + (put-text-property (1- bb) bb 'syntax-table cperl-st-word) (goto-char bb)) - ;; 1+6+2+1+1+2+1+1=15 extra () before this: + ;; 1+6+2+1+1+6+1+1=19 extra () before this: ;; "__\\(END\\|DATA\\)__" - ((match-beginning 16) ; __END__, __DATA__ - (setq bb (match-end 0) - b (match-beginning 0) - state (parse-partial-sexp - state-point b nil nil state) - state-point b) - (if (or (nth 3 state) (nth 4 state)) - nil - ;; (put-text-property b (1+ bb) 'syntax-type 'pod) ; Cheat - (cperl-commentify b bb nil) - (setq end t)) - (goto-char bb)) - ((match-beginning 17) ; "\\\\\\(['`\"($]\\)" - ;; Trailing backslash ==> non-quoting outside string/comment - (setq bb (match-end 0) - b (match-beginning 0)) + ((match-beginning 20) ; __END__, __DATA__ + (setq bb (match-end 0)) + ;; (put-text-property b (1+ bb) 'syntax-type 'pod) ; Cheat + (cperl-commentify b bb nil) + (setq end t)) + ;; "\\\\\\(['`\"($]\\)" + ((match-beginning 21) + ;; Trailing backslash; make non-quoting outside string/comment + (setq bb (match-end 0)) (goto-char b) (skip-chars-backward "\\\\") ;;;(setq i2 (= (% (skip-chars-backward "\\\\") 2) -1)) - (setq state (parse-partial-sexp - state-point b nil nil state) - state-point b) - (if (or (nth 3 state) (nth 4 state) ) - nil - (cperl-modify-syntax-type b cperl-st-punct)) + (cperl-modify-syntax-type b cperl-st-punct) (goto-char bb)) (t (error "Error in regexp of the sniffer"))) (if (> (point) stop-point) @@ -3839,7 +4839,10 @@ (or (car err-l) (setcar err-l b))) (goto-char stop-point)))) (setq cperl-syntax-state (cons state-point state) - cperl-syntax-done-to (or tmpend (max (point) max)))) + ;; Do not mark syntax as done past tmpend??? + cperl-syntax-done-to (or tmpend (max (point) max))) + ;;(message "state-at=%s, done-to=%s" state-point cperl-syntax-done-to) + ) (if (car err-l) (goto-char (car err-l)) (or non-inter (message "Scanning for \"hard\" Perl constructions... done")))) @@ -3851,48 +4854,91 @@ ;; cperl-mode-syntax-table. ;; (set-syntax-table cperl-mode-syntax-table) ) - (car err-l))) + (list (car err-l) overshoot))) + +(defun cperl-find-pods-heres-region (min max) + (interactive "r") + (cperl-find-pods-heres min max)) (defun cperl-backward-to-noncomment (lim) ;; Stops at lim or after non-whitespace that is not in comment + ;; XXXX Wrongly understands end-of-multiline strings with # as comment (let (stop p pr) - (while (and (not stop) (> (point) (or lim 1))) + (while (and (not stop) (> (point) (or lim (point-min)))) (skip-chars-backward " \t\n\f" lim) (setq p (point)) (beginning-of-line) (if (memq (setq pr (get-text-property (point) 'syntax-type)) '(pod here-doc here-doc-delim)) (cperl-unwind-to-safe nil) - (or (looking-at "^[ \t]*\\(#\\|$\\)") - (progn (cperl-to-comment-or-eol) (bolp)) - (progn - (skip-chars-backward " \t") - (if (< p (point)) (goto-char p)) - (setq stop t))))))) - + (or (and (looking-at "^[ \t]*\\(#\\|$\\)") + (not (memq pr '(string prestring)))) + (progn (cperl-to-comment-or-eol) (bolp)) + (progn + (skip-chars-backward " \t") + (if (< p (point)) (goto-char p)) + (setq stop t))))))) + +;; Used only in `cperl-calculate-indent'... +(defun cperl-block-p () ; Do not C-M-q ! One string contains ";" ! + ;; Positions is before ?\{. Checks whether it starts a block. + ;; No save-excursion! This is more a distinguisher of a block/hash ref... + (cperl-backward-to-noncomment (point-min)) + (or (memq (preceding-char) (append ";){}$@&%\C-@" nil)) ; Or label! \C-@ at bobp + ; Label may be mixed up with `$blah :' + (save-excursion (cperl-after-label)) + (get-text-property (cperl-1- (point)) 'attrib-group) + (and (memq (char-syntax (preceding-char)) '(?w ?_)) + (progn + (backward-sexp) + ;; sub {BLK}, print {BLK} $data, but NOT `bless', `return', `tr' + (or (and (looking-at "[a-zA-Z0-9_:]+[ \t\n\f]*[{#]") ; Method call syntax + (not (looking-at "\\(bless\\|return\\|q[wqrx]?\\|tr\\|[smy]\\)\\>"))) + ;; sub bless::foo {} + (progn + (cperl-backward-to-noncomment (point-min)) + (and (eq (preceding-char) ?b) + (progn + (forward-sexp -1) + (looking-at "sub[ \t\n\f#]"))))))))) + +;;; What is the difference of (cperl-after-block-p lim t) and (cperl-block-p)? +;;; No save-excursion; condition-case ... In (cperl-block-p) the block +;;; may be a part of an in-statement construct, such as +;;; ${something()}, print {FH} $data. +;;; Moreover, one takes positive approach (looks for else,grep etc) +;;; another negative (looks for bless,tr etc) (defun cperl-after-block-p (lim &optional pre-block) - "Return true if the preceeding } ends a block or a following { starts one. -Would not look before LIM. If PRE-BLOCK is nil checks preceeding }. -otherwise following {." - ;; We suppose that the preceding char is }. + "Return true if the preceeding } (if PRE-BLOCK, following {) delimits a block. +Would not look before LIM. Assumes that LIM is a good place to begin a +statement. The kind of block we treat here is one after which a new +statement would start; thus the block in ${func()} does not count." (save-excursion (condition-case nil (progn (or pre-block (forward-sexp -1)) (cperl-backward-to-noncomment lim) (or (eq (point) lim) - (eq (preceding-char) ?\) ) ; if () {} sub f () {} - (if (eq (char-syntax (preceding-char)) ?w) ; else {} + ;; if () {} // sub f () {} // sub f :a(') {} + (eq (preceding-char) ?\) ) + ;; label: {} + (save-excursion (cperl-after-label)) + ;; sub :attr {} + (get-text-property (cperl-1- (point)) 'attrib-group) + (if (memq (char-syntax (preceding-char)) '(?w ?_)) ; else {} (save-excursion (forward-sexp -1) - (or (looking-at "\\(else\\|continue\\|grep\\|map\\|BEGIN\\|END\\|CHECK\\|INIT\\)\\>") + ;; else {} but not else::func {} + (or (and (looking-at "\\(else\\|continue\\|grep\\|map\\|BEGIN\\|END\\|CHECK\\|INIT\\)\\>") + (not (looking-at "\\(\\sw\\|_\\)+::"))) ;; sub f {} (progn (cperl-backward-to-noncomment lim) - (and (eq (char-syntax (preceding-char)) ?w) + (and (eq (preceding-char) ?b) (progn (forward-sexp -1) - (looking-at "sub\\>")))))) + (looking-at "sub[ \t\n\f#]")))))) + ;; What preceeds is not word... XXXX Last statement in sub??? (cperl-after-expr-p lim)))) (error nil)))) @@ -3914,12 +4960,12 @@ (if (get-text-property (point) 'here-doc-group) (progn (goto-char - (previous-single-property-change (point) 'here-doc-group)) + (cperl-beginning-of-property (point) 'here-doc-group)) (beginning-of-line 0))) (if (get-text-property (point) 'in-pod) (progn (goto-char - (previous-single-property-change (point) 'in-pod)) + (cperl-beginning-of-property (point) 'in-pod)) (beginning-of-line 0))) (if (looking-at "^[ \t]*\\(#\\|$\\)") nil ; Only comment, skip ;; Else: last iteration, or a label @@ -3931,7 +4977,7 @@ (progn (forward-char -1) (skip-chars-backward " \t\n\f" lim) - (eq (char-syntax (preceding-char)) ?w))) + (memq (char-syntax (preceding-char)) '(?w ?_)))) (forward-sexp -1) ; Possibly label. Skip it (goto-char p) (setq stop t)))) @@ -3947,6 +4993,44 @@ (eq (get-text-property (point) 'syntax-type) 'format))))))))) +(defun cperl-backward-to-start-of-expr (&optional lim) + (condition-case nil + (progn + (while (and (or (not lim) + (> (point) lim)) + (not (cperl-after-expr-p lim))) + (forward-sexp -1) + ;; May be after $, @, $# etc of a variable + (skip-chars-backward "$@%#"))) + (error nil))) + +(defun cperl-at-end-of-expr (&optional lim) + ;; Since the SEXP approach below is very fragile, do some overengineering + (or (looking-at (concat cperl-maybe-white-and-comment-rex "[;}]")) + (condition-case nil + (save-excursion + ;; If nothing interesting after, does as (forward-sexp -1); + ;; otherwise fails, or ends at a start of following sexp. + ;; XXXX PROBLEMS: if what follows (after ";") @FOO, or ${bar} + ;; may be stuck after @ or $; just put some stupid workaround now: + (let ((p (point))) + (forward-sexp 1) + (forward-sexp -1) + (while (memq (preceding-char) (append "%&@$*" nil)) + (forward-char -1)) + (or (< (point) p) + (cperl-after-expr-p lim)))) + (error t)))) + +(defun cperl-forward-to-end-of-expr (&optional lim) + (let ((p (point)))) + (condition-case nil + (progn + (while (and (< (point) (or lim (point-max))) + (not (cperl-at-end-of-expr))) + (forward-sexp 1))) + (error nil))) + (defun cperl-backward-to-start-of-continued-exp (lim) (if (memq (preceding-char) (append ")]}\"'`" nil)) (forward-sexp -1)) @@ -3987,18 +5071,51 @@ (beginning-of-line) (while (null done) (setq top (point)) - (while (= (nth 0 (parse-partial-sexp (point) tmp-end - -1)) -1) + ;; Plan A: if line has an unfinished paren-group, go to end-of-group + (while (= -1 (nth 0 (parse-partial-sexp (point) tmp-end -1))) (setq top (point))) ; Get the outermost parenths in line (goto-char top) (while (< (point) tmp-end) (parse-partial-sexp (point) tmp-end nil t) ; To start-sexp or eol (or (eolp) (forward-sexp 1))) - (if (> (point) tmp-end) - (save-excursion - (end-of-line) - (setq tmp-end (point))) - (setq done t))) + (if (> (point) tmp-end) ; Yes, there an unfinished block + nil + (if (eq ?\) (preceding-char)) + (progn ;; Plan B: find by REGEXP block followup this line + (setq top (point)) + (condition-case nil + (progn + (forward-sexp -2) + (if (eq (following-char) ?$ ) ; for my $var (list) + (progn + (forward-sexp -1) + (if (looking-at "\\(my\\|local\\|our\\)\\>") + (forward-sexp -1)))) + (if (looking-at + (concat "\\(\\elsif\\|if\\|unless\\|while\\|until" + "\\|for\\(each\\)?\\>\\(\\(" + cperl-maybe-white-and-comment-rex + "\\(my\\|local\\|our\\)\\)?" + cperl-maybe-white-and-comment-rex + "\\$[_a-zA-Z0-9]+\\)?\\)\\>")) + (progn + (goto-char top) + (forward-sexp 1) + (setq top (point))))) + (error (setq done t))) + (goto-char top)) + (if (looking-at ; Try Plan C: continuation block + (concat cperl-maybe-white-and-comment-rex + "\\<\\(else\\|elsif\|continue\\)\\>")) + (progn + (goto-char (match-end 0)) + (save-excursion + (end-of-line) + (setq tmp-end (point)))) + (setq done t)))) + (save-excursion + (end-of-line) + (setq tmp-end (point)))) (goto-char tmp-end) (setq tmp-end (point-marker))) (if cperl-indent-region-fix-constructs @@ -4027,16 +5144,26 @@ ;; Looking at: ;; } ;; else - (if (and cperl-merge-trailing-else - (looking-at - "[ \t]*}[ \t]*\n[ \t\n]*\\(els\\(e\\|if\\)\\|continue\\)\\>")) - (progn - (search-forward "}") - (setq p (point)) - (skip-chars-forward " \t\n") - (delete-region p (point)) + (if cperl-merge-trailing-else + (if (looking-at + "[ \t]*}[ \t]*\n[ \t\n]*\\(els\\(e\\|if\\)\\|continue\\)\\>") + (progn + (search-forward "}") + (setq p (point)) + (skip-chars-forward " \t\n") + (delete-region p (point)) (insert (make-string cperl-indent-region-fix-constructs ?\s)) - (beginning-of-line))) + (beginning-of-line))) + (if (looking-at "[ \t]*}[ \t]*\\(els\\(e\\|if\\)\\|continue\\)\\>") + (save-excursion + (search-forward "}") + (delete-horizontal-space) + (insert "\n") + (setq ret (point)) + (if (cperl-indent-line parse-data) + (progn + (cperl-fix-line-spacing end parse-data) + (setq ret (point))))))) ;; Looking at: ;; } else (if (looking-at "[ \t]*}\\(\t*\\|[ \t][ \t]+\\)\\<\\(els\\(e\\|if\\)\\|continue\\)\\>") @@ -4073,19 +5200,19 @@ (insert (make-string cperl-indent-region-fix-constructs ?\s)) (beginning-of-line))) - ;; Looking at: - ;; } foreach my $var () { + ;; Looking at (with or without "}" at start, ending after "({"): + ;; } foreach my $var () OR { (if (looking-at "[ \t]*\\(}[ \t]*\\)?\\<\\(\\els\\(e\\|if\\)\\|continue\\|if\\|unless\\|while\\|for\\(each\\)?\\(\\([ \t]+\\(my\\|local\\|our\\)\\)?[ \t]*\\$[_a-zA-Z0-9]+\\)?\\|until\\)\\>\\([ \t]*(\\|[ \t\n]*{\\)\\|[ \t]*{") (progn - (setq ml (match-beginning 8)) + (setq ml (match-beginning 8)) ; "(" or "{" after control word (re-search-forward "[({]") (forward-char -1) (setq p (point)) (if (eq (following-char) ?\( ) (progn (forward-sexp 1) - (setq pp (point))) + (setq pp (point))) ; past parenth-group ;; after `else' or nothing (if ml ; after `else' (skip-chars-backward " \t\n") @@ -4095,13 +5222,13 @@ ;; Multiline expr should be special (setq ml (and pp (save-excursion (goto-char p) (search-forward "\n" pp t)))) - (if (and (or (not pp) (< pp end)) + (if (and (or (not pp) (< pp end)) ; Do not go too far... (looking-at "[ \t\n]*{")) (progn (cond ((bolp) ; Were before `{', no if/else/etc nil) - ((looking-at "\\(\t*\\| [ \t]+\\){") + ((looking-at "\\(\t*\\| [ \t]+\\){") ; Not exactly 1 SPACE (delete-horizontal-space) (if (if ml cperl-extra-newline-before-brace-multiline @@ -4124,7 +5251,17 @@ (skip-chars-forward " \t\n") (delete-region pp (point)) (insert - (make-string cperl-indent-region-fix-constructs ?\s)))) + (make-string cperl-indent-region-fix-constructs ?\ ))) + ((and (looking-at "[\t ]*{") + (if ml cperl-extra-newline-before-brace-multiline + cperl-extra-newline-before-brace)) + (delete-horizontal-space) + (insert "\n") + (setq ret (point)) + (if (cperl-indent-line parse-data) + (progn + (cperl-fix-line-spacing end parse-data) + (setq ret (point)))))) ;; Now we are before `{' (if (looking-at "[ \t\n]*{[ \t]*[^ \t\n#]") (progn @@ -4276,7 +5413,7 @@ ;; (interactive "P") ; Only works when called from fill-paragraph. -stef (let (;; Non-nil if the current line contains a comment. has-comment - + fill-paragraph-function ; do not recurse ;; If has-comment, the appropriate fill-prefix for the comment. comment-fill-prefix ;; Line that contains code and comment (or nil) @@ -4308,7 +5445,7 @@ dc (- c (current-column)) len (- start (point)) start (point-marker)) (delete-char len) - (insert (make-string dc ?-))))) + (insert (make-string dc ?-))))) ; Placeholder (to avoid splitting???) (if (not has-comment) (fill-paragraph justify) ; Do the usual thing outside of comment ;; Narrow to include only the comment, and then fill the region. @@ -4330,11 +5467,16 @@ (point))) ;; Remove existing hashes (save-excursion - (goto-char (point-min)) - (while (progn (forward-line 1) (< (point) (point-max))) - (skip-chars-forward " \t") - (and (looking-at "#+") - (delete-char (- (match-end 0) (match-beginning 0)))))) + (goto-char (point-min)) + (while (progn (forward-line 1) (< (point) (point-max))) + (skip-chars-forward " \t") + (if (looking-at "#+") + (progn + (if (and (eq (point) (match-beginning 0)) + (not (eq (point) (match-end 0)))) nil + (error + "Bug in Emacs: `looking-at' in `narrow-to-region': match-data is garbage")) + (delete-char (- (match-end 0) (match-beginning 0))))))) ;; Lines with only hashes on them can be paragraph boundaries. (let ((paragraph-start (concat paragraph-start "\\|^[ \t#]*$")) @@ -4350,7 +5492,8 @@ (setq comment-column c) (indent-for-comment) ;; Repeat once more, flagging as iteration - (cperl-fill-paragraph justify t))))))) + (cperl-fill-paragraph justify t)))))) + t) (defun cperl-do-auto-fill () ;; Break out if the line is short enough @@ -4401,8 +5544,8 @@ (let ((index-alist '()) (index-pack-alist '()) (index-pod-alist '()) (index-unsorted-alist '()) (i-s-f (default-value 'imenu-sort-function)) (index-meth-alist '()) meth - packages ends-ranges p marker - (prev-pos 0) char fchar index index1 name (end-range 0) package) + packages ends-ranges p marker is-proto + (prev-pos 0) is-pack index index1 name (end-range 0) package) (goto-char (point-min)) (cperl-update-syntaxification (point-max) (point-max)) ;; Search for the function @@ -4410,72 +5553,81 @@ (while (re-search-forward (or regexp cperl-imenu--function-name-regexp-perl) nil t) + ;; 2=package-group, 5=package-name 8=sub-name (cond ((and ; Skip some noise if building tags - (match-beginning 2) ; package or sub - (eq (char-after (match-beginning 2)) ?p) ; package + (match-beginning 5) ; package name + ;;(eq (char-after (match-beginning 2)) ?p) ; package (not (save-match-data (looking-at "[ \t\n]*;")))) ; Plain text word 'package' nil) ((and - (match-beginning 2) ; package or sub + (or (match-beginning 2) + (match-beginning 8)) ; package or sub ;; Skip if quoted (will not skip multi-line ''-strings :-(): (null (get-text-property (match-beginning 1) 'syntax-table)) (null (get-text-property (match-beginning 1) 'syntax-type)) (null (get-text-property (match-beginning 1) 'in-pod))) - (save-excursion - (goto-char (match-beginning 2)) - (setq fchar (following-char))) + (setq is-pack (match-beginning 2)) ;; (if (looking-at "([^()]*)[ \t\n\f]*") ;; (goto-char (match-end 0))) ; Messes what follows - (setq char (following-char) ; ?\; for "sub foo () ;" - meth nil + (setq meth nil p (point)) (while (and ends-ranges (>= p (car ends-ranges))) ;; delete obsolete entries (setq ends-ranges (cdr ends-ranges) packages (cdr packages))) (setq package (or (car packages) "") end-range (or (car ends-ranges) 0)) - (if (eq fchar ?p) - (setq name (buffer-substring (match-beginning 3) (match-end 3)) - name (progn - (set-text-properties 0 (length name) nil name) - name) - package (concat name "::") - name (concat "package " name) - end-range - (save-excursion - (parse-partial-sexp (point) (point-max) -1) (point)) - ends-ranges (cons end-range ends-ranges) - packages (cons package packages))) - ;; ) + (if is-pack ; doing "package" + (progn + (if (match-beginning 5) ; named package + (setq name (buffer-substring (match-beginning 5) + (match-end 5)) + name (progn + (set-text-properties 0 (length name) nil name) + name) + package (concat name "::") + name (concat "package " name)) + ;; Support nameless packages + (setq name "package;" package "")) + (setq end-range + (save-excursion + (parse-partial-sexp (point) (point-max) -1) (point)) + ends-ranges (cons end-range ends-ranges) + packages (cons package packages))) + (setq is-proto + (or (eq (following-char) ?\;) + (eq 0 (get-text-property (point) 'attrib-group))))) ;; Skip this function name if it is a prototype declaration. - (if (and (eq fchar ?s) (eq char ?\;)) nil - (setq name (buffer-substring (match-beginning 3) (match-end 3)) - marker (make-marker)) - (set-text-properties 0 (length name) nil name) - (set-marker marker (match-end 3)) - (if (eq fchar ?p) - (setq name (concat "package " name)) - (cond ((string-match "[:']" name) - (setq meth t)) - ((> p end-range) nil) - (t - (setq name (concat package name) meth t)))) + (if (and is-proto (not is-pack)) nil + (or is-pack + (setq name + (buffer-substring (match-beginning 8) (match-end 8))) + (set-text-properties 0 (length name) nil name)) + (setq marker (make-marker)) + (set-marker marker (match-end (if is-pack 2 8))) + (cond (is-pack nil) + ((string-match "[:']" name) + (setq meth t)) + ((> p end-range) nil) + (t + (setq name (concat package name) meth t))) (setq index (cons name marker)) - (if (eq fchar ?p) + (if is-pack (push index index-pack-alist) (push index index-alist)) (if meth (push index index-meth-alist)) (push index index-unsorted-alist))) - ((match-beginning 5) ; POD section - ;; (beginning-of-line) - (setq index (imenu-example--name-and-position) - name (buffer-substring (match-beginning 6) (match-end 6))) + ((match-beginning 16) ; POD section + (setq name (buffer-substring (match-beginning 17) (match-end 17)) + marker (make-marker)) + (set-marker marker (match-beginning 17)) (set-text-properties 0 (length name) nil name) - (if (eq (char-after (match-beginning 5)) ?2) - (setq name (concat " " name))) - (setcar index name) + (setq name (concat (make-string + (* 3 (- (char-after (match-beginning 16)) ?1)) + ?\ ) + name) + index (cons name marker)) (setq index1 (cons (concat "=" name) (cdr index))) (push index index-pod-alist) (push index1 index-unsorted-alist))))) @@ -4539,29 +5691,20 @@ (defun cperl-outline-level () (looking-at outline-regexp) (cond ((not (match-beginning 1)) 0) ; beginning-of-file - ((match-beginning 2) - (if (eq (char-after (match-beginning 2)) ?p) - 0 ; package - 1)) ; sub - ((match-beginning 5) - (if (eq (char-after (match-beginning 5)) ?1) - 1 ; head1 - 2)) ; head2 - (t 3))) ; should not happen +;;;; 2=package-group, 5=package-name 8=sub-name 16=head-level + ((match-beginning 2) 0) ; package + ((match-beginning 8) 1) ; sub + ((match-beginning 16) + (- (char-after (match-beginning 16)) ?0)) ; headN ==> N + (t 5))) ; should not happen (defvar cperl-compilation-error-regexp-alist - ;; This look like a paranoiac regexp: could anybody find a better one? (which WORK). + ;; This look like a paranoiac regexp: could anybody find a better one? (which WORKS). '(("^[^\n]* \\(file\\|at\\) \\([^ \t\n]+\\) [^\n]*line \\([0-9]+\\)[\\., \n]" 2 3)) "Alist that specifies how to match errors in perl output.") -(if (fboundp 'eval-after-load) - (eval-after-load - "mode-compile" - '(setq perl-compilation-error-regexp-alist - cperl-compilation-error-regexp-alist))) - (defun cperl-windowed-init () "Initialization under windowed version." @@ -4602,9 +5745,12 @@ ;; Allow `cperl-find-pods-heres' to run. (or (boundp 'font-lock-constant-face) (cperl-force-face font-lock-constant-face - "Face for constant and label names") - ;;(setq font-lock-constant-face 'font-lock-constant-face) - )) + "Face for constant and label names")) + (or (boundp 'font-lock-warning-face) + (cperl-force-face font-lock-warning-face + "Face for things which should stand out")) + ;;(setq font-lock-constant-face 'font-lock-constant-face) + ) (defun cperl-init-faces () (condition-case errs @@ -4627,7 +5773,7 @@ 'identity '("if" "until" "while" "elsif" "else" "unless" "for" "foreach" "continue" "exit" "die" "last" "goto" "next" - "redo" "return" "local" "exec" "sub" "do" "dump" "use" + "redo" "return" "local" "exec" "sub" "do" "dump" "use" "our" "require" "package" "eval" "my" "BEGIN" "END" "CHECK" "INIT") "\\|") ; Flow control "\\)\\>") 2) ; was "\\)[ \n\t;():,\|&]" @@ -4711,7 +5857,7 @@ ;; "chop" "defined" "delete" "do" "each" "else" "elsif" ;; "eval" "exists" "for" "foreach" "format" "goto" ;; "grep" "if" "keys" "last" "local" "map" "my" "next" - ;; "no" "package" "pop" "pos" "print" "printf" "push" + ;; "no" "our" "package" "pop" "pos" "print" "printf" "push" ;; "q" "qq" "qw" "qx" "redo" "return" "scalar" "shift" ;; "sort" "splice" "split" "study" "sub" "tie" "tr" ;; "undef" "unless" "unshift" "untie" "until" "use" @@ -4726,15 +5872,38 @@ "u\\(se\\|n\\(shift\\|ti\\(l\\|e\\)\\|def\\|less\\)\\)\\|" "while\\|y\\|__\\(END\\|DATA\\)__" ;__DATA__ added manually "\\|[sm]" ; Added manually - "\\)\\>") 2 'cperl-nonoverridable) + "\\)\\>") 2 'cperl-nonoverridable-face) ;; (mapconcat 'identity ;; '("#endif" "#else" "#ifdef" "#ifndef" "#if" ;; "#include" "#define" "#undef") ;; "\\|") '("-[rwxoRWXOezsfdlpSbctugkTBMAC]\\>\\([ \t]+_\\>\\)?" 0 font-lock-function-name-face keep) ; Not very good, triggers at "[a-z]" - '("\\<sub[ \t]+\\([^ \t{;()]+\\)[ \t]*\\(([^()]*)[ \t]*\\)?[#{\n]" 1 - font-lock-function-name-face) + ;; This highlights declarations and definitions differenty. + ;; We do not try to highlight in the case of attributes: + ;; it is already done by `cperl-find-pods-heres' + (list (concat "\\<sub" + cperl-white-and-comment-rex ; whitespace/comments + "\\([^ \n\t{;()]+\\)" ; 2=name (assume non-anonymous) + "\\(" + cperl-maybe-white-and-comment-rex ;whitespace/comments? + "([^()]*)\\)?" ; prototype + cperl-maybe-white-and-comment-rex ; whitespace/comments? + "[{;]") + 2 (if cperl-font-lock-multiline + '(if (eq (char-after (cperl-1- (match-end 0))) ?\{ ) + 'font-lock-function-name-face + 'font-lock-variable-name-face) + ;; need to manually set 'multiline' for older font-locks + '(progn + (if (< 1 (count-lines (match-beginning 0) + (match-end 0))) + (put-text-property + (+ 3 (match-beginning 0)) (match-end 0) + 'syntax-type 'multiline)) + (if (eq (char-after (cperl-1- (match-end 0))) ?\{ ) + 'font-lock-function-name-face + 'font-lock-variable-name-face)))) '("\\<\\(package\\|require\\|use\\|import\\|no\\|bootstrap\\)[ \t]+\\([a-zA-z_][a-zA-z_0-9:]*\\)[ \t;]" ; require A if B; 2 font-lock-function-name-face) '("^[ \t]*format[ \t]+\\([a-zA-z_][a-zA-z_0-9:]*\\)[ \t]*=[ \t]*$" @@ -4770,12 +5939,56 @@ (2 '(restart 2 nil) nil t))) nil t))) ; local variables, multiple (font-lock-anchored - '("^[ \t{}]*\\(my\\|local\\|our\\)[ \t]*\\(([ \t]*\\)?\\([$@%*][a-zA-Z0-9_:]+\\)" - (3 font-lock-variable-name-face) - ("\\=[ \t]*,[ \t]*\\([$@%*][a-zA-Z0-9_:]+\\)" - nil nil - (1 font-lock-variable-name-face)))) - (t '("^[ \t{}]*\\(my\\|local\\our\\)[ \t]*\\(([ \t]*\\)?\\([$@%*][a-zA-Z0-9_:]+\\)" + ;; 1=my_etc, 2=white? 3=(+white? 4=white? 5=var + (` ((, (concat "\\<\\(my\\|local\\|our\\)" + cperl-maybe-white-and-comment-rex + "\\((" + cperl-maybe-white-and-comment-rex + "\\)?\\([$@%*]\\([a-zA-Z0-9_:]+\\|[^a-zA-Z0-9_]\\)\\)")) + (5 (, (if cperl-font-lock-multiline + 'font-lock-variable-name-face + '(progn (setq cperl-font-lock-multiline-start + (match-beginning 0)) + 'font-lock-variable-name-face)))) + ((, (concat "\\=" + cperl-maybe-white-and-comment-rex + "," + cperl-maybe-white-and-comment-rex + "\\([$@%*]\\([a-zA-Z0-9_:]+\\|[^a-zA-Z0-9_]\\)\\)")) + ;; Bug in font-lock: limit is used not only to limit + ;; searches, but to set the "extend window for + ;; facification" property. Thus we need to minimize. + (, (if cperl-font-lock-multiline + '(if (match-beginning 3) + (save-excursion + (goto-char (match-beginning 3)) + (condition-case nil + (forward-sexp 1) + (error + (condition-case nil + (forward-char 200) + (error nil)))) ; typeahead + (1- (point))) ; report limit + (forward-char -2)) ; disable continued expr + '(if (match-beginning 3) + (point-max) ; No limit for continuation + (forward-char -2)))) ; disable continued expr + (, (if cperl-font-lock-multiline + nil + '(progn ; Do at end + ;; "my" may be already fontified (POD), + ;; so cperl-font-lock-multiline-start is nil + (if (or (not cperl-font-lock-multiline-start) + (> 2 (count-lines + cperl-font-lock-multiline-start + (point)))) + nil + (put-text-property + (1+ cperl-font-lock-multiline-start) (point) + 'syntax-type 'multiline)) + (setq cperl-font-lock-multiline-start nil)))) + (3 font-lock-variable-name-face))))) + (t '("^[ \t{}]*\\(my\\|local\\|our\\)[ \t]*\\(([ \t]*\\)?\\([$@%*][a-zA-Z0-9_:]+\\)" 3 font-lock-variable-name-face))) '("\\<for\\(each\\)?\\([ \t]+\\(my\\|local\\|our\\)\\)?[ \t]*\\(\\$[a-zA-Z_][a-zA-Z_0-9]*\\)[ \t]*(" 4 font-lock-variable-name-face) @@ -4785,21 +5998,32 @@ (setq t-font-lock-keywords-1 (and (fboundp 'turn-on-font-lock) ; Check for newer font-lock - (not cperl-xemacs-p) ; not yet as of XEmacs 19.12 + ;; not yet as of XEmacs 19.12, works with 21.1.11 + (or + (not cperl-xemacs-p) + (string< "21.1.9" emacs-version) + (and (string< "21.1.10" emacs-version) + (string< emacs-version "21.1.2"))) '( ("\\(\\([@%]\\|\$#\\)[a-zA-Z_:][a-zA-Z0-9_:]*\\)" 1 (if (eq (char-after (match-beginning 2)) ?%) - 'cperl-hash - 'cperl-array) + 'cperl-hash-face + 'cperl-array-face) t) ; arrays and hashes ("\\(\\([$@]+\\)[a-zA-Z_:][a-zA-Z0-9_:]*\\)[ \t]*\\([[{]\\)" 1 (if (= (- (match-end 2) (match-beginning 2)) 1) (if (eq (char-after (match-beginning 3)) ?{) - 'cperl-hash - 'cperl-array) ; arrays and hashes + 'cperl-hash-face + 'cperl-array-face) ; arrays and hashes font-lock-variable-name-face) ; Just to put something t) + ("\\(@\\|\\$#\\)\\(\\$+\\([a-zA-Z_:][a-zA-Z0-9_:]*\\|[^ \t\n]\\)\\)" + (1 cperl-array-face) + (2 font-lock-variable-name-face)) + ("\\(%\\)\\(\\$+\\([a-zA-Z_:][a-zA-Z0-9_:]*\\|[^ \t\n]\\)\\)" + (1 cperl-hash-face) + (2 font-lock-variable-name-face)) ;;("\\([smy]\\|tr\\)\\([^a-z_A-Z0-9]\\)\\(\\([^\n\\]*||\\)\\)\\2") ;;; Too much noise from \s* @s[ and friends ;;("\\(\\<\\([msy]\\|tr\\)[ \t]*\\([^ \t\na-zA-Z0-9_]\\)\\|\\(/\\)\\)" @@ -4811,7 +6035,7 @@ (if cperl-highlight-variables-indiscriminately (setq t-font-lock-keywords-1 (append t-font-lock-keywords-1 - (list '("[$*]{?\\(\\sw+\\)" 1 + (list '("\\([$*]{?\\sw+\\)" 1 font-lock-variable-name-face))))) (setq cperl-font-lock-keywords-1 (if cperl-syntaxify-by-font-lock @@ -4864,27 +6088,35 @@ [nil nil t t t] nil [nil nil t t t]) + (list 'font-lock-warning-face + ["Pink" "Red" "Gray50" "LightGray"] + ["gray20" "gray90" + "gray80" "gray20"] + [nil nil t t t] + nil + [nil nil t t t] + ) (list 'font-lock-constant-face ["CadetBlue" "Aquamarine" "Gray50" "LightGray"] nil [nil nil t t t] nil [nil nil t t t]) - (list 'cperl-nonoverridable + (list 'cperl-nonoverridable-face ["chartreuse3" ("orchid1" "orange") nil "Gray80"] [nil nil "gray90"] [nil nil nil t t] [nil nil t t] [nil nil t t t]) - (list 'cperl-array + (list 'cperl-array-face ["blue" "yellow" nil "Gray80"] ["lightyellow2" ("navy" "os2blue" "darkgreen") "gray90"] t nil nil) - (list 'cperl-hash + (list 'cperl-hash-face ["red" "red" nil "Gray80"] ["lightyellow2" ("navy" "os2blue" "darkgreen") "gray90"] @@ -4907,15 +6139,17 @@ "Face for variable names") (cperl-force-face font-lock-type-face "Face for data types") - (cperl-force-face cperl-nonoverridable + (cperl-force-face cperl-nonoverridable-face "Face for data types from another group") + (cperl-force-face font-lock-warning-face + "Face for things which should stand out") (cperl-force-face font-lock-comment-face "Face for comments") (cperl-force-face font-lock-function-name-face "Face for function names") - (cperl-force-face cperl-hash + (cperl-force-face cperl-hash-face "Face for hashes") - (cperl-force-face cperl-array + (cperl-force-face cperl-array-face "Face for arrays") ;;(defvar font-lock-constant-face 'font-lock-constant-face) ;;(defvar font-lock-variable-name-face 'font-lock-variable-name-face) @@ -4925,7 +6159,7 @@ ;; "Face to use for data types.")) ;;(or (boundp 'cperl-nonoverridable-face) ;; (defconst cperl-nonoverridable-face - ;; 'cperl-nonoverridable + ;; 'cperl-nonoverridable-face ;; "Face to use for data types from another group.")) ;;(if (not cperl-xemacs-p) nil ;; (or (boundp 'font-lock-comment-face) @@ -4941,24 +6175,24 @@ ;; 'font-lock-function-name-face ;; "Face to use for function names."))) (if (and - (not (cperl-is-face 'cperl-array)) + (not (cperl-is-face 'cperl-array-face)) (cperl-is-face 'font-lock-emphasized-face)) - (copy-face 'font-lock-emphasized-face 'cperl-array)) + (copy-face 'font-lock-emphasized-face 'cperl-array-face)) (if (and - (not (cperl-is-face 'cperl-hash)) + (not (cperl-is-face 'cperl-hash-face)) (cperl-is-face 'font-lock-other-emphasized-face)) - (copy-face 'font-lock-other-emphasized-face 'cperl-hash)) + (copy-face 'font-lock-other-emphasized-face 'cperl-hash-face)) (if (and - (not (cperl-is-face 'cperl-nonoverridable)) + (not (cperl-is-face 'cperl-nonoverridable-face)) (cperl-is-face 'font-lock-other-type-face)) - (copy-face 'font-lock-other-type-face 'cperl-nonoverridable)) + (copy-face 'font-lock-other-type-face 'cperl-nonoverridable-face)) ;;(or (boundp 'cperl-hash-face) ;; (defconst cperl-hash-face - ;; 'cperl-hash + ;; 'cperl-hash-face ;; "Face to use for hashes.")) ;;(or (boundp 'cperl-array-face) ;; (defconst cperl-array-face - ;; 'cperl-array + ;; 'cperl-array-face ;; "Face to use for arrays.")) ;; Here we try to guess background (let ((background @@ -4997,17 +6231,17 @@ "pink"))) (t (set-face-background 'font-lock-type-face "gray90")))) - (if (cperl-is-face 'cperl-nonoverridable) + (if (cperl-is-face 'cperl-nonoverridable-face) nil - (copy-face 'font-lock-type-face 'cperl-nonoverridable) + (copy-face 'font-lock-type-face 'cperl-nonoverridable-face) (cond ((eq background 'light) - (set-face-foreground 'cperl-nonoverridable + (set-face-foreground 'cperl-nonoverridable-face (if (x-color-defined-p "chartreuse3") "chartreuse3" "chartreuse"))) ((eq background 'dark) - (set-face-foreground 'cperl-nonoverridable + (set-face-foreground 'cperl-nonoverridable-face (if (x-color-defined-p "orchid1") "orchid1" "orange"))))) @@ -5059,15 +6293,15 @@ '(setq ps-bold-faces ;; font-lock-variable-name-face ;; font-lock-constant-face - (append '(cperl-array cperl-hash) + (append '(cperl-array-face cperl-hash-face) ps-bold-faces) ps-italic-faces ;; font-lock-constant-face - (append '(cperl-nonoverridable cperl-hash) + (append '(cperl-nonoverridable-face cperl-hash-face) ps-italic-faces) ps-underlined-faces ;; font-lock-type-face - (append '(cperl-array cperl-hash underline cperl-nonoverridable) + (append '(cperl-array-face cperl-hash-face underline cperl-nonoverridable-face) ps-underlined-faces)))) (defvar ps-print-face-extension-alist) @@ -5100,27 +6334,27 @@ ;;; (defvar ps-italic-faces nil) ;;; (setq ps-bold-faces ;;; (append '(font-lock-emphasized-face -;;; cperl-array +;;; cperl-array-face ;;; font-lock-keyword-face ;;; font-lock-variable-name-face ;;; font-lock-constant-face ;;; font-lock-reference-face ;;; font-lock-other-emphasized-face -;;; cperl-hash) +;;; cperl-hash-face) ;;; ps-bold-faces)) ;;; (setq ps-italic-faces -;;; (append '(cperl-nonoverridable +;;; (append '(cperl-nonoverridable-face ;;; font-lock-constant-face ;;; font-lock-reference-face ;;; font-lock-other-emphasized-face -;;; cperl-hash) +;;; cperl-hash-face) ;;; ps-italic-faces)) ;;; (setq ps-underlined-faces ;;; (append '(font-lock-emphasized-face -;;; cperl-array +;;; cperl-array-face ;;; font-lock-other-emphasized-face -;;; cperl-hash -;;; cperl-nonoverridable font-lock-type-face) +;;; cperl-hash-face +;;; cperl-nonoverridable-face font-lock-type-face) ;;; ps-underlined-faces)) ;;; (cons 'font-lock-type-face ps-underlined-faces)) @@ -5130,79 +6364,211 @@ (defconst cperl-styles-entries '(cperl-indent-level cperl-brace-offset cperl-continued-brace-offset cperl-label-offset cperl-extra-newline-before-brace + cperl-extra-newline-before-brace-multiline cperl-merge-trailing-else cperl-continued-statement-offset)) +(defconst cperl-style-examples +"##### Numbers etc are: cperl-indent-level cperl-brace-offset +##### cperl-continued-brace-offset cperl-label-offset +##### cperl-continued-statement-offset +##### cperl-merge-trailing-else cperl-extra-newline-before-brace + +########### (Do not forget cperl-extra-newline-before-brace-multiline) + +### CPerl (=GNU - extra-newline-before-brace + merge-trailing-else) 2/0/0/-2/2/t/nil +if (foo) { + bar + baz; + label: + { + boon; + } +} else { + stop; +} + +### PerlStyle (=CPerl with 4 as indent) 4/0/0/-4/4/t/nil +if (foo) { + bar + baz; + label: + { + boon; + } +} else { + stop; +} + +### GNU 2/0/0/-2/2/nil/t +if (foo) + { + bar + baz; + label: + { + boon; + } + } +else + { + stop; + } + +### C++ (=PerlStyle with braces aligned with control words) 4/0/-4/-4/4/nil/t +if (foo) +{ + bar + baz; + label: + { + boon; + } +} +else +{ + stop; +} + +### BSD (=C++, but will not change preexisting merge-trailing-else +### and extra-newline-before-brace ) 4/0/-4/-4/4 +if (foo) +{ + bar + baz; + label: + { + boon; + } +} +else +{ + stop; +} + +### K&R (=C++ with indent 5 - merge-trailing-else, but will not +### change preexisting extra-newline-before-brace) 5/0/-5/-5/5/nil +if (foo) +{ + bar + baz; + label: + { + boon; + } +} +else +{ + stop; +} + +### Whitesmith (=PerlStyle, but will not change preexisting +### extra-newline-before-brace and merge-trailing-else) 4/0/0/-4/4 +if (foo) + { + bar + baz; + label: + { + boon; + } + } +else + { + stop; + } +" +"Examples of if/else with different indent styles (with v4.23).") + (defconst cperl-style-alist - '(("CPerl" ; =GNU without extra-newline-before-brace + '(("CPerl" ;; =GNU - extra-newline-before-brace + cperl-merge-trailing-else (cperl-indent-level . 2) (cperl-brace-offset . 0) (cperl-continued-brace-offset . 0) (cperl-label-offset . -2) + (cperl-continued-statement-offset . 2) (cperl-extra-newline-before-brace . nil) - (cperl-merge-trailing-else . t) - (cperl-continued-statement-offset . 2)) + (cperl-extra-newline-before-brace-multiline . nil) + (cperl-merge-trailing-else . t)) + ("PerlStyle" ; CPerl with 4 as indent (cperl-indent-level . 4) (cperl-brace-offset . 0) (cperl-continued-brace-offset . 0) (cperl-label-offset . -4) + (cperl-continued-statement-offset . 4) (cperl-extra-newline-before-brace . nil) - (cperl-merge-trailing-else . t) - (cperl-continued-statement-offset . 4)) + (cperl-extra-newline-before-brace-multiline . nil) + (cperl-merge-trailing-else . t)) + ("GNU" (cperl-indent-level . 2) (cperl-brace-offset . 0) (cperl-continued-brace-offset . 0) (cperl-label-offset . -2) + (cperl-continued-statement-offset . 2) (cperl-extra-newline-before-brace . t) - (cperl-merge-trailing-else . nil) - (cperl-continued-statement-offset . 2)) + (cperl-extra-newline-before-brace-multiline . t) + (cperl-merge-trailing-else . nil)) + ("K&R" (cperl-indent-level . 5) (cperl-brace-offset . 0) (cperl-continued-brace-offset . -5) (cperl-label-offset . -5) + (cperl-continued-statement-offset . 5) ;;(cperl-extra-newline-before-brace . nil) ; ??? - (cperl-merge-trailing-else . nil) - (cperl-continued-statement-offset . 5)) + ;;(cperl-extra-newline-before-brace-multiline . nil) + (cperl-merge-trailing-else . nil)) + ("BSD" (cperl-indent-level . 4) (cperl-brace-offset . 0) (cperl-continued-brace-offset . -4) (cperl-label-offset . -4) + (cperl-continued-statement-offset . 4) ;;(cperl-extra-newline-before-brace . nil) ; ??? - (cperl-continued-statement-offset . 4)) + ;;(cperl-extra-newline-before-brace-multiline . nil) + ;;(cperl-merge-trailing-else . nil) ; ??? + ) + ("C++" (cperl-indent-level . 4) (cperl-brace-offset . 0) (cperl-continued-brace-offset . -4) (cperl-label-offset . -4) (cperl-continued-statement-offset . 4) - (cperl-merge-trailing-else . nil) - (cperl-extra-newline-before-brace . t)) - ("Current") + (cperl-extra-newline-before-brace . t) + (cperl-extra-newline-before-brace-multiline . t) + (cperl-merge-trailing-else . nil)) + ("Whitesmith" (cperl-indent-level . 4) (cperl-brace-offset . 0) (cperl-continued-brace-offset . 0) (cperl-label-offset . -4) + (cperl-continued-statement-offset . 4) ;;(cperl-extra-newline-before-brace . nil) ; ??? - (cperl-continued-statement-offset . 4))) - "(Experimental) list of variables to set to get a particular indentation style. -Should be used via `cperl-set-style' or via Perl menu.") + ;;(cperl-extra-newline-before-brace-multiline . nil) + ;;(cperl-merge-trailing-else . nil) ; ??? + ) + ("Current")) + "List of variables to set to get a particular indentation style. +Should be used via `cperl-set-style' or via Perl menu. + +See examples in `cperl-style-examples'.") (defun cperl-set-style (style) "Set CPerl mode variables to use one of several different indentation styles. The arguments are a string representing the desired style. The list of styles is in `cperl-style-alist', available styles -are GNU, K&R, BSD, C++ and Whitesmith. +are CPerl, PerlStyle, GNU, K&R, BSD, C++ and Whitesmith. The current value of style is memorized (unless there is a memorized data already), may be restored by `cperl-set-style-back'. Chosing \"Current\" style will not change style, so this may be used for -side-effect of memorizing only." +side-effect of memorizing only. Examples in `cperl-style-examples'." (interactive (let ((list (mapcar (function (lambda (elt) (list (car elt)))) cperl-style-alist))) @@ -5373,6 +6739,8 @@ (match-beginning 1) (match-end 1))) (defun cperl-imenu-on-info () + "Shows imenu for Perl Info Buffer. +Opens Perl Info buffer if needed." (interactive) (let* ((buffer (current-buffer)) imenu-create-index-function @@ -5412,7 +6780,7 @@ \(or `cperl-indent-level', if `cperl-lineup-step' is nil). Will not move the position at the start to the left." (interactive "r") - (let (search col tcol seen b e) + (let (search col tcol seen b) (save-excursion (goto-char end) (end-of-line) @@ -5450,22 +6818,25 @@ (if (/= (% col step) 0) (setq step (* step (1+ (/ col step))))) (while (progn - (setq e (point)) - (skip-chars-backward " \t") - (delete-region (point) e) - (indent-to-column col) ;(make-string (- col (current-column)) ?\s)) + (cperl-make-indent col) (beginning-of-line 2) (and (< (point) end) (re-search-forward search end t) (goto-char (match-beginning 0)))))))) ; No body -(defun cperl-etags (&optional add all files) +(defun cperl-etags (&optional add all files) ;; NOT USED??? "Run etags with appropriate options for Perl files. If optional argument ALL is `recursive', will process Perl files in subdirectories too." (interactive) (let ((cmd "etags") - (args '("-l" "none" "-r" "/\\<\\(package\\|sub\\)[ \\t]+\\(\\([a-zA-Z0-9:_]*::\\)?\\([a-zA-Z0-9_]+\\)[ \\t]*\\(([^()]*)[ \t]*\\)?\\([{#]\\|$\\)\\)/\\4/")) + (args '("-l" "none" "-r" + ;; 1=fullname 2=package? 3=name 4=proto? 5=attrs? (VERY APPROX!) + "/\\<sub[ \\t]+\\(\\([a-zA-Z0-9:_]*::\\)?\\([a-zA-Z0-9_]+\\)\\)[ \\t]*\\(([^()]*)[ \t]*\\)?\\([ \t]*:[^#{;]*\\)?\\([{#]\\|$\\)/\\3/" + "-r" + "/\\<package[ \\t]+\\(\\([a-zA-Z0-9:_]*::\\)?\\([a-zA-Z0-9_]+\\)\\)[ \\t]*\\([#;]\\|$\\)/\\1/" + "-r" + "/\\<\\(package\\)[ \\t]*;/\\1;/")) res) (if add (setq args (cons "-a" args))) (or files (setq files (list buffer-file-name))) @@ -5537,6 +6908,29 @@ (message "indent-region/indent-sexp will %sbe automatically fix whitespace." (if cperl-indent-region-fix-constructs "" "not "))) +(defun cperl-toggle-set-debug-unwind (arg &optional backtrace) + "Toggle (or, with numeric argument, set) debugging state of syntaxification. +Nonpositive numeric argument disables debugging messages. The message +summarizes which regions it was decided to rescan for syntactic constructs. + +The message looks like this: + + Syxify req=123..138 actual=101..146 done-to: 112=>146 statepos: 73=>117 + +Numbers are character positions in the buffer. REQ provides the range to +rescan requested by `font-lock'. ACTUAL is the range actually resyntaxified; +for correct operation it should start and end outside any special syntactic +construct. DONE-TO and STATEPOS indicate changes to internal caches maintained +by CPerl." + (interactive "P") + (or arg + (setq arg (if (eq cperl-syntaxify-by-font-lock + (if backtrace 'backtrace 'message)) 0 1))) + (setq arg (if (> arg 0) (if backtrace 'backtrace 'message) t)) + (setq cperl-syntaxify-by-font-lock arg) + (message "Debugging messages of syntax unwind %sabled." + (if (eq arg t) "dis" "en"))) + ;;;; Tags file creation. (defvar cperl-tmp-buffer " *cperl-tmp*") @@ -5677,13 +7071,22 @@ ret)))) (defun cperl-add-tags-recurse-noxs () - "Add to TAGS data for Perl and XSUB files in the current directory and kids. + "Add to TAGS data for \"pure\" Perl files in the current directory and kids. Use as emacs -batch -q -no-site-file -l emacs/cperl-mode.el \ - -f cperl-add-tags-recurse + -f cperl-add-tags-recurse-noxs " (cperl-write-tags nil nil t t nil t)) +(defun cperl-add-tags-recurse-noxs-fullpath () + "Add to TAGS data for \"pure\" Perl in the current directory and kids. +Writes down fullpath, so TAGS is relocatable (but if the build directory +is relocated, the file TAGS inside it breaks). Use as + emacs -batch -q -no-site-file -l emacs/cperl-mode.el \ + -f cperl-add-tags-recurse-noxs-fullpath +" + (cperl-write-tags nil nil t t nil t "")) + (defun cperl-add-tags-recurse () "Add to TAGS file data for Perl files in the current directory and kids. Use as @@ -5853,9 +7256,9 @@ (cperl-tags-hier-fill)) (or tags-table-list (call-interactively 'visit-tags-table)) - (mapcar - (function - (lambda (tagsfile) + (mapcar + (function + (lambda (tagsfile) (message "Updating list of classes... %s" tagsfile) (set-buffer (get-file-buffer tagsfile)) (cperl-tags-hier-fill))) @@ -6017,7 +7420,7 @@ '("[^-\t <>=+]\\(--\\|\\+\\+\\)" ; var-- var++ "[a-zA-Z0-9_][|&][a-zA-Z0-9_$]" ; abc|def abc&def are often used. "&[(a-zA-Z0-9_$]" ; &subroutine &(var->field) - "<\\$?\\sw+\\(\\.\\sw+\\)?>" ; <IN> <stdin.h> + "<\\$?\\sw+\\(\\.\\(\\sw\\|_\\)+\\)?>" ; <IN> <stdin.h> "-[a-zA-Z][ \t]+[_$\"'`a-zA-Z]" ; -f file, -t STDIN "-[0-9]" ; -5 "\\+\\+" ; ++var @@ -6049,8 +7452,7 @@ (interactive) (let (found-bad (p (point))) (setq last-nonmenu-event 13) ; To disable popup - (with-no-warnings ; It is useful to push the mark here. - (beginning-of-buffer)) + (goto-char (point-min)) (map-y-or-n-p "Insert space here? " (lambda (arg) (insert " ")) 'cperl-next-bad-style @@ -6446,7 +7848,7 @@ eof[([FILEHANDLE])] ... eq ... String equality. eval(EXPR) or eval { BLOCK } -exec(LIST) +exec([TRUENAME] ARGV0, ARGVs) or exec(SHELL_COMMAND_LINE) exit(EXPR) exp(EXPR) fcntl(FILEHANDLE,FUNCTION,SCALAR) @@ -6582,7 +7984,7 @@ symlink(OLDFILE,NEWFILE) syscall(LIST) sysread(FILEHANDLE,SCALAR,LENGTH[,OFFSET]) -system(LIST) +system([TRUENAME] ARGV0 [,ARGV]) or system(SHELL_COMMAND_LINE) syswrite(FILEHANDLE,SCALAR,LENGTH[,OFFSET]) tell[(FILEHANDLE)] telldir(DIRHANDLE) @@ -6683,7 +8085,7 @@ ;; b is before the starting delimiter, e before the ending ;; e should be a marker, may be changed, but remains "correct". ;; EMBED is nil iff we process the whole REx. - ;; The REx is guarantied to have //x + ;; The REx is guaranteed to have //x ;; LEVEL shows how many levels deep to go ;; position at enter and at leave is not defined (let (s c tmp (m (make-marker)) (m1 (make-marker)) c1 spaces inline code pos) @@ -6712,7 +8114,7 @@ (goto-char e) (delete-horizontal-space) (insert "\n") - (indent-to-column c) + (cperl-make-indent c) (set-marker e (point)))) (goto-char b) (end-of-line 2) @@ -6722,7 +8124,7 @@ inline t) (skip-chars-forward " \t") (delete-region s (point)) - (indent-to-column c1) + (cperl-make-indent c1) (while (and inline (looking-at @@ -6748,6 +8150,16 @@ (eq (preceding-char) ?\{))) (forward-char -1) (forward-sexp 1)) + ((and ; [], already syntaxified + (match-beginning 6) + cperl-regexp-scan + cperl-use-syntax-table-text-property) + (forward-char -1) + (forward-sexp 1) + (or (eq (preceding-char) ?\]) + (error "[]-group not terminated")) + (re-search-forward + "\\=\\([*+?]\\|{[0-9]+\\(,[0-9]*\\)?}\\)\\??" e t)) ((match-beginning 6) ; [] (setq tmp (point)) (if (looking-at "\\^?\\]") @@ -6761,12 +8173,8 @@ (setq pos t))) (or (eq (preceding-char) ?\]) (error "[]-group not terminated")) - (if (eq (following-char) ?\{) - (progn - (forward-sexp 1) - (and (eq (following-char) ??) - (forward-char 1))) - (re-search-forward "\\=\\([*+?]\\??\\)" e t))) + (re-search-forward + "\\=\\([*+?]\\|{[0-9]+\\(,[0-9]*\\)?}\\)\\??" e t)) ((match-beginning 7) ; () (goto-char (match-beginning 0)) (setq pos (current-column)) @@ -6774,7 +8182,7 @@ (progn (delete-horizontal-space) (insert "\n") - (indent-to-column c1))) + (cperl-make-indent c1))) (setq tmp (point)) (forward-sexp 1) ;; (or (forward-sexp 1) @@ -6834,7 +8242,7 @@ (insert "\n")) ;; first at line (delete-region (point) tmp)) - (indent-to-column c) + (cperl-make-indent c) (forward-char 1) (skip-chars-forward " \t") (setq spaces nil) @@ -6857,10 +8265,7 @@ (/= (current-indentation) c)) (progn (beginning-of-line) - (setq s (point)) - (skip-chars-forward " \t") - (delete-region s (point)) - (indent-to-column c))))) + (cperl-make-indent c))))) (defun cperl-make-regexp-x () ;; Returns position of the start @@ -6929,7 +8334,7 @@ (interactive) ;; (save-excursion ; Can't, breaks `cperl-contract-levels' (cperl-regext-to-level-start) - (let ((b (point)) (e (make-marker)) s c) + (let ((b (point)) (e (make-marker)) c) (forward-sexp 1) (set-marker e (1- (point))) (goto-char b) @@ -6938,10 +8343,7 @@ ((match-beginning 1) ; #-comment (or c (setq c (current-indentation))) (beginning-of-line 2) ; Skip - (setq s (point)) - (skip-chars-forward " \t") - (delete-region s (point)) - (indent-to-column c)) + (cperl-make-indent c)) (t (delete-char -1) (just-one-space)))))) @@ -6980,96 +8382,197 @@ (set-marker e (1- (point))) (cperl-beautify-regexp-piece b e nil deep)))) +(defun cperl-invert-if-unless-modifiers () + "Change `B if A;' into `if (A) {B}' etc if possible. +\(Unfinished.)" + (interactive) ; + (let (A B pre-B post-B pre-if post-if pre-A post-A if-string + (w-rex "\\<\\(if\\|unless\\|while\\|until\\|for\\|foreach\\)\\>")) + (and (= (char-syntax (preceding-char)) ?w) + (forward-sexp -1)) + (setq pre-if (point)) + (cperl-backward-to-start-of-expr) + (setq pre-B (point)) + (forward-sexp 1) ; otherwise forward-to-end-of-expr is NOP + (cperl-forward-to-end-of-expr) + (setq post-A (point)) + (goto-char pre-if) + (or (looking-at w-rex) + ;; Find the position + (progn (goto-char post-A) + (while (and + (not (looking-at w-rex)) + (> (point) pre-B)) + (forward-sexp -1)) + (setq pre-if (point)))) + (or (looking-at w-rex) + (error "Can't find `if', `unless', `while', `until', `for' or `foreach'")) + ;; 1 B 2 ... 3 B-com ... 4 if 5 ... if-com 6 ... 7 A 8 + (setq if-string (buffer-substring (match-beginning 0) (match-end 0))) + ;; First, simple part: find code boundaries + (forward-sexp 1) + (setq post-if (point)) + (forward-sexp -2) + (forward-sexp 1) + (setq post-B (point)) + (cperl-backward-to-start-of-expr) + (setq pre-B (point)) + (setq B (buffer-substring pre-B post-B)) + (goto-char pre-if) + (forward-sexp 2) + (forward-sexp -1) + ;; May be after $, @, $# etc of a variable + (skip-chars-backward "$@%#") + (setq pre-A (point)) + (cperl-forward-to-end-of-expr) + (setq post-A (point)) + (setq A (buffer-substring pre-A post-A)) + ;; Now modify (from end, to not break the stuff) + (skip-chars-forward " \t;") + (delete-region pre-A (point)) ; we move to pre-A + (insert "\n" B ";\n}") + (and (looking-at "[ \t]*#") (cperl-indent-for-comment)) + (delete-region pre-if post-if) + (delete-region pre-B post-B) + (goto-char pre-B) + (insert if-string " (" A ") {") + (setq post-B (point)) + (if (looking-at "[ \t]+$") + (delete-horizontal-space) + (if (looking-at "[ \t]*#") + (cperl-indent-for-comment) + (just-one-space))) + (forward-line 1) + (if (looking-at "[ \t]*$") + (progn ; delete line + (delete-horizontal-space) + (delete-region (point) (1+ (point))))) + (cperl-indent-line) + (goto-char (1- post-B)) + (forward-sexp 1) + (cperl-indent-line) + (goto-char pre-B))) + (defun cperl-invert-if-unless () - "Change `if (A) {B}' into `B if A;' etc if possible." + "Change `if (A) {B}' into `B if A;' etc (or visa versa) if possible. +If the cursor is not on the leading keyword of the BLOCK flavor of +construct, will assume it is the STATEMENT flavor, so will try to find +the appropriate statement modifier." (interactive) - (or (looking-at "\\<") - (forward-sexp -1)) + (and (= (char-syntax (preceding-char)) ?w) + (forward-sexp -1)) (if (looking-at "\\<\\(if\\|unless\\|while\\|until\\|for\\|foreach\\)\\>") - (let ((pos1 (point)) - pos2 pos3 pos4 pos5 s1 s2 state p pos45 - (s0 (buffer-substring (match-beginning 0) (match-end 0)))) + (let ((pre-if (point)) + pre-A post-A pre-B post-B A B state p end-B-code is-block B-comment + (if-string (buffer-substring (match-beginning 0) (match-end 0)))) (forward-sexp 2) - (setq pos3 (point)) + (setq post-A (point)) (forward-sexp -1) - (setq pos2 (point)) - (if (eq (following-char) ?\( ) + (setq pre-A (point)) + (setq is-block (and (eq (following-char) ?\( ) + (save-excursion + (condition-case nil + (progn + (forward-sexp 2) + (forward-sexp -1) + (eq (following-char) ?\{ )) + (error nil))))) + (if is-block (progn - (goto-char pos3) + (goto-char post-A) (forward-sexp 1) - (setq pos5 (point)) + (setq post-B (point)) (forward-sexp -1) - (setq pos4 (point)) - ;; XXXX In fact may be `A if (B); {C}' ... + (setq pre-B (point)) (if (and (eq (following-char) ?\{ ) (progn - (cperl-backward-to-noncomment pos3) + (cperl-backward-to-noncomment post-A) (eq (preceding-char) ?\) ))) (if (condition-case nil (progn - (goto-char pos5) + (goto-char post-B) (forward-sexp 1) (forward-sexp -1) (looking-at "\\<els\\(e\\|if\\)\\>")) (error nil)) (error - "`%s' (EXPR) {BLOCK} with `else'/`elsif'" s0) - (goto-char (1- pos5)) - (cperl-backward-to-noncomment pos4) + "`%s' (EXPR) {BLOCK} with `else'/`elsif'" if-string) + (goto-char (1- post-B)) + (cperl-backward-to-noncomment pre-B) (if (eq (preceding-char) ?\;) (forward-char -1)) - (setq pos45 (point)) - (goto-char pos4) - (while (re-search-forward "\\<\\(for\\|foreach\\|if\\|unless\\|while\\|until\\)\\>\\|;" pos45 t) + (setq end-B-code (point)) + (goto-char pre-B) + (while (re-search-forward "\\<\\(for\\|foreach\\|if\\|unless\\|while\\|until\\)\\>\\|;" end-B-code t) (setq p (match-beginning 0) - s1 (buffer-substring p (match-end 0)) - state (parse-partial-sexp pos4 p)) + A (buffer-substring p (match-end 0)) + state (parse-partial-sexp pre-B p)) (or (nth 3 state) (nth 4 state) (nth 5 state) - (error "`%s' inside `%s' BLOCK" s1 s0)) + (error "`%s' inside `%s' BLOCK" A if-string)) (goto-char (match-end 0))) ;; Finally got it - (goto-char (1+ pos4)) + (goto-char (1+ pre-B)) (skip-chars-forward " \t\n") - (setq s2 (buffer-substring (point) pos45)) - (goto-char pos45) + (setq B (buffer-substring (point) end-B-code)) + (goto-char end-B-code) (or (looking-at ";?[ \t\n]*}") (progn (skip-chars-forward "; \t\n") - (setq s2 (concat s2 "\n" (buffer-substring (point) (1- pos5)))))) - (and (equal s2 "") - (setq s2 "1")) - (goto-char (1- pos3)) - (cperl-backward-to-noncomment pos2) + (setq B-comment + (buffer-substring (point) (1- post-B))))) + (and (equal B "") + (setq B "1")) + (goto-char (1- post-A)) + (cperl-backward-to-noncomment pre-A) (or (looking-at "[ \t\n]*)") - (goto-char (1- pos3))) + (goto-char (1- post-A))) (setq p (point)) - (goto-char (1+ pos2)) + (goto-char (1+ pre-A)) (skip-chars-forward " \t\n") - (setq s1 (buffer-substring (point) p)) - (delete-region pos4 pos5) - (delete-region pos2 pos3) - (goto-char pos1) - (insert s2 " ") + (setq A (buffer-substring (point) p)) + (delete-region pre-B post-B) + (delete-region pre-A post-A) + (goto-char pre-if) + (insert B " ") + (and B-comment (insert B-comment " ")) (just-one-space) (forward-word 1) - (setq pos1 (point)) - (insert " " s1 ";") + (setq pre-A (point)) + (insert " " A ";") (delete-horizontal-space) + (setq post-B (point)) + (if (looking-at "#") + (indent-for-comment)) + (goto-char post-B) (forward-char -1) (delete-horizontal-space) - (goto-char pos1) + (goto-char pre-A) (just-one-space) - (cperl-indent-line)) - (error "`%s' (EXPR) not with an {BLOCK}" s0))) - (error "`%s' not with an (EXPR)" s0))) - (error "Not at `if', `unless', `while', `until', `for' or `foreach'"))) + (goto-char pre-if) + (setq pre-A (set-marker (make-marker) pre-A)) + (while (<= (point) (marker-position pre-A)) + (cperl-indent-line) + (forward-line 1)) + (goto-char (marker-position pre-A)) + (if B-comment + (progn + (forward-line -1) + (indent-for-comment) + (goto-char (marker-position pre-A))))) + (error "`%s' (EXPR) not with an {BLOCK}" if-string))) + ;; (error "`%s' not with an (EXPR)" if-string) + (forward-sexp -1) + (cperl-invert-if-unless-modifiers))) + ;;(error "Not at `if', `unless', `while', `until', `for' or `foreach'") + (cperl-invert-if-unless-modifiers))) ;;; By Anthony Foiani <afoiani@uswest.com> ;;; Getting help on modules in C-h f ? ;;; This is a modified version of `man'. ;;; Need to teach it how to lookup functions +;;;###autoload (defun cperl-perldoc (word) "Run `perldoc' on WORD." (interactive @@ -7101,6 +8604,7 @@ (t (Man-getpage-in-background word))))) +;;;###autoload (defun cperl-perldoc-at-point () "Run a `perldoc' on the word around point." (interactive) @@ -7145,7 +8649,7 @@ (defun cperl-pod2man-build-command () "Builds the entire background manpage and cleaning command." (let ((command (concat pod2man-program " %s 2>/dev/null")) - (flist Man-filter-list)) + (flist (and (boundp 'Man-filter-list) Man-filter-list))) (while (and flist (car flist)) (let ((pcom (car (car flist))) (pargs (cdr (car flist)))) @@ -7159,6 +8663,205 @@ (setq flist (cdr flist)))) command)) + +(defun cperl-next-interpolated-REx-1 () + "Move point to next REx which has interpolated parts without //o. +Skips RExes consisting of one interpolated variable. + +Note that skipped RExen are not performance hits." + (interactive "") + (cperl-next-interpolated-REx 1)) + +(defun cperl-next-interpolated-REx-0 () + "Move point to next REx which has interpolated parts without //o." + (interactive "") + (cperl-next-interpolated-REx 0)) + +(defun cperl-next-interpolated-REx (&optional skip beg limit) + "Move point to next REx which has interpolated parts. +SKIP is a list of possible types to skip, BEG and LIMIT are the starting +point and the limit of search (default to point and end of buffer). + +SKIP may be a number, then it behaves as list of numbers up to SKIP; this +semantic may be used as a numeric argument. + +Types are 0 for / $rex /o (interpolated once), 1 for /$rex/ (if $rex is +a result of qr//, this is not a performance hit), t for the rest." + (interactive "P") + (if (numberp skip) (setq skip (list 0 skip))) + (or beg (setq beg (point))) + (or limit (setq limit (point-max))) ; needed for n-s-p-c + (let (pp) + (and (eq (get-text-property beg 'syntax-type) 'string) + (setq beg (next-single-property-change beg 'syntax-type nil limit))) + (cperl-map-pods-heres + (function (lambda (s e p) + (if (memq (get-text-property s 'REx-interpolated) skip) + t + (setq pp s) + nil))) ; nil stops + 'REx-interpolated beg limit) + (if pp (goto-char pp) + (message "No more interpolated REx")))) + +;;; Initial version contributed by Trey Belew +(defun cperl-here-doc-spell (&optional beg end) + "Spell-check HERE-documents in the Perl buffer. +If a region is highlighted, restricts to the region." + (interactive "") + (cperl-pod-spell t beg end)) + +(defun cperl-pod-spell (&optional do-heres beg end) + "Spell-check POD documentation. +If invoked with prefix argument, will do HERE-DOCs instead. +If a region is highlighted, restricts to the region." + (interactive "P") + (save-excursion + (let (beg end) + (if (cperl-mark-active) + (setq beg (min (mark) (point)) + end (max (mark) (point))) + (setq beg (point-min) + end (point-max))) + (cperl-map-pods-heres (function + (lambda (s e p) + (if do-heres + (setq e (save-excursion + (goto-char e) + (forward-line -1) + (point)))) + (ispell-region s e) + t)) + (if do-heres 'here-doc-group 'in-pod) + beg end)))) + +(defun cperl-map-pods-heres (func &optional prop s end) + "Executes a function over regions of pods or here-documents. +PROP is the text-property to search for; default to `in-pod'. Stop when +function returns nil." + (let (pos posend has-prop (cont t)) + (or prop (setq prop 'in-pod)) + (or s (setq s (point-min))) + (or end (setq end (point-max))) + (cperl-update-syntaxification end end) + (save-excursion + (goto-char (setq pos s)) + (while (and cont (< pos end)) + (setq has-prop (get-text-property pos prop)) + (setq posend (next-single-property-change pos prop nil end)) + (and has-prop + (setq cont (funcall func pos posend prop))) + (setq pos posend))))) + +;;; Based on code by Masatake YAMATO: +(defun cperl-get-here-doc-region (&optional pos pod) + "Return HERE document region around the point. +Return nil if the point is not in a HERE document region. If POD is non-nil, +will return a POD section if point is in a POD section." + (or pos (setq pos (point))) + (cperl-update-syntaxification pos pos) + (if (or (eq 'here-doc (get-text-property pos 'syntax-type)) + (and pod + (eq 'pod (get-text-property pos 'syntax-type)))) + (let ((b (cperl-beginning-of-property pos 'syntax-type)) + (e (next-single-property-change pos 'syntax-type))) + (cons b (or e (point-max)))))) + +(defun cperl-narrow-to-here-doc (&optional pos) + "Narrows editing region to the HERE-DOC at POS. +POS defaults to the point." + (interactive "d") + (or pos (setq pos (point))) + (let ((p (cperl-get-here-doc-region pos))) + (or p (error "Not inside a HERE document")) + (narrow-to-region (car p) (cdr p)) + (message + "When you are finished with narrow editing, type C-x n w"))) + +(defun cperl-select-this-pod-or-here-doc (&optional pos) + "Select the HERE-DOC (or POD section) at POS. +POS defaults to the point." + (interactive "d") + (let ((p (cperl-get-here-doc-region pos t))) + (if p + (progn + (goto-char (car p)) + (push-mark (cdr p) nil t)) ; Message, activate in transient-mode + (message "I do not think POS is in POD or a HERE-doc...")))) + +(defun cperl-facemenu-add-face-function (face end) + "A callback to process user-initiated font-change requests. +Translates `bold', `italic', and `bold-italic' requests to insertion of +corresponding POD directives, and `underline' to C<> POD directive. + +Such requests are usually bound to M-o LETTER." + (or (get-text-property (point) 'in-pod) + (error "Faces can only be set within POD")) + (setq facemenu-end-add-face (if (eq face 'bold-italic) ">>" ">")) + (cdr (or (assq face '((bold . "B<") + (italic . "I<") + (bold-italic . "B<I<") + (underline . "C<"))) + (error "Face %s not configured for cperl-mode" + face)))) + +(defun cperl-time-fontification (&optional l step lim) + "Times how long it takes to do incremental fontification in a region. +L is the line to start at, STEP is the number of lines to skip when +doing next incremental fontification, LIM is the maximal number of +incremental fontification to perform. Messages are accumulated in +*Messages* buffer. + +May be used for pinpointing which construct slows down buffer fontification: +start with default arguments, then refine the slowdown regions." + (interactive "nLine to start at: \nnStep to do incremental fontification: ") + (or l (setq l 1)) + (or step (setq step 500)) + (or lim (setq lim 40)) + (let* ((timems (function (lambda () + (let ((tt (current-time))) + (+ (* 1000 (nth 1 tt)) (/ (nth 2 tt) 1000)))))) + (tt (funcall timems)) (c 0) delta tot) + (goto-line l) + (cperl-mode) + (setq tot (- (- tt (setq tt (funcall timems))))) + (message "cperl-mode at %s: %s" l tot) + (while (and (< c lim) (not (eobp))) + (forward-line step) + (setq l (+ l step)) + (setq c (1+ c)) + (cperl-update-syntaxification (point) (point)) + (setq delta (- (- tt (setq tt (funcall timems)))) tot (+ tot delta)) + (message "to %s:%6s,%7s" l delta tot)) + tot)) + +(defun cperl-emulate-lazy-lock (&optional window-size) + "Emulate `lazy-lock' without `condition-case', so `debug-on-error' works. +Start fontifying the buffer from the start (or end) using the given +WINDOW-SIZE (units is lines). Negative WINDOW-SIZE starts at end, and +goes backwards; default is -50. This function is not CPerl-specific; it +may be used to debug problems with delayed incremental fontification." + (interactive + "nSize of window for incremental fontification, negative goes backwards: ") + (or window-size (setq window-size -50)) + (let ((pos (if (> window-size 0) + (point-min) + (point-max))) + p) + (goto-char pos) + (normal-mode) + ;; Why needed??? With older font-locks??? + (set (make-local-variable 'font-lock-cache-position) (make-marker)) + (while (if (> window-size 0) + (< pos (point-max)) + (> pos (point-min))) + (setq p (progn + (forward-line window-size) + (point))) + (font-lock-fontify-region (min p pos) (max p pos)) + (setq pos p)))) + + (defun cperl-lazy-install ()) ; Avoid a warning (defun cperl-lazy-unstall ()) ; Avoid a warning @@ -7174,7 +8877,7 @@ "Switches on Auto-Help on Perl constructs (put in the message area). Delay of auto-help controlled by `cperl-lazy-help-time'." (interactive) - (make-variable-buffer-local 'cperl-help-shown) + (make-local-variable 'cperl-help-shown) (if (and (cperl-val 'cperl-lazy-help-time) (not cperl-lazy-installed)) (progn @@ -7207,48 +8910,109 @@ ;;; Plug for wrong font-lock: (defun cperl-font-lock-unfontify-region-function (beg end) - ;; Simplified now that font-lock-unfontify-region uses save-buffer-state. - (let (before-change-functions after-change-functions) - (remove-text-properties beg end '(face nil)))) + (let* ((modified (buffer-modified-p)) (buffer-undo-list t) + (inhibit-read-only t) (inhibit-point-motion-hooks t) + before-change-functions after-change-functions + deactivate-mark buffer-file-name buffer-file-truename) + (remove-text-properties beg end '(face nil)) + (if (and (not modified) (buffer-modified-p)) + (set-buffer-modified-p nil)))) + +(defun cperl-font-lock-fontify-region-function (beg end loudly) + "Extends the region to safe positions, then calls the default function. +Newer `font-lock's can do it themselves. +We unwind only as far as needed for fontification. Syntaxification may +do extra unwind via `cperl-unwind-to-safe'." + (save-excursion + (goto-char beg) + (while (and beg + (progn + (beginning-of-line) + (eq (get-text-property (setq beg (point)) 'syntax-type) + 'multiline))) + (if (setq beg (cperl-beginning-of-property beg 'syntax-type)) + (goto-char beg))) + (setq beg (point)) + (goto-char end) + (while (and end + (progn + (or (bolp) (condition-case nil + (forward-line 1) + (error nil))) + (eq (get-text-property (setq end (point)) 'syntax-type) + 'multiline))) + (setq end (next-single-property-change end 'syntax-type nil (point-max))) + (goto-char end)) + (setq end (point))) + (font-lock-default-fontify-region beg end loudly)) (defvar cperl-d-l nil) (defun cperl-fontify-syntaxically (end) ;; Some vars for debugging only ;; (message "Syntaxifying...") - (let ((dbg (point)) (iend end) + (let ((dbg (point)) (iend end) (idone cperl-syntax-done-to) (istate (car cperl-syntax-state)) - start) - (and cperl-syntaxify-unwind - (setq end (cperl-unwind-to-safe t end))) - (setq start (point)) + start from-start edebug-backtrace-buffer) + (if (eq cperl-syntaxify-by-font-lock 'backtrace) + (progn + (require 'edebug) + (let ((f 'edebug-backtrace)) + (funcall f)))) ; Avoid compile-time warning (or cperl-syntax-done-to - (setq cperl-syntax-done-to (point-min))) - (if (or (not (boundp 'font-lock-hot-pass)) - (eval 'font-lock-hot-pass) - t) ; Not debugged otherwise - ;; Need to forget what is after `start' - (setq start (min cperl-syntax-done-to start)) - ;; Fontification without a change - (setq start (max cperl-syntax-done-to start))) + (setq cperl-syntax-done-to (point-min) + from-start t)) + (setq start (if (and cperl-hook-after-change + (not from-start)) + cperl-syntax-done-to ; Fontify without change; ignore start + ;; Need to forget what is after `start' + (min cperl-syntax-done-to (point)))) + (goto-char start) + (beginning-of-line) + (setq start (point)) + (and cperl-syntaxify-unwind + (setq end (cperl-unwind-to-safe t end) + start (point))) (and (> end start) (setq cperl-syntax-done-to start) ; In case what follows fails (cperl-find-pods-heres start end t nil t)) - (if (eq cperl-syntaxify-by-font-lock 'message) - (message "Syntaxified %s..%s from %s to %s(%s), state %s-->%s" - dbg iend - start end cperl-syntax-done-to + (if (memq cperl-syntaxify-by-font-lock '(backtrace message)) + (message "Syxify req=%s..%s actual=%s..%s done-to: %s=>%s statepos: %s=>%s" + dbg iend start end idone cperl-syntax-done-to istate (car cperl-syntax-state))) ; For debugging nil)) ; Do not iterate (defun cperl-fontify-update (end) - (let ((pos (point)) prop posend) + (let ((pos (point-min)) prop posend) + (setq end (point-max)) (while (< pos end) - (setq prop (get-text-property pos 'cperl-postpone)) - (setq posend (next-single-property-change pos 'cperl-postpone nil end)) + (setq prop (get-text-property pos 'cperl-postpone) + posend (next-single-property-change pos 'cperl-postpone nil end)) (and prop (put-text-property pos posend (car prop) (cdr prop))) (setq pos posend))) nil) ; Do not iterate +(defun cperl-fontify-update-bad (end) + ;; Since fontification happens with different region than syntaxification, + ;; do to the end of buffer, not to END;;; likewise, start earlier if needed + (let* ((pos (point)) (prop (get-text-property pos 'cperl-postpone)) posend) + (if prop + (setq pos (or (cperl-beginning-of-property + (cperl-1+ pos) 'cperl-postpone) + (point-min)))) + (while (< pos end) + (setq posend (next-single-property-change pos 'cperl-postpone)) + (and prop (put-text-property pos posend (car prop) (cdr prop))) + (setq pos posend) + (setq prop (get-text-property pos 'cperl-postpone)))) + nil) ; Do not iterate + +;; Called when any modification is made to buffer text. +(defun cperl-after-change-function (beg end old-len) + ;; We should have been informed about changes by `font-lock'. Since it + ;; does not inform as which calls are defered, do it ourselves + (if cperl-syntax-done-to + (setq cperl-syntax-done-to (min cperl-syntax-done-to beg)))) + (defun cperl-update-syntaxification (from to) (if (and cperl-use-syntax-table-text-property cperl-syntaxify-by-font-lock @@ -7260,7 +9024,7 @@ (cperl-fontify-syntaxically to))))) (defvar cperl-version - (let ((v "Revision: 5.0")) + (let ((v "Revision: 5.22")) (string-match ":\\s *\\([0-9.]+\\)" v) (substring v (match-beginning 1) (match-end 1))) "Version of IZ-supported CPerl package this file is based on.")
--- a/lisp/progmodes/ebnf2ps.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/progmodes/ebnf2ps.el Sat Oct 14 17:36:28 2006 +0000 @@ -5,10 +5,10 @@ ;; Author: Vinicius Jose Latorre <viniciusjl@ig.com.br> ;; Maintainer: Vinicius Jose Latorre <viniciusjl@ig.com.br> -;; Time-stamp: <2005-09-18 07:27:20 deego> +;; Time-stamp: <2006/09/26 21:49:46 vinicius> ;; Keywords: wp, ebnf, PostScript -;; Version: 4.2 -;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/ +;; Version: 4.3 +;; X-URL: http://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre ;; This file is part of GNU Emacs. @@ -27,8 +27,8 @@ ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. -(defconst ebnf-version "4.2" - "ebnf2ps.el, v 4.2 <2004/04/04 vinicius> +(defconst ebnf-version "4.3" + "ebnf2ps.el, v 4.3 <2006/09/26 vinicius> Vinicius's last change version. When reporting bugs, please also report the version of Emacs, if any, that ebnf2ps was running with. @@ -73,18 +73,18 @@ ;; ebnf2ps provides the following commands for generating PostScript syntactic ;; chart images of Emacs buffers: ;; -;; ebnf-print-directory -;; ebnf-print-file -;; ebnf-print-buffer -;; ebnf-print-region -;; ebnf-spool-directory -;; ebnf-spool-file -;; ebnf-spool-buffer -;; ebnf-spool-region -;; ebnf-eps-directory -;; ebnf-eps-file -;; ebnf-eps-buffer -;; ebnf-eps-region +;; ebnf-print-directory +;; ebnf-print-file +;; ebnf-print-buffer +;; ebnf-print-region +;; ebnf-spool-directory +;; ebnf-spool-file +;; ebnf-spool-buffer +;; ebnf-spool-region +;; ebnf-eps-directory +;; ebnf-eps-file +;; ebnf-eps-buffer +;; ebnf-eps-region ;; ;; These commands all perform essentially the same function: they generate ;; PostScript syntactic chart images suitable for printing on a PostScript @@ -94,14 +94,14 @@ ;; The word "print", "spool" and "eps" in the command name determines when the ;; PostScript image is sent to the printer (or file): ;; -;; print - The PostScript image is immediately sent to the printer; -;; -;; spool - The PostScript image is saved temporarily in an Emacs buffer. -;; Many images may be spooled locally before printing them. To -;; send the spooled images to the printer, use the command -;; `ebnf-despool'. -;; -;; eps - The PostScript image is immediately sent to a EPS file. +;; print - The PostScript image is immediately sent to the printer; +;; +;; spool - The PostScript image is saved temporarily in an Emacs buffer. +;; Many images may be spooled locally before printing them. To +;; send the spooled images to the printer, use the command +;; `ebnf-despool'. +;; +;; eps - The PostScript image is immediately sent to a EPS file. ;; ;; The spooling mechanism is the same as used by ps-print and was designed for ;; printing lots of small files to save paper that would otherwise be wasted on @@ -120,22 +120,22 @@ ;; The word "directory", "file", "buffer" or "region" in the command name ;; determines how much of the buffer is printed: ;; -;; directory - Read files in the directory and print them. -;; -;; file - Read file and print it. -;; -;; buffer - Print the entire buffer. -;; -;; region - Print just the current region. +;; directory - Read files in the directory and print them. +;; +;; file - Read file and print it. +;; +;; buffer - Print the entire buffer. +;; +;; region - Print just the current region. ;; ;; Two ebnf- command examples: ;; -;; ebnf-print-buffer - translate and print the entire buffer, and send it -;; immediately to the printer. -;; -;; ebnf-spool-region - translate and print just the current region, and -;; spool the image in Emacs to send to the printer -;; later. +;; ebnf-print-buffer - translate and print the entire buffer, and send it +;; immediately to the printer. +;; +;; ebnf-spool-region - translate and print just the current region, and +;; spool the image in Emacs to send to the printer +;; later. ;; ;; Note that `ebnf-eps-directory', `ebnf-eps-file', `ebnf-eps-buffer' and ;; `ebnf-eps-region' never spool the EPS image, so they don't use the ps-print @@ -148,13 +148,13 @@ ;; ;; To translate and print your buffer, type ;; -;; M-x ebnf-print-buffer +;; M-x ebnf-print-buffer ;; ;; or substitute one of the other four ebnf- commands. The command will ;; generate the PostScript image and print or spool it as specified. By giving ;; the command a prefix argument ;; -;; C-u M-x ebnf-print-buffer +;; C-u M-x ebnf-print-buffer ;; ;; it will save the PostScript image to a file instead of sending it to the ;; printer; you will be prompted for the name of the file to save the image to. @@ -162,7 +162,7 @@ ;; you may save the spooled images to a file by giving a prefix argument to ;; `ebnf-despool': ;; -;; C-u M-x ebnf-despool +;; C-u M-x ebnf-despool ;; ;; When invoked this way, `ebnf-despool' will prompt you for the name of the ;; file to save to. @@ -172,9 +172,9 @@ ;; ;; Any of the `ebnf-' commands can be bound to keys. Here are some examples: ;; -;; (global-set-key 'f22 'ebnf-print-buffer) ;f22 is prsc -;; (global-set-key '(shift f22) 'ebnf-print-region) -;; (global-set-key '(control f22) 'ebnf-despool) +;; (global-set-key 'f22 'ebnf-print-buffer) ;f22 is prsc +;; (global-set-key '(shift f22) 'ebnf-print-region) +;; (global-set-key '(control f22) 'ebnf-despool) ;; ;; ;; Invoking Ebnf2ps in Batch @@ -523,14 +523,14 @@ ;; ;; The following table summarizes the results: ;; -;; EPS FILE NAME NO SORT ASCENDING SORT DESCENDING SORT -;; ebnf--AA.eps A C A C C A -;; ebnf--BB.eps C B B C C B -;; ebnf--CC.eps A C B F A B C F F C B A -;; ebnf--D.eps D D D -;; ebnf--E.eps E E E -;; ebnf--G.eps G G G -;; ebnf--Z.eps Z Z Z +;; EPS FILE NAME NO SORT ASCENDING SORT DESCENDING SORT +;; ebnf--AA.eps A C A C C A +;; ebnf--BB.eps C B B C C B +;; ebnf--CC.eps A C B F A B C F F C B A +;; ebnf--D.eps D D D +;; ebnf--E.eps E E E +;; ebnf--G.eps G G G +;; ebnf--Z.eps Z Z Z ;; ;; As you can see if EPS actions is not used, each single production is ;; generated per EPS file. To avoid overriding EPS files, use names in ;[ that @@ -692,6 +692,11 @@ ;; ;; `ebnf-line-color' Specify flow line color. ;; +;; `ebnf-arrow-extra-width' Specify extra width for arrow shape +;; drawing. +;; +;; `ebnf-arrow-scale' Specify the arrow scale. +;; ;; `ebnf-user-arrow' Specify a sexp for user arrow shape (a ;; PostScript code). ;; @@ -824,6 +829,8 @@ ;; entry is the vertical position used to know where it should ;; be drawn the flow line in the current element. ;; +;; extra is given by `ebnf-arrow-extra-width'. +;; ;; ;; * SPECIAL, TERMINAL and NON-TERMINAL ;; @@ -835,17 +842,17 @@ ;; : | : : | : } font height / 2 } ;; : +==============+...:............................... ;; : : : : : : -;; : : : : : :...................... -;; : : : : : } font height } -;; : : : : :....... } -;; : : : : } font height / 2 } -;; : : : :........... } -;; : : : } text width } width -;; : : :.................. } -;; : : } font height / 2 } -;; : :...................... } -;; : } font height } -;; :............................................. +;; : : : : : :......................... +;; : : : : : } font height } +;; : : : : :....... } +;; : : : : } font height / 2 } +;; : : : :........... } +;; : : : } text width } width +;; : : :.................. } +;; : : } font height / 2 } +;; : :...................... } +;; : } font height + extra } +;; :................................................. ;; ;; ;; * OPTIONAL @@ -976,21 +983,21 @@ ;; : | : : : : | : } font height / 2 } ;; : +================+...:............................... ;; : : : : : : : : -;; : : : : : : : :...................... -;; : : : : : : : } font height } -;; : : : : : : :....... } -;; : : : : : : } font height / 2 } -;; : : : : : :........... } -;; : : : : : } X width } -;; : : : : :............... } -;; : : : : } font height / 2 } width -;; : : : :.................. } -;; : : : } text width } -;; : : :..................... } -;; : : } font height / 2 } -;; : :........................ } -;; : } font height } -;; :............................................... +;; : : : : : : : :.......................... +;; : : : : : : : } font height } +;; : : : : : : :....... } +;; : : : : : : } font height / 2 } +;; : : : : : :........... } +;; : : : : : } X width } +;; : : : : :............... } +;; : : : : } font height / 2 } width +;; : : : :.................. } +;; : : : } text width } +;; : : :..................... } +;; : : } font height / 2 } +;; : :........................ } +;; : } font height + extra } +;; :................................................... ;; ;; ;; * EXCEPT @@ -1003,21 +1010,21 @@ ;; : | : : : : | : } font height / 2 } ;; : +==================+...:............................... ;; : : : : : : : : -;; : : : : : : : :...................... -;; : : : : : : : } font height } -;; : : : : : : :....... } -;; : : : : : : } font height / 2 } -;; : : : : : :........... } -;; : : : : : } Y width } -;; : : : : :............... } -;; : : : : } font height } width -;; : : : :................... } -;; : : : } X width } -;; : : :....................... } -;; : : } font height / 2 } -;; : :.......................... } -;; : } font height } -;; :................................................. +;; : : : : : : : :.......................... +;; : : : : : : : } font height } +;; : : : : : : :....... } +;; : : : : : : } font height / 2 } +;; : : : : : :........... } +;; : : : : : } Y width } +;; : : : : :............... } +;; : : : : } font height } width +;; : : : :................... } +;; : : : } X width } +;; : : :....................... } +;; : : } font height / 2 } +;; : :.......................... } +;; : } font height + extra } +;; :..................................................... ;; ;; NOTE: If Y element is empty, it's draw nothing at Y place. ;; @@ -1089,7 +1096,8 @@ ;; ---------------- ;; ;; Thanks to Drew Adams <drew.adams@oracle.com> for suggestions: -;; - `ebnf-production-name-p', `ebnf-stop-on-error', +;; - `ebnf-arrow-extra-width', `ebnf-arrow-scale', +;; `ebnf-production-name-p', `ebnf-stop-on-error', ;; `ebnf-file-suffix-regexp'and `ebnf-special-show-delimiter' variables. ;; - `ebnf-delete-style', `ebnf-eps-file' and `ebnf-eps-directory' ;; commands. @@ -1911,6 +1919,29 @@ :group 'ebnf2ps) +(defcustom ebnf-arrow-extra-width + (if (eq ebnf-arrow-shape 'none) + 0.0 + (* (sqrt 5.0) 0.65 ebnf-line-width)) + "*Specify extra width for arrow shape drawing. + +The extra width is used to avoid that the arrowhead and the terminal border +overlap. It depens on `ebnf-arrow-shape' and `ebnf-line-width'." + :type 'number + :version "22" + :group 'ebnf-shape) + + +(defcustom ebnf-arrow-scale 1.0 + "*Specify the arrow scale. + +Values lower than 1.0, shrink the arrow. +Values greater than 1.0, expand the arrow." + :type 'number + :version "22" + :group 'ebnf-shape) + + (defcustom ebnf-debug-ps nil "*Non-nil means to generate PostScript debug procedures. @@ -2859,9 +2890,9 @@ /HeightNT FontHeight FontHeight add def /T HeightT HeightNT add 0.5 mul def -/hT T 0.5 mul def -/hT2 hT 0.5 mul def -/hT4 hT 0.25 mul def +/hT T 0.5 mul def +/hT2 hT 0.5 mul ArrowScale mul def +/hT4 hT 0.25 mul ArrowScale mul def /Er 0.1 def % Error factor @@ -2947,6 +2978,7 @@ RA-vector ArrowShape get exec Gstroke moveto + ExtraWidth 0 rmoveto }def % rotation DrawArrow @@ -3245,7 +3277,7 @@ % string width prepare-width |- string /prepare-width {/width exch def - dup stringwidth pop space add space add width exch sub 0.5 mul + dup stringwidth pop space add space add width exch sub ExtraWidth sub 0.5 mul /w exch def }def @@ -4877,7 +4909,6 @@ (progn ;; adjust creator comment (end-of-line) - (backward-char) (insert " & ebnf2ps v" ebnf-version) ;; insert ebnf settings & engine (goto-char (point-max)) @@ -5066,6 +5097,10 @@ (format "/ShadowR %s def\n" (ebnf-boolean ebnf-repeat-shadow)) ;; miscellaneous + (format "/ExtraWidth %s def\n" + (ebnf-format-float ebnf-arrow-extra-width)) + (format "/ArrowScale %s def\n" + (ebnf-format-float ebnf-arrow-scale)) (format "/DefaultWidth %s def\n" (ebnf-format-float ebnf-default-width)) (format "/LineWidth %s def\n" @@ -5152,7 +5187,7 @@ (len (length (ebnf-node-name node)))) (ebnf-node-entry node (* height 0.5)) (ebnf-node-height node height) - (ebnf-node-width node (+ ebnf-basic-width space + (ebnf-node-width node (+ ebnf-basic-width ebnf-arrow-extra-width space (* len font-width) space ebnf-basic-width)))) @@ -5173,6 +5208,7 @@ ebnf-font-height-S) ebnf-space-R ebnf-space-R)) (ebnf-node-width repeat (+ (ebnf-node-width element) + ebnf-arrow-extra-width ebnf-space-R ebnf-space-R ebnf-space-R ebnf-horizontal-space (* (length times) ebnf-font-width-R))))) @@ -5194,6 +5230,7 @@ ebnf-space-E ebnf-space-E)) (ebnf-node-width except (+ (ebnf-node-width factor) (ebnf-node-width element) + ebnf-arrow-extra-width ebnf-space-E ebnf-space-E ebnf-space-E ebnf-space-E ebnf-font-width-E
--- a/lisp/progmodes/gdb-ui.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/progmodes/gdb-ui.el Sat Oct 14 17:36:28 2006 +0000 @@ -782,7 +782,7 @@ (defconst gdb-var-list-children-regexp "child={.*?name=\"\\(.*?\\)\",.*?exp=\"\\(.*?\\)\",.*?\ -numchild=\"\\(.*?\\)\",.*?type=\"\\(.*?\\)\".*?}") +numchild=\"\\(.*?\\)\"\\(}\\|,.*?\\(type=\"\\(.*?\\)\"\\)?.*?}\\)") (defun gdb-var-list-children-handler (varnum) (goto-char (point-min)) @@ -796,7 +796,7 @@ (let ((varchild (list (match-string 1) (match-string 2) (match-string 3) - (match-string 4) + (match-string 6) nil nil))) (if (assoc (car varchild) gdb-var-list) (throw 'child-already-watched nil)) @@ -902,20 +902,23 @@ TEXT is the text of the button we clicked on, a + or - item. TOKEN is data related to this node. INDENT is the current indentation depth." - (cond ((string-match "+" text) ;expand this node - (if (and - (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) - (string-equal gdb-version "pre-6.4")) - (gdb-var-list-children token) - (gdb-var-list-children-1 token))) - ((string-match "-" text) ;contract this node - (dolist (var gdb-var-list) - (if (string-match (concat token "\\.") (car var)) - (setq gdb-var-list (delq var gdb-var-list)))) - (speedbar-change-expand-button-char ?+) - (speedbar-delete-subblock indent)) - (t (error "Ooops... not sure what to do"))) - (speedbar-center-buffer-smartly)) + (if (and gud-comint-buffer (buffer-name gud-comint-buffer)) + (progn + (cond ((string-match "+" text) ;expand this node + (if (and (eq (buffer-local-value + 'gud-minor-mode gud-comint-buffer) 'gdba) + (string-equal gdb-version "pre-6.4")) + (gdb-var-list-children token) + (gdb-var-list-children-1 token))) + ((string-match "-" text) ;contract this node + (dolist (var gdb-var-list) + (if (string-match (concat token "\\.") (car var)) + (setq gdb-var-list (delq var gdb-var-list)))) + (speedbar-change-expand-button-char ?+) + (speedbar-delete-subblock indent)) + (t (error "Ooops... not sure what to do"))) + (speedbar-center-buffer-smartly)) + (message-box "GUD session has been killed"))) (defun gdb-get-target-string () (with-current-buffer gud-comint-buffer @@ -1132,7 +1135,7 @@ (if gdb-prompting (progn (gdb-send-item item) - (setq gdb-prompting nil)) + (setq gdb-prompting nil)) (push item gdb-input-queue)))) (defun gdb-dequeue-input () @@ -3346,7 +3349,8 @@ (defconst gdb-var-list-children-regexp-1 "child={.*?name=\"\\(.+?\\)\",.*?exp=\"\\(.+?\\)\",.*?\ -numchild=\"\\(.+?\\)\",.*?value=\\(\".*?\"\\),.*?type=\"\\(.+?\\)\".*?}") +numchild=\"\\(.+?\\)\",.*?value=\\(\".*?\"\\)\ +\\(}\\|,.*?\\(type=\"\\(.+?\\)\"\\)?.*?}\\)") (defun gdb-var-list-children-handler-1 (varnum) (goto-char (point-min)) @@ -3360,7 +3364,7 @@ (let ((varchild (list (match-string 1) (match-string 2) (match-string 3) - (match-string 5) + (match-string 7) (read (match-string 4)) nil))) (if (assoc (car varchild) gdb-var-list)
--- a/lisp/progmodes/gud.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/progmodes/gud.el Sat Oct 14 17:36:28 2006 +0000 @@ -456,8 +456,8 @@ (while var-list (let* (char (depth 0) (start 0) (var (car var-list)) (varnum (car var)) (expr (nth 1 var)) - (type (nth 3 var)) (value (nth 4 var)) - (status (nth 5 var))) + (type (if (nth 3 var) (nth 3 var) " ")) + (value (nth 4 var)) (status (nth 5 var))) (put-text-property 0 (length expr) 'face font-lock-variable-name-face expr) (put-text-property
--- a/lisp/progmodes/idlwave.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/progmodes/idlwave.el Sat Oct 14 17:36:28 2006 +0000 @@ -75,7 +75,7 @@ ;; of the documentation is available from the maintainers webpage (see ;; SOURCE). ;; -;; +;; ;; ACKNOWLEDGMENTS ;; =============== ;; @@ -125,7 +125,7 @@ ;; up inserting the character that expanded the abbrev after moving ;; point backward, e.g., "\cl" expanded with a space becomes ;; "LONG( )" with point before the close paren. This is solved by -;; using a temporary function in `post-command-hook' - not pretty, +;; using a temporary function in `post-command-hook' - not pretty, ;; but it works. ;; ;; Tabs and spaces are treated equally as whitespace when filling a @@ -178,13 +178,13 @@ nil ;; We've got what we needed ;; We have the old or no custom-library, hack around it! (defmacro defgroup (&rest args) nil) - (defmacro defcustom (var value doc &rest args) + (defmacro defcustom (var value doc &rest args) `(defvar ,var ,value ,doc)))) (defgroup idlwave nil "Major mode for editing IDL .pro files." :tag "IDLWAVE" - :link '(url-link :tag "Home Page" + :link '(url-link :tag "Home Page" "http://idlwave.org") :link '(emacs-commentary-link :tag "Commentary in idlw-shell.el" "idlw-shell.el") @@ -298,8 +298,8 @@ (defcustom idlwave-auto-fill-split-string t "*If non-nil then auto fill will split strings with the IDL `+' operator. -When the line end falls within a string, string concatenation with the -'+' operator will be used to distribute a long string over lines. +When the line end falls within a string, string concatenation with the +'+' operator will be used to distribute a long string over lines. If nil and a string is split then a terminal beep and warning are issued. This variable is ignored when `idlwave-fill-comment-line-only' is @@ -418,7 +418,7 @@ (const :tag "When saving a buffer" save-buffer) (const :tag "After a buffer was killed" kill-buffer) (const :tag "After a buffer was compiled successfully, update shell info" compile-buffer)))) - + (defcustom idlwave-rinfo-max-source-lines 5 "*Maximum number of source files displayed in the Routine Info window. When an integer, it is the maximum number of source files displayed. @@ -453,7 +453,7 @@ :type 'directory) ;; Configuration files -(defcustom idlwave-config-directory +(defcustom idlwave-config-directory (convert-standard-filename "~/.idlwave") "*Directory for configuration files and user-library catalog." :group 'idlwave-routine-info @@ -469,7 +469,7 @@ (defcustom idlwave-special-lib-alist nil "Alist of regular expressions matching special library directories. When listing routine source locations, IDLWAVE gives a short hint where -the file defining the routine is located. By default it lists `SystemLib' +the file defining the routine is located. By default it lists `SystemLib' for routines in the system library `!DIR/lib' and `Library' for anything else. This variable can define additional types. The car of each entry is a regular expression matching the file name (they normally will match @@ -480,7 +480,7 @@ (cons regexp string))) (defcustom idlwave-auto-write-paths t - "Write out path (!PATH) and system directory (!DIR) info automatically. + "Write out path (!PATH) and system directory (!DIR) info automatically. Path info is needed to locate library catalog files. If non-nil, whenever the path-list changes as a result of shell-query, etc., it is written to file. Otherwise, the menu option \"Write Paths\" can be @@ -511,7 +511,7 @@ This variable determines the case (UPPER/lower/Capitalized...) of words inserted into the buffer by completion. The preferred case can be specified separately for routine names, keywords, classes and -methods. +methods. This alist should therefore have entries for `routine' (normal functions and procedures, i.e. non-methods), `keyword', `class', and `method'. Plausible values are @@ -598,7 +598,7 @@ for which to assume this can be set here." :group 'idlwave-routine-info :type '(repeat (regexp :tag "Match method:"))) - + (defcustom idlwave-completion-show-classes 1 "*Number of classes to show when completing object methods and keywords. @@ -663,7 +663,7 @@ specify if the class should be found during method and keyword completion, respectively. -The alist may have additional entries specifying exceptions from the +The alist may have additional entries specifying exceptions from the keyword completion rule for specific methods, like INIT or GETPROPERTY. In order to turn on class specification for the INIT method, add an entry (\"INIT\" . t). The method name must be ALL-CAPS." @@ -687,7 +687,7 @@ value of the variable `idlwave-query-class'. When you specify a class, this information can be stored as a text -property on the `->' arrow in the source code, so that during the same +property on the `->' arrow in the source code, so that during the same editing session, IDLWAVE will not have to ask again. When this variable is non-nil, IDLWAVE will store and reuse the class information. The class stored can be checked and removed with `\\[idlwave-routine-info]' @@ -1065,7 +1065,7 @@ :group 'idlwave-misc :type 'boolean) -(defcustom idlwave-default-font-lock-items +(defcustom idlwave-default-font-lock-items '(pros-and-functions batch-files idlwave-idl-keywords label goto common-blocks class-arrows) "Items which should be fontified on the default fontification level 2. @@ -1127,25 +1127,25 @@ ;;; and Carsten Dominik... ;; The following are the reserved words in IDL. Maybe we should -;; highlight some more stuff as well? +;; highlight some more stuff as well? ;; Procedure declarations. Fontify keyword plus procedure name. (defvar idlwave-idl-keywords - ;; To update this regexp, update the list of keywords and + ;; To update this regexp, update the list of keywords and ;; evaluate the form. - ;; (insert + ;; (insert ;; (prin1-to-string - ;; (concat + ;; (concat ;; "\\<\\(" - ;; (regexp-opt + ;; (regexp-opt ;; '("||" "&&" "and" "or" "xor" "not" - ;; "eq" "ge" "gt" "le" "lt" "ne" + ;; "eq" "ge" "gt" "le" "lt" "ne" ;; "for" "do" "endfor" - ;; "if" "then" "endif" "else" "endelse" + ;; "if" "then" "endif" "else" "endelse" ;; "case" "of" "endcase" ;; "switch" "break" "continue" "endswitch" ;; "begin" "end" ;; "repeat" "until" "endrep" - ;; "while" "endwhile" + ;; "while" "endwhile" ;; "goto" "return" ;; "inherits" "mod" ;; "compile_opt" "forward_function" @@ -1168,7 +1168,7 @@ (2 font-lock-reference-face nil t) ; block name ("[ \t]*\\(\\sw+\\)[ ,]*" ;; Start with point after block name and comma - (goto-char (match-end 0)) ; needed for XEmacs, could be nil + (goto-char (match-end 0)) ; needed for XEmacs, could be nil nil (1 font-lock-variable-name-face) ; variable names ))) @@ -1223,7 +1223,7 @@ ;; All operators (not used because too noisy) (all-operators '("[-*^#+<>/]" (0 font-lock-keyword-face))) - + ;; Arrows with text property `idlwave-class' (class-arrows '(idlwave-match-class-arrows (0 idlwave-class-arrow-face)))) @@ -1260,14 +1260,14 @@ (defvar idlwave-font-lock-defaults '((idlwave-font-lock-keywords - idlwave-font-lock-keywords-1 + idlwave-font-lock-keywords-1 idlwave-font-lock-keywords-2 idlwave-font-lock-keywords-3) - nil t - ((?$ . "w") (?_ . "w") (?. . "w") (?| . "w") (?& . "w")) + nil t + ((?$ . "w") (?_ . "w") (?. . "w") (?| . "w") (?& . "w")) beginning-of-line)) -(put 'idlwave-mode 'font-lock-defaults +(put 'idlwave-mode 'font-lock-defaults idlwave-font-lock-defaults) ; XEmacs (defconst idlwave-comment-line-start-skip "^[ \t]*;" @@ -1275,7 +1275,7 @@ That is the _beginning_ of a line containing a comment delimiter `;' preceded only by whitespace.") -(defconst idlwave-begin-block-reg +(defconst idlwave-begin-block-reg "\\<\\(pro\\|function\\|begin\\|case\\|switch\\)\\>" "Regular expression to find the beginning of a block. The case does not matter. The search skips matches in comments.") @@ -1352,17 +1352,17 @@ '(goto . ("goto\\>" nil)) '(case . ("case\\>" nil)) '(switch . ("switch\\>" nil)) - (cons 'call (list (concat "\\(" idlwave-variable "\\) *= *" + (cons 'call (list (concat "\\(" idlwave-variable "\\) *= *" "\\(" idlwave-method-call "\\s *\\)?" idlwave-identifier "\\s *(") nil)) - (cons 'call (list (concat + (cons 'call (list (concat "\\(" idlwave-method-call "\\s *\\)?" - idlwave-identifier + idlwave-identifier "\\( *\\($\\|\\$\\)\\|\\s *,\\)") nil)) - (cons 'assign (list (concat + (cons 'assign (list (concat "\\(" idlwave-variable "\\) *=") nil))) - + "Associated list of statement matching regular expressions. Each regular expression matches the start of an IDL statement. The first element of each association is a symbol giving the statement @@ -1385,7 +1385,7 @@ ;; Note that this is documented in the v18 manuals as being a string ;; of length one rather than a single character. ;; The code in this file accepts either format for compatibility. -(defvar idlwave-comment-indent-char ?\ +(defvar idlwave-comment-indent-char ?\ "Character to be inserted for IDL comment indentation. Normally a space.") @@ -1557,15 +1557,15 @@ (not (equal idlwave-shell-debug-modifiers '()))) ;; Bind the debug commands also with the special modifiers. (let ((shift (memq 'shift idlwave-shell-debug-modifiers)) - (mods-noshift (delq 'shift + (mods-noshift (delq 'shift (copy-sequence idlwave-shell-debug-modifiers)))) - (define-key idlwave-mode-map + (define-key idlwave-mode-map (vector (append mods-noshift (list (if shift ?C ?c)))) 'idlwave-shell-save-and-run) - (define-key idlwave-mode-map + (define-key idlwave-mode-map (vector (append mods-noshift (list (if shift ?B ?b)))) 'idlwave-shell-break-here) - (define-key idlwave-mode-map + (define-key idlwave-mode-map (vector (append mods-noshift (list (if shift ?E ?e)))) 'idlwave-shell-run-region))) (define-key idlwave-mode-map "\C-c\C-d\C-c" 'idlwave-shell-save-and-run) @@ -1602,7 +1602,7 @@ (define-key idlwave-mode-map "\M-\C-i" 'idlwave-complete) (define-key idlwave-mode-map "\C-c\C-i" 'idlwave-update-routine-info) (define-key idlwave-mode-map "\C-c=" 'idlwave-resolve) -(define-key idlwave-mode-map +(define-key idlwave-mode-map (if (featurep 'xemacs) [(shift button3)] [(shift mouse-3)]) 'idlwave-mouse-context-help) @@ -1617,7 +1617,7 @@ ;; to go ahead of > and <, so >= and <= will be treated correctly (idlwave-action-and-binding "=" '(idlwave-expand-equal -1 -1)) -;; Actions for > and < are complicated by >=, <=, and ->... +;; Actions for > and < are complicated by >=, <=, and ->... (idlwave-action-and-binding "<" '(idlwave-custom-ltgtr-surround nil)) (idlwave-action-and-binding ">" '(idlwave-custom-ltgtr-surround 'gtr)) @@ -1650,7 +1650,7 @@ (error (apply 'define-abbrev args))))) (condition-case nil - (modify-syntax-entry (string-to-char idlwave-abbrev-start-char) + (modify-syntax-entry (string-to-char idlwave-abbrev-start-char) "w" idlwave-mode-syntax-table) (error nil)) @@ -1774,7 +1774,7 @@ (defvar imenu-extract-index-name-function) (defvar imenu-prev-index-position-function) ;; defined later - so just make the compiler hush -(defvar idlwave-mode-menu) +(defvar idlwave-mode-menu) (defvar idlwave-mode-debug-menu) ;;;###autoload @@ -1858,7 +1858,7 @@ \\i IF statement template \\elif IF-ELSE statement template \\b BEGIN - + For a full list, use \\[idlwave-list-abbrevs]. Some templates also have direct keybindings - see the list of keybindings below. @@ -1900,19 +1900,19 @@ (interactive) (kill-all-local-variables) - + (if idlwave-startup-message (message "Emacs IDLWAVE mode version %s." idlwave-mode-version)) (setq idlwave-startup-message nil) - + (setq local-abbrev-table idlwave-mode-abbrev-table) (set-syntax-table idlwave-mode-syntax-table) - + (set (make-local-variable 'indent-line-function) 'idlwave-indent-and-action) - + (make-local-variable idlwave-comment-indent-function) (set idlwave-comment-indent-function 'idlwave-comment-hook) - + (set (make-local-variable 'comment-start-skip) ";+[ \t]*") (set (make-local-variable 'comment-start) ";") (set (make-local-variable 'comment-add) 1) ; ";;" for new and regions @@ -1920,7 +1920,7 @@ (set (make-local-variable 'abbrev-all-caps) t) (set (make-local-variable 'indent-tabs-mode) nil) (set (make-local-variable 'completion-ignore-case) t) - + (use-local-map idlwave-mode-map) (when (featurep 'easymenu) @@ -1930,11 +1930,11 @@ (setq mode-name "IDLWAVE") (setq major-mode 'idlwave-mode) (setq abbrev-mode t) - + (set (make-local-variable idlwave-fill-function) 'idlwave-auto-fill) (setq comment-end "") (set (make-local-variable 'comment-multi-line) nil) - (set (make-local-variable 'paragraph-separate) + (set (make-local-variable 'paragraph-separate) "[ \t\f]*$\\|[ \t]*;+[ \t]*$\\|;+[+=-_*]+$") (set (make-local-variable 'paragraph-start) "[ \t\f]\\|[ \t]*;+[ \t]") (set (make-local-variable 'paragraph-ignore-fill-prefix) nil) @@ -1943,7 +1943,7 @@ ;; Set tag table list to use IDLTAGS as file name. (if (boundp 'tag-table-alist) (add-to-list 'tag-table-alist '("\\.pro$" . "IDLTAGS"))) - + ;; Font-lock additions - originally Phil Williams, then Ulrik Dickow ;; Following line is for Emacs - XEmacs uses the corresponding property ;; on the `idlwave-mode' symbol. @@ -1968,7 +1968,7 @@ idlwave-end-block-reg ";" 'idlwave-forward-block nil)) - + ;; Make a local post-command-hook and add our hook to it ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility @@ -2000,16 +2000,16 @@ (unless idlwave-setup-done (if (not (file-directory-p idlwave-config-directory)) (make-directory idlwave-config-directory)) - (setq - idlwave-user-catalog-file (expand-file-name - idlwave-user-catalog-file + (setq + idlwave-user-catalog-file (expand-file-name + idlwave-user-catalog-file idlwave-config-directory) - idlwave-xml-system-rinfo-converted-file - (expand-file-name + idlwave-xml-system-rinfo-converted-file + (expand-file-name idlwave-xml-system-rinfo-converted-file idlwave-config-directory) - idlwave-path-file (expand-file-name - idlwave-path-file + idlwave-path-file (expand-file-name + idlwave-path-file idlwave-config-directory)) (idlwave-read-paths) ; we may need these early (setq idlwave-setup-done t))) @@ -2028,7 +2028,7 @@ ;; ;; Code Formatting ---------------------------------------------------- -;; +;; (defun idlwave-hard-tab () "Inserts TAB in buffer in current position." @@ -2171,7 +2171,7 @@ (if (> end-pos eol-pos) (setq end-pos pos)) (goto-char end-pos) - (setq end (buffer-substring + (setq end (buffer-substring (progn (skip-chars-backward "a-zA-Z") (point)) @@ -2193,7 +2193,7 @@ (sit-for 1)) (t (beep) - (message "Warning: Shouldn't this be \"%s\" instead of \"%s\"?" + (message "Warning: Shouldn't this be \"%s\" instead of \"%s\"?" end1 end) (sit-for 1)))))))) ;;(delete-char 1)) @@ -2205,8 +2205,8 @@ ((looking-at "pro\\|case\\|switch\\|function\\>") (assoc (downcase (match-string 0)) idlwave-block-matches)) ((looking-at "begin\\>") - (let ((limit (save-excursion - (idlwave-beginning-of-statement) + (let ((limit (save-excursion + (idlwave-beginning-of-statement) (point)))) (cond ((re-search-backward ":[ \t]*\\=" limit t) @@ -2490,7 +2490,7 @@ (let ((eos (save-excursion (idlwave-block-jump-out -1 'nomark) (point)))) - (if (setq status (idlwave-find-key + (if (setq status (idlwave-find-key idlwave-end-block-reg -1 'nomark eos)) (idlwave-beginning-of-statement) (message "No nested block before beginning of containing block."))) @@ -2498,7 +2498,7 @@ (let ((eos (save-excursion (idlwave-block-jump-out 1 'nomark) (point)))) - (if (setq status (idlwave-find-key + (if (setq status (idlwave-find-key idlwave-begin-block-reg 1 'nomark eos)) (idlwave-end-of-statement) (message "No nested block before end of containing block.")))) @@ -2512,7 +2512,7 @@ (here (point))) (goto-char (point-max)) (if (re-search-backward idlwave-doclib-start nil t) - (progn + (progn (setq beg (progn (beginning-of-line) (point))) (if (re-search-forward idlwave-doclib-end nil t) (progn @@ -2545,7 +2545,7 @@ ((eq major-mode 'idlwave-shell-mode) (if (re-search-backward idlwave-shell-prompt-pattern nil t) (goto-char (match-end 0)))) - (t + (t (if (save-excursion (forward-line -1) (idlwave-is-continuation-line)) (idlwave-previous-statement) (beginning-of-line))))) @@ -2622,7 +2622,7 @@ (let ((save-point (point))) (when (re-search-forward ".*&" lim t) (goto-char (match-end 0)) - (if (idlwave-quoted) + (if (idlwave-quoted) (goto-char save-point) (if (eq (char-after (- (point) 2)) ?&) (goto-char save-point)))) (point))) @@ -2639,7 +2639,7 @@ ;; - not in parenthesis (like a[0:3]) ;; - not followed by another ":" in explicit class, ala a->b::c ;; As many in this mode, this function is heuristic and not an exact - ;; parser. + ;; parser. (let* ((start (point)) (eos (save-excursion (idlwave-end-of-statement) (point))) (end (idlwave-find-key ":" 1 'nomark eos))) @@ -2716,7 +2716,7 @@ `idlwave-pad-keyword' is t then keyword assignment is treated just like assignment statements. When nil, spaces are removed for keyword assignment. Any other value keeps the current space around the `='. -Limits in for loops are treated as keyword assignment. +Limits in for loops are treated as keyword assignment. Starting with IDL 6.0, a number of op= assignments are available. Since ambiguities of the form: @@ -2733,25 +2733,25 @@ See `idlwave-surround'." (if idlwave-surround-by-blank - (let + (let ((non-an-ops "\\(##\\|\\*\\|\\+\\|-\\|/\\|<\\|>\\|\\^\\)\\=") - (an-ops + (an-ops "\\s-\\(AND\\|EQ\\|GE\\|GT\\|LE\\|LT\\|MOD\\|NE\\|OR\\|XOR\\)\\=") (len 1)) - - (save-excursion + + (save-excursion (let ((case-fold-search t)) (backward-char) - (if (or + (if (or (re-search-backward non-an-ops nil t) ;; Why doesn't ##? work for both? - (re-search-backward "\\(#\\)\\=" nil t)) + (re-search-backward "\\(#\\)\\=" nil t)) (setq len (1+ (length (match-string 1)))) (when (re-search-backward an-ops nil t) ;(setq begin nil) ; won't modify begin (setq len (1+ (length (match-string 1)))))))) - - (if (eq t idlwave-pad-keyword) + + (if (eq t idlwave-pad-keyword) ;; Everything gets padded equally (idlwave-surround before after len) ;; Treating keywords/for variables specially... @@ -2762,22 +2762,22 @@ (skip-chars-backward "= \t") (nth 2 (idlwave-where))))) (cond ((or (memq what '(function-keyword procedure-keyword)) - (memq (caar st) '(for pdef))) - (cond + (memq (caar st) '(for pdef))) + (cond ((null idlwave-pad-keyword) (idlwave-surround 0 0) ) ; remove space (t))) ; leave any spaces alone (t (idlwave-surround before after len)))))))) - + (defun idlwave-indent-and-action (&optional arg) "Call `idlwave-indent-line' and do expand actions. With prefix ARG non-nil, indent the entire sub-statement." (interactive "p") (save-excursion - (if (and idlwave-expand-generic-end - (re-search-backward "\\<\\(end\\)\\s-*\\=" + (if (and idlwave-expand-generic-end + (re-search-backward "\\<\\(end\\)\\s-*\\=" (max 0 (- (point) 10)) t) (looking-at "\\(end\\)\\([ \n\t]\\|\\'\\)")) (progn (goto-char (match-end 1)) @@ -2787,7 +2787,7 @@ (when (and (not arg) current-prefix-arg) (setq arg current-prefix-arg) (setq current-prefix-arg nil)) - (if arg + (if arg (idlwave-indent-statement) (idlwave-indent-line t))) @@ -2922,7 +2922,7 @@ (save-excursion (cond ;; Beginning of file - ((prog1 + ((prog1 (idlwave-previous-statement) (setq beg-prev-pos (point))) 0) @@ -2932,7 +2932,7 @@ idlwave-main-block-indent)) ;; Begin block ((idlwave-look-at idlwave-begin-block-reg t) - (+ (idlwave-min-current-statement-indent) + (+ (idlwave-min-current-statement-indent) idlwave-block-indent)) ;; End Block ((idlwave-look-at idlwave-end-block-reg t) @@ -2943,7 +2943,7 @@ (idlwave-min-current-statement-indent))) ;; idlwave-end-offset ;; idlwave-block-indent)) - + ;; Default to current indent ((idlwave-current-statement-indent)))))) ;; adjust the indentation based on the current statement @@ -2959,7 +2959,7 @@ (defun idlwave-calculate-paren-indent (beg-reg end-reg close-exp) "Calculate the continuation indent inside a paren group. -Returns a cons-cell with (open . indent), where open is the +Returns a cons-cell with (open . indent), where open is the location of the open paren" (let ((open (nth 1 (parse-partial-sexp beg-reg end-reg)))) ;; Found an innermost open paren. @@ -3000,24 +3000,24 @@ (end-reg (progn (beginning-of-line) (point))) (beg-last-statement (save-excursion (idlwave-previous-statement) (point))) - (beg-reg (progn (idlwave-start-of-substatement 'pre) + (beg-reg (progn (idlwave-start-of-substatement 'pre) (if (eq (line-beginning-position) end-reg) (goto-char beg-last-statement) (point)))) (basic-indent (+ (idlwave-min-current-statement-indent end-reg) idlwave-continuation-indent)) fancy-nonparen-indent fancy-paren-indent) - (cond + (cond ;; Align then with its matching if, etc. ((let ((matchers '(("\\<if\\>" . "[ \t]*then") ("\\<\\(if\\|end\\(if\\)?\\)\\>" . "[ \t]*else") ("\\<\\(for\\|while\\)\\>" . "[ \t]*do") - ("\\<\\(repeat\\|end\\(rep\\)?\\)\\>" . + ("\\<\\(repeat\\|end\\(rep\\)?\\)\\>" . "[ \t]*until") ("\\<case\\>" . "[ \t]*of"))) match cont-re) (goto-char end-reg) - (and + (and (setq cont-re (catch 'exit (while (setq match (car matchers)) @@ -3026,7 +3026,7 @@ (setq matchers (cdr matchers))))) (idlwave-find-key cont-re -1 'nomark beg-last-statement))) (if (looking-at "end") ;; that one's special - (- (idlwave-current-indent) + (- (idlwave-current-indent) (+ idlwave-block-indent idlwave-end-offset)) (idlwave-current-indent))) @@ -3052,7 +3052,7 @@ (let* ((end-reg end-reg) (close-exp (progn (goto-char end-reg) - (skip-chars-forward " \t") + (skip-chars-forward " \t") (looking-at "\\s)"))) indent-cons) (catch 'loop @@ -3086,12 +3086,12 @@ (if (save-match-data (looking-at "[ \t$]*\\(;.*\\)?$")) nil (current-column))) - + ;; Continued assignment (with =): ((catch 'assign ; (while (looking-at "[^=\n\r]*\\(=\\)[ \t]*") (goto-char (match-end 0)) - (if (null (idlwave-what-function beg-reg)) + (if (null (idlwave-what-function beg-reg)) (throw 'assign t)))) (unless (or (idlwave-in-quote) @@ -3153,7 +3153,7 @@ (let* ((here (point)) (case-fold-search t) (limit (if (>= dir 0) (point-max) (point-min))) - (block-limit (if (>= dir 0) + (block-limit (if (>= dir 0) idlwave-begin-block-reg idlwave-end-block-reg)) found @@ -3164,7 +3164,7 @@ (idlwave-find-key idlwave-begin-unit-reg dir t limit) (end-of-line) - (idlwave-find-key + (idlwave-find-key idlwave-end-unit-reg dir t limit))) limit))) (if (>= dir 0) (end-of-line)) ;Make sure we are in current block @@ -3189,7 +3189,7 @@ (or (null end-reg) (< (point) end-reg))) (unless comm-or-empty (setq min (min min (idlwave-current-indent))))) (if (or comm-or-empty (and end-reg (>= (point) end-reg))) - min + min (min min (idlwave-current-indent)))))) (defun idlwave-current-statement-indent (&optional last-line) @@ -3216,10 +3216,10 @@ `$') count as continuations too." (let (p) (save-excursion - (or + (or (idlwave-look-at "\\<\\$") (catch 'loop - (while (and (looking-at "^[ \t]*\\(;.*\\)?$") + (while (and (looking-at "^[ \t]*\\(;.*\\)?$") (eq (forward-line -1) 0)) (if (setq p (idlwave-look-at "\\<\\$")) (throw 'loop p)))))))) @@ -3317,7 +3317,7 @@ (beginning-of-line) (point)) (point)))) "[^;]")) - + ;; Mark the beginning and end of the paragraph (goto-char bcl) (while (and (looking-at fill-prefix-reg) @@ -3381,7 +3381,7 @@ (insert (make-string diff ?\ )))) (forward-line -1)) ) - + ;; No hang. Instead find minimum indentation of paragraph ;; after first line. ;; For the following while statement, since START is at the @@ -3413,7 +3413,7 @@ t) (current-column)) indent)) - + ;; try to keep point at its original place (goto-char here) @@ -3462,7 +3462,7 @@ (current-column))))) (defun idlwave-auto-fill () - "Called to break lines in auto fill mode. + "Called to break lines in auto fill mode. Only fills non-comment lines if `idlwave-fill-comment-line-only' is non-nil. Places a continuation character at the end of the line if not in a comment. Splits strings with IDL concatenation operator `+' @@ -3613,7 +3613,7 @@ (insert (current-time-string)) (insert ", " (user-full-name)) (if (boundp 'user-mail-address) - (insert " <" user-mail-address ">") + (insert " <" user-mail-address ">") (insert " <" (user-login-name) "@" (system-name) ">")) ;; Remove extra spaces from line (idlwave-fill-paragraph) @@ -3639,7 +3639,7 @@ (setq end (match-end 0))) (progn (goto-char beg) - (if (re-search-forward + (if (re-search-forward (concat idlwave-doc-modifications-keyword ":") end t) (end-of-line) @@ -3737,7 +3737,7 @@ (not (idlwave-in-quote)) (save-excursion (forward-char) - (re-search-backward (concat "\\(" idlwave-idl-keywords + (re-search-backward (concat "\\(" idlwave-idl-keywords "\\|[[(*+-/=,^><]\\)\\s-*\\*") limit t))))) @@ -3783,7 +3783,7 @@ (indent-region beg end nil)) (if (stringp prompt) (message prompt))))) - + (defun idlwave-rw-case (string) "Make STRING have the case required by `idlwave-reserved-word-upcase'." (if idlwave-reserved-word-upcase @@ -3801,7 +3801,7 @@ (defun idlwave-case () "Build skeleton IDL case statement." (interactive) - (idlwave-template + (idlwave-template (idlwave-rw-case "case") (idlwave-rw-case " of\n\nendcase") "Selector expression")) @@ -3809,7 +3809,7 @@ (defun idlwave-switch () "Build skeleton IDL switch statement." (interactive) - (idlwave-template + (idlwave-template (idlwave-rw-case "switch") (idlwave-rw-case " of\n\nendswitch") "Selector expression")) @@ -3817,7 +3817,7 @@ (defun idlwave-for () "Build skeleton for loop statment." (interactive) - (idlwave-template + (idlwave-template (idlwave-rw-case "for") (idlwave-rw-case " do begin\n\nendfor") "Loop expression")) @@ -3832,14 +3832,14 @@ (defun idlwave-procedure () (interactive) - (idlwave-template + (idlwave-template (idlwave-rw-case "pro") (idlwave-rw-case "\n\nreturn\nend") "Procedure name")) (defun idlwave-function () (interactive) - (idlwave-template + (idlwave-template (idlwave-rw-case "function") (idlwave-rw-case "\n\nreturn\nend") "Function name")) @@ -3853,7 +3853,7 @@ (defun idlwave-while () (interactive) - (idlwave-template + (idlwave-template (idlwave-rw-case "while") (idlwave-rw-case " do begin\n\nendwhile") "Entry condition")) @@ -3932,8 +3932,8 @@ (defun idlwave-count-outlawed-buffers (tag) "How many outlawed buffers have tag TAG?" (length (delq nil - (mapcar - (lambda (x) (eq (cdr x) tag)) + (mapcar + (lambda (x) (eq (cdr x) tag)) idlwave-outlawed-buffers)))) (defun idlwave-do-kill-autoloaded-buffers (&rest reasons) @@ -3947,9 +3947,9 @@ (memq (cdr entry) reasons)) (kill-buffer (car entry)) (incf cnt) - (setq idlwave-outlawed-buffers + (setq idlwave-outlawed-buffers (delq entry idlwave-outlawed-buffers))) - (setq idlwave-outlawed-buffers + (setq idlwave-outlawed-buffers (delq entry idlwave-outlawed-buffers)))) (message "%d buffer%s killed" cnt (if (= cnt 1) "" "s")))) @@ -3961,7 +3961,7 @@ (entry (assq buf idlwave-outlawed-buffers))) ;; Revoke license (if entry - (setq idlwave-outlawed-buffers + (setq idlwave-outlawed-buffers (delq entry idlwave-outlawed-buffers))) ;; Remove this function from the hook. (remove-hook 'after-save-hook 'idlwave-revoke-license-to-kill 'local))) @@ -3980,7 +3980,7 @@ (defun idlwave-expand-lib-file-name (file) ;; Find FILE on the scanned lib path and return a buffer visiting it ;; This is for, e.g., finding source with no user catalog - (cond + (cond ((null file) nil) ((file-name-absolute-p file) file) (t (idlwave-locate-lib-file file)))) @@ -3995,7 +3995,7 @@ (interactive) (let (directory directories cmd append status numdirs dir getsubdirs buffer save_buffer files numfiles item errbuf) - + ;; ;; Read list of directories (setq directory (read-string "Tag Directories: " ".")) @@ -4047,7 +4047,7 @@ (message "%s" (concat "Tagging " item "...")) (setq errbuf (get-buffer-create "*idltags-error*")) (setq status (+ status - (if (eq 0 (call-process + (if (eq 0 (call-process "sh" nil errbuf nil "-c" (concat cmd append item))) 0 @@ -4061,13 +4061,13 @@ (setq numfiles (1+ numfiles)) (setq item (nth numfiles files)) ))) - + (setq numdirs (1+ numdirs)) (setq dir (nth numdirs directories))) (progn (setq numdirs (1+ numdirs)) (setq dir (nth numdirs directories))))) - + (setq errbuf (get-buffer-create "*idltags-error*")) (if (= status 0) (kill-buffer errbuf)) @@ -4143,7 +4143,7 @@ ;; Make sure the hash functions are accessible. (if (or (not (fboundp 'gethash)) (not (fboundp 'puthash))) - (progn + (progn (require 'cl) (or (fboundp 'puthash) (defalias 'puthash 'cl-puthash)))) @@ -4162,7 +4162,7 @@ (null (cdr idlwave-sint-routines))) (loop for entry in entries for var = (car entry) for size = (nth 1 entry) - do (setcdr (symbol-value var) + do (setcdr (symbol-value var) (make-hash-table ':size size ':test 'equal))) (setq idlwave-sint-dirs nil idlwave-sint-libnames nil)) @@ -4172,7 +4172,7 @@ (null (car idlwave-sint-routines))) (loop for entry in entries for var = (car entry) for size = (nth 1 entry) - do (setcar (symbol-value var) + do (setcar (symbol-value var) (make-hash-table ':size size ':test 'equal)))))) (defun idlwave-sintern-routine-or-method (name &optional class set) @@ -4259,11 +4259,11 @@ (setq class (idlwave-sintern-class class set)) (setq name (idlwave-sintern-method name set))) (setq name (idlwave-sintern-routine name set))) - + ;; The source (let ((source-type (car source)) (source-file (nth 1 source)) - (source-dir (if default-dir + (source-dir (if default-dir (file-name-as-directory default-dir) (nth 2 source))) (source-lib (nth 3 source))) @@ -4272,7 +4272,7 @@ (if (stringp source-lib) (setq source-lib (idlwave-sintern-libname source-lib set))) (setq source (list source-type source-file source-dir source-lib))) - + ;; The keywords (setq kwds (mapcar (lambda (x) (idlwave-sintern-keyword-list x set)) @@ -4407,15 +4407,15 @@ (not (stringp idlwave-user-catalog-file)) (not (file-regular-p idlwave-user-catalog-file))) (error "No catalog has been produced yet")) - (let* ((emacs (expand-file-name (invocation-name) (invocation-directory))) + (let* ((emacs (concat invocation-directory invocation-name)) (args (list "-batch" "-l" (expand-file-name "~/.emacs") "-l" "idlwave" "-f" "idlwave-rescan-catalog-directories")) - (process (apply 'start-process "idlcat" + (process (apply 'start-process "idlcat" nil emacs args))) (setq idlwave-catalog-process process) - (set-process-sentinel + (set-process-sentinel process (lambda (pro why) (when (string-match "finished" why) @@ -4432,7 +4432,7 @@ ;; ("ROUTINE" type class ;; (system) | (lib pro_file dir "LIBNAME") | (user pro_file dir "USERLIB") | ;; (buffer pro_file dir) | (compiled pro_file dir) -;; "calling_string" ("HELPFILE" (("KWD1" . link1) ...)) +;; "calling_string" ("HELPFILE" (("KWD1" . link1) ...)) ;; ("HELPFILE2" (("KWD2" . link) ...)) ...) ;; ;; DIR will be supplied dynamically while loading library catalogs, @@ -4491,7 +4491,7 @@ ;; The override-idle means, even if the idle timer has done some ;; preparing work, load and renormalize everything anyway. (override-idle (or arg idlwave-buffer-case-takes-precedence))) - + (setq idlwave-buffer-routines nil idlwave-compiled-routines nil idlwave-unresolved-routines nil) @@ -4502,7 +4502,7 @@ (idlwave-reset-sintern (cond (load t) ((null idlwave-system-routines) t) (t 'bufsh)))) - + (if idlwave-buffer-case-takes-precedence ;; We can safely scan the buffer stuff first (progn @@ -4517,9 +4517,9 @@ (idlwave-shell-is-running))) (ask-shell (and shell-is-running idlwave-query-shell-for-routine-info))) - + ;; Load the library catalogs again, first re-scanning the path - (when arg + (when arg (if shell-is-running (idlwave-shell-send-command idlwave-shell-path-query '(progn @@ -4539,7 +4539,7 @@ ;; Therefore, we do a concatenation now, even though ;; the shell might do it again. (idlwave-concatenate-rinfo-lists nil 'run-hooks)) - + (when ask-shell ;; Ask the shell about the routines it knows of. (message "Querying the shell") @@ -4576,26 +4576,26 @@ ;; which, if necessary, will be re-created from the XML file on ;; disk. As a last fallback, load the (likely outdated) idlw-rinfo ;; file distributed with older IDLWAVE versions (<6.0) - (unless (and (load idlwave-xml-system-rinfo-converted-file + (unless (and (load idlwave-xml-system-rinfo-converted-file 'noerror 'nomessage) (idlwave-xml-system-routine-info-up-to-date)) ;; See if we can create it from XML source (condition-case nil (idlwave-convert-xml-system-routine-info) - (error - (unless (load idlwave-xml-system-rinfo-converted-file + (error + (unless (load idlwave-xml-system-rinfo-converted-file 'noerror 'nomessage) (if idlwave-system-routines - (message + (message "Failed to load converted routine info, using old conversion.") - (message + (message "Failed to convert XML routine info, falling back on idlw-rinfo.") (if (not (load "idlw-rinfo" 'noerror 'nomessage)) - (message + (message "Could not locate any system routine information.")))))))) (defun idlwave-xml-system-routine-info-up-to-date() - (let* ((dir (file-name-as-directory + (let* ((dir (file-name-as-directory (expand-file-name "help/online_help" (idlwave-sys-dir)))) (catalog-file (expand-file-name "idl_catalog.xml" dir))) (file-newer-than-file-p ;converted file is newer than catalog @@ -4610,15 +4610,15 @@ "Alist of system variables and their help files.") (defvar idlwave-help-special-topic-words nil) - + (defun idlwave-shorten-syntax (syntax name &optional class) ;; From a list of syntax statments, shorten with %s and group with "or" (let ((case-fold-search t)) - (mapconcat + (mapconcat (lambda (x) (while (string-match name x) (setq x (replace-match "%s" t t x))) - (if class + (if class (while (string-match class x) (setq x (replace-match "%s" t t x)))) x) @@ -4670,8 +4670,8 @@ (put 'set-props 'matched t) set-props) (t nil))) - (setq methods-entry - (nconc (idlwave-xml-create-rinfo-list pelem class extra-kwds) + (setq methods-entry + (nconc (idlwave-xml-create-rinfo-list pelem class extra-kwds) methods-entry))) (t))) (setq params (cdr params))) @@ -4681,12 +4681,12 @@ ; (message "Failed to match GetProperty in class %s" class)) ;(unless (get 'set-props 'matched) ; (message "Failed to match SetProperty in class %s" class)) - (setq class-entry - (if inherits + (setq class-entry + (if inherits (list class (append '(inherits) inherits) (list 'link link)) (list class (list 'link link)))) (cons class-entry methods-entry))) - + (defun idlwave-xml-create-rinfo-list (xml-entry &optional class extra-kws) ;; Create correctly structured list elements from ROUTINE or METHOD ;; XML list structures. Return a list of list elements, with more @@ -4722,8 +4722,8 @@ (setq kwd (cdr (assq 'name props)) klink (cdr (assq 'link props))) (if (string-match "^\\[XY\\(Z?\\)\\]" kwd) - (progn - (setq pref-list + (progn + (setq pref-list (if (match-string 1 kwd) '("X" "Y" "Z") '("X" "Y")) kwd (substring kwd (match-end 0))) (loop for x in pref-list do @@ -4732,7 +4732,7 @@ (t))); Do nothing for the others (setq params (cdr params))) - + ;; Debug ; (if (and (null (aref syntax-vec 0)) ; (null (aref syntax-vec 1)) @@ -4749,16 +4749,16 @@ (setq kwds (idlwave-rinfo-group-keywords kwds link)) (loop for idx from 0 to 1 do (if (aref syntax-vec idx) - (push (append (list name (if (eq idx 0) 'pro 'fun) + (push (append (list name (if (eq idx 0) 'pro 'fun) class '(system) - (idlwave-shorten-syntax + (idlwave-shorten-syntax (aref syntax-vec idx) name class)) kwds) result))) result))) (defun idlwave-rinfo-group-keywords (kwds master-link) - ;; Group keywords by link file, as a list with elements + ;; Group keywords by link file, as a list with elements ;; (linkfile ( ("KWD1" . link1) ("KWD2" . link2)) (let (kwd link anchor linkfiles block master-elt) (while kwds @@ -4777,7 +4777,7 @@ linkfiles (cons master-elt (delq master-elt linkfiles))) (push (list master-link) linkfiles)))) - + (defun idlwave-convert-xml-clean-statement-aliases (aliases) ;; Clean up the syntax of routines which are actually aliases by ;; removing the "OR" from the statements @@ -4790,7 +4790,7 @@ (defun idlwave-convert-xml-clean-routine-aliases (aliases) ;; Duplicate and trim original routine aliases from rinfo list - ;; This if for, e.g. OPENR/OPENW/OPENU + ;; This if for, e.g. OPENR/OPENW/OPENU (let (alias remove-list new parts all-parts) (loop for x in aliases do (when (setq parts (split-string (cdr x) "/")) @@ -4799,7 +4799,7 @@ (setq new (cons (cdr x) parts)) (push new all-parts)) (setcdr new (delete (car x) (cdr new))))) - + ;; Add any missing aliases (separate by slashes) (loop for x in all-parts do (if (cdr x) @@ -4843,7 +4843,7 @@ props (car (cdr pelem))) (cond ((eq ptype 'FIELD) - (push (cons (cdr (assq 'name props)) + (push (cons (cdr (assq 'name props)) (cdr (idlwave-split-link-target (cdr (assq 'link props))))) tags)))) @@ -4857,10 +4857,10 @@ (defun idlwave-save-routine-info () (if idlwave-xml-routine-info-file (with-temp-file idlwave-xml-system-rinfo-converted-file - (insert + (insert (concat ";; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* -;; IDLWAVE Routine Information File (IDLWAVE version " idlwave-mode-version ") -;; Automatically generated from source file: +;; IDLWAVE Routine Information File (IDLWAVE version " idlwave-mode-version ") +;; Automatically generated from source file: ;; " idlwave-xml-routine-info-file " ;; on " (current-time-string) " ;; Do not edit.")) @@ -4886,11 +4886,11 @@ "Convert XML supplied IDL routine info into internal form. Cache to disk for quick recovery." (interactive) - (let* ((dir (file-name-as-directory + (let* ((dir (file-name-as-directory (expand-file-name "help/online_help" (idlwave-sys-dir)))) (catalog-file (expand-file-name "idl_catalog.xml" dir)) (elem-cnt 0) - props rinfo msg-cnt elem type nelem class-result alias + props rinfo msg-cnt elem type nelem class-result alias routines routine-aliases statement-aliases sysvar-aliases buf version-string) (if (not (file-exists-p catalog-file)) @@ -4898,7 +4898,7 @@ (if (not (file-readable-p catalog-file)) (error "Cannot read XML routine info file: %s" catalog-file))) (require 'xml) - (message "Reading XML routine info...") + (message "Reading XML routine info...") (unwind-protect (progn ;; avoid warnings about read-only files @@ -4909,13 +4909,13 @@ (setq rinfo (assq 'CATALOG rinfo)) (unless rinfo (error "Failed to parse XML routine info")) ;;(setq rinfo (car rinfo)) ; Skip the catalog stuff. - + (setq version-string (cdr (assq 'version (nth 1 rinfo))) rinfo (cddr rinfo)) (setq nelem (length rinfo) msg-cnt (/ nelem 20)) - + (setq idlwave-xml-routine-info-file nil) (message "Converting XML routine info...") (setq idlwave-system-routines nil @@ -4932,12 +4932,12 @@ (setq type (car elem) props (car (cdr elem))) (if (= (mod elem-cnt msg-cnt) 0) - (message "Converting XML routine info...%2d%%" + (message "Converting XML routine info...%2d%%" (/ (* elem-cnt 100) nelem))) - (cond + (cond ((eq type 'ROUTINE) (if (setq alias (assq 'alias_to props)) - (push (cons (cdr (assq 'name props)) (cdr alias)) + (push (cons (cdr (assq 'name props)) (cdr alias)) routine-aliases) (setq routines (idlwave-xml-create-rinfo-list elem)) (if (listp (cdr routines)) @@ -4945,7 +4945,7 @@ (nconc idlwave-system-routines routines)) ;; a cons cell is an executive commands (push routines idlwave-executive-commands-alist)))) - + ((eq type 'CLASS) (setq class-result (idlwave-xml-create-class-method-lists elem)) (push (car class-result) idlwave-system-class-info) @@ -4963,10 +4963,10 @@ ((eq type 'SYSVAR) (if (setq alias (cdr (assq 'alias_to props))) - (push (cons (substring (cdr (assq 'name props)) 1) + (push (cons (substring (cdr (assq 'name props)) 1) (substring alias 1)) sysvar-aliases) - (push (idlwave-xml-create-sysvar-alist elem) + (push (idlwave-xml-create-sysvar-alist elem) idlwave-system-variables-alist))) (t)))) (idlwave-convert-xml-clean-routine-aliases routine-aliases) @@ -4976,12 +4976,12 @@ (setq idlwave-xml-routine-info-file catalog-file) (idlwave-save-routine-info) (message "Converting XML routine info...done"))) - - + + ;; ("ROUTINE" type class ;; (system) | (lib pro_file dir "LIBNAME") | (user pro_file dir "USERLIB") | ;; (buffer pro_file dir) | (compiled pro_file dir) -;; "calling_string" ("HELPFILE" (("KWD1" . link1) ...)) +;; "calling_string" ("HELPFILE" (("KWD1" . link1) ...)) ;; ("HELPFILE2" (("KWD2" . link) ...)) ...) @@ -4996,7 +4996,7 @@ (message "Loading system routine info in idle time...done") (aset arr 0 t) (throw 'exit t)) - + (when (not (aref arr 1)) (message "Normalizing idlwave-system-routines in idle time...") (idlwave-reset-sintern t) @@ -5021,7 +5021,7 @@ (progn (setq idlwave-library-routines nil) (ding) - (message "Outdated user catalog: %s... recreate" + (message "Outdated user catalog: %s... recreate" idlwave-user-catalog-file)) (message "Loading user catalog in idle time...done"))) (aset arr 2 t) @@ -5030,16 +5030,16 @@ (when (not (aref arr 3)) (when idlwave-user-catalog-routines (message "Normalizing user catalog routines in idle time...") - (setq idlwave-user-catalog-routines + (setq idlwave-user-catalog-routines (idlwave-sintern-rinfo-list idlwave-user-catalog-routines 'sys)) - (message + (message "Normalizing user catalog routines in idle time...done")) (aset arr 3 t) (throw 'exit t)) (when (not (aref arr 4)) - (idlwave-scan-library-catalogs + (idlwave-scan-library-catalogs "Loading and normalizing library catalogs in idle time...") (aset arr 4 t) (throw 'exit t)) @@ -5047,7 +5047,7 @@ (message "Finishing initialization in idle time...") (idlwave-routines) (message "Finishing initialization in idle time...done") - (aset arr 5 t) + (aset arr 5 t) (throw 'exit nil))) ;; restart the timer (if (sit-for 1) @@ -5082,17 +5082,17 @@ (when (or force (not (aref idlwave-load-rinfo-steps-done 2))) (load-file idlwave-user-catalog-file)) (error nil)) - (when (and + (when (and (boundp 'idlwave-library-routines) idlwave-library-routines) (setq idlwave-library-routines nil) - (error "Outdated user catalog: %s... recreate" + (error "Outdated user catalog: %s... recreate" idlwave-user-catalog-file)) (setq idlwave-true-path-alist nil) (when (or force (not (aref idlwave-load-rinfo-steps-done 3))) (message "Normalizing user catalog routines...") - (setq idlwave-user-catalog-routines - (idlwave-sintern-rinfo-list + (setq idlwave-user-catalog-routines + (idlwave-sintern-rinfo-list idlwave-user-catalog-routines 'sys)) (message "Normalizing user catalog routines...done"))) @@ -5105,11 +5105,11 @@ (defun idlwave-update-buffer-routine-info () (let (res) - (cond + (cond ((eq idlwave-scan-all-buffers-for-routine-info t) ;; Scan all buffers, current buffer last (message "Scanning all buffers...") - (setq res (idlwave-get-routine-info-from-buffers + (setq res (idlwave-get-routine-info-from-buffers (reverse (buffer-list))))) ((null idlwave-scan-all-buffers-for-routine-info) ;; Don't scan any buffers @@ -5122,12 +5122,12 @@ (setq res (idlwave-get-routine-info-from-buffers (list (current-buffer)))))))) ;; Put the result into the correct variable - (setq idlwave-buffer-routines + (setq idlwave-buffer-routines (idlwave-sintern-rinfo-list res 'set)))) (defun idlwave-concatenate-rinfo-lists (&optional quiet run-hook) "Put the different sources for routine information together." - ;; The sequence here is important because earlier definitions shadow + ;; The sequence here is important because earlier definitions shadow ;; later ones. We assume that if things in the buffers are newer ;; then in the shell of the system, they are meant to be different. (setcdr idlwave-last-system-routine-info-cons-cell @@ -5139,7 +5139,7 @@ ;; Give a message with information about the number of routines we have. (unless quiet - (message + (message "Routines Found: buffer(%d) compiled(%d) library(%d) user(%d) system(%d)" (length idlwave-buffer-routines) (length idlwave-compiled-routines) @@ -5157,7 +5157,7 @@ (when (and (setq class (nth 2 x)) (not (assq class idlwave-class-alist))) (push (list class) idlwave-class-alist))) - idlwave-class-alist))) + idlwave-class-alist))) ;; Three functions for the hooks (defun idlwave-save-buffer-update () @@ -5190,7 +5190,7 @@ (defun idlwave-replace-buffer-routine-info (file new) "Cut the part from FILE out of `idlwave-buffer-routines' and add NEW." - (let ((list idlwave-buffer-routines) + (let ((list idlwave-buffer-routines) found) (while list ;; The following test uses eq to make sure it works correctly @@ -5201,7 +5201,7 @@ (setcar list nil) (setq found t)) (if found - ;; End of that section reached. Jump. + ;; End of that section reached. Jump. (setq list nil))) (setq list (cdr list))) (setq idlwave-buffer-routines @@ -5233,11 +5233,11 @@ (save-restriction (widen) (goto-char (point-min)) - (while (re-search-forward + (while (re-search-forward "^[ \t]*\\(pro\\|function\\)[ \t]" nil t) (setq string (buffer-substring-no-properties (match-beginning 0) - (progn + (progn (idlwave-end-of-statement) (point)))) (setq entry (idlwave-parse-definition string)) @@ -5275,7 +5275,7 @@ (push (match-string 1 string) args))) ;; Normalize and sort. (setq args (nreverse args)) - (setq keywords (sort keywords (lambda (a b) + (setq keywords (sort keywords (lambda (a b) (string< (downcase a) (downcase b))))) ;; Make and return the entry ;; We don't know which argument are optional, so this information @@ -5285,7 +5285,7 @@ class (cond ((not (boundp 'idlwave-scanning-lib)) (list 'buffer (buffer-file-name))) -; ((string= (downcase +; ((string= (downcase ; (file-name-sans-extension ; (file-name-nondirectory (buffer-file-name)))) ; (downcase name)) @@ -5293,7 +5293,7 @@ ; (t (cons 'lib (file-name-nondirectory (buffer-file-name)))) (t (list 'user (file-name-nondirectory (buffer-file-name)) idlwave-scanning-lib-dir "UserLib"))) - (concat + (concat (if (string= type "function") "Result = " "") (if class "Obj ->[%s::]" "") "%s" @@ -5339,10 +5339,10 @@ (> (length idlwave-user-catalog-file) 0) (file-accessible-directory-p (file-name-directory idlwave-user-catalog-file)) - (not (string= "" (file-name-nondirectory + (not (string= "" (file-name-nondirectory idlwave-user-catalog-file)))) (error "`idlwave-user-catalog-file' does not point to a file in an accessible directory")) - + (cond ;; Rescan the known directories ((and arg idlwave-path-alist @@ -5352,13 +5352,13 @@ ;; Expand the directories from library-path and run the widget (idlwave-library-path (idlwave-display-user-catalog-widget - (if idlwave-true-path-alist + (if idlwave-true-path-alist ;; Propagate any flags on the existing path-alist (mapcar (lambda (x) (let ((path-entry (assoc (file-truename x) idlwave-true-path-alist))) (if path-entry - (cons x (cdr path-entry)) + (cons x (cdr path-entry)) (list x)))) (idlwave-expand-path idlwave-library-path)) (mapcar 'list (idlwave-expand-path idlwave-library-path))))) @@ -5383,7 +5383,7 @@ (idlwave-scan-library-catalogs "Locating library catalogs..." 'no-load) (idlwave-display-user-catalog-widget idlwave-path-alist))) -(defconst idlwave-user-catalog-widget-help-string +(defconst idlwave-user-catalog-widget-help-string "This is the front-end to the creation of the IDLWAVE user catalog. Please select the directories on IDL's search path from which you would like to extract routine information, to be stored in the file: @@ -5418,7 +5418,7 @@ (make-local-variable 'idlwave-widget) (widget-insert (format idlwave-user-catalog-widget-help-string idlwave-user-catalog-file)) - + (widget-create 'push-button :notify 'idlwave-widget-scan-user-lib-files "Scan & Save") @@ -5428,7 +5428,7 @@ "Delete File") (widget-insert " ") (widget-create 'push-button - :notify + :notify '(lambda (&rest ignore) (let ((path-list (widget-get idlwave-widget :path-dirs))) (mapcar (lambda (x) @@ -5439,7 +5439,7 @@ "Select All Non-Lib") (widget-insert " ") (widget-create 'push-button - :notify + :notify '(lambda (&rest ignore) (let ((path-list (widget-get idlwave-widget :path-dirs))) (mapcar (lambda (x) @@ -5455,18 +5455,18 @@ (widget-insert "\n\n") (widget-insert "Select Directories: \n") - + (setq idlwave-widget (apply 'widget-create 'checklist - :value (delq nil (mapcar (lambda (x) - (if (memq 'user (cdr x)) + :value (delq nil (mapcar (lambda (x) + (if (memq 'user (cdr x)) (car x))) dirs-list)) :greedy t :tag "List of directories" - (mapcar (lambda (x) - (list 'item + (mapcar (lambda (x) + (list 'item (if (memq 'lib (cdr x)) (concat "[LIB] " (car x) ) (car x)))) dirs-list))) @@ -5476,7 +5476,7 @@ (widget-setup) (goto-char (point-min)) (delete-other-windows)) - + (defun idlwave-delete-user-catalog-file (&rest ignore) (if (yes-or-no-p (format "Delete file %s " idlwave-user-catalog-file)) @@ -5492,7 +5492,7 @@ (this-path-alist path-alist) dir-entry) (while (setq dir-entry (pop this-path-alist)) - (if (member + (if (member (if (memq 'lib (cdr dir-entry)) (concat "[LIB] " (car dir-entry)) (car dir-entry)) @@ -5589,7 +5589,7 @@ ;; Define the variable which knows the value of "!DIR" (insert (format "\n(setq idlwave-system-directory \"%s\")\n" idlwave-system-directory)) - + ;; Define the variable which contains a list of all scanned directories (insert "\n(setq idlwave-path-alist\n '(") (let ((standard-output (current-buffer))) @@ -5629,7 +5629,7 @@ (when (file-directory-p dir) (setq files (nreverse (directory-files dir t "[^.]"))) (while (setq file (pop files)) - (if (file-directory-p file) + (if (file-directory-p file) (push (file-name-as-directory file) path))) (push dir path1))) path1)) @@ -5641,7 +5641,7 @@ (defun idlwave-scan-library-catalogs (&optional message-base no-load) - "Scan for library catalog files (.idlwave_catalog) and ingest. + "Scan for library catalog files (.idlwave_catalog) and ingest. All directories on `idlwave-path-alist' (or `idlwave-library-path' instead, if present) are searched. Print MESSAGE-BASE along with the @@ -5649,7 +5649,7 @@ NO-LOAD is non-nil. The variable `idlwave-use-library-catalogs' can be set to nil to disable library catalog scanning." (when idlwave-use-library-catalogs - (let ((dirs + (let ((dirs (if idlwave-library-path (idlwave-expand-path idlwave-library-path) (mapcar 'car idlwave-path-alist))) @@ -5658,7 +5658,7 @@ (if message-base (message message-base)) (while (setq dir (pop dirs)) (catch 'continue - (when (file-readable-p + (when (file-readable-p (setq catalog (expand-file-name ".idlwave_catalog" dir))) (unless no-load (setq idlwave-library-catalog-routines nil) @@ -5666,20 +5666,20 @@ (condition-case nil (load catalog t t t) (error (throw 'continue t))) - (when (and - message-base - (not (string= idlwave-library-catalog-libname + (when (and + message-base + (not (string= idlwave-library-catalog-libname old-libname))) - (message "%s" (concat message-base + (message "%s" (concat message-base idlwave-library-catalog-libname)) (setq old-libname idlwave-library-catalog-libname)) (when idlwave-library-catalog-routines (setq all-routines - (append + (append (idlwave-sintern-rinfo-list idlwave-library-catalog-routines 'sys dir) all-routines)))) - + ;; Add a 'lib flag if on path-alist (when (and idlwave-path-alist (setq dir-entry (assoc dir idlwave-path-alist))) @@ -5690,7 +5690,7 @@ ;;----- Communicating with the Shell ------------------- ;; First, here is the idl program which can be used to query IDL for -;; defined routines. +;; defined routines. (defconst idlwave-routine-info.pro " ;; START OF IDLWAVE SUPPORT ROUTINES @@ -5708,10 +5708,10 @@ pro idlwave_print_info_entry,name,func=func,separator=sep ;; See if it's an object method if name eq '' then return - func = keyword_set(func) + func = keyword_set(func) methsep = strpos(name,'::') meth = methsep ne -1 - + ;; Get routine info pars = routine_info(name,/parameters,functions=func) source = routine_info(name,/source,functions=func) @@ -5719,12 +5719,12 @@ nkw = pars.num_kw_args if nargs gt 0 then args = pars.args if nkw gt 0 then kwargs = pars.kw_args - + ;; Trim the class, and make the name - if meth then begin + if meth then begin class = strmid(name,0,methsep) name = strmid(name,methsep+2,strlen(name)-1) - if nargs gt 0 then begin + if nargs gt 0 then begin ;; remove the self argument wh = where(args ne 'SELF',nargs) if nargs gt 0 then args = args[wh] @@ -5733,7 +5733,7 @@ ;; No class, just a normal routine. class = \"\" endelse - + ;; Calling sequence cs = \"\" if func then cs = 'Result = ' @@ -5754,9 +5754,9 @@ kwstring = kwstring + ' ' + kwargs[j] endfor endif - + ret=(['IDLWAVE-PRO','IDLWAVE-FUN'])[func] - + print,ret + ': ' + name + sep + class + sep + source[0].path $ + sep + cs + sep + kwstring end @@ -5768,19 +5768,19 @@ all = routine_info() fileQ=n_elements(file) ne 0 if fileQ then file=strtrim(file,2) - for i=0L,n_elements(all)-1L do begin - if fileQ then begin + for i=0L,n_elements(all)-1L do begin + if fileQ then begin if (routine_info(all[i],/SOURCE)).path eq file then $ idlwave_print_info_entry,all[i],separator=sep endif else idlwave_print_info_entry,all[i],separator=sep - endfor + endfor all = routine_info(/functions) - for i=0L,n_elements(all)-1L do begin - if fileQ then begin + for i=0L,n_elements(all)-1L do begin + if fileQ then begin if (routine_info(all[i],/FUNCTIONS,/SOURCE)).path eq file then $ idlwave_print_info_entry,all[i],separator=sep,/FUNC endif else idlwave_print_info_entry,all[i],separator=sep,/FUNC - endfor + endfor print,'>>>END OF IDLWAVE ROUTINE INFO' end @@ -5806,7 +5806,7 @@ if res then print,'IDLWAVE-CLASS-TAGS: '+class+' '+strjoin(tags,' ',/single) end ;; END OF IDLWAVE SUPPORT ROUTINES -" +" "The idl programs to get info from the shell.") (defvar idlwave-idlwave_routine_info-compiled nil @@ -5824,11 +5824,11 @@ (erase-buffer) (insert idlwave-routine-info.pro) (save-buffer 0)) - (idlwave-shell-send-command + (idlwave-shell-send-command (concat ".run \"" idlwave-shell-temp-pro-file "\"") nil 'hide wait) (idlwave-shell-send-command - (format "save,'idlwave_print_safe','idlwave_routine_info','idlwave_print_info_entry','idlwave_get_class_tags','idlwave_get_sysvars',FILE='%s',/ROUTINES" + (format "save,'idlwave_print_safe','idlwave_routine_info','idlwave_print_info_entry','idlwave_get_class_tags','idlwave_get_sysvars',FILE='%s',/ROUTINES" (idlwave-shell-temp-file 'rinfo)) nil 'hide) (setq idlwave-idlwave_routine_info-compiled t)) @@ -5929,7 +5929,7 @@ (completion-regexp-list (if (equal arg '(16)) (list (read-string (concat "Completion Regexp: ")))))) - + (if (and module (string-match "::" module)) (setq class (substring module 0 (match-beginning 0)) module (substring module (match-end 0)))) @@ -5950,7 +5950,7 @@ ;; Check for any special completion functions ((and idlwave-complete-special (idlwave-call-special idlwave-complete-special))) - + ((null what) (error "Nothing to complete here")) @@ -5967,7 +5967,7 @@ (idlwave-all-class-inherits class-selector))) (isa (concat "procedure" (if class-selector "-method" ""))) (type-selector 'pro)) - (setq idlwave-completion-help-info + (setq idlwave-completion-help-info (list 'routine nil type-selector class-selector nil super-classes)) (idlwave-complete-in-buffer 'procedure (if class-selector 'method 'routine) @@ -5975,8 +5975,8 @@ (format "Select a %s name%s" isa (if class-selector - (format " (class is %s)" - (if (eq class-selector t) + (format " (class is %s)" + (if (eq class-selector t) "unknown" class-selector)) "")) isa @@ -5990,7 +5990,7 @@ (idlwave-all-class-inherits class-selector))) (isa (concat "function" (if class-selector "-method" ""))) (type-selector 'fun)) - (setq idlwave-completion-help-info + (setq idlwave-completion-help-info (list 'routine nil type-selector class-selector nil super-classes)) (idlwave-complete-in-buffer 'function (if class-selector 'method 'routine) @@ -5998,7 +5998,7 @@ (format "Select a %s name%s" isa (if class-selector - (format " (class is %s)" + (format " (class is %s)" (if (eq class-selector t) "unknown" class-selector)) "")) @@ -6026,18 +6026,18 @@ (unless (or entry (eq class t)) (error "Nothing known about procedure %s" (idlwave-make-full-name class name))) - (setq list (idlwave-fix-keywords name 'pro class list + (setq list (idlwave-fix-keywords name 'pro class list super-classes system)) (unless list (error "No keywords available for procedure %s" (idlwave-make-full-name class name))) - (setq idlwave-completion-help-info + (setq idlwave-completion-help-info (list 'keyword name type-selector class-selector entry super-classes)) (idlwave-complete-in-buffer 'keyword 'keyword list nil (format "Select keyword for procedure %s%s" (idlwave-make-full-name class name) (if (or (member '("_EXTRA") list) - (member '("_REF_EXTRA") list)) + (member '("_REF_EXTRA") list)) " (note _EXTRA)" "")) isa 'idlwave-attach-keyword-classes))) @@ -6060,7 +6060,7 @@ (unless (or entry (eq class t)) (error "Nothing known about function %s" (idlwave-make-full-name class name))) - (setq list (idlwave-fix-keywords name 'fun class list + (setq list (idlwave-fix-keywords name 'fun class list super-classes system)) ;; OBJ_NEW: Messages mention the proper Init method (setq msg-name (if (and (null class) @@ -6070,13 +6070,13 @@ (idlwave-make-full-name class name))) (unless list (error "No keywords available for function %s" msg-name)) - (setq idlwave-completion-help-info + (setq idlwave-completion-help-info (list 'keyword name type-selector class-selector nil super-classes)) (idlwave-complete-in-buffer 'keyword 'keyword list nil (format "Select keyword for function %s%s" msg-name (if (or (member '("_EXTRA") list) - (member '("_REF_EXTRA") list)) + (member '("_REF_EXTRA") list)) " (note _EXTRA)" "")) isa 'idlwave-attach-keyword-classes))) @@ -6114,10 +6114,10 @@ ("class"))) (module (idlwave-sintern-routine-or-method module class)) (class (idlwave-sintern-class class)) - (what (cond + (what (cond ((equal what 0) (setq what - (intern (completing-read + (intern (completing-read "Complete what? " what-list nil t)))) ((integerp what) (setq what (intern (car (nth (1- what) what-list))))) @@ -6139,7 +6139,7 @@ (super-classes nil) (type-selector 'pro) (pro (or module - (idlwave-completing-read + (idlwave-completing-read "Procedure: " (idlwave-routines) 'idlwave-selector)))) (setq pro (idlwave-sintern-routine pro)) (list nil-list nil-list 'procedure-keyword @@ -6153,7 +6153,7 @@ (super-classes nil) (type-selector 'fun) (func (or module - (idlwave-completing-read + (idlwave-completing-read "Function: " (idlwave-routines) 'idlwave-selector)))) (setq func (idlwave-sintern-routine func)) (list nil-list nil-list 'function-keyword @@ -6193,7 +6193,7 @@ ((eq what 'class) (list nil-list nil-list 'class nil-list nil)) - + (t (error "Invalid value for WHAT"))))) (defun idlwave-completing-read (&rest args) @@ -6216,7 +6216,7 @@ (stringp idlwave-shell-default-directory) (file-directory-p idlwave-shell-default-directory)) idlwave-shell-default-directory - default-directory))) + default-directory))) (comint-dynamic-complete-filename))) (defun idlwave-make-full-name (class name) @@ -6225,7 +6225,7 @@ (defun idlwave-rinfo-assoc (name type class list) "Like `idlwave-rinfo-assq', but sintern strings first." - (idlwave-rinfo-assq + (idlwave-rinfo-assq (idlwave-sintern-routine-or-method name class) type (idlwave-sintern-class class) list)) @@ -6249,7 +6249,7 @@ (setq classes nil))) rtn)) -(defun idlwave-best-rinfo-assq (name type class list &optional with-file +(defun idlwave-best-rinfo-assq (name type class list &optional with-file keep-system) "Like `idlwave-rinfo-assq', but get all twins and sort, then return first. If WITH-FILE is passed, find the best rinfo entry with a file @@ -6274,7 +6274,7 @@ twins))))) (car twins))) -(defun idlwave-best-rinfo-assoc (name type class list &optional with-file +(defun idlwave-best-rinfo-assoc (name type class list &optional with-file keep-system) "Like `idlwave-best-rinfo-assq', but sintern strings first." (idlwave-best-rinfo-assq @@ -6365,7 +6365,7 @@ Must accept two arguments: `apos' and `info'") (defun idlwave-determine-class (info type) - ;; Determine the class of a routine call. + ;; Determine the class of a routine call. ;; INFO is the `cw-list' structure as returned by idlwave-where. ;; The second element in this structure is the class. When nil, we ;; return nil. When t, try to get the class from text properties at @@ -6385,7 +6385,7 @@ (dassoc (cdr dassoc)) (t t))) (arrow (and apos (string= (buffer-substring apos (+ 2 apos)) "->"))) - (is-self + (is-self (and arrow (save-excursion (goto-char apos) (forward-word -1) @@ -6406,19 +6406,19 @@ (setq class (or (nth 2 (idlwave-current-routine)) class))) ;; Before prompting, try any special class determination routines - (when (and (eq t class) + (when (and (eq t class) idlwave-determine-class-special (not force-query)) - (setq special-class + (setq special-class (idlwave-call-special idlwave-determine-class-special apos)) - (if special-class + (if special-class (setq class (idlwave-sintern-class special-class) store idlwave-store-inquired-class))) - + ;; Prompt for a class, if we need to (when (and (eq class t) (or force-query query)) - (setq class-alist + (setq class-alist (mapcar 'list (idlwave-all-method-classes (car info) type))) (setq class (idlwave-sintern-class @@ -6427,9 +6427,9 @@ (error "No classes available with method %s" (car info))) ((and (= (length class-alist) 1) (not force-query)) (car (car class-alist))) - (t + (t (setq store idlwave-store-inquired-class) - (idlwave-completing-read + (idlwave-completing-read (format "Class%s: " (if (stringp (car info)) (format " for %s method %s" type (car info)) @@ -6441,9 +6441,9 @@ ;; We have a real class here (when (and store arrow) (condition-case () - (add-text-properties - apos (+ apos 2) - `(idlwave-class ,class face ,idlwave-class-arrow-face + (add-text-properties + apos (+ apos 2) + `(idlwave-class ,class face ,idlwave-class-arrow-face rear-nonsticky t)) (error nil))) (setf (nth 2 info) class)) @@ -6471,14 +6471,14 @@ (defun idlwave-where () - "Find out where we are. + "Find out where we are. The return value is a list with the following stuff: \(PRO-LIST FUNC-LIST COMPLETE-WHAT CW-LIST LAST-CHAR) PRO-LIST (PRO POINT CLASS ARROW) FUNC-LIST (FUNC POINT CLASS ARROW) COMPLETE-WHAT a symbol indicating what kind of completion makes sense here -CW-LIST (PRO-OR-FUNC POINT CLASS ARROW) Like PRO-LIST, for what can +CW-LIST (PRO-OR-FUNC POINT CLASS ARROW) Like PRO-LIST, for what can be completed here. LAST-CHAR last relevant character before point (non-white non-comment, not part of current identifier or leading slash). @@ -6490,7 +6490,7 @@ CLASS: What class has the routine (nil=no, t=is method, but class unknown) ARROW: Location of the arrow" (idlwave-routines) - (let* (;(bos (save-excursion (idlwave-beginning-of-statement) (point))) + (let* (;(bos (save-excursion (idlwave-beginning-of-statement) (point))) (bos (save-excursion (idlwave-start-of-substatement 'pre) (point))) (func-entry (idlwave-what-function bos)) (func (car func-entry)) @@ -6512,8 +6512,8 @@ ((string-match "\\`[ \t]*\\(pro\\|function\\)[ \t]+[a-zA-Z0-9_]*\\'" match-string) (setq cw 'class)) - ((string-match - "\\`[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)?\\'" + ((string-match + "\\`[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)?\\'" (if (> pro-point 0) (buffer-substring pro-point (point)) match-string)) @@ -6524,11 +6524,11 @@ nil) ((string-match "OBJ_NEW([ \t]*['\"]\\([a-zA-Z0-9$_]*\\)?\\'" match-string) - (setq cw 'class)) + (setq cw 'class)) ((string-match "\\<inherits\\s-+\\([a-zA-Z0-9$_]*\\)?\\'" match-string) - (setq cw 'class)) - ((and func + (setq cw 'class)) + ((and func (> func-point pro-point) (= func-level 1) (memq last-char '(?\( ?,))) @@ -6574,7 +6574,7 @@ ;; searches to this point. (catch 'exit - (let (pos + (let (pos func-point (cnt 0) func arrow-start class) @@ -6589,18 +6589,18 @@ (setq pos (point)) (incf cnt) (when (and (= (following-char) ?\() - (re-search-backward + (re-search-backward "\\(::\\|\\<\\)\\([a-zA-Z][a-zA-Z0-9$_]*\\)[ \t]*\\=" bound t)) (setq func (match-string 2) func-point (goto-char (match-beginning 2)) pos func-point) - (if (re-search-backward + (if (re-search-backward "->[ \t]*\\(\\([a-zA-Z][a-zA-Z0-9$_]*\\)::\\)?\\=" bound t) (setq arrow-start (copy-marker (match-beginning 0)) class (or (match-string 2) t))) - (throw - 'exit + (throw + 'exit (list (idlwave-sintern-routine-or-method func class) (idlwave-sintern-class class) @@ -6616,18 +6616,18 @@ ;; searches to this point. (let ((pos (point)) pro-point pro class arrow-start string) - (save-excursion + (save-excursion ;;(idlwave-beginning-of-statement) (idlwave-start-of-substatement 'pre) (setq string (buffer-substring (point) pos)) - (if (string-match + (if (string-match "\\`[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)[ \t]*\\(,\\|\\'\\)" string) (setq pro (match-string 1 string) pro-point (+ (point) (match-beginning 1))) (if (and (idlwave-skip-object) (setq string (buffer-substring (point) pos)) - (string-match - "\\`[ \t]*\\(->\\)[ \t]*\\(\\([a-zA-Z][a-zA-Z0-9$_]*\\)::\\)?\\([a-zA-Z][a-zA-Z0-9$_]*\\)?[ \t]*\\(,\\|\\(\\$\\s *\\(;.*\\)?\\)?$\\)" + (string-match + "\\`[ \t]*\\(->\\)[ \t]*\\(\\([a-zA-Z][a-zA-Z0-9$_]*\\)::\\)?\\([a-zA-Z][a-zA-Z0-9$_]*\\)?[ \t]*\\(,\\|\\(\\$\\s *\\(;.*\\)?\\)?$\\)" string)) (setq pro (if (match-beginning 4) (match-string 4 string)) @@ -6671,7 +6671,7 @@ (throw 'exit nil)))) (goto-char pos) nil))) - + (defun idlwave-last-valid-char () "Return the last character before point which is not white or a comment and also not part of the current identifier. Since we do this in @@ -6761,23 +6761,23 @@ ((or (eq completion t) (and (= 1 (length (setq all-completions (idlwave-uniquify - (all-completions part list - (or special-selector + (all-completions part list + (or special-selector selector)))))) (equal dpart dcompletion))) ;; This is already complete (idlwave-after-successful-completion type slash beg) (message "%s is already the complete %s" part isa) nil) - (t + (t ;; We cannot add something - offer a list. (message "Making completion list...") - + (unless idlwave-completion-help-links ; already set somewhere? (mapcar (lambda (x) ; Pass link prop through to highlight-linked (let ((link (get-text-property 0 'link (car x)))) (if link - (push (cons (car x) link) + (push (cons (car x) link) idlwave-completion-help-links)))) list)) (let* ((list all-completions) @@ -6787,7 +6787,7 @@ ; (completion-fixup-function ; Emacs ; (lambda () (and (eq (preceding-char) ?>) ; (re-search-backward " <" beg t))))) - + (setq list (sort list (lambda (a b) (string< (downcase a) (downcase b))))) (if prepare-display-function @@ -6797,7 +6797,7 @@ idlwave-complete-empty-string-as-lower-case) (not idlwave-completion-force-default-case)) (setq list (mapcar (lambda (x) - (if (listp x) + (if (listp x) (setcar x (downcase (car x))) (setq x (downcase x))) x) @@ -6817,19 +6817,19 @@ (re-search-backward "\\<\\(pro\\|function\\)[ \t]+\\=" (- (point) 15) t) (goto-char (point-min)) - (re-search-forward + (re-search-forward "^[ \t]*\\(pro\\|function\\)[ \t]+\\([a-zA-Z0-9_]+::\\)" nil t)))) ;; Yank the full class specification (insert (match-string 2)) ;; Do the completion, using list gathered from `idlwave-routines' - (idlwave-complete-in-buffer - 'class 'class (idlwave-class-alist) nil + (idlwave-complete-in-buffer + 'class 'class (idlwave-class-alist) nil "Select a class" "class" '(lambda (list) ;; Push it to help-links if system help available (mapcar (lambda (x) (let* ((entry (idlwave-class-info x)) (link (nth 1 (assq 'link entry)))) - (if link (push (cons x link) + (if link (push (cons x link) idlwave-completion-help-links)) x)) list))))) @@ -6841,7 +6841,7 @@ ;; SHOW-CLASSES is the value of `idlwave-completion-show-classes'. (if (or (null show-classes) ; don't want to see classes (null class-selector) ; not a method call - (and + (and (stringp class-selector) ; the class is already known (not super-classes))) ; no possibilities for inheritance ;; In these cases, we do not have to do anything @@ -6856,13 +6856,13 @@ (max (abs show-classes)) (lmax (if do-dots (apply 'max (mapcar 'length list)))) classes nclasses class-info space) - (mapcar + (mapcar (lambda (x) ;; get the classes (if (eq type 'class-tag) ;; Just one class for tags (setq classes - (list + (list (idlwave-class-or-superclass-with-tag class-selector x))) ;; Multiple classes for method or method-keyword (setq classes @@ -6871,7 +6871,7 @@ method-selector x type-selector) (idlwave-all-method-classes x type-selector))) (if inherit - (setq classes + (setq classes (delq nil (mapcar (lambda (x) (if (memq x inherit) x nil)) classes))))) @@ -6908,7 +6908,7 @@ (defun idlwave-attach-class-tag-classes (list) ;; Call idlwave-attach-classes with class structure tags (idlwave-attach-classes list 'class-tag idlwave-completion-show-classes)) - + ;;---------------------------------------------------------------------- ;;---------------------------------------------------------------------- @@ -6929,7 +6929,7 @@ ((= 1 (length list)) (setq rtn (car list))) ((featurep 'xemacs) - (if sort (setq list (sort list (lambda (a b) + (if sort (setq list (sort list (lambda (a b) (string< (upcase a) (upcase b)))))) (setq menu (append (list title) @@ -6940,7 +6940,7 @@ (setq resp (get-popup-menu-response menu)) (funcall (event-function resp) (event-object resp))) (t - (if sort (setq list (sort list (lambda (a b) + (if sort (setq list (sort list (lambda (a b) (string< (upcase a) (upcase b)))))) (setq menu (cons title (list @@ -7031,7 +7031,7 @@ (setq idlwave-before-completion-wconf (current-window-configuration))) (if (featurep 'xemacs) - (idlwave-display-completion-list-xemacs + (idlwave-display-completion-list-xemacs list) (idlwave-display-completion-list-emacs list)) @@ -7112,7 +7112,7 @@ (mapcar (lambda(x) (princ (nth 1 x)) (princ "\n")) - keys-alist)) + keys-alist)) (setq char (read-char))) (setq char (read-char))) (message nil) @@ -7232,7 +7232,7 @@ (defun idlwave-make-modified-completion-map-emacs (old-map) "Replace `choose-completion' and `mouse-choose-completion' in OLD-MAP." (let ((new-map (copy-keymap old-map))) - (substitute-key-definition + (substitute-key-definition 'choose-completion 'idlwave-choose-completion new-map) (substitute-key-definition 'mouse-choose-completion 'idlwave-mouse-choose-completion new-map) @@ -7258,8 +7258,8 @@ ;; ;; - Go again over the documentation how to write a completion ;; plugin. It is in self.el, but currently still very bad. -;; This could be in a separate file in the distribution, or -;; in an appendix for the manual. +;; This could be in a separate file in the distribution, or +;; in an appendix for the manual. (defvar idlwave-struct-skip "[ \t]*\\(\\$.*\n\\(^[ \t]*\\(\\$[ \t]*\\)?\\(;.*\\)?\n\\)*\\)?[ \t]*" @@ -7298,7 +7298,7 @@ (beg (car borders)) (end (cdr borders)) (case-fold-search t)) - (re-search-forward (concat "\\(^[ \t]*\\|[,{][ \t]*\\)" tag "[ \t]*:") + (re-search-forward (concat "\\(^[ \t]*\\|[,{][ \t]*\\)" tag "[ \t]*:") end t))) (defun idlwave-struct-inherits () @@ -7313,7 +7313,7 @@ (goto-char beg) (save-restriction (narrow-to-region beg end) - (while (re-search-forward + (while (re-search-forward (concat "[{,]" ;leading comma/brace idlwave-struct-skip ; 4 groups "inherits" ; The INHERITS tag @@ -7363,9 +7363,9 @@ (concat "\\<" (regexp-quote (downcase var)) "\\>" ws) "\\(\\)") "=" ws "\\({\\)" - (if name + (if name (if (stringp name) - (concat ws "\\(\\<" (downcase name) "\\)[^a-zA-Z0-9_$]") + (concat ws "\\(\\<" (downcase name) "\\)[^a-zA-Z0-9_$]") ;; Just a generic name (concat ws "\\<\\([a-zA-Z_0-9$]+\\)" ws ",")) "")))) @@ -7376,7 +7376,7 @@ (goto-char (match-beginning 3)) (match-string-no-properties 5))))) -(defvar idlwave-class-info nil) +(defvar idlwave-class-info nil) (defvar idlwave-class-reset nil) ; to reset buffer-local classes (add-hook 'idlwave-update-rinfo-hook @@ -7388,13 +7388,13 @@ (let (list entry) (if idlwave-class-info (if idlwave-class-reset - (setq + (setq idlwave-class-reset nil idlwave-class-info ; Remove any visited in a buffer - (delq nil (mapcar - (lambda (x) - (let ((filebuf - (idlwave-class-file-or-buffer + (delq nil (mapcar + (lambda (x) + (let ((filebuf + (idlwave-class-file-or-buffer (or (cdr (assq 'found-in x)) (car x))))) (if (cdr filebuf) nil @@ -7432,7 +7432,7 @@ (progn ;; For everything there (setq end-lim (save-excursion (idlwave-end-of-subprogram) (point))) - (while (setq name + (while (setq name (idlwave-find-structure-definition nil t end-lim)) (funcall all-hook name))) (idlwave-find-structure-definition nil (or alt-class class)))))) @@ -7470,11 +7470,11 @@ (insert-file-contents file)) (save-excursion (goto-char 1) - (idlwave-find-class-definition class + (idlwave-find-class-definition class ;; Scan all of the structures found there (lambda (name) (let* ((this-class (idlwave-sintern-class name)) - (entry + (entry (list this-class (cons 'tags (idlwave-struct-tags)) (cons 'inherits (idlwave-struct-inherits))))) @@ -7499,7 +7499,7 @@ (condition-case err (apply 'append (mapcar 'idlwave-class-tags (cons class (idlwave-all-class-inherits class)))) - (error + (error (idlwave-class-tag-reset) (error "%s" (error-message-string err))))) @@ -7536,24 +7536,24 @@ all-inherits)))))) (defun idlwave-entry-keywords (entry &optional record-link) - "Return the flat entry keywords alist from routine-info entry. + "Return the flat entry keywords alist from routine-info entry. If RECORD-LINK is non-nil, the keyword text is copied and a text property indicating the link is added." (let (kwds) (mapcar - (lambda (key-list) + (lambda (key-list) (let ((file (car key-list))) (mapcar (lambda (key-cons) (let ((key (car key-cons)) (link (cdr key-cons))) (when (and record-link file) (setq key (copy-sequence key)) - (put-text-property + (put-text-property 0 (length key) - 'link - (concat - file - (if link + 'link + (concat + file + (if link (concat idlwave-html-link-sep (number-to-string link)))) key)) @@ -7566,13 +7566,13 @@ "Find keyword KEYWORD in entry ENTRY, and return (with link) if set" (catch 'exit (mapc - (lambda (key-list) + (lambda (key-list) (let ((file (car key-list)) (kwd (assoc keyword (cdr key-list)))) (when kwd - (setq kwd (cons (car kwd) + (setq kwd (cons (car kwd) (if (and file (cdr kwd)) - (concat file + (concat file idlwave-html-link-sep (number-to-string (cdr kwd))) (cdr kwd)))) @@ -7610,14 +7610,14 @@ ;; Check if we need to update the "current" class (if (not (equal class-selector idlwave-current-tags-class)) (idlwave-prepare-class-tag-completion class-selector)) - (setq idlwave-completion-help-info + (setq idlwave-completion-help-info (list 'idlwave-complete-class-structure-tag-help - (idlwave-sintern-routine + (idlwave-sintern-routine (concat class-selector "__define")) nil)) (let ((idlwave-cpl-bold idlwave-current-native-class-tags)) (idlwave-complete-in-buffer - 'class-tag 'class-tag + 'class-tag 'class-tag idlwave-current-class-tags nil (format "Select a tag of class %s" class-selector) "class tag" @@ -7663,7 +7663,7 @@ (skip-chars-backward "[a-zA-Z0-9_$]") (equal (char-before) ?!)) (setq idlwave-completion-help-info '(idlwave-complete-sysvar-help)) - (idlwave-complete-in-buffer 'sysvar 'sysvar + (idlwave-complete-in-buffer 'sysvar 'sysvar idlwave-system-variables-alist nil "Select a system variable" "system variable") @@ -7682,7 +7682,7 @@ (or tags (error "System variable !%s is not a structure" var)) (setq idlwave-completion-help-info (list 'idlwave-complete-sysvar-tag-help var)) - (idlwave-complete-in-buffer 'sysvartag 'sysvartag + (idlwave-complete-in-buffer 'sysvartag 'sysvartag tags nil "Select a system variable tag" "system variable tag") @@ -7711,8 +7711,8 @@ ((eq mode 'test) ; we can at least link the main (and (stringp word) entry main)) ((eq mode 'set) - (if entry - (setq link + (if entry + (setq link (if (setq target (cdr (assoc word tags))) (idlwave-substitute-link-target main target) main)))) ;; setting dynamic!!! @@ -7736,7 +7736,7 @@ ;; Fake help in the source buffer for class structure tags. ;; KWD AND NAME ARE GLOBAL-VARIABLES HERE. -(defvar name) +(defvar name) (defvar kwd) (defvar idlwave-help-do-class-struct-tag nil) (defun idlwave-complete-class-structure-tag-help (mode word) @@ -7745,11 +7745,11 @@ nil) ((eq mode 'set) (let (class-with found-in) - (when (setq class-with - (idlwave-class-or-superclass-with-tag + (when (setq class-with + (idlwave-class-or-superclass-with-tag idlwave-current-tags-class word)) - (if (assq (idlwave-sintern-class class-with) + (if (assq (idlwave-sintern-class class-with) idlwave-system-class-info) (error "No help available for system class tags")) (if (setq found-in (idlwave-class-found-in class-with)) @@ -7762,7 +7762,7 @@ (defun idlwave-class-or-superclass-with-tag (class tag) "Find and return the CLASS or one of its superclass with the associated TAG, if any." - (let ((sclasses (cons class (cdr (assq 'all-inherits + (let ((sclasses (cons class (cdr (assq 'all-inherits (idlwave-class-info class))))) cl) (catch 'exit @@ -7771,7 +7771,7 @@ (let ((tags (idlwave-class-tags cl))) (while tags (if (eq t (compare-strings tag 0 nil (car tags) 0 nil t)) - (throw 'exit cl)) + (throw 'exit cl)) (setq tags (cdr tags)))))))) @@ -7794,8 +7794,8 @@ (setcar entry (idlwave-sintern-sysvar (car entry) 'set)) (setq tags (assq 'tags entry)) (if tags - (setcdr tags - (mapcar (lambda (x) + (setcdr tags + (mapcar (lambda (x) (cons (idlwave-sintern-sysvartag (car x) 'set) (cdr x))) (cdr tags))))))) @@ -7812,19 +7812,19 @@ text start) (setq start (match-end 0) var (match-string 1 text) - tags (if (match-end 3) + tags (if (match-end 3) (idlwave-split-string (match-string 3 text)))) ;; Maintain old links, if present (setq old-entry (assq (idlwave-sintern-sysvar var) old)) (setq link (assq 'link old-entry)) (setq idlwave-system-variables-alist - (cons (list var - (cons - 'tags - (mapcar (lambda (x) - (cons x - (cdr (assq - (idlwave-sintern-sysvartag x) + (cons (list var + (cons + 'tags + (mapcar (lambda (x) + (cons x + (cdr (assq + (idlwave-sintern-sysvartag x) (cdr (assq 'tags old-entry)))))) tags)) link) idlwave-system-variables-alist))) @@ -7846,9 +7846,9 @@ (defun idlwave-uniquify (list) (let ((ht (make-hash-table :size (length list) :test 'equal))) - (delq nil + (delq nil (mapcar (lambda (x) - (unless (gethash x ht) + (unless (gethash x ht) (puthash x t ht) x)) list)))) @@ -7876,11 +7876,11 @@ nil))) ;; Restore the pre-completion window configuration if this is safe. - - (if (or (eq verify 'force) ; force - (and + + (if (or (eq verify 'force) ; force + (and (get-buffer-window "*Completions*") ; visible - (idlwave-local-value 'idlwave-completion-p + (idlwave-local-value 'idlwave-completion-p "*Completions*") ; cib-buffer (eq (marker-buffer idlwave-completion-mark) (current-buffer)) ; buffer OK @@ -7978,7 +7978,7 @@ (if (string-match "\\(pro\\|function\\)[ \t]+\\(\\(.*\\)::\\)?\\(.*\\)" resolve) (setq type (match-string 1 resolve) - class (if (match-beginning 2) + class (if (match-beginning 2) (match-string 3 resolve) nil) name (match-string 4 resolve))) @@ -7987,15 +7987,15 @@ (cond ((null class) - (idlwave-shell-send-command + (idlwave-shell-send-command (format "resolve_routine,'%s'%s" (downcase name) kwd) 'idlwave-update-routine-info nil t)) (t - (idlwave-shell-send-command + (idlwave-shell-send-command (format "resolve_routine,'%s__define'%s" (downcase class) kwd) - (list 'idlwave-shell-send-command - (format "resolve_routine,'%s__%s'%s" + (list 'idlwave-shell-send-command + (format "resolve_routine,'%s__%s'%s" (downcase class) (downcase name) kwd) '(idlwave-update-routine-info) nil t)))))) @@ -8016,19 +8016,19 @@ (this-buffer (equal arg '(4))) (module (idlwave-fix-module-if-obj_new (idlwave-what-module))) (default (if module - (concat (idlwave-make-full-name + (concat (idlwave-make-full-name (nth 2 module) (car module)) (if (eq (nth 1 module) 'pro) "<p>" "<f>")) "none")) - (list + (list (idlwave-uniquify (delq nil - (mapcar (lambda (x) + (mapcar (lambda (x) (if (eq 'system (car-safe (nth 3 x))) ;; Take out system routines with no source. nil (list - (concat (idlwave-make-full-name + (concat (idlwave-make-full-name (nth 2 x) (car x)) (if (eq (nth 1 x) 'pro) "<p>" "<f>"))))) (if this-buffer @@ -8057,10 +8057,10 @@ (t t))) (idlwave-do-find-module name type class nil this-buffer))) -(defun idlwave-do-find-module (name type class +(defun idlwave-do-find-module (name type class &optional force-source this-buffer) (let ((name1 (idlwave-make-full-name class name)) - source buf1 entry + source buf1 entry (buf (current-buffer)) (pos (point)) file name2) @@ -8070,11 +8070,11 @@ name2 (if (nth 2 entry) (idlwave-make-full-name (nth 2 entry) name) name1)) - (if source + (if source (setq file (idlwave-routine-source-file source))) (unless file ; Try to find it on the path. - (setq file - (idlwave-expand-lib-file-name + (setq file + (idlwave-expand-lib-file-name (if class (format "%s__define.pro" (downcase class)) (format "%s.pro" (downcase name)))))) @@ -8082,14 +8082,14 @@ ((or (null name) (equal name "")) (error "Abort")) ((eq (car source) 'system) - (error "Source code for system routine %s is not available" + (error "Source code for system routine %s is not available" name2)) ((or (not file) (not (file-regular-p file))) (error "Source code for routine %s is not available" name2)) (t (when (not this-buffer) - (setq buf1 + (setq buf1 (idlwave-find-file-noselect file 'find)) (pop-to-buffer buf1 t)) (goto-char (point-max)) @@ -8099,7 +8099,7 @@ (cond ((eq type 'fun) "function") ((eq type 'pro) "pro") (t "\\(pro\\|function\\)")) - "\\>[ \t]+" + "\\>[ \t]+" (regexp-quote (downcase name2)) "[^a-zA-Z0-9_$]") nil t) @@ -8136,17 +8136,17 @@ (cond ((and (eq cw 'procedure) (not (equal this-word ""))) - (setq this-word (idlwave-sintern-routine-or-method + (setq this-word (idlwave-sintern-routine-or-method this-word (nth 2 (nth 3 where)))) (list this-word 'pro - (idlwave-determine-class + (idlwave-determine-class (cons this-word (cdr (nth 3 where))) 'pro))) - ((and (eq cw 'function) + ((and (eq cw 'function) (not (equal this-word "")) (or (eq next-char ?\() ; exclude arrays, vars. (looking-at "[a-zA-Z0-9_]*[ \t]*("))) - (setq this-word (idlwave-sintern-routine-or-method + (setq this-word (idlwave-sintern-routine-or-method this-word (nth 2 (nth 3 where)))) (list this-word 'fun (idlwave-determine-class @@ -8183,7 +8183,7 @@ class))) (defun idlwave-fix-module-if-obj_new (module) - "Check if MODULE points to obj_new. + "Check if MODULE points to obj_new. If yes, and if the cursor is in the keyword region, change to the appropriate Init method." (let* ((name (car module)) @@ -8204,7 +8204,7 @@ (idlwave-sintern-class class))))) module)) -(defun idlwave-fix-keywords (name type class keywords +(defun idlwave-fix-keywords (name type class keywords &optional super-classes system) "Update a list of keywords. Translate OBJ_NEW, adding all super-class keywords, or all keywords @@ -8225,34 +8225,34 @@ string) (setq class (idlwave-sintern-class (match-string 1 string))) (setq idlwave-current-obj_new-class class) - (setq keywords - (append keywords + (setq keywords + (append keywords (idlwave-entry-keywords (idlwave-rinfo-assq (idlwave-sintern-method "INIT") 'fun class (idlwave-routines)) 'do-link)))))) - + ;; If the class is `t', combine all keywords of all methods NAME (when (eq class t) (mapc (lambda (entry) (and (nth 2 entry) ; non-nil class (eq (nth 1 entry) type) ; correct type - (setq keywords - (append keywords + (setq keywords + (append keywords (idlwave-entry-keywords entry 'do-link))))) (idlwave-all-assq name (idlwave-routines))) (setq keywords (idlwave-uniquify keywords))) - + ;; If we have inheritance, add all keywords from superclasses, if ;; the user indicated that method in `idlwave-keyword-class-inheritance' - (when (and + (when (and super-classes idlwave-keyword-class-inheritance (stringp class) - (or + (or system (assq (idlwave-sintern-keyword "_extra") keywords) (assq (idlwave-sintern-keyword "_ref_extra") keywords)) @@ -8270,7 +8270,7 @@ (mapcar (lambda (k) (add-to-list 'keywords k)) (idlwave-entry-keywords entry 'do-link)))) (setq keywords (idlwave-uniquify keywords))) - + ;; Return the final list keywords)) @@ -8295,14 +8295,14 @@ (assq (idlwave-sintern-keyword "_REF_EXTRA") kwd-alist))) (completion-ignore-case t) candidates) - (cond ((assq kwd kwd-alist) + (cond ((assq kwd kwd-alist) kwd) ((setq candidates (all-completions kwd kwd-alist)) (if (= (length candidates) 1) (car candidates) candidates)) ((and entry extra) - ;; Inheritance may cause this keyword to be correct + ;; Inheritance may cause this keyword to be correct keyword) (entry ;; We do know the function, which does not have the keyword. @@ -8314,13 +8314,13 @@ (defvar idlwave-rinfo-mouse-map (make-sparse-keymap)) (defvar idlwave-rinfo-map (make-sparse-keymap)) -(define-key idlwave-rinfo-mouse-map +(define-key idlwave-rinfo-mouse-map (if (featurep 'xemacs) [button2] [mouse-2]) 'idlwave-mouse-active-rinfo) -(define-key idlwave-rinfo-mouse-map +(define-key idlwave-rinfo-mouse-map (if (featurep 'xemacs) [(shift button2)] [(shift mouse-2)]) 'idlwave-mouse-active-rinfo-shift) -(define-key idlwave-rinfo-mouse-map +(define-key idlwave-rinfo-mouse-map (if (featurep 'xemacs) [button3] [mouse-3]) 'idlwave-mouse-active-rinfo-right) (define-key idlwave-rinfo-mouse-map " " 'idlwave-active-rinfo-space) @@ -8346,7 +8346,7 @@ (let* ((initial-class (or initial-class class)) (entry (or (idlwave-best-rinfo-assq name type class (idlwave-routines)) - (idlwave-rinfo-assq name type class + (idlwave-rinfo-assq name type class idlwave-unresolved-routines))) (name (or (car entry) name)) (class (or (nth 2 entry) class)) @@ -8371,7 +8371,7 @@ (km-prop (if (featurep 'xemacs) 'keymap 'local-map)) (face 'idlwave-help-link) beg props win cnt total) - ;; Fix keywords, but don't add chained super-classes, since these + ;; Fix keywords, but don't add chained super-classes, since these ;; are shown separately for that super-class (setq keywords (idlwave-fix-keywords name type class keywords)) (cond @@ -8413,7 +8413,7 @@ km-prop idlwave-rinfo-mouse-map 'help-echo help-echo-use 'data (cons 'usage data))) - (if html-file (setq props (append (list 'face face 'link html-file) + (if html-file (setq props (append (list 'face face 'link html-file) props))) (insert "Usage: ") (setq beg (point)) @@ -8422,14 +8422,14 @@ (format calling-seq name name name name)) "\n") (add-text-properties beg (point) props) - + (insert "Keywords:") (if (null keywords) (insert " No keywords accepted.") (setq col 9) (mapcar (lambda (x) - (if (>= (+ col 1 (length (car x))) + (if (>= (+ col 1 (length (car x))) (window-width)) (progn (insert "\n ") @@ -8447,7 +8447,7 @@ (add-text-properties beg (point) props) (setq col (+ col 1 (length (car x))))) keywords)) - + (setq cnt 1 total (length all)) ;; Here entry is (key file (list of type-conses)) (while (setq entry (pop all)) @@ -8460,7 +8460,7 @@ (cdr (car (nth 2 entry)))) 'data (cons 'source data))) (idlwave-insert-source-location - (format "\n%-8s %s" + (format "\n%-8s %s" (if (equal cnt 1) (if (> total 1) "Sources:" "Source:") "") @@ -8469,7 +8469,7 @@ (incf cnt) (when (and all (> cnt idlwave-rinfo-max-source-lines)) ;; No more source lines, please - (insert (format + (insert (format "\n Source information truncated to %d entries." idlwave-rinfo-max-source-lines)) (setq all nil))) @@ -8483,7 +8483,7 @@ (unwind-protect (progn (select-window win) - (enlarge-window (- (/ (frame-height) 2) + (enlarge-window (- (/ (frame-height) 2) (window-height))) (shrink-window-if-larger-than-buffer)) (select-window ww))))))))) @@ -8520,9 +8520,9 @@ ((and (not file) shell-flag) (insert "Unresolved")) - ((null file) + ((null file) (insert "ERROR")) - + ((idlwave-syslib-p file) (if (string-match "obsolete" (file-name-directory file)) (insert "Obsolete ") @@ -8536,7 +8536,7 @@ ;; Old special syntax: a matching regexp ((setq special (idlwave-special-lib-test file)) (insert (format "%-10s" special))) - + ;; Catch-all with file ((idlwave-lib-p file) (insert "Library ")) @@ -8551,7 +8551,7 @@ (if shell-flag "S" "-") (if buffer-flag "B" "-") "] "))) - (when (> ndupl 1) + (when (> ndupl 1) (setq beg (point)) (insert (format "(%dx) " ndupl)) (add-text-properties beg (point) (list 'face 'bold))) @@ -8575,7 +8575,7 @@ alist nil))) rtn) (t nil)))) - + (defun idlwave-mouse-active-rinfo-right (ev) (interactive "e") (idlwave-mouse-active-rinfo ev 'right)) @@ -8594,7 +8594,7 @@ was pressed." (interactive "e") (if ev (mouse-set-point ev)) - (let (data id name type class buf bufwin source link keyword + (let (data id name type class buf bufwin source link keyword word initial-class) (setq data (get-text-property (point) 'data) source (get-text-property (point) 'source) @@ -8609,9 +8609,9 @@ (cond ((eq id 'class) ; Switch class being displayed (if (window-live-p bufwin) (select-window bufwin)) - (idlwave-display-calling-sequence + (idlwave-display-calling-sequence (idlwave-sintern-method name) - type (idlwave-sintern-class word) + type (idlwave-sintern-class word) initial-class)) ((eq id 'usage) ; Online help on this routine (idlwave-online-help link name type class)) @@ -8652,9 +8652,9 @@ (setq bwin (get-buffer-window buffer))) (if (eq (preceding-char) ?/) (insert keyword) - (unless (save-excursion + (unless (save-excursion (re-search-backward - "[(,][ \t]*\\(\\$[ \t]*\\(;.*\\)?\n\\)?[ \t]*\\=" + "[(,][ \t]*\\(\\$[ \t]*\\(;.*\\)?\n\\)?[ \t]*\\=" (min (- (point) 100) (point-min)) t)) (insert ", ")) (if shift (insert "/")) @@ -8706,7 +8706,7 @@ command can be used to detect possible name clashes during this process." (idlwave-routines) ; Make sure everything is loaded. (unless (or idlwave-user-catalog-routines idlwave-library-catalog-routines) - (or (y-or-n-p + (or (y-or-n-p "You don't have any user or library catalogs. Continue anyway? ") (error "Abort"))) (let* ((routines (append idlwave-system-routines @@ -8719,7 +8719,7 @@ (keymap (make-sparse-keymap)) (props (list 'mouse-face 'highlight km-prop keymap - 'help-echo "Mouse2: Find source")) + 'help-echo "Mouse2: Find source")) (nroutines (length (or special-routines routines))) (step (/ nroutines 100)) (n 0) @@ -8742,13 +8742,13 @@ (message "Sorting routines...done") (define-key keymap (if (featurep 'xemacs) [(button2)] [(mouse-2)]) - (lambda (ev) + (lambda (ev) (interactive "e") (mouse-set-point ev) (apply 'idlwave-do-find-module (get-text-property (point) 'find-args)))) (define-key keymap [(return)] - (lambda () + (lambda () (interactive) (apply 'idlwave-do-find-module (get-text-property (point) 'find-args)))) @@ -8774,13 +8774,13 @@ (> (idlwave-count-memq 'buffer (nth 2 (car dtwins))) 1)) (incf cnt) (insert (format "\n%s%s" - (idlwave-make-full-name (nth 2 routine) + (idlwave-make-full-name (nth 2 routine) (car routine)) (if (eq (nth 1 routine) 'fun) "()" ""))) (while (setq twin (pop dtwins)) (setq props1 (append (list 'find-args - (list (nth 0 routine) - (nth 1 routine) + (list (nth 0 routine) + (nth 1 routine) (nth 2 routine))) props)) (idlwave-insert-source-location "\n - " twin props1)))) @@ -8803,7 +8803,7 @@ (or (not (stringp sfile)) (not (string-match "\\S-" sfile)))) (setq stype 'unresolved)) - (princ (format " %-10s %s\n" + (princ (format " %-10s %s\n" stype (if sfile sfile "No source code available"))))) @@ -8822,20 +8822,20 @@ (eq type (nth 1 candidate)) (eq class (nth 2 candidate))) (push candidate twins))) - (if (setq candidate (idlwave-rinfo-assq name type class + (if (setq candidate (idlwave-rinfo-assq name type class idlwave-unresolved-routines)) (push candidate twins)) (cons entry (nreverse twins)))) (defun idlwave-study-twins (entries) - "Return dangerous twins of first entry in ENTRIES. + "Return dangerous twins of first entry in ENTRIES. Dangerous twins are routines with same name, but in different files on the load path. If a file is in the system library and has an entry in the `idlwave-system-routines' list, we omit the latter as non-dangerous because many IDL routines are implemented as library routines, and may have been scanned." (let* ((entry (car entries)) - (name (car entry)) ; + (name (car entry)) ; (type (nth 1 entry)) ; Must be bound for (class (nth 2 entry)) ; idlwave-routine-twin-compare (cnt 0) @@ -8853,23 +8853,23 @@ (t 'unresolved))) ;; Check for an entry in the system library - (if (and file + (if (and file (not syslibp) (idlwave-syslib-p file)) (setq syslibp t)) - + ;; If there's more than one matching entry for the same file, just ;; append the type-cons to the type list. (if (setq entry (assoc key alist)) (push type-cons (nth 2 entry)) (push (list key file (list type-cons)) alist))) - + (setq alist (nreverse alist)) - + (when syslibp ;; File is in system *library* - remove any 'system entry (setq alist (delq (assq 'system alist) alist))) - + ;; If 'system remains and we've scanned the syslib, it's a builtin ;; (rather than a !DIR/lib/.pro file bundled as source). (when (and (idlwave-syslib-scanned-p) @@ -8905,7 +8905,7 @@ ((not (eq type (nth 1 b))) ;; Type decides (< (if (eq type 'fun) 1 0) (if (eq (nth 1 b) 'fun) 1 0))) - (t + (t ;; A and B are twins - so the decision is more complicated. ;; Call twin-compare with the proper arguments. (idlwave-routine-entry-compare-twins a b))))) @@ -8957,7 +8957,7 @@ (tpath-alist (idlwave-true-path-alist)) (apathp (and (stringp akey) (assoc (file-name-directory akey) tpath-alist))) - (bpathp (and (stringp bkey) + (bpathp (and (stringp bkey) (assoc (file-name-directory bkey) tpath-alist))) ;; How early on search path? High number means early since we ;; measure the tail of the path list @@ -8993,7 +8993,7 @@ (t nil)))) ; Default (defun idlwave-routine-source-file (source) - (if (nth 2 source) + (if (nth 2 source) (expand-file-name (nth 1 source) (nth 2 source)) (nth 1 source))) @@ -9083,7 +9083,7 @@ (forward-sexp 2) (forward-sexp -1) (let ((begin (point))) - (re-search-forward + (re-search-forward "[a-zA-Z_][a-zA-Z0-9$_]+\\(::[a-zA-Z_][a-zA-Z0-9$_]+\\)?") (if (fboundp 'buffer-substring-no-properties) (buffer-substring-no-properties begin (point)) @@ -9123,7 +9123,7 @@ (start-process "idldeclient" nil idlwave-shell-explicit-file-name "-c" "-e" (buffer-file-name))) - + (defvar idlwave-help-use-assistant) (defun idlwave-launch-idlhelp () "Start the IDLhelp application." @@ -9131,7 +9131,7 @@ (if idlwave-help-use-assistant (idlwave-help-assistant-raise) (start-process "idlhelp" nil idlwave-help-application))) - + ;; Menus - using easymenu.el (defvar idlwave-mode-menu-def `("IDLWAVE" @@ -9150,7 +9150,7 @@ ["Block" idlwave-mark-block t] ["Header" idlwave-mark-doclib t]) ("Format" - ["Indent Entire Statement" idlwave-indent-statement + ["Indent Entire Statement" idlwave-indent-statement :active t :keys "C-u \\[indent-for-tab-command]" ] ["Indent Subprogram" idlwave-indent-subprogram t] ["(Un)Comment Region" idlwave-toggle-comment-region t] @@ -9220,7 +9220,7 @@ ("Customize" ["Browse IDLWAVE Group" idlwave-customize t] "--" - ["Build Full Customize Menu" idlwave-create-customize-menu + ["Build Full Customize Menu" idlwave-create-customize-menu (fboundp 'customize-menu-create)]) ("Documentation" ["Describe Mode" describe-mode t] @@ -9237,22 +9237,22 @@ '("Debug" ["Start IDL shell" idlwave-shell t] ["Save and .RUN buffer" idlwave-shell-save-and-run - (and (boundp 'idlwave-shell-automatic-start) + (and (boundp 'idlwave-shell-automatic-start) idlwave-shell-automatic-start)])) (if (or (featurep 'easymenu) (load "easymenu" t)) (progn - (easy-menu-define idlwave-mode-menu idlwave-mode-map - "IDL and WAVE CL editing menu" + (easy-menu-define idlwave-mode-menu idlwave-mode-map + "IDL and WAVE CL editing menu" idlwave-mode-menu-def) - (easy-menu-define idlwave-mode-debug-menu idlwave-mode-map - "IDL and WAVE CL editing menu" + (easy-menu-define idlwave-mode-debug-menu idlwave-mode-map + "IDL and WAVE CL editing menu" idlwave-mode-debug-menu-def))) (defun idlwave-customize () "Call the customize function with idlwave as argument." (interactive) - ;; Try to load the code for the shell, so that we can customize it + ;; Try to load the code for the shell, so that we can customize it ;; as well. (or (featurep 'idlw-shell) (load "idlw-shell" t)) @@ -9263,11 +9263,11 @@ (interactive) (if (fboundp 'customize-menu-create) (progn - ;; Try to load the code for the shell, so that we can customize it + ;; Try to load the code for the shell, so that we can customize it ;; as well. (or (featurep 'idlw-shell) (load "idlw-shell" t)) - (easy-menu-change + (easy-menu-change '("IDLWAVE") "Customize" `(["Browse IDLWAVE group" idlwave-customize t] "--" @@ -9315,7 +9315,7 @@ (let ((table (symbol-value 'idlwave-mode-abbrev-table)) abbrevs str rpl func fmt (len-str 0) (len-rpl 0)) - (mapatoms + (mapatoms (lambda (sym) (if (symbol-value sym) (progn @@ -9341,7 +9341,7 @@ (with-output-to-temp-buffer "*Help*" (if arg (progn - (princ "Abbreviations and Actions in IDLWAVE-Mode\n") + (princ "Abbreviations and Actions in IDLWAVE-Mode\n") (princ "=========================================\n\n") (princ (format fmt "KEY" "REPLACE" "HOOK")) (princ (format fmt "---" "-------" "----")))
--- a/lisp/progmodes/make-mode.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/progmodes/make-mode.el Sat Oct 14 17:36:28 2006 +0000 @@ -836,8 +836,8 @@ nil nil ((?$ . ".")) backward-paragraph - (font-lock-syntactic-keywords . makefile-font-lock-syntactic-keywords) - (font-lock-support-mode))) ; JIT breaks on long series of continuation lines. + (font-lock-syntactic-keywords + . makefile-font-lock-syntactic-keywords))) ;; Add-log. (make-local-variable 'add-log-current-defun-function)
--- a/lisp/progmodes/prolog.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/progmodes/prolog.el Sat Oct 14 17:36:28 2006 +0000 @@ -41,27 +41,27 @@ (defcustom prolog-program-name - (let ((names '("prolog" "gprolog"))) + (let ((names '("prolog" "gprolog" "swipl"))) (while (and names (not (executable-find (car names)))) (setq names (cdr names))) (or (car names) "prolog")) - "*Program name for invoking an inferior Prolog with `run-prolog'." + "Program name for invoking an inferior Prolog with `run-prolog'." :type 'string :group 'prolog) (defcustom prolog-consult-string "reconsult(user).\n" - "*(Re)Consult mode (for C-Prolog and Quintus Prolog). " + "(Re)Consult mode (for C-Prolog and Quintus Prolog). " :type 'string :group 'prolog) (defcustom prolog-compile-string "compile(user).\n" - "*Compile mode (for Quintus Prolog)." + "Compile mode (for Quintus Prolog)." :type 'string :group 'prolog) (defcustom prolog-eof-string "end_of_file.\n" - "*String that represents end of file for Prolog. + "String that represents end of file for Prolog. When nil, send actual operating system end of file." :type 'string :group 'prolog) @@ -121,7 +121,21 @@ (defvar prolog-mode-map (let ((map (make-sparse-keymap))) (define-key map "\e\C-x" 'prolog-consult-region) + (define-key map "\C-c\C-l" 'inferior-prolog-load-file) + (define-key map "\C-c\C-z" 'switch-to-prolog) map)) + +(easy-menu-define prolog-mode-menu prolog-mode-map "Menu for Prolog mode." + ;; Mostly copied from scheme-mode's menu. + ;; Not tremendously useful, but it's a start. + '("Prolog" + ["Indent line" indent-according-to-mode t] + ["Indent region" indent-region t] + ["Comment region" comment-region t] + ["Uncomment region" uncomment-region t] + "--" + ["Run interactive Prolog session" run-prolog t] + )) ;;;###autoload (defun prolog-mode () @@ -138,29 +152,24 @@ (setq major-mode 'prolog-mode) (setq mode-name "Prolog") (prolog-mode-variables) + (set (make-local-variable 'comment-add) 1) ;; font lock (setq font-lock-defaults '(prolog-font-lock-keywords nil nil nil beginning-of-line)) (run-mode-hooks 'prolog-mode-hook)) -(defun prolog-indent-line (&optional whole-exp) +(defun prolog-indent-line () "Indent current line as Prolog code. With argument, indent any additional lines of the same clause rigidly along with this one (not yet)." (interactive "p") (let ((indent (prolog-indent-level)) - (pos (- (point-max) (point))) beg) + (pos (- (point-max) (point)))) (beginning-of-line) - (setq beg (point)) - (skip-chars-forward " \t") - (if (zerop (- indent (current-column))) - nil - (delete-region beg (point)) - (indent-to indent)) + (indent-line-to indent) (if (> (- (point-max) pos) (point)) - (goto-char (- (point-max) pos))) - )) + (goto-char (- (point-max) pos))))) (defun prolog-indent-level () "Compute Prolog indentation level." @@ -224,6 +233,8 @@ (let ((map (make-sparse-keymap))) ;; This map will inherit from `comint-mode-map' when entering ;; inferior-prolog-mode. + (define-key map [remap self-insert-command] + 'inferior-prolog-self-insert-command) map)) (defvar inferior-prolog-mode-syntax-table prolog-mode-syntax-table) @@ -256,36 +267,129 @@ (setq comint-prompt-regexp "^| [ ?][- ] *") (prolog-mode-variables)) +(defvar inferior-prolog-buffer nil) + +(defun inferior-prolog-run (&optional name) + (with-current-buffer (make-comint "prolog" (or name prolog-program-name)) + (inferior-prolog-mode) + (setq-default inferior-prolog-buffer (current-buffer)) + (make-local-variable 'inferior-prolog-buffer) + (when (and name (not (equal name prolog-program-name))) + (set (make-local-variable 'prolog-program-name) name)) + (set (make-local-variable 'inferior-prolog-flavor) + ;; Force re-detection. + (let* ((proc (get-buffer-process (current-buffer))) + (pmark (and proc (marker-position (process-mark proc))))) + (cond + ((null pmark) (1- (point-min))) + ;; The use of insert-before-markers in comint.el together with + ;; the potential use of comint-truncate-buffer in the output + ;; filter, means that it's difficult to reliably keep track of + ;; the buffer position where the process's output started. + ;; If possible we use a marker at "start - 1", so that + ;; insert-before-marker at `start' won't shift it. And if not, + ;; we fall back on using a plain integer. + ((> pmark (point-min)) (copy-marker (1- pmark))) + (t (1- pmark))))) + (add-hook 'comint-output-filter-functions + 'inferior-prolog-guess-flavor nil t))) + +(defun inferior-prolog-process (&optional dontstart) + (or (and (buffer-live-p inferior-prolog-buffer) + (get-buffer-process inferior-prolog-buffer)) + (unless dontstart + (inferior-prolog-run) + ;; Try again. + (inferior-prolog-process)))) + +(defvar inferior-prolog-flavor 'unknown + "Either a symbol or a buffer position offset by one. +If a buffer position, the flavor has not been determined yet and +it is expected that the process's output has been or will +be inserted at that position plus one.") + +(defun inferior-prolog-guess-flavor (&optional ignored) + (save-excursion + (goto-char (1+ inferior-prolog-flavor)) + (setq inferior-prolog-flavor + (cond + ((looking-at "GNU Prolog") 'gnu) + ((looking-at "Welcome to SWI-Prolog") 'swi) + ((looking-at ".*\n") 'unknown) ;There's at least one line. + (t inferior-prolog-flavor)))) + (when (symbolp inferior-prolog-flavor) + (remove-hook 'comint-output-filter-functions + 'inferior-prolog-guess-flavor t) + (if (eq inferior-prolog-flavor 'gnu) + (set (make-local-variable 'comint-process-echoes) t)))) + ;;;###autoload -(defun run-prolog () - "Run an inferior Prolog process, input and output via buffer *prolog*." +(defalias 'run-prolog 'switch-to-prolog) +;;;###autoload +(defun switch-to-prolog (&optional name) + "Run an inferior Prolog process, input and output via buffer *prolog*. +With prefix argument \\[universal-prefix], prompt for the program to use." + (interactive + (list (when current-prefix-arg + (let ((proc (inferior-prolog-process 'dontstart))) + (if proc + (if (yes-or-no-p "Kill current process before starting new one? ") + (kill-process proc) + (error "Abort"))) + (read-string "Run Prolog: " prolog-program-name))))) + (unless (inferior-prolog-process 'dontstart) + (inferior-prolog-run name)) + (pop-to-buffer inferior-prolog-buffer)) + +(defun inferior-prolog-self-insert-command () + "Insert the char in the buffer or pass it directly to the process." (interactive) - (require 'comint) - (pop-to-buffer (make-comint "prolog" prolog-program-name)) - (inferior-prolog-mode)) + (let* ((proc (get-buffer-process (current-buffer))) + (pmark (and proc (marker-position (process-mark proc))))) + (if (and (eq inferior-prolog-flavor 'gnu) + pmark + (null current-prefix-arg) + (eobp) + (eq (point) pmark) + (save-excursion + (goto-char (- pmark 3)) + (looking-at " \\? "))) + (comint-send-string proc (string last-command-char)) + (call-interactively 'self-insert-command)))) (defun prolog-consult-region (compile beg end) "Send the region to the Prolog process made by \"M-x run-prolog\". If COMPILE (prefix arg) is not nil, use compile mode rather than consult mode." (interactive "P\nr") - (save-excursion - (if compile - (process-send-string "prolog" prolog-compile-string) - (process-send-string "prolog" prolog-consult-string)) - (process-send-region "prolog" beg end) - (process-send-string "prolog" "\n") ;May be unnecessary + (let ((proc (inferior-prolog-process))) + (comint-send-string proc + (if compile prolog-compile-string + prolog-consult-string)) + (comint-send-region proc beg end) + (comint-send-string proc "\n") ;May be unnecessary (if prolog-eof-string - (process-send-string "prolog" prolog-eof-string) - (process-send-eof "prolog")))) ;Send eof to prolog process. + (comint-send-string proc prolog-eof-string) + (with-current-buffer (process-buffer proc) + (comint-send-eof))))) ;Send eof to prolog process. (defun prolog-consult-region-and-go (compile beg end) "Send the region to the inferior Prolog, and switch to *prolog* buffer. If COMPILE (prefix arg) is not nil, use compile mode rather than consult mode." (interactive "P\nr") (prolog-consult-region compile beg end) - (switch-to-buffer "*prolog*")) + (pop-to-buffer inferior-prolog-buffer)) + +(defun inferior-prolog-load-file () + "Pass the current buffer's file to the inferior prolog process." + (interactive) + (save-buffer) + (let ((file buffer-file-name) + (proc (inferior-prolog-process))) + (with-current-buffer (process-buffer proc) + (comint-send-string proc (concat "['" (file-relative-name file) "'].\n")) + (pop-to-buffer (current-buffer))))) (provide 'prolog) -;;; arch-tag: f3ec6748-1272-4ab6-8826-c50cb1607636 +;; arch-tag: f3ec6748-1272-4ab6-8826-c50cb1607636 ;;; prolog.el ends here
--- a/lisp/progmodes/python.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/progmodes/python.el Sat Oct 14 17:36:28 2006 +0000 @@ -67,7 +67,8 @@ (eval-when-compile (require 'cl) (require 'compile) - (require 'comint)) + (require 'comint) + (require 'hippie-exp)) (autoload 'comint-mode "comint") @@ -95,7 +96,9 @@ "import" "in" "is" "lambda" "not" "or" "pass" "print" "raise" "return" "try" "while" "yield" ;; Future keywords - "as" "None") + "as" "None" + ;; Not real keywords, but close enough to be fontified as such + "self" "True" "False") symbol-end) ;; Definitions (,(rx symbol-start (group "class") (1+ space) (group (1+ (or word ?_)))) @@ -1286,7 +1289,7 @@ ;; Maybe we could be more selective here. (if (zerop (length res)) (not (bolp)) - (string-match res ".\\'")))) + (string-match ".\\'" res)))) ;; The need for this seems to be system-dependent: ;; What is this all about, exactly? --Stef ;; (if (and (eq ?. (aref s 0))) @@ -1330,30 +1333,30 @@ ;; (not a name) in Python buffers from which `run-python' &c is ;; invoked. Would support multiple processes better. (when (or new (not (comint-check-proc python-buffer))) - (save-current-buffer - (let* ((cmdlist (append (python-args-to-list cmd) '("-i"))) - (path (getenv "PYTHONPATH")) - (process-environment ; to import emacs.py - (cons (concat "PYTHONPATH=" data-directory - (if path (concat ":" path))) - process-environment))) - (set-buffer (apply 'make-comint-in-buffer "Python" - (generate-new-buffer "*Python*") - (car cmdlist) nil (cdr cmdlist))) - (setq-default python-buffer (current-buffer)) - (setq python-buffer (current-buffer))) + (with-current-buffer + (let* ((cmdlist (append (python-args-to-list cmd) '("-i"))) + (path (getenv "PYTHONPATH")) + (process-environment ; to import emacs.py + (cons (concat "PYTHONPATH=" data-directory + (if path (concat ":" path))) + process-environment))) + (apply 'make-comint-in-buffer "Python" + (if new (generate-new-buffer "*Python*") "*Python*") + (car cmdlist) nil (cdr cmdlist))) + (setq-default python-buffer (current-buffer)) + (setq python-buffer (current-buffer)) (accept-process-output (get-buffer-process python-buffer) 5) - (inferior-python-mode))) + (inferior-python-mode) + ;; Load function definitions we need. + ;; Before the preoutput function was used, this was done via -c in + ;; cmdlist, but that loses the banner and doesn't run the startup + ;; file. The code might be inline here, but there's enough that it + ;; seems worth putting in a separate file, and it's probably cleaner + ;; to put it in a module. + ;; Ensure we're at a prompt before doing anything else. + (python-send-receive "import emacs; print '_emacs_out ()'"))) (if (derived-mode-p 'python-mode) (setq python-buffer (default-value 'python-buffer))) ; buffer-local - ;; Load function definitions we need. - ;; Before the preoutput function was used, this was done via -c in - ;; cmdlist, but that loses the banner and doesn't run the startup - ;; file. The code might be inline here, but there's enough that it - ;; seems worth putting in a separate file, and it's probably cleaner - ;; to put it in a module. - ;; Ensure we're at a prompt before doing anything else. - (python-send-receive "import emacs; print '_emacs_out ()'") ;; Without this, help output goes into the inferior python buffer if ;; the process isn't already running. (sit-for 1 t) ;Should we use accept-process-output instead? --Stef @@ -1369,15 +1372,20 @@ (defun python-send-command (command) "Like `python-send-string' but resets `compilation-shell-minor-mode'. COMMAND should be a single statement." - (assert (not (string-match "\n" command))) - (let ((end (marker-position (process-mark (python-proc))))) + ;; (assert (not (string-match "\n" command))) + ;; (let ((end (marker-position (process-mark (python-proc))))) (with-current-buffer python-buffer (goto-char (point-max))) (compilation-forget-errors) - ;; Must wait until this has completed before re-setting variables below. - (python-send-receive (concat command "; print '_emacs_out ()'")) + (python-send-string command) (with-current-buffer python-buffer - (set-marker compilation-parsing-end end) - (setq compilation-last-buffer (current-buffer))))) + (setq compilation-last-buffer (current-buffer))) + ;; No idea what this is for but it breaks the call to + ;; compilation-fake-loc in python-send-region. -- Stef + ;; Must wait until this has completed before re-setting variables below. + ;; (python-send-receive "print '_emacs_out ()'") + ;; (with-current-buffer python-buffer + ;; (set-marker compilation-parsing-end end)) + ) ;;) (defun python-send-region (start end) "Send the region to the inferior Python process." @@ -1419,11 +1427,13 @@ "Evaluate STRING in inferior Python process." (interactive "sPython command: ") (comint-send-string (python-proc) string) - (comint-send-string (python-proc) - ;; If the string is single-line or if it ends with \n, - ;; only add a single \n, otherwise add 2, so as to - ;; make sure we terminate the multiline instruction. - (if (string-match "\n.+\\'" string) "\n\n" "\n"))) + (unless (string-match "\n\\'" string) + ;; Make sure the text is properly LF-terminated. + (comint-send-string (python-proc) "\n")) + (when (string-match "\n[ \t].*\n?\\'" string) + ;; If the string contains a final indented line, add a second newline so + ;; as to make sure we terminate the multiline instruction. + (comint-send-string (python-proc) "\n"))) (defun python-send-buffer () "Send the current buffer to the inferior Python process." @@ -1594,24 +1604,26 @@ instance. Assumes an inferior Python is running." (let ((symbol (with-syntax-table python-dotty-syntax-table (current-word)))) - ;; First try the symbol we're on. - (or (and symbol - (python-send-receive (format "emacs.eargs(%S, %s)" - symbol python-imports))) - ;; Try moving to symbol before enclosing parens. - (let ((s (syntax-ppss))) - (unless (zerop (car s)) - (when (eq ?\( (char-after (nth 1 s))) - (save-excursion - (goto-char (nth 1 s)) - (skip-syntax-backward "-") - (let ((point (point))) - (skip-chars-backward "a-zA-Z._") - (if (< (point) point) - (python-send-receive - (format "emacs.eargs(%S, %s)" - (buffer-substring-no-properties (point) point) - python-imports))))))))))) + ;; This is run from timers, so inhibit-quit tends to be set. + (with-local-quit + ;; First try the symbol we're on. + (or (and symbol + (python-send-receive (format "emacs.eargs(%S, %s)" + symbol python-imports))) + ;; Try moving to symbol before enclosing parens. + (let ((s (syntax-ppss))) + (unless (zerop (car s)) + (when (eq ?\( (char-after (nth 1 s))) + (save-excursion + (goto-char (nth 1 s)) + (skip-syntax-backward "-") + (let ((point (point))) + (skip-chars-backward "a-zA-Z._") + (if (< (point) point) + (python-send-receive + (format "emacs.eargs(%S, %s)" + (buffer-substring-no-properties (point) point) + python-imports)))))))))))) ;;;; Info-look functionality.
--- a/lisp/progmodes/sh-script.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/progmodes/sh-script.el Sat Oct 14 17:36:28 2006 +0000 @@ -2460,46 +2460,45 @@ ;; (if (bolp) nil - (let (c min-point - (start (point))) - (save-restriction - (narrow-to-region - (if (sh-this-is-a-continuation) - (setq min-point (sh-prev-line nil)) - (save-excursion - (beginning-of-line) - (setq min-point (point)))) - (point)) - (skip-chars-backward " \t;") - (unless (looking-at "\\s-*;;") - (skip-chars-backward "^)}];\"'`({[") - (setq c (char-before)))) - (sh-debug "stopping at %d c is %s start=%d min-point=%d" - (point) c start min-point) - (if (< (point) min-point) - (error "point %d < min-point %d" (point) min-point)) - (cond - ((looking-at "\\s-*;;") - ;; (message "Found ;; !") - ";;") - ((or (eq c ?\n) - (eq c nil) - (eq c ?\;)) - (save-excursion - ;; skip forward over white space newline and \ at eol - (skip-chars-forward " \t\n\\\\") - (sh-debug "Now at %d start=%d" (point) start) - (if (>= (point) start) - (progn - (sh-debug "point: %d >= start: %d" (point) start) - nil) - (sh-get-word)) - )) - (t - ;; c -- return a string - (char-to-string c) - )) - ))) + (let ((start (point)) + (min-point (if (sh-this-is-a-continuation) + (sh-prev-line nil) + (line-beginning-position)))) + (skip-chars-backward " \t;" min-point) + (if (looking-at "\\s-*;;") + ;; (message "Found ;; !") + ";;" + (skip-chars-backward "^)}];\"'`({[" min-point) + (let ((c (if (> (point) min-point) (char-before)))) + (sh-debug "stopping at %d c is %s start=%d min-point=%d" + (point) c start min-point) + (if (not (memq c '(?\n nil ?\;))) + ;; c -- return a string + (char-to-string c) + ;; Return the leading keyword of the "command" we supposedly + ;; skipped over. Maybe we skipped too far (e.g. past a `do' or + ;; `then' that precedes the actual command), so check whether + ;; we're looking at such a keyword and if so, move back forward. + (let ((boundary (point)) + kwd next) + (while + (progn + ;; Skip forward over white space newline and \ at eol. + (skip-chars-forward " \t\n\\\\" start) + (if (>= (point) start) + (progn + (sh-debug "point: %d >= start: %d" (point) start) + nil) + (if next (setq boundary next)) + (sh-debug "Now at %d start=%d" (point) start) + (setq kwd (sh-get-word)) + (if (member kwd (sh-feature sh-leading-keywords)) + (progn + (setq next (point)) + t) + nil)))) + (goto-char boundary) + kwd))))))) (defun sh-this-is-a-continuation () @@ -2518,7 +2517,7 @@ (goto-char where)) (prog1 (buffer-substring (point) - (progn (skip-chars-forward "^ \t\n;&")(point))) + (progn (skip-chars-forward "^ \t\n;&|()")(point))) (unless and-move (goto-char start)))))
--- a/lisp/ps-print.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/ps-print.el Sat Oct 14 17:36:28 2006 +0000 @@ -12,7 +12,7 @@ ;; Keywords: wp, print, PostScript ;; Time-stamp: <2005/06/27 00:57:22 vinicius> ;; Version: 6.6.7 -;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/ +;; X-URL: http://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre (defconst ps-print-version "6.6.7" "ps-print.el, v 6.6.7 <2005/06/27 vinicius>
--- a/lisp/saveplace.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/saveplace.el Sat Oct 14 17:36:28 2006 +0000 @@ -238,7 +238,7 @@ ;; load it if it exists: (if (file-readable-p file) (save-excursion - (message "Loading places from %s..." save-place-file) + (message "Loading places from %s..." file) ;; don't want to use find-file because we have been ;; adding hooks to it. (set-buffer (get-buffer-create " *Saved Places*"))
--- a/lisp/select.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/select.el Sat Oct 14 17:36:28 2006 +0000 @@ -223,8 +223,11 @@ (setq str (encode-coding-string str coding)))) ((eq type 'UTF8_STRING) - (setq str (encode-coding-string str 'utf-8))) - + (let ((charsets (find-charset-string str))) + (if (or (memq 'eight-bit-control charsets) + (memq 'eight-bit-graphic charsets)) + (setq type 'STRING) + (setq str (encode-coding-string str 'utf-8))))) (t (error "Unknow selection type: %S" type)) )))
--- a/lisp/server.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/server.el Sat Oct 14 17:36:28 2006 +0000 @@ -792,7 +792,7 @@ ;; This looks scary because `fancy-splash-screens' ;; will call `recursive-edit' from a process filter. ;; However, that should be safe to do now. - (display-splash-screen) + (display-splash-screen t) ;; `recursive-edit' will throw an error if Emacs is ;; already doing a recursive edit elsewhere. Catch it ;; here so that we can finish normally.
--- a/lisp/ses.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/ses.el Sat Oct 14 17:36:28 2006 +0000 @@ -237,13 +237,6 @@ ses-initial-file-trailer) "The initial contents of an empty spreadsheet.") -(defconst ses-paramlines-plist - '(ses--col-widths 2 ses--col-printers 3 ses--default-printer 4 - ses--header-row 5 ses--file-format 8 ses--numrows 9 - ses--numcols 10) - "Offsets from last cell line to various parameter lines in the data area -of a spreadsheet.") - (defconst ses-box-prop '(:box (:line-width 2 :style released-button)) "Display properties to create a raised box for cells in the header line.") @@ -255,13 +248,19 @@ column printer or a global-default printer because they invoke the column or default printer and then modify its output.") + +;;---------------------------------------------------------------------------- +;; Local variables and constants +;;---------------------------------------------------------------------------- + (eval-and-compile (defconst ses-localvars '(ses--blank-line ses--cells ses--col-printers ses--col-widths ses--curcell ses--curcell-overlay ses--default-printer ses--deferred-narrow ses--deferred-recalc ses--deferred-write ses--file-format ses--header-hscroll ses--header-row ses--header-string ses--linewidth - ses--numcols ses--numrows ses--symbolic-formulas + ses--numcols ses--numrows ses--symbolic-formulas ses--data-marker + ses--params-marker ;;Global variables that we override mode-line-process next-line-add-newlines transient-mark-mode) "Buffer-local variables used by SES.")) @@ -272,6 +271,13 @@ (make-local-variable x) (set x nil))) +(defconst ses-paramlines-plist + '(ses--col-widths -5 ses--col-printers -4 ses--default-printer -3 + ses--header-row -2 ses--file-format 1 ses--numrows 2 + ses--numcols 3) + "Offsets from 'Global parameters' line to various parameter lines in the +data area of a spreadsheet.") + ;; ;; "Side-effect variables". They are set in one function, altered in @@ -408,6 +414,7 @@ "Execute BODY repeatedly, with the variables `row' and `col' set to each cell in the range specified by CURCELL. The range is available in the variables `minrow', `maxrow', `mincol', and `maxcol'." + (declare (indent defun) (debug (form body))) (let ((cur (make-symbol "cur")) (min (make-symbol "min")) (max (make-symbol "max")) @@ -429,9 +436,6 @@ (setq col (+ ,c mincol)) ,@body)))))) -(put 'ses-dorange 'lisp-indent-function 'defun) -(def-edebug-spec ses-dorange (form body)) - ;;Support for coverage testing. (defmacro 1value (form) "For code-coverage testing, indicate that FORM is expected to always have @@ -650,7 +654,7 @@ (defun ses-update-cells (list &optional force) "Recalculate cells in LIST, checking for dependency loops. Prints progress messages every second. Dependent cells are not recalculated -if the cell's value is unchanged if FORCE is nil." +if the cell's value is unchanged and FORCE is nil." (let ((ses--deferred-recalc list) (nextlist list) (pos (point)) @@ -709,7 +713,7 @@ (defun ses-in-print-area () "Returns t if point is in print area of spreadsheet." - (eq (get-text-property (point) 'keymap) 'ses-mode-print-map)) + (<= (point) ses--data-marker)) ;;We turn off point-motion-hooks and explicitly position the cursor, in case ;;the intangible properties have gotten screwed up (e.g., when @@ -953,14 +957,16 @@ ses--default-printer, ses--numrows, or ses--numcols." (ses-widen) (let ((inhibit-point-motion-hooks t)) ;In case intangible attrs are wrong - (goto-char (point-min)) (if col - ;;It's a cell - (forward-line (+ ses--numrows 2 (* def (1+ ses--numcols)) col)) - ;;Convert def-symbol to offset - (setq def (plist-get ses-paramlines-plist def)) - (or def (signal 'args-out-of-range nil)) - (forward-line (+ (* ses--numrows (+ ses--numcols 2)) def))))) + ;;It's a cell + (progn + (goto-char ses--data-marker) + (forward-line (+ 1 (* def (1+ ses--numcols)) col))) + ;;Convert def-symbol to offset + (setq def (plist-get ses-paramlines-plist def)) + (or def (signal 'args-out-of-range nil)) + (goto-char ses--params-marker) + (forward-line def)))) (defun ses-set-parameter (def value &optional elem) "Set parameter DEF to VALUE (with undo) and write the value to the data area. @@ -1070,6 +1076,23 @@ )))) result-so-far) +(defsubst ses-relocate-symbol (sym rowcol startrow startcol rowincr colincr) + "Relocate one symbol SYM, whichs corresponds to ROWCOL (a cons of ROW and +COL). Cells starting at (STARTROW,STARTCOL) are being shifted +by (ROWINCR,COLINCR)." + (let ((row (car rowcol)) + (col (cdr rowcol))) + (if (or (< row startrow) (< col startcol)) + sym + (setq row (+ row rowincr) + col (+ col colincr)) + (if (and (>= row startrow) (>= col startcol) + (< row ses--numrows) (< col ses--numcols)) + ;;Relocate this variable + (ses-create-cell-symbol row col) + ;;Delete reference to a deleted cell + nil)))) + (defun ses-relocate-formula (formula startrow startcol rowincr colincr) "Produce a copy of FORMULA where all symbols that refer to cells in row STARTROW or above and col STARTCOL or above are altered by adding ROWINCR @@ -1114,23 +1137,6 @@ result)))) (nreverse result)))) -(defun ses-relocate-symbol (sym rowcol startrow startcol rowincr colincr) - "Relocate one symbol SYM, whichs corresponds to ROWCOL (a cons of ROW and -COL). Cells starting at (STARTROW,STARTCOL) are being shifted -by (ROWINCR,COLINCR)." - (let ((row (car rowcol)) - (col (cdr rowcol))) - (if (or (< row startrow) (< col startcol)) - sym - (setq row (+ row rowincr) - col (+ col colincr)) - (if (and (>= row startrow) (>= col startcol) - (< row ses--numrows) (< col ses--numcols)) - ;;Relocate this variable - (ses-create-cell-symbol row col) - ;;Delete reference to a deleted cell - nil)))) - (defun ses-relocate-range (range startrow startcol rowincr colincr) "Relocate one RANGE, of the form '(ses-range min max). Cells starting at (STARTROW,STARTCOL) are being shifted by (ROWINCR,COLINCR). Result is the @@ -1337,6 +1343,7 @@ (goto-char (point-max)) (search-backward ";; Local Variables:\n" nil t) (backward-list 1) + (setq ses--params-marker (point-marker)) (let ((params (condition-case nil (read (current-buffer)) (error nil)))) (or (and (= (safe-length params) 3) (numberp (car params)) @@ -1366,7 +1373,9 @@ (forward-line ses--numrows) (or (looking-at ses-print-data-boundary) (error "Missing marker between print and data areas")) - (forward-char (length ses-print-data-boundary)) + (forward-char 1) + (setq ses--data-marker (point-marker)) + (forward-char (1- (length ses-print-data-boundary))) ;;Initialize printer and symbol lists (mapc 'ses-printer-record ses-standard-printer-functions) (setq ses--symbolic-formulas nil) @@ -1573,10 +1582,7 @@ ;;We're not allowed to narrow the buffer until after-find-file has ;;read the local variables at the end of the file. Now it's safe to ;;do the narrowing. - (save-excursion - (goto-char (point-min)) - (forward-line ses--numrows) - (narrow-to-region (point-min) (point))) + (narrow-to-region (point-min) ses--data-marker) (setq ses--deferred-narrow nil)) ;;Update the modeline (let ((oldcell ses--curcell)) @@ -1803,11 +1809,17 @@ (dotimes (row ses--numrows) (insert ses--blank-line)) (insert ses-print-data-boundary) + (backward-char (1- (length ses-print-data-boundary))) + (setq ses--data-marker (point-marker)) + (forward-char (1- (length ses-print-data-boundary))) ;;Placeholders for cell data (insert (make-string (* ses--numrows (1+ ses--numcols)) ?\n)) ;;Placeholders for col-widths, col-printers, default-printer, header-row (insert "\n\n\n\n") - (insert ses-initial-global-parameters)) + (insert ses-initial-global-parameters) + (backward-char (1- (length ses-initial-global-parameters))) + (setq ses--params-marker (point-marker)) + (forward-char (1- (length ses-initial-global-parameters)))) (ses-set-parameter 'ses--col-widths ses--col-widths) (ses-set-parameter 'ses--col-printers ses--col-printers) (ses-set-parameter 'ses--default-printer ses--default-printer) @@ -2880,7 +2892,8 @@ (cons 'list result))) ;;All standard formulas are safe -(dolist (x '(ses-range ses-delete-blanks ses+ ses-average ses-select)) +(dolist (x '(ses-cell-value ses-range ses-delete-blanks ses+ ses-average + ses-select)) (put x 'side-effect-free t))
--- a/lisp/shell.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/shell.el Sat Oct 14 17:36:28 2006 +0000 @@ -272,6 +272,8 @@ :type '(choice (const :tag "None" nil) file) :group 'shell) +;; Note: There are no explicit references to the variable `explicit-csh-args'. +;; It is used implicitly by M-x shell when the shell is `csh'. (defcustom explicit-csh-args (if (eq system-type 'hpux) ;; -T persuades HP's csh not to think it is smarter @@ -283,12 +285,15 @@ :type '(repeat (string :tag "Argument")) :group 'shell) +;; Note: There are no explicit references to the variable `explicit-bash-args'. +;; It is used implicitly by M-x shell when the interactive shell is `bash'. (defcustom explicit-bash-args - ;; Tell bash not to use readline, except for bash 1.x which doesn't grook --noediting. - ;; Bash 1.x has -nolineediting, but process-send-eof cannot terminate bash if we use it. (let* ((prog (or (and (boundp 'explicit-shell-file-name) explicit-shell-file-name) (getenv "ESHELL") shell-file-name)) (name (file-name-nondirectory prog))) + ;; Tell bash not to use readline, except for bash 1.x which + ;; doesn't grook --noediting. Bash 1.x has -nolineediting, but + ;; process-send-eof cannot terminate bash if we use it. (if (and (not purify-flag) (equal name "bash") (file-executable-p prog) @@ -483,7 +488,9 @@ The argument STRING is ignored." (let ((pmark (process-mark (get-buffer-process (current-buffer))))) (save-excursion - (goto-char (or comint-last-output-start (point-min))) + (goto-char (or (and (markerp comint-last-output-start) + (marker-position comint-last-output-start)) + (point-min))) (while (re-search-forward "[\C-a\C-b]" pmark t) (replace-match "")))))
--- a/lisp/simple.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/simple.el Sat Oct 14 17:36:28 2006 +0000 @@ -116,29 +116,29 @@ :group 'next-error :version "22.1") -(defcustom next-error-highlight 0.1 +(defcustom next-error-highlight 0.5 "*Highlighting of locations in selected source buffers. If number, highlight the locus in `next-error' face for given time in seconds. -If t, use persistent overlays fontified in `next-error' face. +If t, highlight the locus indefinitely until some other locus replaces it. If nil, don't highlight the locus in the source buffer. If `fringe-arrow', indicate the locus by the fringe arrow." - :type '(choice (number :tag "Delay") - (const :tag "Persistent overlay" t) + :type '(choice (number :tag "Highlight for specified time") + (const :tag "Semipermanent highlighting" t) (const :tag "No highlighting" nil) - (const :tag "Fringe arrow" 'fringe-arrow)) + (const :tag "Fringe arrow" fringe-arrow)) :group 'next-error :version "22.1") -(defcustom next-error-highlight-no-select 0.1 - "*Highlighting of locations in non-selected source buffers. +(defcustom next-error-highlight-no-select 0.5 + "*Highlighting of locations in `next-error-no-select'. If number, highlight the locus in `next-error' face for given time in seconds. -If t, use persistent overlays fontified in `next-error' face. +If t, highlight the locus indefinitely until some other locus replaces it. If nil, don't highlight the locus in the source buffer. If `fringe-arrow', indicate the locus by the fringe arrow." - :type '(choice (number :tag "Delay") - (const :tag "Persistent overlay" t) + :type '(choice (number :tag "Highlight for specified time") + (const :tag "Semipermanent highlighting" t) (const :tag "No highlighting" nil) - (const :tag "Fringe arrow" 'fringe-arrow)) + (const :tag "Fringe arrow" fringe-arrow)) :group 'next-error :version "22.1") @@ -1489,8 +1489,7 @@ then call `undo-more' one or more times to undo them." (or (listp pending-undo-list) (error (concat "No further undo information" - (and transient-mark-mode mark-active - " for region")))) + (and undo-in-region " for region")))) (let ((undo-in-progress t)) (setq pending-undo-list (primitive-undo n pending-undo-list)) (if (null pending-undo-list) @@ -1637,12 +1636,12 @@ ((null (car undo-elt)) ;; (nil PROPERTY VALUE BEG . END) (let ((tail (nthcdr 3 undo-elt))) - (not (or (< (car tail) end) - (> (cdr tail) start))))) + (and (< (car tail) end) + (> (cdr tail) start)))) ((integerp (car undo-elt)) ;; (BEGIN . END) - (not (or (< (car undo-elt) end) - (> (cdr undo-elt) start)))))) + (and (< (car undo-elt) end) + (> (cdr undo-elt) start))))) ;; Return the first affected buffer position and the delta for an undo element ;; delta is defined as the change in subsequent buffer positions if we *did* @@ -1664,7 +1663,7 @@ Normally, Emacs discards the undo info for the current command if it exceeds `undo-outer-limit'. But if you set this option non-nil, it asks in the echo area whether to discard the info. -If you answer no, there a slight risk that Emacs might crash, so +If you answer no, there is a slight risk that Emacs might crash, so only do it if you really want to undo the command. This option is mainly intended for debugging. You have to be @@ -2546,6 +2545,8 @@ ;; Pass point first, then mark, because the order matters ;; when calling kill-append. (interactive (list (point) (mark))) + (unless (and beg end) + (error "The mark is not set now, so there is no region")) (condition-case nil (let ((string (filter-buffer-substring beg end t))) (when string ;STRING is nil if BEG = END @@ -2649,7 +2650,7 @@ ;; This is actually used in subr.el but defcustom does not work there. (defcustom yank-excluded-properties '(read-only invisible intangible field mouse-face help-echo local-map keymap - yank-handler follow-link) + yank-handler follow-link fontified) "*Text properties to discard when yanking. The value should be a list of text properties to discard or t, which means to discard all text properties." @@ -3467,6 +3468,63 @@ (or (memq prop buffer-invisibility-spec) (assq prop buffer-invisibility-spec))))) +;; Returns non-nil if partial move was done. +(defun line-move-partial (arg noerror to-end) + (if (< arg 0) + ;; Move backward (up). + ;; If already vscrolled, reduce vscroll + (let ((vs (window-vscroll nil t))) + (when (> vs (frame-char-height)) + (set-window-vscroll nil (- vs (frame-char-height)) t))) + + ;; Move forward (down). + (let* ((lh (window-line-height -1)) + (vpos (nth 1 lh)) + (ypos (nth 2 lh)) + (rbot (nth 3 lh)) + ppos py vs) + (when (or (null lh) + (>= rbot (frame-char-height)) + (<= ypos (- (frame-char-height)))) + (unless lh + (let ((wend (pos-visible-in-window-p t nil t))) + (setq rbot (nth 3 wend) + vpos (nth 5 wend)))) + (cond + ;; If last line of window is fully visible, move forward. + ((or (null rbot) (= rbot 0)) + nil) + ;; If cursor is not in the bottom scroll margin, move forward. + ((and (> vpos 0) + (< (setq py + (or (nth 1 (window-line-height)) + (let ((ppos (posn-at-point))) + (cdr (or (posn-actual-col-row ppos) + (posn-col-row ppos)))))) + (min (- (window-text-height) scroll-margin 1) (1- vpos)))) + nil) + ;; When already vscrolled, we vscroll some more if we can, + ;; or clear vscroll and move forward at end of tall image. + ((> (setq vs (window-vscroll nil t)) 0) + (when (> rbot 0) + (set-window-vscroll nil (+ vs (min rbot (frame-char-height))) t))) + ;; If cursor just entered the bottom scroll margin, move forward, + ;; but also vscroll one line so redisplay wont recenter. + ((and (> vpos 0) + (= py (min (- (window-text-height) scroll-margin 1) + (1- vpos)))) + (set-window-vscroll nil (frame-char-height) t) + (line-move-1 arg noerror to-end) + t) + ;; If there are lines above the last line, scroll-up one line. + ((> vpos 0) + (scroll-up 1) + t) + ;; Finally, start vscroll. + (t + (set-window-vscroll nil (frame-char-height) t))))))) + + ;; This is like line-move-1 except that it also performs ;; vertical scrolling of tall images if appropriate. ;; That is not really a clean thing to do, since it mixes @@ -3474,37 +3532,14 @@ ;; a cleaner solution to the problem of making C-n do something ;; useful given a tall image. (defun line-move (arg &optional noerror to-end try-vscroll) - (if (and auto-window-vscroll try-vscroll - ;; But don't vscroll in a keyboard macro. - (not defining-kbd-macro) - (not executing-kbd-macro)) - (let ((forward (> arg 0)) - (part (nth 2 (pos-visible-in-window-p (point) nil t)))) - (if (and (consp part) - (> (if forward (cdr part) (car part)) 0)) - (set-window-vscroll nil - (if forward - (+ (window-vscroll nil t) - (min (cdr part) - (* (frame-char-height) arg))) - (max 0 - (- (window-vscroll nil t) - (min (car part) - (* (frame-char-height) (- arg)))))) - t) - (set-window-vscroll nil 0) - (when (line-move-1 arg noerror to-end) - (when (not forward) - ;; Update display before calling pos-visible-in-window-p, - ;; because it depends on window-start being up-to-date. - (sit-for 0) - ;; If the current line is partly hidden at the bottom, - ;; scroll it partially up so as to unhide the bottom. - (if (and (setq part (nth 2 (pos-visible-in-window-p - (line-beginning-position) nil t))) - (> (cdr part) 0)) - (set-window-vscroll nil (cdr part) t))) - t))) + (unless (and auto-window-vscroll try-vscroll + ;; Only vscroll for single line moves + (= (abs arg) 1) + ;; But don't vscroll in a keyboard macro. + (not defining-kbd-macro) + (not executing-kbd-macro) + (line-move-partial arg noerror to-end)) + (set-window-vscroll nil 0 t) (line-move-1 arg noerror to-end))) ;; This is the guts of next-line and previous-line. @@ -3515,7 +3550,7 @@ ;; for intermediate positions. (let ((inhibit-point-motion-hooks t) (opoint (point)) - (forward (> arg 0))) + (orig-arg arg)) (unwind-protect (progn (if (not (memq last-command '(next-line previous-line))) @@ -3548,14 +3583,18 @@ 'end-of-buffer) nil))) ;; Move by arg lines, but ignore invisible ones. - (let (done) + (let (done line-end) (while (and (> arg 0) (not done)) ;; If the following character is currently invisible, ;; skip all characters with that same `invisible' property value. (while (and (not (eobp)) (line-move-invisible-p (point))) (goto-char (next-char-property-change (point)))) - ;; Now move a line. - (end-of-line) + ;; Move a line. + ;; We don't use `end-of-line', since we want to escape + ;; from field boundaries ocurring exactly at point. + (let ((inhibit-field-text-motion t)) + (setq line-end (line-end-position))) + (goto-char (constrain-to-field line-end (point) t t)) ;; If there's no invisibility here, move over the newline. (cond ((eobp) @@ -3613,7 +3652,7 @@ (beginning-of-line)) (t (line-move-finish (or goal-column temporary-goal-column) - opoint forward)))))) + opoint (> orig-arg 0))))))) (defun line-move-finish (column opoint forward) (let ((repeat t)) @@ -3622,6 +3661,7 @@ (setq repeat nil) (let (new + (old (point)) (line-beg (save-excursion (beginning-of-line) (point))) (line-end ;; Compute the end of the line @@ -3636,6 +3676,17 @@ ;; Move to the desired column. (line-move-to-column column) + + ;; Corner case: suppose we start out in a field boundary in + ;; the middle of a continued line. When we get to + ;; line-move-finish, point is at the start of a new *screen* + ;; line but the same text line; then line-move-to-column would + ;; move us backwards. Test using C-n with point on the "x" in + ;; (insert "a" (propertize "x" 'field t) (make-string 89 ?y)) + (and forward + (< (point) old) + (goto-char old)) + (setq new (point)) ;; Process intangibility within a line. @@ -3675,8 +3726,15 @@ (goto-char opoint) (let ((inhibit-point-motion-hooks nil)) (goto-char - (constrain-to-field new opoint nil t - 'inhibit-line-move-field-capture))) + ;; Ignore field boundaries if the initial and final + ;; positions have the same `field' property, even if the + ;; fields are non-contiguous. This seems to be "nicer" + ;; behavior in many situations. + (if (eq (get-char-property new 'field) + (get-char-property opoint 'field)) + new + (constrain-to-field new opoint t t + 'inhibit-line-move-field-capture)))) ;; If all this moved us to a different line, ;; retry everything within that new line. @@ -3691,10 +3749,7 @@ and `current-column' to be able to ignore invisible text." (if (zerop col) (beginning-of-line) - (let ((opoint (point))) - (move-to-column col) - ;; move-to-column doesn't respect field boundaries. - (goto-char (constrain-to-field (point) opoint)))) + (move-to-column col)) (when (and line-move-ignore-invisible (not (bolp)) (line-move-invisible-p (1- (point)))) @@ -4330,21 +4385,21 @@ Line numbers do not appear for very large buffers and buffers with very long lines; see variables `line-number-display-limit' and `line-number-display-limit-width'." - :init-value t :global t :group 'editing-basics) + :init-value t :global t :group 'mode-line) (define-minor-mode column-number-mode "Toggle Column Number mode. With arg, turn Column Number mode on iff arg is positive. When Column Number mode is enabled, the column number appears in the mode line." - :global t :group 'editing-basics) + :global t :group 'mode-line) (define-minor-mode size-indication-mode "Toggle Size Indication mode. With arg, turn Size Indication mode on iff arg is positive. When Size Indication mode is enabled, the size of the accessible part of the buffer appears in the mode line." - :global t :group 'editing-basics) + :global t :group 'mode-line) (defgroup paren-blinking nil "Blinking matching of parens and expressions." @@ -4974,6 +5029,12 @@ ;; Variables and faces used in `completion-setup-function'. +(defcustom completion-show-help t + "Non-nil means show help message in *Completions* buffer." + :type 'boolean + :version "22.1" + :group 'completion) + (defface completions-first-difference '((t (:inherit bold))) "Face put on the first uncommon character in completions in *Completions* buffer." @@ -5060,14 +5121,15 @@ (if (get-char-property element-common-end 'mouse-face) (put-text-property element-common-end (1+ element-common-end) 'font-lock-face 'completions-first-difference)))))) - ;; Insert help string. - (goto-char (point-min)) - (if (display-mouse-p) - (insert (substitute-command-keys - "Click \\[mouse-choose-completion] on a completion to select it.\n"))) - (insert (substitute-command-keys - "In this buffer, type \\[choose-completion] to \ -select the completion near point.\n\n"))))) + ;; Maybe insert help string. + (when completion-show-help + (goto-char (point-min)) + (if (display-mouse-p) + (insert (substitute-command-keys + "Click \\[mouse-choose-completion] on a completion to select it.\n"))) + (insert (substitute-command-keys + "In this buffer, type \\[choose-completion] to \ +select the completion near point.\n\n")))))) (add-hook 'completion-setup-hook 'completion-setup-function)
--- a/lisp/startup.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/startup.el Sat Oct 14 17:36:28 2006 +0000 @@ -784,6 +784,7 @@ (custom-reevaluate-setting 'mouse-wheel-up-event) (custom-reevaluate-setting 'file-name-shadow-mode) (custom-reevaluate-setting 'send-mail-function) + (custom-reevaluate-setting 'focus-follows-mouse) (normal-erase-is-backspace-setup-frame) @@ -1097,10 +1098,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar fancy-splash-text - '((:face variable-pitch - "You can do basic editing with the menu bar and scroll bar \ -using the mouse.\n\n" - :face (variable-pitch :weight bold) + '((:face (variable-pitch :weight bold) "Important Help menu items:\n" :face variable-pitch (lambda () @@ -1124,8 +1122,8 @@ "\n"))) :face variable-pitch "\ Emacs FAQ\tFrequently asked questions and answers -Read the Emacs Manual\tView the Emacs manual using Info -\(Non)Warranty\tGNU Emacs comes with " +View Emacs Manual\tView the Emacs manual using Info +Absence of Warranty\tGNU Emacs comes with " :face (variable-pitch :slant oblique) "ABSOLUTELY NO WARRANTY\n" :face variable-pitch @@ -1133,18 +1131,16 @@ Copying Conditions\tConditions for redistributing and changing Emacs Getting New Versions\tHow to obtain the latest version of Emacs More Manuals / Ordering Manuals Buying printed manuals from the FSF\n") - (:face variable-pitch - "You can do basic editing with the menu bar and scroll bar \ -using the mouse.\n\n" - :face (variable-pitch :weight bold) - "Useful File menu items:\n" - :face variable-pitch "\ -Exit Emacs\t(Or type Control-x followed by Control-c) + (:face (variable-pitch :weight bold) + "Useful File menu items:\n" + :face variable-pitch "\ +Exit Emacs\t\t(Or type Control-x followed by Control-c) Recover Crashed Session\tRecover files you were editing before a crash + " )) "A list of texts to show in the middle part of splash screens. @@ -1249,6 +1245,10 @@ "GNU Emacs is one component of the GNU/Linux operating system." "GNU Emacs is one component of the GNU operating system.")) (insert "\n") + (fancy-splash-insert + :face 'variable-pitch + "You can do basic editing with the menu bar and scroll bar \ +using the mouse.\n\n") (if fancy-splash-outer-buffer (fancy-splash-insert :face 'variable-pitch @@ -1285,7 +1285,7 @@ t) (fancy-splash-insert :face '(variable-pitch :foreground "red") "\n\nIf an Emacs session crashed recently, " - "type M-x recover-session RET\nto recover" + "type Meta-x recover-session RET\nto recover" " the files you were editing.")))) (defun fancy-splash-screens-1 (buffer) @@ -1340,7 +1340,6 @@ (defun fancy-splash-screens (&optional hide-on-input) "Display fancy splash screens when Emacs starts." - (setq fancy-splash-help-echo (startup-echo-area-message)) (if hide-on-input (let ((old-hourglass display-hourglass) (fancy-splash-outer-buffer (current-buffer)) @@ -1352,11 +1351,11 @@ (save-selected-window (select-frame frame) (switch-to-buffer "GNU Emacs") - (setq tab-width 20) (setq splash-buffer (current-buffer)) (catch 'stop-splashing (unwind-protect (let* ((map (make-sparse-keymap)) + (cursor-type nil) (overriding-local-map map) ;; Catch if our frame is deleted; the delete-frame ;; event is unreliable and is handled by @@ -1367,8 +1366,7 @@ (define-key map [mouse-movement] 'ignore) (define-key map [mode-line t] 'ignore) (define-key map [select-window] 'ignore) - (setq cursor-type nil - display-hourglass nil + (setq display-hourglass nil minor-mode-map-alist nil emulation-mode-map-alists nil buffer-undo-list t @@ -1379,6 +1377,7 @@ timer (run-with-timer 0 fancy-splash-delay #'fancy-splash-screens-1 splash-buffer)) + (message "%s" (startup-echo-area-message)) (recursive-edit)) (cancel-timer timer) (setq display-hourglass old-hourglass @@ -1388,11 +1387,12 @@ (when (frame-live-p frame) (select-frame frame) (switch-to-buffer fancy-splash-outer-buffer)))))) - ;; If hide-on-input is non-nil, don't hide the buffer on input. + ;; If hide-on-input is nil, don't hide the buffer on input. (if (or (window-minibuffer-p) (window-dedicated-p (selected-window))) (pop-to-buffer (current-buffer)) - (switch-to-buffer "GNU Emacs")) + (switch-to-buffer "*About GNU Emacs*")) + (setq buffer-read-only nil) (erase-buffer) (if pure-space-overflow (insert "\ @@ -1401,9 +1401,16 @@ (let (fancy-splash-outer-buffer) (fancy-splash-head) (dolist (text fancy-splash-text) - (apply #'fancy-splash-insert text)) + (apply #'fancy-splash-insert text) + (insert "\n")) + (skip-chars-backward "\n") + (delete-region (point) (point-max)) + (insert "\n") (fancy-splash-tail) (set-buffer-modified-p nil) + (setq buffer-read-only t) + (if (and view-read-only (not view-mode)) + (view-mode-enter nil 'kill-buffer)) (goto-char (point-min))))) @@ -1441,6 +1448,7 @@ (let ((prev-buffer (current-buffer))) (unwind-protect (with-current-buffer (get-buffer-create "GNU Emacs") + (setq buffer-read-only nil) (erase-buffer) (set (make-local-variable 'tab-width) 8) (if hide-on-input @@ -1575,26 +1583,32 @@ auto-save-list-file-prefix))) t) (insert "\n\nIf an Emacs session crashed recently, " - "type M-x recover-session RET\nto recover" + "type Meta-x recover-session RET\nto recover" " the files you were editing.")) ;; Display the input that we set up in the buffer. (set-buffer-modified-p nil) + (setq buffer-read-only t) + (if (and view-read-only (not view-mode)) + (view-mode-enter nil 'kill-buffer)) (goto-char (point-min)) - (if (or (window-minibuffer-p) - (window-dedicated-p (selected-window))) - ;; If hide-on-input is nil, creating a new frame will - ;; generate enough events that the subsequent `sit-for' - ;; will immediately return anyway. - (pop-to-buffer (current-buffer)) - (if hide-on-input + (if hide-on-input + (if (or (window-minibuffer-p) + (window-dedicated-p (selected-window))) + ;; If hide-on-input is nil, creating a new frame will + ;; generate enough events that the subsequent `sit-for' + ;; will immediately return anyway. + nil ;; (pop-to-buffer (current-buffer)) (save-window-excursion (switch-to-buffer (current-buffer)) (sit-for 120)) - (switch-to-buffer (current-buffer))))) + (condition-case nil + (switch-to-buffer (current-buffer)))))) ;; Unwind ... ensure splash buffer is killed (if hide-on-input - (kill-buffer "GNU Emacs"))))) + (kill-buffer "GNU Emacs") + (switch-to-buffer "GNU Emacs") + (rename-buffer "*About GNU Emacs*" t))))) (defun startup-echo-area-message () @@ -1651,8 +1665,9 @@ (defun display-splash-screen (&optional hide-on-input) "Display splash screen according to display. Fancy splash screens are used on graphic displays, -normal otherwise." - (interactive) +normal otherwise. +With a prefix argument, any user input hides the splash screen." + (interactive "P") ;; Prevent recursive calls from server-process-filter. (if (not (get-buffer "GNU Emacs")) (if (use-fancy-splash-screens-p)
--- a/lisp/strokes.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/strokes.el Sat Oct 14 17:36:28 2006 +0000 @@ -142,6 +142,8 @@ ;; the user to enter strokes which "remove the pencil from the paper" ;; so to speak, so one character can have multiple strokes. +;; NOTE (Oct 7, 2006): The URLs below seem to be invalid!!! + ;; You can read more about strokes at: ;; http://www.mit.edu/people/cadet/strokes-help.html @@ -211,7 +213,6 @@ (defgroup strokes nil "Control Emacs through mouse strokes." :link '(emacs-commentary-link "strokes") - :link '(url-link "http://www.mit.edu/people/cadet/strokes-help.html") :group 'mouse) (defcustom strokes-modeline-string " Strokes"
--- a/lisp/subr.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/subr.el Sat Oct 14 17:36:28 2006 +0000 @@ -1085,9 +1085,10 @@ (kill-local-variable hook) (set hook hook-value)))))) -(defun add-to-list (list-var element &optional append) +(defun add-to-list (list-var element &optional append compare-fn) "Add ELEMENT to the value of LIST-VAR if it isn't there yet. -The test for presence of ELEMENT is done with `equal'. +The test for presence of ELEMENT is done with `equal', +or with COMPARE-FN if that's non-nil. If ELEMENT is added, it is added at the beginning of the list, unless the optional argument APPEND is non-nil, in which case ELEMENT is added at the end. @@ -1099,7 +1100,13 @@ into a hook function that will be run only after loading the package. `eval-after-load' provides one way to do this. In some cases other hooks, such as major mode hooks, can do the job." - (if (member element (symbol-value list-var)) + (if (if compare-fn + (let (present) + (dolist (elt (symbol-value list-var)) + (if (funcall compare-fn element elt) + (setq present t))) + present) + (member element (symbol-value list-var))) (symbol-value list-var) (set list-var (if append @@ -1733,13 +1740,20 @@ (when (or obsolete (numberp nodisp)) (setq seconds (+ seconds (* 1e-3 nodisp))) (setq nodisp obsolete)) - (if noninteractive - (progn (sleep-for seconds) t) - (unless nodisp (redisplay)) - (or (<= seconds 0) - (let ((read (read-event nil nil seconds))) - (or (null read) - (progn (push read unread-command-events) nil)))))) + (cond + (noninteractive + (sleep-for seconds) + t) + ((input-pending-p) + nil) + ((<= seconds 0) + (or nodisp (redisplay))) + (t + (or nodisp (redisplay)) + (let ((read (read-event nil nil seconds))) + (or (null read) + (progn (push read unread-command-events) + nil)))))) ;;; Atomic change groups. @@ -2039,7 +2053,8 @@ (defun shell-quote-argument (argument) "Quote an argument for passing as argument to an inferior shell." - (if (eq system-type 'ms-dos) + (if (or (eq system-type 'ms-dos) + (and (eq system-type 'windows-nt) (w32-shell-dos-semantics))) ;; Quote using double quotes, but escape any existing quotes in ;; the argument with backslashes. (let ((result "") @@ -2053,19 +2068,17 @@ "\\" (substring argument end (1+ end))) start (1+ end)))) (concat "\"" result (substring argument start) "\"")) - (if (eq system-type 'windows-nt) - (concat "\"" argument "\"") - (if (equal argument "") - "''" - ;; Quote everything except POSIX filename characters. - ;; This should be safe enough even for really weird shells. - (let ((result "") (start 0) end) - (while (string-match "[^-0-9a-zA-Z_./]" argument start) - (setq end (match-beginning 0) - result (concat result (substring argument start end) - "\\" (substring argument end (1+ end))) - start (1+ end))) - (concat result (substring argument start))))))) + (if (equal argument "") + "''" + ;; Quote everything except POSIX filename characters. + ;; This should be safe enough even for really weird shells. + (let ((result "") (start 0) end) + (while (string-match "[^-0-9a-zA-Z_./]" argument start) + (setq end (match-beginning 0) + result (concat result (substring argument start end) + "\\" (substring argument end (1+ end))) + start (1+ end))) + (concat result (substring argument start)))))) (defun string-or-null-p (object) "Return t if OBJECT is a string or nil. @@ -2154,11 +2167,32 @@ (let* ((handler (and (stringp string) (get-text-property 0 'yank-handler string))) (param (or (nth 1 handler) string)) - (opoint (point))) + (opoint (point)) + end) + (setq yank-undo-function t) (if (nth 0 handler) ;; FUNCTION (funcall (car handler) param) (insert param)) + (setq end (point)) + + ;; What should we do with `font-lock-face' properties? + (if font-lock-defaults + ;; No, just wipe them. + (remove-list-of-text-properties opoint end '(font-lock-face)) + ;; Convert them to `face'. + (save-excursion + (goto-char opoint) + (while (< (point) end) + (let ((face (get-text-property (point) 'font-lock-face)) + run-end) + (setq run-end + (next-single-property-change (point) 'font-lock-face nil end)) + (when face + (remove-text-properties (point) run-end '(font-lock-face nil)) + (put-text-property (point) run-end 'face face)) + (goto-char run-end))))) + (unless (nth 2 handler) ;; NOEXCLUDE (remove-yank-excluded-properties opoint (point))) (if (eq yank-undo-function t) ;; not set by FUNCTION @@ -2201,7 +2235,9 @@ BUFFER may be also nil, meaning that this process is not associated with any buffer COMMAND is the name of a shell command. -Remaining arguments are the arguments for the command. +Remaining arguments are the arguments for the command; they are all +spliced together with blanks separating between each two of them, before +passing the command to the shell. Wildcards and redirection are handled as usual in the shell. \(fn NAME BUFFER COMMAND &rest COMMAND-ARGS)" @@ -2404,8 +2440,8 @@ `(with-local-quit (catch ',catch-sym (let ((throw-on-input ',catch-sym)) - (or (not (sit-for 0 0 t)) - ,@body)))))) + (or (input-pending-p) + ,@body)))))) (defmacro combine-after-change-calls (&rest body) "Execute BODY, but don't call the after-change functions till the end. @@ -3109,8 +3145,8 @@ (defvar version-regexp-alist '(("^[-_+ ]?a\\(lpha\\)?$" . -3) - ("^[-_+]$" . -3) ; treat "1.2.3-20050920" and "1.2-3" as alpha releases - ("^[-_+ ]cvs$" . -3) ; treat "1.2.3-CVS" as alpha release + ("^[-_+]$" . -3) ; treat "1.2.3-20050920" and "1.2-3" as alpha releases + ("^[-_+ ]cvs$" . -3) ; treat "1.2.3-CVS" as alpha release ("^[-_+ ]?b\\(eta\\)?$" . -2) ("^[-_+ ]?\\(pre\\|rc\\)$" . -1)) "*Specify association between non-numeric version part and a priority.
--- a/lisp/term/mac-win.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/term/mac-win.el Sat Oct 14 17:36:28 2006 +0000 @@ -1287,14 +1287,19 @@ (find-coding-systems-string string))) (setq coding-system (coding-system-change-eol-conversion coding-system 'mac)) - (when (and (eq system-type 'darwin) - (eq coding-system 'japanese-shift-jis-mac)) - (setq encoding mac-text-encoding-mac-japanese-basic-variant) - (setq string (subst-char-in-string ?\\ ?\x80 string)) - (subst-char-in-string ?\(J\(B ?\x5c string t)) - (setq data (mac-code-convert-string - (encode-coding-string string coding-system) - (or encoding coding-system) nil))) + (let ((str string)) + (when (and (eq system-type 'darwin) + (eq coding-system 'japanese-shift-jis-mac)) + (setq encoding mac-text-encoding-mac-japanese-basic-variant) + (setq str (subst-char-in-string ?\\ ?\x80 str)) + (subst-char-in-string ?\(J\(B ?\x5c str t) + ;; ASCII-only? + (if (string-match "\\`[\x00-\x7f]*\\'" str) + (setq str nil))) + (and str + (setq data (mac-code-convert-string + (encode-coding-string str coding-system) + (or encoding coding-system) nil))))) (or data (encode-coding-string string (if (eq (byteorder) ?B) 'utf-16be-mac 'utf-16le-mac))))) @@ -1528,19 +1533,20 @@ ;;; Event IDs ;; kCoreEventClass -(put 'open-application 'mac-apple-event-id "oapp") ; kAEOpenApplication -(put 'reopen-application 'mac-apple-event-id "rapp") ; kAEReopenApplication -(put 'open-documents 'mac-apple-event-id "odoc") ; kAEOpenDocuments -(put 'print-documents 'mac-apple-event-id "pdoc") ; kAEPrintDocuments -(put 'open-contents 'mac-apple-event-id "ocon") ; kAEOpenContents -(put 'quit-application 'mac-apple-event-id "quit") ; kAEQuitApplication -(put 'application-died 'mac-apple-event-id "obit") ; kAEApplicationDied -(put 'show-preferences 'mac-apple-event-id "pref") ; kAEShowPreferences -(put 'autosave-now 'mac-apple-event-id "asav") ; kAEAutosaveNow +(put 'open-application 'mac-apple-event-id "oapp") ; kAEOpenApplication +(put 'reopen-application 'mac-apple-event-id "rapp") ; kAEReopenApplication +(put 'open-documents 'mac-apple-event-id "odoc") ; kAEOpenDocuments +(put 'print-documents 'mac-apple-event-id "pdoc") ; kAEPrintDocuments +(put 'open-contents 'mac-apple-event-id "ocon") ; kAEOpenContents +(put 'quit-application 'mac-apple-event-id "quit") ; kAEQuitApplication +(put 'application-died 'mac-apple-event-id "obit") ; kAEApplicationDied +(put 'show-preferences 'mac-apple-event-id "pref") ; kAEShowPreferences +(put 'autosave-now 'mac-apple-event-id "asav") ; kAEAutosaveNow ;; kAEInternetEventClass -(put 'get-url 'mac-apple-event-id "GURL") ; kAEGetURL +(put 'get-url 'mac-apple-event-id "GURL") ; kAEGetURL ;; Converted HI command events -(put 'about 'mac-apple-event-id "abou") ; kHICommandAbout +(put 'about 'mac-apple-event-id "abou") ; kHICommandAbout +(put 'show-hide-font-panel 'mac-apple-event-id "shfp") ; kHICommandShowHideFontPanel (defmacro mac-event-spec (event) `(nth 1 ,event)) @@ -1796,6 +1802,8 @@ 'mac-handle-font-panel-closed) ;; kEventClassFont/kEventFontSelection (define-key mac-apple-event-map [font selection] 'mac-handle-font-selection) +(define-key mac-apple-event-map [hi-command show-hide-font-panel] + 'mac-font-panel-mode) (define-key-after menu-bar-showhide-menu [mac-font-panel-mode] (menu-bar-make-mm-toggle mac-font-panel-mode
--- a/lisp/term/x-win.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/term/x-win.el Sat Oct 14 17:36:28 2006 +0000 @@ -2393,6 +2393,12 @@ (kill-new clipboard-text)) (yank))) +(defun x-menu-bar-open (&optional frame) + "Open the menu bar if `menu-bar-mode' is on. otherwise call `tmm-menubar'." + (interactive "i") + (if menu-bar-mode (menu-bar-open frame) + (tmm-menubar))) + ;;; Window system initialization.
--- a/lisp/term/xterm.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/term/xterm.el Sat Oct 14 17:36:28 2006 +0000 @@ -162,17 +162,20 @@ ;; These keys are available in xterm starting from version 216 ;; if the modifyOtherKeys resource is set to 1. +(define-key xterm-function-map "\e[27;5;9~" [C-tab]) +(define-key xterm-function-map "\e[27;5;13~" [C-return]) (define-key xterm-function-map "\e[27;5;39~" [?\C-\']) +(define-key xterm-function-map "\e[27;5;44~" [?\C-,]) (define-key xterm-function-map "\e[27;5;45~" [?\C--]) - +(define-key xterm-function-map "\e[27;5;46~" [?\C-.]) +(define-key xterm-function-map "\e[27;5;47~" [?\C-/]) (define-key xterm-function-map "\e[27;5;48~" [?\C-0]) (define-key xterm-function-map "\e[27;5;49~" [?\C-1]) ;; Not all C-DIGIT keys have a distinct binding. (define-key xterm-function-map "\e[27;5;57~" [?\C-9]) - -(define-key xterm-function-map "\e[27;5;59~" [?\C-\;]) +(define-key xterm-function-map "\e[27;5;59~" [(C-\;)]) (define-key xterm-function-map "\e[27;5;61~" [?\C-=]) - +(define-key xterm-function-map "\e[27;5;92~" [?\C-\\]) (define-key xterm-function-map "\e[27;6;33~" [?\C-!]) (define-key xterm-function-map "\e[27;6;34~" [?\C-\"]) @@ -184,26 +187,93 @@ (define-key xterm-function-map "\e[27;6;41~" [?\C-)]) (define-key xterm-function-map "\e[27;6;42~" [?\C-*]) (define-key xterm-function-map "\e[27;6;43~" [?\C-+]) - (define-key xterm-function-map "\e[27;6;58~" [?\C-:]) (define-key xterm-function-map "\e[27;6;60~" [?\C-<]) (define-key xterm-function-map "\e[27;6;62~" [?\C->]) (define-key xterm-function-map "\e[27;6;63~" [(C-\?)]) -(define-key xterm-function-map "\e[27;5;9~" [C-tab]) -(define-key xterm-function-map "\e[27;5;13~" [C-return]) -(define-key xterm-function-map "\e[27;5;44~" [?\C-,]) -(define-key xterm-function-map "\e[27;5;46~" [?\C-.]) -(define-key xterm-function-map "\e[27;5;47~" [?\C-/]) -(define-key xterm-function-map "\e[27;5;92~" [?\C-\\]) +;; These are the strings emitted for various C-M- combinations +;; for keyboards that the Meta and Alt modifiers are on the same +;; key (usually labeled "Alt"). +(define-key xterm-function-map "\e[27;13;9~" [(C-M-tab)]) +(define-key xterm-function-map "\e[27;13;13~" [(C-M-return)]) + +(define-key xterm-function-map "\e[27;13;39~" [?\C-\M-\']) +(define-key xterm-function-map "\e[27;13;44~" [?\C-\M-,]) +(define-key xterm-function-map "\e[27;13;45~" [?\C-\M--]) +(define-key xterm-function-map "\e[27;13;46~" [?\C-\M-.]) +(define-key xterm-function-map "\e[27;13;47~" [?\C-\M-/]) +(define-key xterm-function-map "\e[27;13;48~" [?\C-\M-0]) +(define-key xterm-function-map "\e[27;13;49~" [?\C-\M-1]) +(define-key xterm-function-map "\e[27;13;50~" [?\C-\M-2]) +(define-key xterm-function-map "\e[27;13;51~" [?\C-\M-3]) +(define-key xterm-function-map "\e[27;13;52~" [?\C-\M-4]) +(define-key xterm-function-map "\e[27;13;53~" [?\C-\M-5]) +(define-key xterm-function-map "\e[27;13;54~" [?\C-\M-6]) +(define-key xterm-function-map "\e[27;13;55~" [?\C-\M-7]) +(define-key xterm-function-map "\e[27;13;56~" [?\C-\M-8]) +(define-key xterm-function-map "\e[27;13;57~" [?\C-\M-9]) +(define-key xterm-function-map "\e[27;13;59~" [?\C-\M-\;]) +(define-key xterm-function-map "\e[27;13;61~" [?\C-\M-=]) +(define-key xterm-function-map "\e[27;13;92~" [?\C-\M-\\]) + +(define-key xterm-function-map "\e[27;14;33~" [?\C-\M-!]) +(define-key xterm-function-map "\e[27;14;34~" [?\C-\M-\"]) +(define-key xterm-function-map "\e[27;14;35~" [?\C-\M-#]) +(define-key xterm-function-map "\e[27;14;36~" [?\C-\M-$]) +(define-key xterm-function-map "\e[27;14;37~" [?\C-\M-%]) +(define-key xterm-function-map "\e[27;14;38~" [(C-M-&)]) +(define-key xterm-function-map "\e[27;14;40~" [?\C-\M-(]) +(define-key xterm-function-map "\e[27;14;41~" [?\C-\M-)]) +(define-key xterm-function-map "\e[27;14;42~" [?\C-\M-*]) +(define-key xterm-function-map "\e[27;14;43~" [?\C-\M-+]) +(define-key xterm-function-map "\e[27;14;58~" [?\C-\M-:]) +(define-key xterm-function-map "\e[27;14;60~" [?\C-\M-<]) +(define-key xterm-function-map "\e[27;14;62~" [?\C-\M->]) +(define-key xterm-function-map "\e[27;14;63~" [(C-M-\?)]) -(define-key xterm-function-map "\e[27;2;9~" [S-tab]) -(define-key xterm-function-map "\e[27;2;13~" [S-return]) +(define-key xterm-function-map "\e[27;7;9~" [(C-M-tab)]) +(define-key xterm-function-map "\e[27;7;13~" [(C-M-return)]) -(define-key xterm-function-map "\e[27;6;9~" [(C-S-tab)]) +(define-key xterm-function-map "\e[27;7;39~" [?\C-\M-\']) +(define-key xterm-function-map "\e[27;7;44~" [?\C-\M-,]) +(define-key xterm-function-map "\e[27;7;45~" [?\C-\M--]) +(define-key xterm-function-map "\e[27;7;46~" [?\C-\M-.]) +(define-key xterm-function-map "\e[27;7;47~" [?\C-\M-/]) +(define-key xterm-function-map "\e[27;7;48~" [?\C-\M-0]) +(define-key xterm-function-map "\e[27;7;49~" [?\C-\M-1]) +(define-key xterm-function-map "\e[27;7;50~" [?\C-\M-2]) +(define-key xterm-function-map "\e[27;7;51~" [?\C-\M-3]) +(define-key xterm-function-map "\e[27;7;52~" [?\C-\M-4]) +(define-key xterm-function-map "\e[27;7;53~" [?\C-\M-5]) +(define-key xterm-function-map "\e[27;7;54~" [?\C-\M-6]) +(define-key xterm-function-map "\e[27;7;55~" [?\C-\M-7]) +(define-key xterm-function-map "\e[27;7;56~" [?\C-\M-8]) +(define-key xterm-function-map "\e[27;7;57~" [?\C-\M-9]) +(define-key xterm-function-map "\e[27;7;59~" [?\C-\M-\;]) +(define-key xterm-function-map "\e[27;7;61~" [?\C-\M-=]) +(define-key xterm-function-map "\e[27;7;92~" [?\C-\M-\\]) -(define-key xterm-function-map "\e[27;13;46~" [?\C-\M-.]) +(define-key xterm-function-map "\e[27;8;33~" [?\C-\M-!]) +(define-key xterm-function-map "\e[27;8;34~" [?\C-\M-\"]) +(define-key xterm-function-map "\e[27;8;35~" [?\C-\M-#]) +(define-key xterm-function-map "\e[27;8;36~" [?\C-\M-$]) +(define-key xterm-function-map "\e[27;8;37~" [?\C-\M-%]) +(define-key xterm-function-map "\e[27;8;38~" [(C-M-&)]) +(define-key xterm-function-map "\e[27;8;40~" [?\C-\M-(]) +(define-key xterm-function-map "\e[27;8;41~" [?\C-\M-)]) +(define-key xterm-function-map "\e[27;8;42~" [?\C-\M-*]) +(define-key xterm-function-map "\e[27;8;43~" [?\C-\M-+]) +(define-key xterm-function-map "\e[27;8;58~" [?\C-\M-:]) +(define-key xterm-function-map "\e[27;8;60~" [?\C-\M-<]) +(define-key xterm-function-map "\e[27;8;62~" [?\C-\M->]) +(define-key xterm-function-map "\e[27;8;63~" [(C-M-\?)]) +(define-key xterm-function-map "\e[27;2;9~" [S-tab]) +(define-key xterm-function-map "\e[27;2;13~" [S-return]) + +(define-key xterm-function-map "\e[27;6;9~" [(C-S-tab)]) +(define-key xterm-function-map "\e[27;6;13~" [(C-S-return)]) ;; Other versions of xterm might emit these. (define-key xterm-function-map "\e[A" [up])
--- a/lisp/textmodes/conf-mode.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/textmodes/conf-mode.el Sat Oct 14 17:36:28 2006 +0000 @@ -75,8 +75,8 @@ (define-key map "\C-c\C-u" 'conf-unix-mode) (define-key map "\C-c\C-w" 'conf-windows-mode) (define-key map "\C-c\C-j" 'conf-javaprop-mode) - (define-key map "\C-c\C-s" 'conf-space-mode) - (define-key map "\C-c " 'conf-space-mode) + (define-key map "\C-c\C-s" 'conf-space-keywords) + (define-key map "\C-c " 'conf-space-keywords) (define-key map "\C-c\C-c" 'conf-colon-mode) (define-key map "\C-c:" 'conf-colon-mode) (define-key map "\C-c\C-x" 'conf-xdefaults-mode) @@ -168,7 +168,7 @@ ("/resmgr\\.conf" . "class\\|add\\|allow\\|deny") ("/dictionary\\.lst\\'" . "DICT\\|HYPH\\|THES") ("/tuxracer/options" . "set")) - "File name based settings for `conf-space-keywords'.") + "File-name-based settings for the variable `conf-space-keywords'.") (defvar conf-space-keywords nil "Regexps for functions that may come before a space assignment. @@ -188,7 +188,7 @@ '(1 'font-lock-keyword-face) '(2 'font-lock-variable-name-face)) '("^[ \t]*\\([^\000- ]+\\)" 1 'font-lock-variable-name-face))) - "Keywords to hilight in Conf Space mode.") + "Keywords to highlight in Conf Space mode.") (defvar conf-colon-font-lock-keywords `(;; [section] (do this first because it may look like a parameter) @@ -446,10 +446,11 @@ (define-derived-mode conf-space-mode conf-unix-mode "Conf[Space]" "Conf Mode starter for space separated conf files. \"Assignments\" are with ` '. Keywords before the parameters are -recognized according to `conf-space-keywords'. Interactively -with a prefix ARG of `0' no keywords will be recognized. With -any other prefix arg you will be prompted for a regexp to match -the keywords. +recognized according to the variable `conf-space-keywords-alist'. +Alternatively, you can specify a value for the file local variable +`conf-space-keywords'. +Use the function `conf-space-keywords' if you want to specify keywords +in an interactive fashion instead. For details see `conf-mode'. Example: @@ -465,34 +466,61 @@ add /dev/audio desktop add /dev/mixer desktop" (conf-mode-initialize "#" 'conf-space-font-lock-keywords) - (set (make-local-variable 'conf-assignment-sign) - nil) - ;; This doesn't seem right, but the next two depend on conf-space-keywords - ;; being set, while after-change-major-mode-hook might set up imenu, needing - ;; the following result: - (hack-local-variables-prop-line) - (hack-local-variables) - (cond (current-prefix-arg - (set (make-local-variable 'conf-space-keywords) - (if (> (prefix-numeric-value current-prefix-arg) 0) - (read-string "Regexp to match keywords: ")))) - (conf-space-keywords) - (buffer-file-name - (set (make-local-variable 'conf-space-keywords) - (assoc-default buffer-file-name conf-space-keywords-alist - 'string-match)))) - (set (make-local-variable 'conf-assignment-regexp) - (if conf-space-keywords - (concat "\\(?:" conf-space-keywords "\\)[ \t]+.+?\\([ \t]+\\|$\\)") - ".+?\\([ \t]+\\|$\\)")) + (make-local-variable 'conf-assignment-sign) + (setq conf-assignment-sign nil) + (make-local-variable 'conf-space-keywords) + (cond (buffer-file-name + ;; We set conf-space-keywords directly, but a value which is + ;; in the local variables list or interactively specified + ;; (see the function conf-space-keywords) takes precedence. + (setq conf-space-keywords + (assoc-default buffer-file-name conf-space-keywords-alist + 'string-match)))) + (conf-space-mode-internal) + ;; In case the local variables list specifies conf-space-keywords, + ;; recompute other things from that afterward. + (add-hook 'hack-local-variables-hook 'conf-space-mode-internal nil t)) + +;;;###autoload +(defun conf-space-keywords (keywords) + "Enter Conf Space mode using regexp KEYWORDS to match the keywords. +See `conf-space-mode'." + (interactive "sConf Space keyword regexp: ") + (delay-mode-hooks + (conf-space-mode)) + (if (string-equal keywords "") + (setq keywords nil)) + (setq conf-space-keywords keywords) + (conf-space-mode-internal) + (run-mode-hooks)) + +(defun conf-space-mode-internal () + (make-local-variable 'conf-assignment-regexp) + (setq conf-assignment-regexp + (if conf-space-keywords + (concat "\\(?:" conf-space-keywords "\\)[ \t]+.+?\\([ \t]+\\|$\\)") + ".+?\\([ \t]+\\|$\\)")) + ;; If Font Lock is already enabled, reenable it with new + ;; conf-assignment-regexp. + (when (and font-lock-mode + (boundp 'font-lock-keywords)) ;see `normal-mode' + (font-lock-add-keywords nil nil) + (font-lock-mode 1)) + ;; Copy so that we don't destroy shared structure. + (setq imenu-generic-expression (copy-sequence imenu-generic-expression)) + ;; Get rid of any existing Parameters element. (setq imenu-generic-expression - `(,@(cdr imenu-generic-expression) - ("Parameters" - ,(if conf-space-keywords - (concat "^[ \t]*\\(?:" conf-space-keywords - "\\)[ \t]+\\([^ \t\n]+\\)\\(?:[ \t]\\|$\\)") - "^[ \t]*\\([^ \t\n[]+\\)\\(?:[ \t]\\|$\\)") - 1)))) + (delq (assoc "Parameters" imenu-generic-expression) + imenu-generic-expression)) + ;; Add a new one based on conf-space-keywords. + (setq imenu-generic-expression + (cons `("Parameters" + ,(if conf-space-keywords + (concat "^[ \t]*\\(?:" conf-space-keywords + "\\)[ \t]+\\([^ \t\n]+\\)\\(?:[ \t]\\|$\\)") + "^[ \t]*\\([^ \t\n[]+\\)\\(?:[ \t]\\|$\\)") + 1) + imenu-generic-expression))) ;;;###autoload (define-derived-mode conf-colon-mode conf-unix-mode "Conf[Colon]"
--- a/lisp/textmodes/fill.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/textmodes/fill.el Sat Oct 14 17:36:28 2006 +0000 @@ -89,7 +89,8 @@ (defcustom adaptive-fill-regexp ;; Added `!' for doxygen comments starting with `//!' or `/*!'. ;; Added `%' for TeX comments. - (purecopy "[ \t]*\\([-!|#%;>*,A7$,1s"s#sC$,2"F(B]+[ \t]*\\|(?[0-9]+[.)][ \t]*\\)*") + ;; RMS: deleted the code to match `1.' and `(1)'. + "[ \t]*\\([-!|#%;>*,A7$,1s"s#sC$,2"F(B]+[ \t]*\\)*" "*Regexp to match text at start of line that constitutes indentation. If Adaptive Fill mode is enabled, a prefix matching this pattern on the first and second lines of a paragraph is used as the @@ -292,7 +293,9 @@ (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 (concat "[ \t]*\\sw+" "\\(?:" (sentence-end) "\\)")) + ;; Actually, allow breaking before the last word of a sentence, so long as + ;; it's not the last word of the paragraph. + (or (looking-at (concat "[ \t]*\\sw+" "\\(?:" (sentence-end) "\\)[ \t]*$")) (save-excursion (skip-chars-backward " \t") (and (/= (skip-syntax-backward "w") 0)
--- a/lisp/textmodes/flyspell.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/textmodes/flyspell.el Sat Oct 14 17:36:28 2006 +0000 @@ -992,7 +992,7 @@ (flyspell-accept-buffer-local-defs) (let* ((cursor-location (point)) (flyspell-word (flyspell-get-word following)) - start end poss word) + start end poss word ispell-filter) (if (or (eq flyspell-word nil) (and (fboundp flyspell-generic-check-word-predicate) (not (funcall flyspell-generic-check-word-predicate)))) @@ -1050,7 +1050,12 @@ (not (string= "" (car ispell-filter)))))) ;; (ispell-send-string "!\n") ;; back to terse mode. + ;; Remove leading empty element (setq ispell-filter (cdr ispell-filter)) + ;; ispell process should return something after word is sent. + ;; Tag word as valid (i.e., skip) otherwise + (or ispell-filter + (setq ispell-filter '(*))) (if (consp ispell-filter) (setq poss (ispell-parse-output (car ispell-filter)))) (let ((res (cond ((eq poss t) @@ -1455,6 +1460,22 @@ (while (re-search-forward regexp nil t) (delete-region (match-beginning 0) (match-end 0))))))))) +;;* --------------------------------------------------------------- +;;* flyspell-check-region-doublons +;;* --------------------------------------------------------------- +(defun flyspell-check-region-doublons (beg end) + "Check for adjacent duplicated words (doublons) in the given region." + (save-excursion + (goto-char beg) + (flyspell-word) ; Make sure current word is checked + (backward-word 1) + (while (and (< (point) end) + (re-search-forward "\\b\\([^ \n\t]+\\)[ \n\t]+\\1\\b" + end 'move)) + (flyspell-word) + (backward-word 1)) + (flyspell-word))) + ;;*---------------------------------------------------------------------*/ ;;* flyspell-large-region ... */ ;;*---------------------------------------------------------------------*/ @@ -1499,7 +1520,8 @@ (progn (flyspell-process-localwords buffer) (with-current-buffer curbuf - (flyspell-delete-region-overlays beg end)) + (flyspell-delete-region-overlays beg end) + (flyspell-check-region-doublons beg end)) (flyspell-external-point-words)) (error "Can't check region..."))))) @@ -1830,7 +1852,7 @@ (let ((start (car (cdr word))) (end (car (cdr (cdr word)))) (word (car word)) - poss) + poss ispell-filter) (setq flyspell-auto-correct-word word) ;; now check spelling of word. (ispell-send-string "%\n") ;put in verbose mode @@ -1839,7 +1861,12 @@ (while (progn (accept-process-output ispell-process) (not (string= "" (car ispell-filter))))) + ;; Remove leading empty element (setq ispell-filter (cdr ispell-filter)) + ;; ispell process should return something after word is sent. + ;; Tag word as valid (i.e., skip) otherwise + (or ispell-filter + (setq ispell-filter '(*))) (if (consp ispell-filter) (setq poss (ispell-parse-output (car ispell-filter)))) (cond @@ -1980,7 +2007,7 @@ (let ((start (car (cdr word))) (end (car (cdr (cdr word)))) (word (car word)) - poss) + poss ispell-filter) ;; now check spelling of word. (ispell-send-string "%\n") ;put in verbose mode (ispell-send-string (concat "^" word "\n")) @@ -1988,7 +2015,12 @@ (while (progn (accept-process-output ispell-process) (not (string= "" (car ispell-filter))))) + ;; Remove leading empty element (setq ispell-filter (cdr ispell-filter)) + ;; ispell process should return something after word is sent. + ;; Tag word as valid (i.e., skip) otherwise + (or ispell-filter + (setq ispell-filter '(*))) (if (consp ispell-filter) (setq poss (ispell-parse-output (car ispell-filter)))) (cond
--- a/lisp/textmodes/ispell.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/textmodes/ispell.el Sat Oct 14 17:36:28 2006 +0000 @@ -2613,8 +2613,9 @@ (cond ((equal dict "") (ispell-internal-change-dictionary) (message "Using %s dictionary" - (or ispell-local-dictionary ispell-dictionary "default"))) - ((equal dict (or ispell-local-dictionary + (or (and (not arg) ispell-local-dictionary) + ispell-dictionary "default"))) + ((equal dict (or (and (not arg) ispell-local-dictionary) ispell-dictionary "default")) ;; Specified dictionary is the default already. Could reload ;; the dictionaries if needed.
--- a/lisp/textmodes/org.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/textmodes/org.el Sat Oct 14 17:36:28 2006 +0000 @@ -2690,7 +2690,7 @@ (make-variable-buffer-local 'org-keyword-time-regexp) (defconst org-rm-props '(invisible t face t keymap t intangible t mouse-face t - mouse-map t) + rear-nonsticky t mouse-map t) "Properties to remove when a string without properties is wanted.") (defsubst org-match-string-no-properties (num &optional string) @@ -3140,6 +3140,7 @@ (progn (add-text-properties (match-beginning 0) (match-end 0) (list 'mouse-face 'highlight + 'rear-nonsticky t 'keymap org-mouse-map )) t))) @@ -3150,6 +3151,7 @@ (progn (add-text-properties (match-beginning 0) (match-end 0) (list 'mouse-face 'highlight + 'rear-nonsticky t 'keymap org-mouse-map )) t))) @@ -3188,6 +3190,7 @@ (progn (add-text-properties (match-beginning 0) (match-end 0) (list 'mouse-face 'highlight + 'rear-nonsticky t 'keymap org-mouse-map)) t))) @@ -3206,6 +3209,7 @@ (progn (add-text-properties (match-beginning 0) (match-end 0) (list 'mouse-face 'highlight + 'rear-nonsticky t 'keymap org-mouse-map 'help-echo "Radio target link" 'org-linked-text t)) @@ -3271,6 +3275,7 @@ (progn (add-text-properties (match-beginning 0) (match-end 0) (list 'mouse-face 'highlight + 'rear-nonsticky t 'keymap org-mouse-map)) t))) @@ -3279,6 +3284,7 @@ (progn (add-text-properties (match-beginning 1) (match-end 1) (list 'mouse-face 'highlight + 'rear-nonsticky t 'keymap org-mouse-map)) t))) @@ -3380,6 +3386,7 @@ deactivate-mark buffer-file-name buffer-file-truename) (remove-text-properties beg end '(mouse-face nil keymap nil org-linked-text nil + rear-nonsticky nil invisible nil intangible nil)))) ;;; Visibility cycling @@ -4569,7 +4576,7 @@ ;; Make the subtree visible (show-subtree) (org-end-of-subtree t) - (skip-chars-backward " \t\r\n]") + (skip-chars-backward " \t\r\n") (and (looking-at "[ \t\r\n]*") (replace-match "\n\n"))) ;; No specific heading, just go to end of file. @@ -6204,15 +6211,15 @@ (while (setq p (next-single-property-change (point) :org-clock-minutes)) (goto-char p) (when (setq time (get-text-property p :org-clock-minutes)) - (beginning-of-line 1) - (when (and (looking-at "\\(\\*+\\)[ \t]+\\(.*?\\)\\([ \t]+:[0-9a-zA-Z_@:]+:\\)?[ \t]*$") - (setq level (- (match-end 1) (match-beginning 1))) - (<= level maxlevel)) - (setq hlc (if emph (or (cdr (assoc level hlchars)) "") "") - hdl (match-string 2) - h (/ time 60) - m (- time (* 60 h))) - (save-excursion + (save-excursion + (beginning-of-line 1) + (when (and (looking-at "\\(\\*+\\)[ \t]+\\(.*?\\)\\([ \t]+:[0-9a-zA-Z_@:]+:\\)?[ \t]*$") + (setq level (- (match-end 1) (match-beginning 1))) + (<= level maxlevel)) + (setq hlc (if emph (or (cdr (assoc level hlchars)) "") "") + hdl (match-string 2) + h (/ time 60) + m (- time (* 60 h))) (goto-char ins) (if (= level 1) (insert-before-markers "|-\n")) (insert-before-markers @@ -8660,7 +8667,7 @@ (push txt rtn)) ;; if we are to skip sublevels, jump to end of subtree (point) - (or org-tags-match-list-sublevels (org-end-of-subtree)))))) + (or org-tags-match-list-sublevels (org-end-of-subtree t)))))) (when (and (eq action 'sparse-tree) (not org-sparse-tree-open-archived-trees)) (org-hide-archived-subtrees (point-min) (point-max))) @@ -9816,7 +9823,7 @@ ((fboundp 'tramp-handle-file-remote-p) (tramp-handle-file-remote-p file)) ((and (boundp 'ange-ftp-name-format) - (string-match ange-ftp-name-format file)) + (string-match (car ange-ftp-name-format) file)) t) (t nil)))
--- a/lisp/textmodes/reftex-global.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/textmodes/reftex-global.el Sat Oct 14 17:36:28 2006 +0000 @@ -38,7 +38,8 @@ (reftex-access-scan-info current-prefix-arg) (let* ((master (reftex-TeX-master-file)) (files (reftex-all-document-files)) - (cmd (format "etags %s" (mapconcat 'identity files " ")))) + (cmd (format "etags %s" (mapconcat 'shell-quote-argument + files " ")))) (save-excursion (set-buffer (reftex-get-file-buffer-force master)) (message "Running etags to create TAGS file...")
--- a/lisp/textmodes/reftex-vars.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/textmodes/reftex-vars.el Sat Oct 14 17:36:28 2006 +0000 @@ -232,7 +232,7 @@ "LaTeX label and citation support." :tag "RefTeX" :link '(url-link :tag "Home Page" - "http://zon.astro.uva.nl/~dominik/Tools/") + "http://staff.science.uva.nl/~dominik/Tools/reftex/") :link '(emacs-commentary-link :tag "Commentary in reftex.el" "reftex.el") :link '(custom-manual "(reftex)Top") :prefix "reftex-"
--- a/lisp/textmodes/two-column.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/textmodes/two-column.el Sat Oct 14 17:36:28 2006 +0000 @@ -340,9 +340,9 @@ ;;;###autoload (defun 2C-two-columns (&optional buffer) "Split current window vertically for two-column editing. -When called the first time, associates a buffer with the current -buffer in two-column minor mode (see \\[describe-mode] ). -Runs `2C-other-buffer-hook' in the new buffer. +\\<global-map>When called the first time, associates a buffer with the current +buffer in two-column minor mode (use \\[describe-mode] once in the mode, +for details.). It runs `2C-other-buffer-hook' in the new buffer. When called again, restores the screen layout with the current buffer first and the associated buffer to its right." (interactive "P")
--- a/lisp/thingatpt.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/thingatpt.el Sat Oct 14 17:36:28 2006 +0000 @@ -240,7 +240,7 @@ (let ((strip (thing-at-point-looking-at thing-at-point-markedup-url-regexp))) ;; (url "") short (if (or strip -` (thing-at-point-looking-at thing-at-point-url-regexp) + (thing-at-point-looking-at thing-at-point-url-regexp) ;; Access scheme omitted? ;; (setq short (thing-at-point-looking-at ;; thing-at-point-short-url-regexp))
--- a/lisp/time.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/time.el Sat Oct 14 17:36:28 2006 +0000 @@ -31,7 +31,7 @@ (defgroup display-time nil "Display time and load in mode line of Emacs." - :group 'modeline + :group 'mode-line :group 'mail)
--- a/lisp/url/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/url/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,49 @@ +2006-10-12 Magnus Henoch <mange@freemail.hu> + + * url-http.el (url-http-find-free-connection): Handle + url-open-stream returning nil. + +2006-10-11 Magnus Henoch <mange@freemail.hu> + + * url-https.el: Remove (clashes with url-http on 8+3 systems). + + * url-http.el: Move contents of url-https.el here. Add autoloads. + +2006-10-09 Magnus Henoch <mange@freemail.hu> + + * url-parse.el (url-generic-parse-url): Handle URLs with empty + path component and non-empty query component. Untangle path, + query and fragment parsing code. Add references to RFC 3986 in + comments. + (url-recreate-url-attributes): Start query string with "?", not ";". + +2006-09-20 Stefan Monnier <monnier@iro.umontreal.ca> + + * url-dav.el (url-dav-file-attributes): Simplify. + + * url-http.el (url-http-head-file-attributes): Add device "info". + +2006-09-18 Michael Olson <mwolson@gnu.org> + + * url-methods.el (url-scheme-register-proxy): Handle case where + getenv returns an empty string for http_proxy. This prevents an + error when calling `format' later on. + +2006-08-31 Diane Murray <disumu@x3y2z1.net> + + * url-parse.el (url-recreate-url-attributes): New function, code + simply moved from `url-recreate-url'. + (url-recreate-url): Use it. + Put the `url-target' at the end of the URL after the attributes. + + * url-http.el (url-http-create-request): + Use `url-recreate-url-attributes' when setting real-fname. + +2006-08-29 Diane Murray <disumu@x3y2z1.net> + + * url-cookie.el (url-cookie-write-file): Really don't use versioned + backups. + 2006-08-25 Stefan Monnier <monnier@iro.umontreal.ca> * url-handlers.el (url-file-local-copy): Tell url-copy-file that the @@ -393,32 +439,19 @@ 2004-10-10 Lars Hansen <larsh@math.ku.dk> - * url-auth.el: Update header and footer. - - * url-cache.el: Update header and footer. - - * url-cid.el: Update header and footer. - - * url-dired.el: Update header and footer. - - * url-expand.el: Update header and footer. - - * url-ftp.el: Update header and footer. - - * url-gw.el: Update header and footer. - - * url-imap.el: Update header and footer. - - * url-irc.el: Update header and footer. - - * url-misc.el: Update header and footer. - - * url-news.el: Update header and footer. - - * url-ns.el: Update header and footer. - - * url-privacy.el: Update header and footer. - + * url-auth.el: + * url-cache.el: + * url-cid.el: + * url-dired.el: + * url-expand.el: + * url-ftp.el: + * url-gw.el: + * url-imap.el: + * url-irc.el: + * url-misc.el: + * url-news.el: + * url-ns.el: + * url-privacy.el: * url-proxy.el: Update header and footer. * url-vars.el: Update header. @@ -463,42 +496,24 @@ 2004-10-10 Lars Hansen <larsh@math.ku.dk> - * url-auth.el: Fix copyright notice. - - * url-cache.el: Fix copyright notice. - - * url-cookie.el: Fix copyright notice. - - * url-dired.el: Fix copyright notice. - - * url-file.el: Fix copyright notice. - - * url-ftp.el: Fix copyright notice. - - * url-handlers.el: Fix copyright notice. - - * url-history.el: Fix copyright notice. - - * url-irc.el: Fix copyright notice. - - * url-mailto.el: Fix copyright notice. - - * url-methods.el: Fix copyright notice. - - * url-misc.el: Fix copyright notice. - - * url-news.el: Fix copyright notice. - - * url-nfs.el: Fix copyright notice. - - * url-parse.el: Fix copyright notice. - - * url-privacy.el: Fix copyright notice. - - * url-vars.el: Fix copyright notice. - - * url.el: Fix copyright notice. - + * url-auth.el: + * url-cache.el: + * url-cookie.el: + * url-dired.el: + * url-file.el: + * url-ftp.el: + * url-handlers.el: + * url-history.el: + * url-irc.el: + * url-mailto.el: + * url-methods.el: + * url-misc.el: + * url-news.el: + * url-nfs.el: + * url-parse.el: + * url-privacy.el: + * url-vars.el: + * url.el: * url-util.el: Fix copyright notice. 2004-10-06 Stefan Monnier <monnier@iro.umontreal.ca>
--- a/lisp/url/url-cookie.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/url/url-cookie.el Sat Oct 14 17:36:28 2006 +0000 @@ -168,11 +168,11 @@ (insert ")\n(setq url-cookie-secure-storage\n '") (pp url-cookie-secure-storage (current-buffer)) (insert ")\n") - (insert ";; Local Variables:\n" + (insert "\n;; Local Variables:\n" ";; version-control: never\n" ";; no-byte-compile: t\n" ";; End:\n") - (set (make-local-variable 'version-control) t) + (set (make-local-variable 'version-control) 'never) (write-file fname) (setq url-cookies-changed-since-last-save nil) (kill-buffer (current-buffer))))))
--- a/lisp/url/url-dav.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/url/url-dav.el Sat Oct 14 17:36:28 2006 +0000 @@ -621,59 +621,56 @@ (autoload 'url-http-head-file-attributes "url-http") (defun url-dav-file-attributes (url &optional id-format) - (let ((properties (cdar (url-dav-get-properties url))) - (attributes nil)) + (let ((properties (cdar (url-dav-get-properties url)))) (if (and properties (url-dav-http-success-p (plist-get properties 'DAV:status))) ;; We got a good DAV response back.. - (setq attributes - (list - ;; t for directory, string for symbolic link, or nil - ;; Need to support DAV Bindings to figure out the - ;; symbolic link issues. - (if (memq 'DAV:collection (plist-get properties 'DAV:resourcetype)) t nil) + (list + ;; t for directory, string for symbolic link, or nil + ;; Need to support DAV Bindings to figure out the + ;; symbolic link issues. + (if (memq 'DAV:collection (plist-get properties 'DAV:resourcetype)) t nil) - ;; Number of links to file... Needs DAV Bindings. - 1 + ;; Number of links to file... Needs DAV Bindings. + 1 - ;; File uid - no way to figure out? - 0 + ;; File uid - no way to figure out? + 0 - ;; File gid - no way to figure out? - 0 + ;; File gid - no way to figure out? + 0 - ;; Last access time - ??? - nil + ;; Last access time - ??? + nil - ;; Last modification time - (plist-get properties 'DAV:getlastmodified) + ;; Last modification time + (plist-get properties 'DAV:getlastmodified) - ;; Last status change time... just reuse last-modified - ;; for now. - (plist-get properties 'DAV:getlastmodified) + ;; Last status change time... just reuse last-modified + ;; for now. + (plist-get properties 'DAV:getlastmodified) - ;; size in bytes - (or (plist-get properties 'DAV:getcontentlength) 0) + ;; size in bytes + (or (plist-get properties 'DAV:getcontentlength) 0) - ;; file modes as a string like `ls -l' - ;; - ;; Should be able to build this up from the - ;; DAV:supportedlock attribute pretty easily. Getting - ;; the group info could be impossible though. - (url-dav-file-attributes-mode-string properties) + ;; file modes as a string like `ls -l' + ;; + ;; Should be able to build this up from the + ;; DAV:supportedlock attribute pretty easily. Getting + ;; the group info could be impossible though. + (url-dav-file-attributes-mode-string properties) - ;; t iff file's gid would change if it were deleted & - ;; recreated. No way for us to know that thru DAV. - nil + ;; t iff file's gid would change if it were deleted & + ;; recreated. No way for us to know that thru DAV. + nil - ;; inode number - meaningless - nil + ;; inode number - meaningless + nil - ;; device number - meaningless - nil)) + ;; device number - meaningless + nil) ;; Fall back to just the normal http way of doing things. - (setq attributes (url-http-head-file-attributes url id-format))) - attributes)) + (url-http-head-file-attributes url id-format)))) (defun url-dav-save-resource (url obj &optional content-type lock-token) "Save OBJ as URL using WebDAV.
--- a/lisp/url/url-http.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/url/url-http.el Sat Oct 14 17:36:28 2006 +0000 @@ -123,8 +123,10 @@ ;; like authentication. But we use another buffer afterwards. (unwind-protect (let ((proc (url-open-stream host buf host port))) - ;; Drop the temp buffer link before killing the buffer. - (set-process-buffer proc nil) + ;; url-open-stream might return nil. + (when (processp proc) + ;; Drop the temp buffer link before killing the buffer. + (set-process-buffer proc nil)) proc) (kill-buffer buf))))))) @@ -160,7 +162,8 @@ (let ((url-basic-auth-storage 'url-http-proxy-basic-auth-storage)) (url-get-authentication url nil 'any nil)))) - (real-fname (url-filename (or proxy-obj url))) + (real-fname (concat (url-filename (or proxy-obj url)) + (url-recreate-url-attributes (or proxy-obj url)))) (host (url-host (or proxy-obj url))) (auth (if (cdr-safe (assoc "Authorization" url-request-extra-headers)) nil @@ -1150,19 +1153,19 @@ (defalias 'url-http-file-readable-p 'url-http-file-exists-p) (defun url-http-head-file-attributes (url &optional id-format) - (let ((buffer (url-http-head url)) - (attributes nil)) + (let ((buffer (url-http-head url))) (when buffer - (setq attributes (make-list 11 nil)) - (setf (nth 1 attributes) 1) ; Number of links to file - (setf (nth 2 attributes) 0) ; file uid - (setf (nth 3 attributes) 0) ; file gid - (setf (nth 7 attributes) ; file size - (url-http-symbol-value-in-buffer 'url-http-content-length - buffer -1)) - (setf (nth 8 attributes) (eval-when-compile (make-string 10 ?-))) - (kill-buffer buffer)) - attributes)) + (prog1 + (list + nil ;dir / link / normal file + 1 ;number of links to file. + 0 0 ;uid ; gid + nil nil nil ;atime ; mtime ; ctime + (url-http-symbol-value-in-buffer 'url-http-content-length + buffer -1) + (eval-when-compile (make-string 10 ?-)) + nil nil nil) ;whether gid would change ; inode ; device. + (kill-buffer buffer))))) ;;;###autoload (defun url-http-file-attributes (url &optional id-format) @@ -1244,6 +1247,35 @@ (if buffer (kill-buffer buffer)) options)) +;; HTTPS. This used to be in url-https.el, but that file collides +;; with url-http.el on systems with 8-character file names. +(require 'tls) + +;;;###autoload +(defconst url-https-default-port 443 "Default HTTPS port.") +;;;###autoload +(defconst url-https-asynchronous-p t "HTTPS retrievals are asynchronous.") +;;;###autoload +(defalias 'url-https-expand-file-name 'url-http-expand-file-name) + +(defmacro url-https-create-secure-wrapper (method args) + `(defun ,(intern (format (if method "url-https-%s" "url-https") method)) ,args + ,(format "HTTPS wrapper around `%s' call." (or method "url-http")) + (let ((url-gateway-method (condition-case () + (require 'ssl) + (error 'tls)))) + (,(intern (format (if method "url-http-%s" "url-http") method)) + ,@(remove '&rest (remove '&optional args)))))) + +;;;###autoload (autoload 'url-https "url-http") +(url-https-create-secure-wrapper nil (url callback cbargs)) +;;;###autoload (autoload 'url-https-file-exists-p "url-http") +(url-https-create-secure-wrapper file-exists-p (url)) +;;;###autoload (autoload 'url-https-file-readable-p "url-http") +(url-https-create-secure-wrapper file-readable-p (url)) +;;;###autoload (autoload 'url-https-file-attributes "url-http") +(url-https-create-secure-wrapper file-attributes (url &optional id-format)) + (provide 'url-http) ;; arch-tag: ba7c59ae-c0f4-4a31-9617-d85f221732ee
--- a/lisp/url/url-https.el Sat Oct 14 16:56:21 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -;;; url-https.el --- HTTP over SSL/TLS routines - -;; Copyright (C) 1999, 2004, 2005, 2006 Free Software Foundation, Inc. - -;; Keywords: comm, data, processes - -;; This file is part of GNU Emacs. -;; -;; GNU Emacs is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. -;; -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. - -;;; Commentary: - -;;; Code: - -(require 'url-gw) -(require 'url-util) -(require 'url-parse) -(require 'url-cookie) -(require 'url-http) -(require 'tls) - -(defconst url-https-default-port 443 "Default HTTPS port.") -(defconst url-https-asynchronous-p t "HTTPS retrievals are asynchronous.") -(defalias 'url-https-expand-file-name 'url-http-expand-file-name) - -(defmacro url-https-create-secure-wrapper (method args) - `(defun ,(intern (format (if method "url-https-%s" "url-https") method)) ,args - ,(format "HTTPS wrapper around `%s' call." (or method "url-http")) - (let ((url-gateway-method (condition-case () - (require 'ssl) - (error 'tls)))) - (,(intern (format (if method "url-http-%s" "url-http") method)) - ,@(remove '&rest (remove '&optional args)))))) - -(url-https-create-secure-wrapper nil (url callback cbargs)) -(url-https-create-secure-wrapper file-exists-p (url)) -(url-https-create-secure-wrapper file-readable-p (url)) -(url-https-create-secure-wrapper file-attributes (url &optional id-format)) - -(provide 'url-https) - -;; arch-tag: c3645ac5-c248-4d12-ad41-7c4b6f7b6d19 -;;; url-https.el ends here
--- a/lisp/url/url-methods.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/url/url-methods.el Sat Oct 14 17:36:28 2006 +0000 @@ -75,6 +75,11 @@ (cur-proxy (assoc scheme url-proxy-services)) (urlobj nil)) + ;; If env-proxy is an empty string, treat it as if it were nil + (when (and (stringp env-proxy) + (string= env-proxy "")) + (setq env-proxy nil)) + ;; Store any proxying information - this will not overwrite an old ;; entry, so that people can still set this information in their ;; .emacs file
--- a/lisp/url/url-parse.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/url/url-parse.el Sat Oct 14 17:36:28 2006 +0000 @@ -100,28 +100,36 @@ (not (equal (url-port urlobj) (url-scheme-get-property (url-type urlobj) 'default-port)))) (format ":%d" (url-port urlobj))) - (or (url-filename urlobj) "/") + (or (url-filename urlobj) "/") + (url-recreate-url-attributes urlobj) (if (url-target urlobj) - (concat "#" (url-target urlobj))) - (if (url-attributes urlobj) - (concat ";" - (mapconcat - (function - (lambda (x) - (if (cdr x) - (concat (car x) "=" (cdr x)) - (car x)))) (url-attributes urlobj) ";"))))) + (concat "#" (url-target urlobj))))) + +(defun url-recreate-url-attributes (urlobj) + "Recreate the attributes of an URL string from the parsed URLOBJ." + (when (url-attributes urlobj) + (concat "?" + (mapconcat (lambda (x) + (if (cdr x) + (concat (car x) "=" (cdr x)) + (car x))) + (url-attributes urlobj) ";")))) ;;;###autoload (defun url-generic-parse-url (url) "Return a vector of the parts of URL. Format is: \[TYPE USER PASSWORD HOST PORT FILE TARGET ATTRIBUTES FULL\]" + ;; See RFC 3986. (cond ((null url) (make-vector 9 nil)) ((or (not (string-match url-nonrelative-link url)) (= ?/ (string-to-char url))) + ;; This isn't correct, as a relative URL can be a fragment link + ;; (e.g. "#foo") and many other things (see section 4.2). + ;; However, let's not fix something that isn't broken, especially + ;; when close to a release. (let ((retval (make-vector 9 nil))) (url-set-filename retval url) (url-set-full retval nil) @@ -145,6 +153,8 @@ (insert url) (goto-char (point-min)) (setq save-pos (point)) + + ;; 3.1. Scheme (if (not (looking-at "//")) (progn (skip-chars-forward "a-zA-Z+.\\-") @@ -153,13 +163,13 @@ (skip-chars-forward ":") (setq save-pos (point)))) - ;; We are doing a fully specified URL, with hostname and all + ;; 3.2. Authority (if (looking-at "//") (progn (setq full t) (forward-char 2) (setq save-pos (point)) - (skip-chars-forward "^/") + (skip-chars-forward "^/\\?#") (setq host (buffer-substring save-pos (point))) (if (string-match "^\\([^@]+\\)@" host) (setq user (match-string 1 host) @@ -167,6 +177,7 @@ (if (and user (string-match "\\([^:]+\\):\\(.*\\)" user)) (setq pass (match-string 2 user) user (match-string 1 user))) + ;; This gives wrong results for IPv6 literal addresses. (if (string-match ":\\([0-9+]+\\)" host) (setq port (string-to-number (match-string 1 host)) host (substring host 0 (match-beginning 0)))) @@ -178,29 +189,26 @@ (if (not port) (setq port (url-scheme-get-property prot 'default-port))) - ;; Gross hack to preserve ';' in data URLs - + ;; 3.3. Path (setq save-pos (point)) + (skip-chars-forward "^#?") + (setq file (buffer-substring save-pos (point))) - (if (string= "data" prot) - (goto-char (point-max)) - ;; Now check for references + ;; 3.4. Query + (when (looking-at "\\?") + (forward-char 1) + (setq save-pos (point)) (skip-chars-forward "^#") - (if (eobp) - nil - (delete-region - (point) - (progn - (skip-chars-forward "#") - (setq refs (buffer-substring (point) (point-max))) - (point-max)))) - (goto-char save-pos) - (skip-chars-forward "^;") - (if (not (eobp)) - (setq attr (url-parse-args (buffer-substring (point) (point-max)) t) - attr (nreverse attr)))) + ;; RFC 3986 specifies no general way of parsing the query + ;; string, but `url-parse-args' seems universal enough. + (setq attr (url-parse-args (buffer-substring save-pos (point)) t) + attr (nreverse attr))) - (setq file (buffer-substring save-pos (point))) + ;; 3.5. Fragment + (when (looking-at "#") + (forward-char 1) + (setq refs (buffer-substring (point) (point-max)))) + (if (and host (string-match "%[0-9][0-9]" host)) (setq host (url-unhex-string host))) (vector prot user pass host port file refs attr full))))))
--- a/lisp/vc-hooks.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/vc-hooks.el Sat Oct 14 17:36:28 2006 +0000 @@ -52,11 +52,13 @@ (defvar vc-header-alist ()) (make-obsolete-variable 'vc-header-alist 'vc-BACKEND-header) -(defvar vc-ignore-dir-regexp "\\`\\([\\/][\\/]\\|/net/\\|/afs/\\)\\'" - "Regexp matching directory names that are not under VC's control. +(defcustom vc-ignore-dir-regexp "\\`\\([\\/][\\/]\\|/net/\\|/afs/\\)\\'" + "Regexp matching directory names that are not under VC's control. The default regexp prevents fruitless and time-consuming attempts to determine the VC status in directories in which filenames are -interpreted as hostnames.") +interpreted as hostnames." + :type 'regexp + :group 'vc) (defcustom vc-handled-backends '(RCS CVS SVN SCCS Arch MCVS) ;; Arch and MCVS come last because they are per-tree rather than per-dir. @@ -308,6 +310,9 @@ "Find the root of a checked out project. The function walks up the directory tree from FILE looking for WITNESS. If WITNESS if not found, return nil, otherwise return the root." + ;; Represent /home/luser/foo as ~/foo so that we don't try to look for + ;; witnesses in /home or in /. + (setq file (abbreviate-file-name file)) (let ((root nil)) (while (not (or root (equal file (setq file (file-name-directory file)))
--- a/lisp/wid-edit.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/wid-edit.el Sat Oct 14 17:36:28 2006 +0000 @@ -912,6 +912,10 @@ ;; backward-compatibility alias (put 'widget-button-pressed-face 'face-alias 'widget-button-pressed) +(defvar widget-button-click-moves-point nil + "If non-nil, `widget-button-click' moves point to a button after invoking it. +If nil, point returns to its original position after invoking a button.") + (defun widget-button-click (event) "Invoke the button that the mouse is pointing at." (interactive "e") @@ -922,7 +926,8 @@ (start (event-start event)) (button (get-char-property pos 'button (and (windowp (posn-window start)) - (window-buffer (posn-window start)))))) + (window-buffer (posn-window start))))) + newpoint) (when (or (null button) (catch 'button-press-cancelled ;; Mouse click on a widget button. Do the following @@ -959,24 +964,30 @@ (push event unread-command-events) (setq event oevent) (throw 'button-press-cancelled t)) - (setq pos (widget-event-point event)) - (if (and pos - (eq (get-char-property pos 'button) - button)) - (when face - (overlay-put overlay 'face pressed-face) - (overlay-put overlay 'mouse-face pressed-face)) - (overlay-put overlay 'face face) - (overlay-put overlay 'mouse-face mouse-face))))) + (unless (or (integerp event) + (memq (car event) '(switch-frame select-window)) + (eq (car event) 'scroll-bar-movement)) + (setq pos (widget-event-point event)) + (if (and pos + (eq (get-char-property pos 'button) + button)) + (when face + (overlay-put overlay 'face pressed-face) + (overlay-put overlay 'mouse-face pressed-face)) + (overlay-put overlay 'face face) + (overlay-put overlay 'mouse-face mouse-face)))))) ;; When mouse is released over the button, run ;; its action function. - (when (and pos - (eq (get-char-property pos 'button) button)) - (widget-apply-action button event))) + (when (and pos (eq (get-char-property pos 'button) button)) + (goto-char pos) + (widget-apply-action button event) + (if widget-button-click-moves-point + (setq newpoint (point))))) (overlay-put overlay 'face face) (overlay-put overlay 'mouse-face mouse-face)))) + (if newpoint (goto-char newpoint)) ;; This loses if the widget action switches windows. -- cyd ;; (unless (pos-visible-in-window-p (widget-event-point event)) ;; (mouse-set-point event) @@ -1862,7 +1873,7 @@ "History of field minibuffer edits.") (defun widget-field-prompt-internal (widget prompt initial history) - "Read string for WIDGET promptinhg with PROMPT. + "Read string for WIDGET prompting with PROMPT. INITIAL is the initial input and HISTORY is a symbol containing the earlier input." (read-string prompt initial history)) @@ -2853,7 +2864,7 @@ (defcustom widget-documentation-link-p 'intern-soft "Predicate used to test if a string is useful as a link. -The value should be a function. The function will be called one +The value should be a function. The function will be called with one argument, a string, and should return non-nil if there should be a link for that string." :type 'function
--- a/lisp/window.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/window.el Sat Oct 14 17:36:28 2006 +0000 @@ -777,21 +777,134 @@ ;; Maybe get rid of the window. (and window (not window-handled) (not window-solitary) (delete-window window)))) + +(defvar mouse-autoselect-window-timer nil + "Timer used by delayed window autoselection.") + +(defvar mouse-autoselect-window-position nil + "Last mouse position recorded by delayed window autoselection.") + +(defvar mouse-autoselect-window-window nil + "Last window recorded by delayed window autoselection.") + +(defvar mouse-autoselect-window-now nil + "When non-nil don't delay autoselection in `handle-select-window'.") + +(defun mouse-autoselect-window-cancel (&optional force) + "Cancel delayed window autoselection. +Optional argument FORCE means cancel unconditionally." + (unless (and (not force) + ;; Don't cancel while the user drags a scroll bar. + (eq this-command 'scroll-bar-toolkit-scroll) + (memq (nth 4 (event-end last-input-event)) + '(handle end-scroll))) + (setq mouse-autoselect-window-now nil) + (when (timerp mouse-autoselect-window-timer) + (cancel-timer mouse-autoselect-window-timer)) + (remove-hook 'pre-command-hook 'mouse-autoselect-window-cancel))) + +(defun mouse-autoselect-window-start (window) + "Start delayed window autoselection. +Called when Emacs detects that the mouse has moved to the non-selected +window WINDOW and the variable `mouse-autoselect-window' has a numeric, +non-zero value. The return value is non-nil iff delayed autoselection +started successfully. Delayed window autoselection is canceled when the +mouse position has stabilized or a command is executed." + ;; Cancel any active window autoselection. + (mouse-autoselect-window-cancel t) + ;; Record current mouse position in `mouse-autoselect-window-position' and + ;; WINDOW in `mouse-autoselect-window-window'. + (setq mouse-autoselect-window-position (mouse-position)) + (setq mouse-autoselect-window-window window) + ;; Install timer which runs `mouse-autoselect-window-select' every + ;; `mouse-autoselect-window' seconds. + (setq mouse-autoselect-window-timer + (run-at-time + (abs mouse-autoselect-window) (abs mouse-autoselect-window) + 'mouse-autoselect-window-select)) + ;; Executing a command cancels window autoselection. + (add-hook 'pre-command-hook 'mouse-autoselect-window-cancel)) + +(defun mouse-autoselect-window-select () + "Select window with delayed window autoselection. +If the mouse position has stabilized in a non-selected window, select +that window. The minibuffer window is selected iff the minibuffer is +active. This function is run by `mouse-autoselect-window-timer'." + (condition-case nil + (let* ((mouse-position (mouse-position)) + (window (window-at (cadr mouse-position) (cddr mouse-position) + (car mouse-position)))) + (cond + ((and window (not (eq window (selected-window))) + (or (not (numberp mouse-autoselect-window)) + (and (> mouse-autoselect-window 0) + ;; If `mouse-autoselect-window' is positive, select + ;; window if the window is the same as before. + (eq window mouse-autoselect-window-window)) + ;; Otherwise select window iff the mouse is at the same + ;; position as before. Observe that the first test after + ;; `mouse-autoselect-window-start' usually fails since the + ;; value of `mouse-autoselect-window-position' recorded there + ;; is the position where the mouse has entered the new window + ;; and not necessarily where the mouse has stopped moving. + (equal mouse-position mouse-autoselect-window-position)) + ;; The minibuffer is a candidate window iff it's active. + (or (not (window-minibuffer-p window)) + (eq window (active-minibuffer-window)))) + ;; Mouse position has stabilized in non-selected window: Cancel window + ;; autoselection and try to select that window. + (mouse-autoselect-window-cancel t) + ;; Select window where mouse appears unless the selected window is the + ;; minibuffer. Use `unread-command-events' in order to execute pre- + ;; and post-command hooks and trigger idle timers. To avoid delaying + ;; autoselection again, temporarily set `mouse-autoselect-window-now' + ;; to t. + (unless (window-minibuffer-p (selected-window)) + (setq mouse-autoselect-window-now t) + (setq unread-command-events + (cons (list 'select-window (list window)) + unread-command-events)))) + ((or (and window (eq window (selected-window))) + (not (numberp mouse-autoselect-window)) + (equal mouse-position mouse-autoselect-window-position)) + ;; Mouse position has either stabilized in the selected window or at + ;; `mouse-autoselect-window-position': Cancel window autoselection. + (mouse-autoselect-window-cancel t)) + (t + ;; Mouse position has not stabilized yet, record new mouse position in + ;; `mouse-autoselect-window-position' and any window at that position + ;; in `mouse-autoselect-window-window'. + (setq mouse-autoselect-window-position mouse-position) + (setq mouse-autoselect-window-window window)))) + (error nil))) (defun handle-select-window (event) "Handle select-window events." (interactive "e") (let ((window (posn-window (event-start event)))) - (if (and (window-live-p window) - ;; Don't switch if we're currently in the minibuffer. - ;; This tries to work around problems where the minibuffer gets - ;; unselected unexpectedly, and where you then have to move - ;; your mouse all the way down to the minibuffer to select it. - (not (window-minibuffer-p (selected-window))) - ;; Don't switch to a minibuffer window unless it's active. - (or (not (window-minibuffer-p window)) - (minibuffer-window-active-p window))) - (select-window window)))) + (when (and (window-live-p window) + ;; Don't switch if we're currently in the minibuffer. + ;; This tries to work around problems where the minibuffer gets + ;; unselected unexpectedly, and where you then have to move + ;; your mouse all the way down to the minibuffer to select it. + (not (window-minibuffer-p (selected-window))) + ;; Don't switch to a minibuffer window unless it's active. + (or (not (window-minibuffer-p window)) + (minibuffer-window-active-p window))) + (unless (and (numberp mouse-autoselect-window) + (not (zerop mouse-autoselect-window)) + (not mouse-autoselect-window-now) + ;; When `mouse-autoselect-window' has a numeric, non-zero + ;; value, delay window autoselection by that value. + ;; `mouse-autoselect-window-start' returns non-nil iff it + ;; successfully installed a timer for this purpose. + (mouse-autoselect-window-start window)) + ;; Re-enable delayed window autoselection. + (setq mouse-autoselect-window-now nil) + (when mouse-autoselect-window + ;; Run `mouse-leave-buffer-hook' when autoselecting window. + (run-hooks 'mouse-leave-buffer-hook)) + (select-window window))))) (define-key ctl-x-map "2" 'split-window-vertically) (define-key ctl-x-map "3" 'split-window-horizontally)
--- a/lisp/woman.el Sat Oct 14 16:56:21 2006 +0000 +++ b/lisp/woman.el Sat Oct 14 17:36:28 2006 +0000 @@ -438,6 +438,7 @@ (eval-when-compile ; to avoid compiler warnings (require 'dired) + (require 'cl) (require 'apropos)) (defun woman-mapcan (fn x) @@ -1196,7 +1197,7 @@ (kill-buffer standard-output) )))) -(defvar woman-topic-history nil "Topic read history.") +(defvaralias 'woman-topic-history 'Man-topic-history) (defvar woman-file-history nil "File-name read history.") (defun woman-file-name (topic &optional re-cache) @@ -1750,7 +1751,18 @@ (define-key woman-mode-map [M-mouse-2] 'woman-follow-word) ;; We don't need to call `man' when we are in `woman-mode'. - (define-key woman-mode-map [remap man] 'woman)) + (define-key woman-mode-map [remap man] 'woman) + (define-key woman-mode-map [remap man-follow] 'woman-follow)) + +(defun woman-follow (topic) + "Get a Un*x manual page of the item under point and put it in a buffer." + (interactive (list (Man-default-man-entry))) + (if (or (not topic) + (string= topic "")) + (error "No item under point") + (woman (if (string-match Man-reference-regexp topic) + (substring topic 0 (match-end 1)) + topic)))) (defun woman-follow-word (event) "Run WoMan with word under mouse as topic. @@ -2456,6 +2468,7 @@ (woman0-search-regex (concat woman0-search-regex-start woman0-search-regex-end)) woman0-rename-alist) + (set-marker-insertion-type woman0-if-to t) (while (re-search-forward woman0-search-regex nil t) (setq request (match-string 1)) (cond ((string= request "ig") (woman0-ig)) @@ -2529,7 +2542,7 @@ ;; String delimiter can be any non-numeric character, ;; including a special character escape: (looking-at "\\(\\\\(..\\|[^0-9]\\)\\(.*\\)\\1\\(.*\\)\\1\\'")) - (let ((end1 (copy-marker (match-end 2)))) ; end of first string + (let ((end1 (copy-marker (match-end 2) t))) ; End of first string. ;; Delete 2nd and 3rd delimiters to avoid processing them: (delete-region (match-end 3) woman0-if-to) (delete-region (match-end 2) (match-beginning 3)) @@ -2644,10 +2657,9 @@ (error "File `%s' not found" name)) (beginning-of-line) (woman-delete-line 1) - (let ((from (point)) - (to (make-marker)) - (length (woman-insert-file-contents filename 0))) - (set-marker to (+ from length)) + (let* ((from (point)) + (length (woman-insert-file-contents filename 0)) + (to (copy-marker (+ from length) t))) (woman-pre-process-region from to) (set-marker to nil) (goto-char from) @@ -3431,9 +3443,7 @@ (defsubst woman2-process-escapes-to-eol (&optional numeric) "Process remaining escape sequences up to eol. Handle numeric arguments specially if optional argument NUMERIC is non-nil." - (woman2-process-escapes - (save-excursion (end-of-line) (point-marker)) - numeric)) + (woman2-process-escapes (copy-marker (line-end-position) t) numeric)) (defun woman2-nr (to) ".nr R +/-N M -- Assign +/-N (wrt to previous value, if any) to register R. @@ -3634,6 +3644,7 @@ (woman-registers woman-registers) fn request translations tab-stop-list) + (set-marker-insertion-type to t) ;; ?roff does not squeeze multiple spaces, but does fill, so... (fset 'canonically-space-region 'ignore) ;; Try to avoid spaces inheriting underlines from preceding text! @@ -3676,7 +3687,8 @@ ;; Call the appropriate function: (funcall fn to))) (if (not (eobp)) ; This should not happen, but ... - (woman2-format-paragraphs (point-max-marker) woman-left-margin)) + (woman2-format-paragraphs (copy-marker (point-max) t) + woman-left-margin)) (fset 'canonically-space-region canonically-space-region) (fset 'set-text-properties set-text-properties) (fset 'insert-and-inherit insert-and-inherit) @@ -3888,6 +3900,7 @@ (defun woman2-process-escapes (to &optional numeric) "Process remaining escape sequences up to marker TO, preserving point. Optional argument NUMERIC, if non-nil, means the argument is numeric." + (assert (and (markerp to) (marker-insertion-type to))) ;; The first two cases below could be merged (maybe)! (let ((from (point))) ;; Discard zero width filler character used to hide leading dots @@ -3957,15 +3970,13 @@ (delete-char -1) (delete-char 1) (looking-at "\\(.\\)\\(.*\\)\\1") - (let ((to (make-marker)) from N c) - (set-marker to (match-end 2)) - (delete-char 1) - (setq from (point) - N (woman-parse-numeric-arg)) - (setq c (if (< (point) to) (following-char) ?_)) + (forward-char 1) + (let* ((to (match-end 2)) + (from (match-beginning 0)) + (N (woman-parse-numeric-arg)) + (c (if (< (point) to) (following-char) ?_))) (delete-region from to) (delete-char 1) - (set-marker to nil) (insert (make-string N c)) ))
--- a/lispref/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,178 @@ +2006-10-13 Chong Yidong <cyd@stupidchicken.com> + + * frames.texi (Frame Titles): %c and %l are ignored in + frame-title-format. + +2006-10-11 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Key Sequences): Clarify use of kbd. + +2006-10-10 Kim F. Storm <storm@cua.dk> + + * lists.texi (Sets And Lists): Add memql. + +2006-10-03 Richard Stallman <rms@gnu.org> + + * searching.texi (Char Classes): Document :multibyte: and :unibyte:. + Clarify :ascii: and :nonascii:. + +2006-09-29 Juri Linkov <juri@jurta.org> + + * modes.texi (%-Constructs): Reorder coding systems in the + documentation of %z to the real order displayed in the modeline. + +2006-09-25 Richard Stallman <rms@gnu.org> + + * os.texi (Timers): Describe timer-max-repeats. + +2006-09-25 Chong Yidong <cyd@stupidchicken.com> + + * os.texi (Timers): Mention with-local-quit. + +2006-09-24 Richard Stallman <rms@gnu.org> + + * searching.texi (Searching and Matching): Mention property search. + + * commands.texi (Command Loop Info): Explain how read-event affects + this-command-keys. + +2006-09-20 Richard Stallman <rms@gnu.org> + + * os.texi (Timers): Clarify about REPEAT when timer is delayed. + + * windows.texi (Window Start): Minor cleanups. + +2006-09-20 Kim F. Storm <storm@cua.dk> + + * windows.texi (Window Start): pos-visible-in-window-p allows + specifying t for position to mean "end of window". + Add window-line-height. + + * anti.texi (Antinews): Mention window-line-height. + +2006-09-19 David Kastrup <dak@gnu.org> + + * keymaps.texi (Searching Keymaps): Small clarification. + +2006-09-18 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Creating Keymaps): Explain that keymap prompt strings + cause keyboard menus. + (Menu Keymaps): Likewise. + (Defining Menus, Keyboard Menus): Clarify. + + * text.texi (Fields): Clarify explanation of constrain-to-field. + +2006-09-16 Eli Zaretskii <eliz@gnu.org> + + * variables.texi (Tips for Defining): Fix a typo. + +2006-09-15 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Remapping Commands, Searching Keymaps) + (Active Keymaps): Clean up previous change. + +2006-09-15 Jay Belanger <belanger@truman.edu> + + * gpl.texi: Replace "Library Public License" by "Lesser Public + License" throughout. + +2006-09-15 David Kastrup <dak@gnu.org> + + * keymaps.texi (Active Keymaps): Adapt description to use + `get-char-property' instead `get-text-property'. Explain how + mouse events change this. Explain the new optional argument of + `key-binding' and its mouse-dependent lookup. + (Searching Keymaps): Adapt description similarly. + (Remapping Commands): Explain the new optional argument of + `command-remapping'. + +2006-09-14 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Searching Keymaps): Clarification. + (Active Keymaps): Refer to Searching Keymaps instead of duplication. + +2006-09-13 Richard Stallman <rms@gnu.org> + + * objects.texi (Character Type): Node split. + Add xref to Describing Characters. + (Basic Char Syntax, General Escape Syntax) + (Ctl-Char Syntax, Meta-Char Syntax): New subnodes. + +2006-09-11 Richard Stallman <rms@gnu.org> + + * display.texi (Display Table Format): Wording clarification. + (Glyphs): Clarifications. + +2006-09-10 Chong Yidong <cyd@stupidchicken.com> + + * keymaps.texi (Active Keymaps): Mention that key-binding checks + local maps. + +2006-09-10 Kim F. Storm <storm@cua.dk> + + * display.texi (Forcing Redisplay): Document return value of + function redisplay. + +2006-09-09 Richard Stallman <rms@gnu.org> + + * windows.texi (Window Hooks): Explain limits of + window-scroll-functions. + + * display.texi (Fringe Indicators): Update for last change in + indicate-buffer-boundaries. + +2006-09-08 Richard Stallman <rms@gnu.org> + + * processes.texi (Bindat Spec): Suggest names ending in -bindat-spec. + +2006-09-06 Kim F. Storm <storm@cua.dk> + + * frames.texi (Display Feature Testing): display-mm-dimensions-alist. + + * windows.texi (Window Start): Update pos-visible-in-window-p. + +2006-09-04 Richard Stallman <rms@gnu.org> + + * processes.texi (Accepting Output): Explain SECONDS=0 for + accept-process-output. + + * os.texi (Idle Timers): Explain why timer functions should not + loop until (input-pending-p). + +2006-09-02 Eli Zaretskii <eliz@gnu.org> + + * makefile.w32-in (usermanualdir): New variable. + (elisp.dvi): Use it. + +2006-09-01 Eli Zaretskii <eliz@gnu.org> + + * buffers.texi (Buffer Modification): Fix last change. + +2006-09-01 Chong Yidong <cyd@stupidchicken.com> + + * buffers.texi (Buffer Modification): Document + buffer-chars-modified-tick. + +2006-08-31 Richard Stallman <rms@gnu.org> + + * modes.texi (Syntactic Font Lock): Mention specific faces once again. + +2006-08-31 Richard Bielawski <RBielawski@moneygram.com> (tiny change) + + * modes.texi (Syntactic Font Lock): + Mention font-lock-syntactic-face-function + instead of specific faces. + +2006-08-29 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Images): Add xrref to display-images-p. + +2006-08-28 Kenichi Handa <handa@m17n.org> + + * nonascii.texi (Lisp and Coding Systems): Fix description of + detect-coding-region. + 2006-08-27 Michael Olson <mwolson@gnu.org> * processes.texi (Transaction Queues): Remove stray quote @@ -4785,7 +4960,7 @@ (info): Add target. (installall): Target removed. -2001-10-31 Pavel Jan,Bm(Bk <Pavel@Janik.cz> +2001-10-31 Pavel Jan,Am(Bk <Pavel@Janik.cz> * tips.texi (Coding Conventions): Fix typo.
--- a/lispref/anti.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/anti.texi Sat Oct 14 17:36:28 2006 +0000 @@ -325,7 +325,8 @@ think in terms of lines and columns, not pixel coordinates. (Sometime in the distant past, we will do away with graphical terminals entirely, in favor of text terminals.) For similar reasons, the -functions @code{posn-at-point} and @code{posn-at-x-y} have been removed, and +functions @code{posn-at-point}, @code{posn-at-x-y}, and +@code{window-line-height} have been removed, and @code{pos-visible-in-window-p} no longer worries about partially visible rows.
--- a/lispref/buffers.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/buffers.texi Sat Oct 14 17:36:28 2006 +0000 @@ -573,7 +573,6 @@ echo area; use @code{set-buffer-modified-p} (above) instead. @end deffn -@c Emacs 19 feature @defun buffer-modified-tick &optional buffer This function returns @var{buffer}'s modification-count. This is a counter that increments every time the buffer is modified. If @@ -581,6 +580,17 @@ The counter can wrap around occasionally. @end defun +@defun buffer-chars-modified-tick &optional buffer +This function returns @var{buffer}'s character-change modification-count. +Changes to text properties leave this counter unchanged; however, each +time text is inserted or removed from the buffer, the counter is reset +to the value that would be returned @code{buffer-modified-tick}. +By comparing the values returned by two @code{buffer-chars-modified-tick} +calls, you can tell whether a character change occurred in that buffer +in between the calls. If @var{buffer} is @code{nil} (or omitted), the +current buffer is used. +@end defun + @node Modification Time @comment node-name, next, previous, up @section Comparison of Modification Time
--- a/lispref/commands.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/commands.texi Sat Oct 14 17:36:28 2006 +0000 @@ -788,11 +788,13 @@ @anchor{Definition of this-command-keys} This function returns a string or vector containing the key sequence that invoked the present command, plus any previous commands that -generated the prefix argument for this command. However, if the -command has called @code{read-key-sequence}, it returns the last read -key sequence. @xref{Key Sequence Input}. The value is a string if -all events in the sequence were characters that fit in a string. -@xref{Input Events}. +generated the prefix argument for this command. Any events read by the +command using @code{read-event} without a timeout get tacked on to the end. + +However, if the command has called @code{read-key-sequence}, it +returns the last read key sequence. @xref{Key Sequence Input}. The +value is a string if all events in the sequence were characters that +fit in a string. @xref{Input Events}. @example @group
--- a/lispref/display.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/display.texi Sat Oct 14 17:36:28 2006 +0000 @@ -119,6 +119,8 @@ If the optional argument @var{force} is non-@code{nil}, it forces an immediate and complete redisplay even if input is available. + +Returns @code{t} if redisplay was performed, or @code{nil} otherwise. @end defun @node Truncation @@ -2816,26 +2818,32 @@ that there is text above the screen, and a down-arrow to show there is text below the screen. -There are four kinds of basic values: +There are three kinds of basic values: @table @asis @item @code{nil} -Don't display the icons. +Don't display any of these fringe icons. @item @code{left} -Display them in the left fringe. +Display the angle icons and arrows in the left fringe. @item @code{right} -Display them in the right fringe. -@item @var{anything-else} -Display the icon at the top of the window top in the left fringe, and other -in the right fringe. +Display the angle icons and arrows in the right fringe. +@item any non-alist +Display the angle icons in the left fringe +and don't display the arrows. @end table -If value is a cons @code{(@var{angles} . @var{arrows})}, @var{angles} -controls the angle icons, and @var{arrows} controls the arrows. Both -@var{angles} and @var{arrows} work according to the table above. -Thus, @code{(t . right)} places the top angle icon in the left -fringe, the bottom angle icon in the right fringe, and both arrows in -the right fringe. +Otherwise the value should be an alist that specifies which fringe +indicators to display and where. Each element of the alist should +have the form @code{(@var{indicator} . @var{position})}. Here, +@var{indicator} is one of @code{top}, @code{bottom}, @code{up}, +@code{down}, and @code{t} (which covers all the icons not yet +specified), while @var{position} is one of @code{left}, @code{right} +and @code{nil}. + +For example, @code{((top . left) (t . right))} places the top angle +bitmap in left fringe, and the bottom angle bitmap as well as both +arrow bitmaps in right fringe. To show the angle bitmaps in the left +fringe, and no arrow bitmaps, use @code{((top . left) (bottom . left))}. @end defvar @defvar default-indicate-buffer-boundaries @@ -3564,6 +3572,13 @@ descriptor, then use it as a display specifier in the @code{display} property of text that is displayed (@pxref{Display Property}). + Emacs is usually able to display images when it is run on a +graphical terminal. Images cannot be displayed in a text terminal, on +certain graphical terminals that lack the support for this, or if +Emacs is compiled without image support. You can use the function +@code{display-images-p} to determine if images can in principle be +displayed (@pxref{Display Feature Testing}). + Emacs can display a number of different image formats; some of them are supported only if particular support libraries are installed on your machine. In some environments, Emacs can load image @@ -5103,13 +5118,14 @@ The ordinary elements of the display table are indexed by character codes; the element at index @var{c} says how to display the character -code @var{c}. The value should be @code{nil} or a vector of glyph -values (@pxref{Glyphs}). If an element is @code{nil}, it says to -display that character according to the usual display conventions +code @var{c}. The value should be @code{nil} or a vector of the +glyphs to be output (@pxref{Glyphs}). @code{nil} says to display the +character @var{c} according to the usual display conventions (@pxref{Usual Display}). - If you use the display table to change the display of newline -characters, the whole buffer will be displayed as one long ``line.'' + @strong{Warning:} if you use the display table to change the display +of newline characters, the whole buffer will be displayed as one long +``line.'' The display table also has six ``extra slots'' which serve special purposes. Here is a table of their meanings; @code{nil} in any slot @@ -5236,14 +5252,14 @@ A @dfn{glyph} is a generalization of a character; it stands for an image that takes up a single character position on the screen. Glyphs are represented in Lisp as integers, just as characters are. Normally -Emacs finds glyphs in the display table (@pxref{Display Tables}). - - A glyph can be @dfn{simple} or it can be defined by the @dfn{glyph -table}. A simple glyph is just a way of specifying a character and a -face to output it in. The glyph code for a simple glyph, mod 524288, -is the character to output, and the glyph code divided by 524288 -specifies the face number (@pxref{Face Functions}) to use while -outputting it. (524288 is +glyph come from vectors in the display table (@pxref{Display Tables}). + + A glyph code can be @dfn{simple} or it can be defined by the +@dfn{glyph table}. A simple glyph code is just a way of specifying a +character and a face to output it in. When a glyph code is simple, +the code, mod 524288, is the character to output, and the code divided +by 524288 specifies the face number (@pxref{Face Functions}) to use +while outputting it. (524288 is @ifnottex 2**19.) @end ifnottex @@ -5253,35 +5269,35 @@ @xref{Faces}. On character terminals, you can set up a @dfn{glyph table} to define -the meaning of glyph codes. The glyph codes is the value of the -variable @code{glyph-table}. +the meaning of glyph codes. @defvar glyph-table -The value of this variable is the current glyph table. It should be a -vector; the @var{g}th element defines glyph code @var{g}. +The value of this variable is the current glyph table. It should be +@code{nil} or a vector whose @var{g}th element defines glyph code +@var{g}. If a glyph code is greater than or equal to the length of the glyph -table, that code is automatically simple. If the value of -@code{glyph-table} is @code{nil} instead of a vector, then all glyphs -are simple. The glyph table is not used on graphical displays, only -on character terminals. On graphical displays, all glyphs are simple. +table, that code is automatically simple. If @code{glyph-table} is +@code{nil} then all glyph codes are simple. + +The glyph table is used only on character terminals. On graphical +displays, all glyph codes are simple. @end defvar - Here are the possible types of elements in the glyph table: + Here are the meaningful types of elements in the glyph table: @table @asis @item @var{string} Send the characters in @var{string} to the terminal to output -this glyph. This alternative is available on character terminals, -but not on graphical displays. +this glyph code. @item @var{integer} Define this glyph code as an alias for glyph code @var{integer}. You -can use an alias to specify a face code for the glyph and use a small -number as its code. +can use such an alias to define a small-numbered glyph code which +specifies a face. @item @code{nil} -This glyph is simple. +This glyph code is simple. @end table @defun create-glyph string
--- a/lispref/frames.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/frames.texi Sat Oct 14 17:36:28 2006 +0000 @@ -555,7 +555,7 @@ @node Management Parameters @subsubsection Window Management Parameters - + These frame parameters, meaningful only on window system displays, interact with the window manager. @@ -899,7 +899,8 @@ @defvar frame-title-format This variable specifies how to compute a name for a frame when you have not explicitly specified one. The variable's value is actually a mode -line construct, just like @code{mode-line-format}. @xref{Mode Line +line construct, just like @code{mode-line-format}, except that the +@samp{%c} and @samp{%l} constructs are ignored. @xref{Mode Line Data}. @end defvar @@ -2086,21 +2087,27 @@ On a character terminal, it gives the height in characters. @end defun +@defun display-pixel-width &optional display +This function returns the width of the screen in pixels. +On a character terminal, it gives the width in characters. +@end defun + @defun display-mm-height &optional display This function returns the height of the screen in millimeters, or @code{nil} if Emacs cannot get that information. @end defun -@defun display-pixel-width &optional display -This function returns the width of the screen in pixels. -On a character terminal, it gives the width in characters. -@end defun - @defun display-mm-width &optional display This function returns the width of the screen in millimeters, or @code{nil} if Emacs cannot get that information. @end defun +@defvar display-mm-dimensions-alist +This variable allows the user to specify the dimensions of graphical +displays returned by @code{display-mm-height} and +@code{display-mm-width} in case the system provides incorrect values. +@end defvar + @defun display-backing-store &optional display This function returns the backing store capability of the display. Backing store means recording the pixels of windows (and parts of
--- a/lispref/gpl.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/gpl.texi Sat Oct 14 17:36:28 2006 +0000 @@ -23,7 +23,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -75,13 +75,13 @@ @item This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The ``Program,'' below, +under the terms of this General Public License. The ``Program'', below, refers to any such program or work, and a ``work based on the Program'' means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in -the term ``modification.'') Each licensee is addressed as ``you.'' +the term ``modification''.) Each licensee is addressed as ``you''. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of @@ -274,7 +274,7 @@ Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and ``any -later version,'' you have the option of following the terms and conditions +later version'', you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software @@ -339,8 +339,8 @@ the ``copyright'' line and a pointer to where the full notice is found. @smallexample -@var{one line to give the program's name and an idea of what it does.} -Copyright (C) @var{year} @var{name of author} +@var{one line to give the program's name and a brief idea of what it does.} +Copyright (C) @var{yyyy} @var{name of author} This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -364,11 +364,10 @@ when it starts in an interactive mode: @smallexample -Gnomovision version 69, Copyright (C) @var{year} @var{name of author} -Gnomovision comes with ABSOLUTELY NO WARRANTY; for details -type `show w'. This is free software, and you are welcome -to redistribute it under certain conditions; type `show c' -for details. +Gnomovision version 69, Copyright (C) @var{yyyy} @var{name of author} +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. @end smallexample The hypothetical commands @samp{show w} and @samp{show c} should show
--- a/lispref/keymaps.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/keymaps.texi Sat Oct 14 17:36:28 2006 +0000 @@ -94,6 +94,9 @@ (kbd "<f1> SPC") @result{} [f1 32] (kbd "C-M-<down>") @result{} [C-M-down] @end example + +This macro is not meant for use with arguments that vary---only +with string constants. @end defmac @node Keymap Basics @@ -169,6 +172,15 @@ This specifies one binding, for events of type @var{type}. Each ordinary binding applies to events of a particular @dfn{event type}, which is always a character or a symbol. @xref{Classifying Events}. +In this kind of binding, @var{binding} is a command. + +@item (@var{type} @var{item-name} .@: @var{binding}) +This specifies a binding which is also a menu item +named @var{item-name}. @xref{Simple Menu Items}. + +@item (@var{type} menu-item .@: @var{details}) +This specifies a binding which is also a menu item and allows use of +other features. @xref{Extended Menu Items}. @item (t .@: @var{binding}) @cindex default key binding @@ -295,9 +307,13 @@ @end group @end example -If you specify @var{prompt}, that becomes the overall prompt string for -the keymap. The prompt string should be provided for menu keymaps -(@pxref{Defining Menus}). +If you specify @var{prompt}, that becomes the overall prompt string +for the keymap. You should specify this only for menu keymaps +(@pxref{Defining Menus}). A keymap with an overall prompt string will +always present a mouse menu or a keyboard menu if it is active for +looking up the next input event. Don't specify an overall prompt string +for the main map of a major or minor mode, because that would cause +the command loop to present a keyboard menu every time. @end defun @defun make-keymap &optional prompt @@ -569,35 +585,19 @@ of them are @dfn{active}, meaning that they participate in the interpretation of user input. All the active keymaps are used together to determine what command to execute when a key is entered. -Emacs searches these keymaps one by one, in a standard order, until it -finds a binding in one of the keymaps. Normally the active keymaps are the @code{keymap} property keymap, the keymaps of any enabled minor modes, the current buffer's local -keymap, and the global keymap, in that order. Therefore, Emacs -searches for each input key sequence in all these keymaps. Here is a -pseudo-Lisp description of how this process works: - -@lisp -(or (if overriding-terminal-local-map - (@var{find-in} overriding-terminal-local-map) - (if overriding-local-map - (@var{find-in} overriding-local-map) - (or (@var{find-in} (get-text-property (point) 'keymap)) - (@var{find-in-any} emulation-mode-map-alists) - (@var{find-in-any} minor-mode-overriding-map-alist) - (@var{find-in-any} minor-mode-map-alist) - (if (get-text-property (point) 'local-map) - (@var{find-in} (get-text-property (point) 'local-map)) - (@var{find-in} (current-local-map)))))) - (@var{find-in} (current-global-map))) -@end lisp - -@noindent -Here, the pseudo-function @var{find-in} means to look up the key -sequence in a single map, and @var{find-in-any} means to search the -appropriate keymaps from an alist. (Searching a single keymap for a -binding is called @dfn{key lookup}; see @ref{Key Lookup}.) +keymap, and the global keymap, in that order. Emacs searches for each +input key sequence in all these keymaps. @xref{Searching Keymaps}, +for more details of this procedure. + + When the key sequence starts with a mouse event (optionally preceded +by a symbolic prefix), the active keymaps are determined based on the +position in that event. If the event happened on a string embedded +with a @code{display}, @code{before-string}, or @code{after-string} +property (@pxref{Special Properties}), the non-@code{nil} map +properties of the string override those of the buffer. The @dfn{global keymap} holds the bindings of keys that are defined regardless of the current buffer, such as @kbd{C-f}. The variable @@ -655,12 +655,11 @@ non-@code{nil} then it pays attention to them. @end defun -@defun key-binding key &optional accept-defaults no-remap +@defun key-binding key &optional accept-defaults no-remap position This function returns the binding for @var{key} according to the current active keymaps. The result is @code{nil} if @var{key} is undefined in the keymaps. -@c Emacs 19 feature The argument @var{accept-defaults} controls checking for default bindings, as in @code{lookup-key} (above). @@ -670,6 +669,14 @@ if @var{no-remap} is non-@code{nil}, @code{key-binding} ignores remappings and returns the binding directly specified for @var{key}. +If @var{key} starts with a mouse event (perhaps following a prefix +event), the maps to be consulted are determined based on the event's +position. Otherwise, they are determined based on the value of point. +However, you can override either of them by specifying @var{position}. +If @var{position} is non-@code{nil}, it should be either a buffer +position or an event position like the value of @code{event-start}. +Then the maps consulted are determined based on @var{position}. + An error is signaled if @var{key} is not a string or a vector. @example @@ -683,21 +690,22 @@ @node Searching Keymaps @section Searching the Active Keymaps - After translation of event subsequences (@pxref{Translation Keymaps}) -Emacs looks for them in the active keymaps. Here is a pseudo-Lisp -description of the order in which the active keymaps are searched: + After translation of event subsequences (@pxref{Translation +Keymaps}) Emacs looks for them in the active keymaps. Here is a +pseudo-Lisp description of the order and conditions for searching +them: @lisp (or (if overriding-terminal-local-map (@var{find-in} overriding-terminal-local-map) (if overriding-local-map (@var{find-in} overriding-local-map) - (or (@var{find-in} (get-text-property (point) 'keymap)) + (or (@var{find-in} (get-char-property (point) 'keymap)) (@var{find-in-any} emulation-mode-map-alists) (@var{find-in-any} minor-mode-overriding-map-alist) (@var{find-in-any} minor-mode-map-alist) (if (get-text-property (point) 'local-map) - (@var{find-in} (get-text-property (point) 'local-map)) + (@var{find-in} (get-char-property (point) 'local-map)) (@var{find-in} (current-local-map)))))) (@var{find-in} (current-global-map))) @end lisp @@ -705,6 +713,12 @@ @noindent The @var{find-in} and @var{find-in-any} are pseudo functions that search in one keymap and in an alist of keymaps, respectively. +(Searching a single keymap for a binding is called @dfn{key lookup}; +see @ref{Key Lookup}.) If the key sequence starts with a mouse event, +or a symbolic prefix event followed by a mouse event, that event's +position is used instead of point and the current buffer. Mouse +events on an embedded string use non-@code{nil} text properties from +that string instead of the buffer. @enumerate @item @@ -1466,11 +1480,13 @@ if an ordinary binding specifies @code{my-kill-line}, this keymap will remap it to @code{my-other-kill-line}. -@defun command-remapping command +@defun command-remapping command &optional position This function returns the remapping for @var{command} (a symbol), given the current active keymaps. If @var{command} is not remapped (which is the usual situation), or not a symbol, the function returns -@code{nil}. +@code{nil}. @code{position} can optionally specify a buffer position +or an event position to determine the keymaps to use, as in +@code{key-binding}. @end defun @node Translation Keymaps @@ -1900,15 +1916,16 @@ @section Menu Keymaps @cindex menu keymaps -@c Emacs 19 feature -A keymap can define a menu as well as bindings for keyboard keys and -mouse button. Menus are usually actuated with the mouse, but they can -work with the keyboard also. +A keymap can operate as a menu as well as defining bindings for +keyboard keys and mouse buttons. Menus are usually actuated with the +mouse, but they can function with the keyboard also. If a menu keymap +is active for the next input event, that activates the keyboard menu +feature. @menu * Defining Menus:: How to make a keymap that defines a menu. * Mouse Menus:: How users actuate the menu with the mouse. -* Keyboard Menus:: How they actuate it with the keyboard. +* Keyboard Menus:: How users actuate the menu with the keyboard. * Menu Example:: Making a simple menu. * Menu Bar:: How to customize the menu bar. * Tool Bar:: A tool bar is a row of images. @@ -1921,26 +1938,34 @@ @cindex menu prompt string @cindex prompt string (of menu) -A keymap is suitable for menu use if it has an @dfn{overall prompt -string}, which is a string that appears as an element of the keymap. +A keymap acts as a menu if it has an @dfn{overall prompt string}, +which is a string that appears as an element of the keymap. (@xref{Format of Keymaps}.) The string should describe the purpose of the menu's commands. Emacs displays the overall prompt string as the menu title in some cases, depending on the toolkit (if any) used for displaying menus.@footnote{It is required for menus which do not use a -toolkit, e.g.@: under MS-DOS.} Keyboard menus also display the overall -prompt string. - -The easiest way to construct a keymap with a prompt string is to specify -the string as an argument when you call @code{make-keymap}, +toolkit, e.g.@: under MS-DOS.} Keyboard menus also display the +overall prompt string. + +The easiest way to construct a keymap with a prompt string is to +specify the string as an argument when you call @code{make-keymap}, @code{make-sparse-keymap} (@pxref{Creating Keymaps}), or -@code{define-prefix-command} (@pxref{Definition of define-prefix-command}). - +@code{define-prefix-command} (@pxref{Definition of +define-prefix-command}). If you do not want the keymap to operate as +a menu, don't specify a prompt string for it. @defun keymap-prompt keymap This function returns the overall prompt string of @var{keymap}, or @code{nil} if it has none. @end defun +The menu's items are the bindings in the keymap. Each binding +associates an event type to a definition, but the event types have no +significance for the menu appearance. (Usually we use pseudo-events, +symbols that the keyboard cannot generate, as the event types for menu +item bindings.) The menu is generated entirely from the bindings that +correspond in the keymap to these events. + The order of items in the menu is the same as the order of bindings in the keymap. Since @code{define-key} puts new bindings at the front, you should define the menu items starting at the bottom of the menu and @@ -1961,8 +1986,8 @@ @node Simple Menu Items @subsubsection Simple Menu Items - The simpler and older way to define a menu keymap binding -looks like this: + The simpler (and original) way to define a menu item is to bind some +event type (it doesn't matter what event type) to a binding like this: @example (@var{item-string} . @var{real-binding}) @@ -1978,25 +2003,26 @@ encoded using the @code{utf-8} coding system and then rendered by the toolkit as it sees fit.} -You can also supply a second string, called the help string, as follows: + You can also supply a second string, called the help string, as follows: @example (@var{item-string} @var{help} . @var{real-binding}) @end example +@noindent @var{help} specifies a ``help-echo'' string to display while the mouse is on that item in the same way as @code{help-echo} text properties (@pxref{Help display}). -As far as @code{define-key} is concerned, @var{item-string} and + As far as @code{define-key} is concerned, @var{item-string} and @var{help-string} are part of the event's binding. However, @code{lookup-key} returns just @var{real-binding}, and only @var{real-binding} is used for executing the key. -If @var{real-binding} is @code{nil}, then @var{item-string} appears in + If @var{real-binding} is @code{nil}, then @var{item-string} appears in the menu but cannot be selected. -If @var{real-binding} is a symbol and has a non-@code{nil} + If @var{real-binding} is a symbol and has a non-@code{nil} @code{menu-enable} property, that property is an expression that controls whether the menu item is enabled. Every time the keymap is used to display a menu, Emacs evaluates the expression, and it enables @@ -2004,12 +2030,12 @@ menu item is disabled, it is displayed in a ``fuzzy'' fashion, and cannot be selected. -The menu bar does not recalculate which items are enabled every time you + The menu bar does not recalculate which items are enabled every time you look at a menu. This is because the X toolkit requires the whole tree of menus in advance. To force recalculation of the menu bar, call @code{force-mode-line-update} (@pxref{Mode Line Format}). -You've probably noticed that menu items show the equivalent keyboard key + You've probably noticed that menu items show the equivalent keyboard key sequence (if any) to invoke the same command. To save time on recalculation, menu display caches this information in a sublist in the binding, like this: @@ -2029,9 +2055,9 @@ @kindex menu-item An extended-format menu item is a more flexible and also cleaner -alternative to the simple format. It consists of a list that starts -with the symbol @code{menu-item}. To define a non-selectable string, -the item looks like this: +alternative to the simple format. You define an event type with a +binding that's a list starting with the symbol @code{menu-item}. +For a non-selectable string, the binding looks like this: @example (menu-item @var{item-name}) @@ -2042,7 +2068,7 @@ see @ref{Menu Separators}. To define a real menu item which can be selected, the extended format -item looks like this: +binding looks like this: @example (menu-item @var{item-name} @var{real-binding} @@ -2292,21 +2318,23 @@ @node Keyboard Menus @subsection Menus and the Keyboard -When a prefix key ending with a keyboard event (a character or function -key) has a definition that is a menu keymap, the user can use the -keyboard to choose a menu item. - -Emacs displays the menu's overall prompt string followed by the -alternatives (the item strings of the bindings) in the echo area. If -the bindings don't all fit at once, the user can type @key{SPC} to see -the next line of alternatives. Successive uses of @key{SPC} eventually -get to the end of the menu and then cycle around to the beginning. (The -variable @code{menu-prompt-more-char} specifies which character is used -for this; @key{SPC} is the default.) - -When the user has found the desired alternative from the menu, he or she -should type the corresponding character---the one whose binding is that -alternative. + When a prefix key ending with a keyboard event (a character or +function key) has a definition that is a menu keymap, the keymap +operates as a keyboard menu; the user specifies the next event by +choosing a menu item with the keyboard. + + Emacs displays the keyboard menu with the map's overall prompt +string, followed by the alternatives (the item strings of the map's +bindings), in the echo area. If the bindings don't all fit at once, +the user can type @key{SPC} to see the next line of alternatives. +Successive uses of @key{SPC} eventually get to the end of the menu and +then cycle around to the beginning. (The variable +@code{menu-prompt-more-char} specifies which character is used for +this; @key{SPC} is the default.) + + When the user has found the desired alternative from the menu, he or +she should type the corresponding character---the one whose binding is +that alternative. @ignore In a menu intended for keyboard use, each menu item must clearly @@ -2317,7 +2345,7 @@ key for each alternative. @end ignore -This way of using menus in an Emacs-like editor was inspired by the + This way of using menus in an Emacs-like editor was inspired by the Hierarkey system. @defvar menu-prompt-more-char
--- a/lispref/lists.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/lists.texi Sat Oct 14 17:36:28 2006 +0000 @@ -1395,6 +1395,27 @@ destructively. See @ref{Sets And Lists}. @end defun +@defun memql object list +The function @code{member} tests to see whether @var{object} is a member +of @var{list}, comparing members with @var{object} using @code{eql}, +so floating point elements are compared by value. +If @var{object} is a member, @code{memql} returns a list starting with +its first occurrence in @var{list}. Otherwise, it returns @code{nil}. + +Compare this with @code{memq}: + +@example +@group +(memql 1.2 '(1.1 1.2 1.3) ; @r{@code{1.2} and @code{1.2} are @code{eql}.} + @result{} (1.2 1.3) +@end group +@group +(memq 1.2 '(1.1 1.2 1.3) ; @r{@code{1.2} and @code{1.2} are not @code{eq}.} + @result{} nil +@end group +@end example +@end defun + The following three functions are like @code{memq}, @code{delq} and @code{remq}, but use @code{equal} rather than @code{eq} to compare elements. @xref{Equality Predicates}.
--- a/lispref/makefile.w32-in Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/makefile.w32-in Sat Oct 14 17:36:28 2006 +0000 @@ -23,6 +23,7 @@ srcdir = . infodir = $(srcdir)/../info +usermanualdir = $(srcdir)/../man # Redefine `TEX' if `tex' does not invoke plain TeX. For example: # TEX=platex @@ -108,7 +109,7 @@ $(MAKEINFO) -I. -I$(srcdir) -o $(infodir)/elisp $(srcdir)/elisp.texi elisp.dvi: $(srcs) - $(texinputdir) $(TEX) $(srcdir)/elisp.texi + $(texinputdir) $(TEX) -I $(usermanualdir) $(srcdir)/elisp.texi clean: - $(DEL) *.toc *.aux *.log *.cp *.cps *.fn *.fns *.tp *.tps \
--- a/lispref/modes.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/modes.texi Sat Oct 14 17:36:28 2006 +0000 @@ -1966,7 +1966,7 @@ File Types}). @item %z -The mnemonics of buffer, terminal, and keyboard coding systems. +The mnemonics of keyboard, terminal, and buffer coding systems. @item %Z Like @samp{%z}, but including the end-of-line format. @@ -2897,9 +2897,10 @@ Syntactic fontification uses the syntax table to find comments and string constants (@pxref{Syntax Tables}). It highlights them using @code{font-lock-comment-face} and @code{font-lock-string-face} -(@pxref{Faces for Font Lock}). There are several variables that -affect syntactic fontification; you should set them by means of -@code{font-lock-defaults} (@pxref{Font Lock Basics}). +(@pxref{Faces for Font Lock}), or whatever +@code{font-lock-syntactic-face-function} chooses. There are several +variables that affect syntactic fontification; you should set them by +means of @code{font-lock-defaults} (@pxref{Font Lock Basics}). @defvar font-lock-keywords-only Non-@code{nil} means Font Lock should not do syntactic fontification;
--- a/lispref/nonascii.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/nonascii.texi Sat Oct 14 17:36:28 2006 +0000 @@ -882,8 +882,9 @@ return value is just one coding system, the one that is highest in priority. -If the region contains only @acronym{ASCII} characters, the value -is @code{undecided} or @code{(undecided)}, or a variant specifying +If the region contains only @acronym{ASCII} characters except for such +ISO-2022 control characters ISO-2022 as @code{ESC}, the value is +@code{undecided} or @code{(undecided)}, or a variant specifying end-of-line conversion, if that can be deduced from the text. @end defun
--- a/lispref/objects.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/objects.texi Sat Oct 14 17:36:28 2006 +0000 @@ -227,9 +227,9 @@ other words, characters are represented by their character codes. For example, the character @kbd{A} is represented as the @w{integer 65}. - Individual characters are not often used in programs. It is far more -common to work with @emph{strings}, which are sequences composed of -characters. @xref{String Type}. + Individual characters are used occasionally in programs, but it is +more common to work with @emph{strings}, which are sequences composed +of characters. @xref{String Type}. Characters in strings, buffers, and files are currently limited to the range of 0 to 524287---nineteen bits. But not all values in that @@ -239,17 +239,32 @@ input have a much wider range, to encode modifier keys such as Control, Meta and Shift. + There are special functions for producing a human-readable textual +description of a character for the sake of messages. @xref{Describing +Characters}. + +@menu +* Basic Char Syntax:: +* General Escape Syntax:: +* Ctl-Char Syntax:: +* Meta-Char Syntax:: +* Other Char Bits:: +@end menu + +@node Basic Char Syntax +@subsubsection Basic Char Syntax @cindex read syntax for characters @cindex printed representation for characters @cindex syntax for characters @cindex @samp{?} in character constant @cindex question mark in character constant - Since characters are really integers, the printed representation of a -character is a decimal number. This is also a possible read syntax for -a character, but writing characters that way in Lisp programs is a very -bad idea. You should @emph{always} use the special read syntax formats -that Emacs Lisp provides for characters. These syntax formats start -with a question mark. + + Since characters are really integers, the printed representation of +a character is a decimal number. This is also a possible read syntax +for a character, but writing characters that way in Lisp programs is +not clear programming. You should @emph{always} use the special read +syntax formats that Emacs Lisp provides for characters. These syntax +formats start with a question mark. The usual read syntax for alphanumeric characters is a question mark followed by the character; thus, @samp{?A} for the character @@ -315,8 +330,76 @@ character @key{ESC}. @samp{\s} is meant for use in character constants; in string constants, just write the space. + A backslash is allowed, and harmless, preceding any character without +a special escape meaning; thus, @samp{?\+} is equivalent to @samp{?+}. +There is no reason to add a backslash before most characters. However, +you should add a backslash before any of the characters +@samp{()\|;'`"#.,} to avoid confusing the Emacs commands for editing +Lisp code. You can also add a backslash before whitespace characters such as +space, tab, newline and formfeed. However, it is cleaner to use one of +the easily readable escape sequences, such as @samp{\t} or @samp{\s}, +instead of an actual whitespace character such as a tab or a space. +(If you do write backslash followed by a space, you should write +an extra space after the character constant to separate it from the +following text.) + +@node General Escape Syntax +@subsubsection General Escape Syntax + + In addition to the specific excape sequences for special important +control characters, Emacs provides general categories of escape syntax +that you can use to specify non-ASCII text characters. + +@cindex unicode character escape + For instance, you can specify characters by their Unicode values. +@code{?\u@var{nnnn}} represents a character that maps to the Unicode +code point @samp{U+@var{nnnn}}. There is a slightly different syntax +for specifying characters with code points above @code{#xFFFF}; +@code{\U00@var{nnnnnn}} represents the character whose Unicode code +point is @samp{U+@var{nnnnnn}}, if such a character is supported by +Emacs. If the corresponding character is not supported, Emacs signals +an error. + + This peculiar and inconvenient syntax was adopted for compatibility +with other programming languages. Unlike some other languages, Emacs +Lisp supports this syntax in only character literals and strings. + +@cindex @samp{\} in character constant +@cindex backslash in character constant +@cindex octal character code + The most general read syntax for a character represents the +character code in either octal or hex. To use octal, write a question +mark followed by a backslash and the octal character code (up to three +octal digits); thus, @samp{?\101} for the character @kbd{A}, +@samp{?\001} for the character @kbd{C-a}, and @code{?\002} for the +character @kbd{C-b}. Although this syntax can represent any +@acronym{ASCII} character, it is preferred only when the precise octal +value is more important than the @acronym{ASCII} representation. + +@example +@group +?\012 @result{} 10 ?\n @result{} 10 ?\C-j @result{} 10 +?\101 @result{} 65 ?A @result{} 65 +@end group +@end example + + To use hex, write a question mark followed by a backslash, @samp{x}, +and the hexadecimal character code. You can use any number of hex +digits, so you can represent any character code in this way. +Thus, @samp{?\x41} for the character @kbd{A}, @samp{?\x1} for the +character @kbd{C-a}, and @code{?\x8e0} for the Latin-1 character +@iftex +@samp{@`a}. +@end iftex +@ifnottex +@samp{a} with grave accent. +@end ifnottex + +@node Ctl-Char Syntax +@subsubsection Control-Character Syntax + @cindex control characters - Control characters may be represented using yet another read syntax. + Control characters can be represented using yet another read syntax. This consists of a question mark followed by a backslash, caret, and the corresponding non-control character, in either upper or lower case. For example, both @samp{?\^I} and @samp{?\^i} are valid read syntax for the @@ -363,6 +446,9 @@ affect the meaning of the program, but may guide the understanding of people who read it. +@node Meta-Char Syntax +@subsubsection Meta-Character Syntax + @cindex meta characters A @dfn{meta character} is a character typed with the @key{META} modifier key. The integer that represents such a character has the @@ -395,6 +481,9 @@ or as @samp{?\M-\101}. Likewise, you can write @kbd{C-M-b} as @samp{?\M-\C-b}, @samp{?\C-\M-b}, or @samp{?\M-\002}. +@node Other Char Bits +@subsubsection Other Character Modifier Bits + The case of a graphic character is indicated by its character code; for example, @acronym{ASCII} distinguishes between the characters @samp{a} and @samp{A}. But @acronym{ASCII} has no way to represent whether a control @@ -431,64 +520,6 @@ bit values are 2**22 for alt, 2**23 for super and 2**24 for hyper. @end ifnottex -@cindex unicode character escape - Emacs provides a syntax for specifying characters by their Unicode -code points. @code{?\u@var{nnnn}} represents a character that maps to -the Unicode code point @samp{U+@var{nnnn}}. There is a slightly -different syntax for specifying characters with code points above -@code{#xFFFF}; @code{\U00@var{nnnnnn}} represents the character whose -Unicode code point is @samp{U+@var{nnnnnn}}, if such a character -is supported by Emacs. If the corresponding character is not -supported, Emacs signals an error. - - This peculiar and inconvenient syntax was adopted for compatibility -with other programming languages. Unlike some other languages, Emacs -Lisp supports this syntax in only character literals and strings. - -@cindex @samp{\} in character constant -@cindex backslash in character constant -@cindex octal character code - Finally, the most general read syntax for a character represents the -character code in either octal or hex. To use octal, write a question -mark followed by a backslash and the octal character code (up to three -octal digits); thus, @samp{?\101} for the character @kbd{A}, -@samp{?\001} for the character @kbd{C-a}, and @code{?\002} for the -character @kbd{C-b}. Although this syntax can represent any @acronym{ASCII} -character, it is preferred only when the precise octal value is more -important than the @acronym{ASCII} representation. - -@example -@group -?\012 @result{} 10 ?\n @result{} 10 ?\C-j @result{} 10 -?\101 @result{} 65 ?A @result{} 65 -@end group -@end example - - To use hex, write a question mark followed by a backslash, @samp{x}, -and the hexadecimal character code. You can use any number of hex -digits, so you can represent any character code in this way. -Thus, @samp{?\x41} for the character @kbd{A}, @samp{?\x1} for the -character @kbd{C-a}, and @code{?\x8e0} for the Latin-1 character -@iftex -@samp{@`a}. -@end iftex -@ifnottex -@samp{a} with grave accent. -@end ifnottex - - A backslash is allowed, and harmless, preceding any character without -a special escape meaning; thus, @samp{?\+} is equivalent to @samp{?+}. -There is no reason to add a backslash before most characters. However, -you should add a backslash before any of the characters -@samp{()\|;'`"#.,} to avoid confusing the Emacs commands for editing -Lisp code. You can also add a backslash before whitespace characters such as -space, tab, newline and formfeed. However, it is cleaner to use one of -the easily readable escape sequences, such as @samp{\t} or @samp{\s}, -instead of an actual whitespace character such as a tab or a space. -(If you do write backslash followed by a space, you should write -an extra space after the character constant to separate it from the -following text.) - @node Symbol Type @subsection Symbol Type
--- a/lispref/os.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/os.texi Sat Oct 14 17:36:28 2006 +0000 @@ -1386,7 +1386,12 @@ things in an inconsistent state. This is normally unproblematical because most timer functions don't do a lot of work. Indeed, for a timer to call a function that takes substantial time to run is likely -to be annoying. +to be annoying. If a timer function needs to allow quitting, it +should use @code{with-local-quit} (@pxref{Quitting}). For example, if +a timer function calls @code{accept-process-output} to receive output +from an external process, that call should be wrapped inside +@code{with-local-quit}, to ensure that @kbd{C-g} works if the external +process hangs. It is usually a bad idea for timer functions to alter buffer contents. When they do, they usually should call @code{undo-boundary} @@ -1407,9 +1412,9 @@ @deffn Command run-at-time time repeat function &rest args This sets up a timer that calls the function @var{function} with arguments @var{args} at time @var{time}. If @var{repeat} is a number -(integer or floating point), the timer also runs every @var{repeat} -seconds after that. If @var{repeat} is @code{nil}, the timer runs -only once. +(integer or floating point), the timer is scheduled to run again every +@var{repeat} seconds after @var{time}. If @var{repeat} is @code{nil}, +the timer runs only once. @var{time} may specify an absolute or a relative time. @@ -1458,6 +1463,23 @@ @code{cancel-timer} (see below). @end deffn + A repeating timer nominally ought to run every @var{repeat} seconds, +but remember that any invocation of a timer can be late. Lateness of +one repetition has no effect on the scheduled time of the next +repetition. For instance, if Emacs is busy computing for long enough +to cover three scheduled repetitions of the timer, and then starts to +wait, it will immediately call the timer function three times in +immediate succession (presuming no other timers trigger before or +between them). If you want a timer to run again no less than @var{n} +seconds after the last invocation, don't use the @var{repeat} argument. +Instead, the timer function should explicitly reschedule the timer. + +@defvar timer-max-repeats +This variable's value specifies the maximum number of times to repeat +calling a timer function in a row, when many previously scheduled +calls were unavoidably delayed. +@end defvar + @defmac with-timeout (seconds timeout-forms@dots{}) body@dots{} Execute @var{body}, but give up after @var{seconds} seconds. If @var{body} finishes before the time is up, @code{with-timeout} returns @@ -1578,6 +1600,25 @@ @end smallexample @end defun + Some idle timer functions in user Lisp packages have a loop that +does a certain amount of processing each time around, and exits when +@code{(input-pending-p)} is non-@code{nil}. That approach seems very +natural but has two problems: + +@itemize +@item +It blocks out all process output (since Emacs accepts process output +only while waiting). + +@item +It blocks out any idle timers that ought to run during that time. +@end itemize + +@noindent +To avoid these problems, don't use that technique. Instead, write +such idle timers to reschedule themselves after a brief pause, using +the method in the @code{timer-function} example above. + @node Terminal Input @section Terminal Input @cindex terminal input
--- a/lispref/processes.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/processes.texi Sat Oct 14 17:36:28 2006 +0000 @@ -1308,6 +1308,8 @@ The argument @var{seconds} need not be an integer. If it is a floating point number, this function waits for a fractional number of seconds. +If @var{seconds} is 0, the function accepts whatever output is +pending but does not wait. @c Emacs 22.1 feature If @var{process} is a process, and the argument @var{just-this-one} is @@ -2097,7 +2099,9 @@ To control unpacking and packing, you write a @dfn{data layout specification}, a special nested list describing named and typed @dfn{fields}. This specification controls length of each field to be -processed, and how to pack or unpack it. +processed, and how to pack or unpack it. We normally keep bindat specs +in variables whose names end in @samp{-bindat-spec}; that kind of name +is automatically recognized as ``risky.'' @cindex endianness @cindex big endian
--- a/lispref/searching.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/searching.texi Sat Oct 14 17:36:28 2006 +0000 @@ -27,7 +27,8 @@ @end menu The @samp{skip-chars@dots{}} functions also perform a kind of searching. -@xref{Skipping Characters}. +@xref{Skipping Characters}. To search for changes in character +properties, see @ref{Property Search}. @node String Search @section Searching for Strings @@ -514,7 +515,7 @@ @table @samp @item [:ascii:] -This matches any @acronym{ASCII} (unibyte) character. +This matches any @acronym{ASCII} character (codes 0--127). @item [:alnum:] This matches any letter or digit. (At present, for multibyte characters, it matches anything that has word syntax.) @@ -534,8 +535,10 @@ @item [:lower:] This matches any lower-case letter, as determined by the current case table (@pxref{Case Tables}). +@item [:multibyte:] +This matches any multibyte character (@pxref{Text Representations}). @item [:nonascii:] -This matches any non-@acronym{ASCII} (multibyte) character. +This matches any non-@acronym{ASCII} character. @item [:print:] This matches printing characters---everything except @acronym{ASCII} control characters and the delete character. @@ -545,6 +548,8 @@ @item [:space:] This matches any character that has whitespace syntax (@pxref{Syntax Class Table}). +@item [:unibyte:] +This matches any unibyte character (@pxref{Text Representations}). @item [:upper:] This matches any upper-case letter, as determined by the current case table (@pxref{Case Tables}).
--- a/lispref/text.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/text.texi Sat Oct 14 17:36:28 2006 +0000 @@ -3783,20 +3783,25 @@ closest to @var{new-pos} that is in the same field as @var{old-pos}. If @var{new-pos} is @code{nil}, then @code{constrain-to-field} uses -the value of point instead, and moves point to the resulting position. +the value of point instead, and moves point to the resulting position +as well as returning it. If @var{old-pos} is at the boundary of two fields, then the acceptable -positions for @var{new-pos} depend on the value of the optional argument -@var{escape-from-edge}. If @var{escape-from-edge} is @code{nil}, then -@var{new-pos} is constrained to the field that has the same @code{field} -property (either a text-property or an overlay property) that new -characters inserted at @var{old-pos} would get. (This depends on the +final positions depend on the argument @var{escape-from-edge}. If +@var{escape-from-edge} is @code{nil}, then @var{new-pos} must be in +the field whose @code{field} property equals what new characters +inserted at @var{old-pos} would inherit. (This depends on the stickiness of the @code{field} property for the characters before and after @var{old-pos}.) If @var{escape-from-edge} is non-@code{nil}, -@var{new-pos} is constrained to the union of the two adjacent fields. +@var{new-pos} can be anywhere in the two adjacent fields. Additionally, if two fields are separated by another field with the -special value @code{boundary}, then any point within this special field -is also considered to be ``on the boundary.'' +special value @code{boundary}, then any point within this special +field is also considered to be ``on the boundary.'' + +Commands like @kbd{C-a} with no argumemt, that normally move backward +to a specific kind of location and stay there once there, probably +should specify @code{nil} for @var{escape-from-edge}. Other motion +commands that check fields should probably pass @code{t}. If the optional argument @var{only-in-line} is non-@code{nil}, and constraining @var{new-pos} in the usual way would move it to a different
--- a/lispref/variables.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/variables.texi Sat Oct 14 17:36:28 2006 +0000 @@ -626,7 +626,7 @@ @item @dots{}-command The value is a whole shell command. -@item @samp{}-switches +@item @dots{}-switches The value specifies options for a command. @end table
--- a/lispref/windows.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/lispref/windows.texi Sat Oct 14 17:36:28 2006 +0000 @@ -1355,6 +1355,9 @@ @var{position} defaults to the current position of point in @var{window}; @var{window}, to the selected window. +If @var{position} is @code{t}, that means to check the last visible +position in @var{window}. + The @code{pos-visible-in-window-p} function considers only vertical scrolling. If @var{position} is out of view only because @var{window} has been scrolled horizontally, @code{pos-visible-in-window-p} returns @@ -1362,13 +1365,16 @@ If @var{position} is visible, @code{pos-visible-in-window-p} returns @code{t} if @var{partially} is @code{nil}; if @var{partially} is -non-@code{nil}, it returns a list of the form @code{(@var{x} @var{y} -@var{partial})}, where @var{x} and @var{y} are the pixel coordinates -relative to the top left corner of the window, and @var{partial} is -@code{nil} if the character after @var{position} is fully visible; -otherwise it is a cons @code{(@var{rtop} . @var{rbot})} where the -@var{rtop} and @var{rbot} specify the number of invisible pixels at -the top and bottom of the row at @var{position}. +non-@code{nil}, and the character after @var{position} is fully +visible, it returns a list of the form @code{(@var{x} @var{y})}, where +@var{x} and @var{y} are the pixel coordinates relative to the top left +corner of the window; otherwise it returns an extended list of the +form @code{(@var{x} @var{y} @var{rtop} @var{rbot} @var{rowh} +@var{vpos})}, where the @var{rtop} and @var{rbot} specify the number +of off-window pixels at the top and bottom of the row at +@var{position}, @var{rowh} specifies the visible height of that row, +and @var{vpos} specifies the vertical position (zero-based row number) +of that row. Here is an example: @@ -1382,6 +1388,30 @@ @end example @end defun +@defun window-line-height &optional line window +This function returns information about text line @var{line} in @var{window}. +If @var{line} is one of @code{header-line} or @code{mode-line}, +@code{window-line-height} returns information about the corresponding +line of the window. Otherwise, @var{line} is a text line number +starting from 0. A negative number counts from the end of the window. +The argument @var{line} defaults to the current line in @var{window}; +@var{window}, to the selected window. + +If the display is not up to date, @code{window-line-height} returns +@code{nil}. In that case, @code{pos-visible-in-window-p} may be used +to obtain related information. + +If there is no line corresponding to the specified @var{line}, +@code{window-line-height} returns @code{nil}. Otherwise, it returns +a list @code{(@var{height} @var{vpos} @var{ypos} @var{offbot})}, +where @var{height} is the height in pixels of the visible part of the +line, @var{vpos} and @var{ypos} are the vertical position in lines and +pixels of the line relative to the top of the first text line, and +@var{offbot} is the number of off-window pixels at the bottom of the +text line. If there are off-window pixels at the top of the (first) +text line, @var{ypos} is negative. +@end defun + @node Textual Scrolling @section Textual Scrolling @cindex textual scrolling @@ -2344,6 +2374,10 @@ These functions must be careful in using @code{window-end} (@pxref{Window Start}); if you need an up-to-date value, you must use the @var{update} argument to ensure you get it. + +@strong{Warning:} don't use this feature to alter the way the window +is scrolled. It's not designed for that, and such use probably won't +work. @end defvar @defvar window-size-change-functions
--- a/lwlib/COPYING Sat Oct 14 16:56:21 2006 +0000 +++ b/lwlib/COPYING Sat Oct 14 17:36:28 2006 +0000 @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -15,7 +15,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,7 +55,7 @@ The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest @@ -303,10 +303,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. @@ -336,5 +335,5 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
--- a/lwlib/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/lwlib/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,8 @@ +2006-09-15 Jay Belanger <belanger@truman.edu> + + * COPYING: Replace "Library Public License" by "Lesser Public + License" throughout. + 2006-05-23 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> * xlwmenu.c: Include xterm.h if emacs instead of declaring functions
--- a/mac/COPYING Sat Oct 14 16:56:21 2006 +0000 +++ b/mac/COPYING Sat Oct 14 17:36:28 2006 +0000 @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -15,7 +15,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,7 +55,7 @@ The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest @@ -303,10 +303,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. @@ -336,5 +335,5 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
--- a/mac/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/mac/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,17 @@ +2006-09-19 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * INSTALL: Remove descriptions about experimental flags. + + * inc/config.h: Sync with src/config.in. + + * src/Emacs.r (M_APPLE): New define. + (MENU): Use it. + +2006-09-15 Jay Belanger <belanger@truman.edu> + + * COPYING: Replace "Library Public License" by "Lesser Public + License" throughout. + 2006-07-20 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> * makefile.MPW (dired.c.x, editfns.c.x, fileio.c.x): Depend on
--- a/mac/INSTALL Sat Oct 14 16:56:21 2006 +0000 +++ b/mac/INSTALL Sat Oct 14 17:36:28 2006 +0000 @@ -213,16 +213,4 @@ with PowerPC builds of Emacs; you will have to recompile for Intel. Therefore, builds of Emacs are architecture specific. -There are some compile-time flags that enable experimental features. -Please use them at your own risk after reading the corresponding -threads in the emacs-devel@gnu.org archive. - - SELECT_USE_CFSOCKET (on Mac OS X): Avoid polling in sys_select (in - src/mac.c). - http://lists.gnu.org/archive/html/emacs-devel/2004-12/msg00789.html - - USE_ATSUI (on Mac OS 9/Carbon): Enable ATSUI (Apple Type Services - for Unicode Imaging) support. - http://lists.gnu.org/archive/html/emacs-devel/2005-10/msg00005.html - Enjoy!
--- a/mac/inc/config.h Sat Oct 14 16:56:21 2006 +0000 +++ b/mac/inc/config.h Sat Oct 14 17:36:28 2006 +0000 @@ -98,6 +98,9 @@ #define HAVE_ALLOCA_H 1 #endif +/* Define to 1 if ALSA is available. */ +/* #undef HAVE_ALSA */ + /* Define to 1 if you have the `bcmp' function. */ /* #define HAVE_BCMP */ @@ -963,6 +966,9 @@ #ifdef HAVE_SOUNDCARD_H #define HAVE_SOUND 1 #endif +#ifdef HAVE_ALSA +#define HAVE_SOUND 1 +#endif #endif /* __FreeBSD__ || __NetBSD__ || __linux__ */ /* If using GNU, then support inline function declarations. */
--- a/mac/src/Emacs.r Sat Oct 14 16:56:21 2006 +0000 +++ b/mac/src/Emacs.r Sat Oct 14 17:36:28 2006 +0000 @@ -63,8 +63,10 @@ }; #endif +#define M_APPLE 234 /* Menu ID for Apple Menu. */ + resource 'MENU' (128, preload) { - 128, + M_APPLE, textMenuProc, 0x7FFFFFFD, enabled,
--- a/make-dist Sat Oct 14 16:56:21 2006 +0000 +++ b/make-dist Sat Oct 14 17:36:28 2006 +0000 @@ -120,8 +120,7 @@ fi ### Find where to run Emacs. -### (We don't accept EMACS=t as an answer, since that probably only means -### that the shell is running in an Emacs window.) +### (Accept only absolute file names.) if [ $update = yes ]; then unset EMACS_UNIBYTE @@ -129,11 +128,15 @@ then EMACS=`pwd`/src/emacs else - if [ "x$EMACS" = "x" -o "x$EMACS" = "xt" ]; - then - echo You must specify the EMACS environment variable 2>&1 - exit 1 - fi + case $EMACS in + /*) ;; + *) + if [ ! -f "$EMACS" ]; then + echo "$0: You must specify the EMACS environment variable " \ + "to an absolute file name." 2>&1 + exit 1 + fi;; + esac fi fi
--- a/man/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/man/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,167 @@ +2006-10-12 Roberto Rodr,Am(Bguez <lanubeblanca@googlemail.com> + + * widget.texi: Fix typos (tiny change) + +2006-10-11 Kim F. Storm <storm@cua.dk> + + * emacs.texi (Acknowledgments): Use @dotless{i}. + +2006-10-08 Nick Roberts <nickrob@snap.net.nz> + + * building.texi (Breakpoints Buffer): Mention catchpoints. + +2006-10-08 Kim F. Storm <storm@cua.dk> + + * ack.texi (Acknowledgments): Update. + + * emacs.texi (Acknowledgments): Fix bad @/ form. + +2006-10-06 Reiner Steib <Reiner.Steib@gmx.de> + + * gnus.texi (Image Enhancements): Update for Emacs 22. + + * gnus-faq.texi ([1.3]): Update. + +2006-10-06 Richard Stallman <rms@gnu.org> + + * faq.texi (Displaying the current line or column): + Delete "As of Emacs 20". + +2006-10-06 Romain Francoise <romain@orebokech.com> + + * faq.texi (VM): VM works with Emacs 22 too. + +2006-10-06 Richard Stallman <rms@gnu.org> + + * ebrowse.texi: Remove Emacs version "21" from title. + +2006-10-05 Kim F. Storm <storm@cua.dk> + + * emacs.texi (Acknowledgments): Add more contributors. + +2006-10-03 Richard Stallman <rms@gnu.org> + + * emacs.texi (Acknowledgments): Update version and edition. + +2006-10-02 Reiner Steib <Reiner.Steib@gmx.de> + + * gnus.texi (Foreign Groups): Say where change of editing commands are + stored. Add reference to `gnus-parameters'. + +2006-10-01 Karl Berry <karl@gnu.org> + + * custom.texi (Customization Groups): Page break to keep example buffer + on one page. + +2006-09-30 Karl Berry <karl@gnu.org> + + * programs.texi (Basic Indent): @need to improve page break. + * text.texi: Rewording to improve page breaks, and use @LaTeX{}. + +2006-09-29 Glenn Morris <rgm@gnu.org> + + * calendar.texi (Date Formats): Doc fix for european-calendar-style. + +2006-09-29 Karl Berry <karl@gnu.org> + + * windows.texi (Basic Window): Remove forced @break, no longer + desirable. + * frames.texi (Frame Commands), + * mark.texi (Marking Objects): Reword to avoid bad page break. + * display.texi (Auto Scrolling): Use @tie{} to avoid bad line break. + +2006-09-19 Richard Stallman <rms@gnu.org> + + * frames.texi (Dialog Boxes): Clean up wording: avoid passive, + stick to present tense. + +2006-09-18 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * frames.texi (Dialog Boxes): Rename x-use-old-gtk-file-dialog + to x-gtk-use-old-file-dialog. + (Dialog Boxes): Document x-gtk-file-dialog-help-text. + +2006-09-15 Jay Belanger <belanger@truman.edu> + + * calc.texi, emacs.texi, mh-e.texi (GNU GENERAL PUBLIC LICENSE): + Change "Library Public License" to "Lesser Public License" + throughout. Use "yyyy" to represent year. + +2006-09-15 Carsten Dominik <dominik@science.uva.nl> + + * org.texi (Setting tags): Typo fix. + +2006-09-14 Reiner Steib <Reiner.Steib@gmx.de> + + * gnus.texi (Oort Gnus): Add @xref for `mm-fill-flowed'. + +2006-09-12 Reiner Steib <Reiner.Steib@gmx.de> + + * files.texi (Visiting): Add index entry "open file". + + * reftex.texi (Citations Outside LaTeX): Simplify lisp example. + +2006-09-12 Paul Eggert <eggert@cs.ucla.edu> + + * faq.texi (Escape sequences in shell output): EMACS is now set + to Emacs's absolute file name, not to "t". + (^M in the shell buffer): Likewise. + * misc.texi (Interactive Shell): Likewise. + +2006-09-11 Richard Stallman <rms@gnu.org> + + * building.texi (Compilation Mode): Clarification. + (Grep Searching): Add xref to Compilation Mode. + +2006-09-11 Reiner Steib <Reiner.Steib@gmx.de> + + * gnus.texi (Mail Source Specifiers): Mention problem of duplicate + mails with pop3-leave-mail-on-server. Fix wording. + (Limiting): Improve gnus-summary-limit-to-articles. + (X-Face): Fix typo. + +2006-09-11 Simon Josefsson <jas@extundo.com> + + * smtpmail.texi (Authentication): Explain TLS and SSL better, based on + suggested by Phillip Lord <phillip.lord@newcastle.ac.uk>. + +2006-09-08 Richard Stallman <rms@gnu.org> + + * search.texi (Search): Ref multi-file search commands here. + (Other Repeating Search): Not here. + +2006-09-06 Simon Josefsson <jas@extundo.com> + + * smtpmail.texi (Authentication): Mention SSL. + +2006-09-01 Eli Zaretskii <eliz@gnu.org> + + * rcirc.texi (Internet Relay Chat, Useful IRC commands): + Don't use @indicateurl. + + * cc-mode.texi (Subword Movement): Don't use @headitem. + (Custom Braces, Clean-ups): Don't use @tie. + +2006-08-29 Michael Albinus <michael.albinus@gmx.de> + + Sync with Tramp 2.0.54. + + * tramp.texi (Bug Reports): The Tramp mailing list is moderated now. + Suggested by Adrian Phillips <a.phillips@met.no>. + +2006-08-28 Richard Stallman <rms@gnu.org> + + * windows.texi (Split Window): Update xref. + + * basic.texi (Continuation Lines): Update xref. + + * indent.texi (Tab Stops): Update xref. + + * emacs.texi (Top): Update subnode menu. + + * display.texi (Line Truncation, Displaying Boundaries): New nodes, + split out of Display Custom. + 2006-08-25 Kim F. Storm <storm@cua.dk> * display.texi (Display Custom): Add variables overline-margin
--- a/man/ack.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/ack.texi Sat Oct 14 17:36:28 2006 +0000 @@ -34,6 +34,11 @@ decompression and recompression for compressed files. @item +Ralf Angeli wrote @file{scroll-lock.el}, a minor mode which keeps the +point vertically fixed by scrolling the window when moving up and down +in the buffer. + +@item Joe Arceneaux wrote the original text property implementation, and implemented support for X11. @@ -62,6 +67,11 @@ sound effects for Gnus. @item +Alexander L. Belikoff, Sergey Berezin, David Edmondson, Andreas +Fuchs, Mario Lang, Gergely Nagy, Michael Olson, and Alex Schroeder +contributed ERC, an advanced Internet Relay Chat client. + +@item Boaz Ben-Zvi wrote @file{profile.el}, to time Emacs Lisp functions. @item @@ -173,6 +183,10 @@ for compiled Emacs Lisp code. @item +Mathias Dahl wrote @file{tumme.el}, a package for viewing image files +as ``thumbnails.'' + +@item Michael DeCorte wrote @file{emacs.csh}, a C-shell script that starts a new Emacs job, or restarts a paused Emacs if one exists. @@ -368,8 +382,9 @@ Odd Gripenstam wrote @file{dcl-mode.el} for editing DCL command files. @item -Kai Gro@ss{}johann wrote the Tramp package, which provides transparent -remote file editing using rcp, ssh, and other network protocols. +Kai Gro@ss{}johann and Michael Albinus wrote the Tramp package, which +provides transparent remote file editing using rcp, ssh, ftp, and other +network protocols. @item Michael Gschwind wrote @file{iso-cvt.el}, a package to convert between @@ -398,6 +413,9 @@ File Access facility from Emacs. @item +Jesper Harder wrote @file{yenc.el}, for decoding yenc encoded messages. + +@item K. Shane Hartman wrote: @itemize @minus @@ -447,6 +465,8 @@ template instantiations. @item +Joakim Hove wrote @file{html2text.el}, a html to plain text converter. +@item Denis Howe wrote @file{browse-url.el}, a package for invoking a WWW browser to display a URL. @@ -462,7 +482,8 @@ @item Ulf Jasper wrote @file{icalendar.el}, a package for converting Emacs -diary entries to and from the iCalendar format. +diary entries to and from the iCalendar format, and +@file{newsticker.el}, an RSS and Atom based Newsticker. @item Kyle Jones wrote @file{life.el}, a package to play Conway's ``life'' game, @@ -493,6 +514,10 @@ @end itemize @item +Arne J@/orgensen wrote @file{latexenc.el}, a package to +automatically guess the correct coding system in LaTeX files. + +@item Tomoji Kagatani implemented @file{smtpmail.el}, used for sending out mail with SMTP. @@ -545,7 +570,7 @@ interactive automatic highlighting of parts of the buffer text. @item -Koseki Yoshinori wrote @file{iinline.el}, a minor mode for displaying +Koseki Yoshinori wrote @file{iimage.el}, a minor mode for displaying inline images. @item @@ -666,8 +691,16 @@ @end itemize @item -Eric Ludlam wrote the Speedbar package and @file{checkdoc.el}, a package -for checking doc strings in Emacs Lisp programs. +Eric Ludlam wrote the Speedbar package and the following packages: + +@itemize @minus +@item +@file{checkdoc.el}, for checking doc strings in Emacs Lisp programs, +@item +@file{dframe.el}, providing dedicatd frame support modes, and +@item +@file{ezimage.el}, a generalized way to place images over text. +@end itemize @item Alan Mackenzie wrote the integrated AWK support in CC Mode. @@ -841,6 +874,10 @@ Jurgen Nickelsen wrote @file{ws-mode.el}, providing WordStar emulation. @item +Hrvoje Niksic wrote @file{savehist.el}, for saving the minibuffer +history between Emacs sessions. + +@item Jeff Norden wrote @file{kermit.el}, a package to help the Kermit dialup communications program run comfortably in an Emacs shell buffer. @@ -932,10 +969,18 @@ Soundex algorithm for comparing English words by their pronunciation. @item -David Ponce wrote @file{recentf.el}, a package that puts a menu of -recently visited files in the Emacs menu bar, and +David Ponce wrote: + +@itemize @minus +@item +@file{recentf.el}, a package that puts a menu of recently visited +files in the Emacs menu bar, +@item @file{ruler-mode.el}, a minor mode for displaying a ruler in the -header line. +header line, and +@item +@file{tree-widget.el}, a package to display hierarchical data structures. +@end itemize @item Francesco A.@: Potorti wrote @file{cmacexp.el}, providing a command which @@ -1001,6 +1046,10 @@ F.@: Schelter, Dick King, Stephen Gildea, Michael Prange, and Jacob Gore. @item +David Reitter wrote @file{mailclient.el} which can send mail via the +system's designated mail client. + +@item Alex Rezinsky contributed @file{which-func.el}, a mode that shows the name of the current function in the mode line. @@ -1239,6 +1288,10 @@ decoding UTF-8 data. @item +Luc Teirlinck wrote @file{help-at-pt.el}, providing local help through +the keyboard. + +@item Jean-Philippe Theberge wrote @file{thumbs.el}, a package for viewing image files as ``thumbnails.'' @@ -1262,8 +1315,10 @@ subprocess. @item +Eli Tziperman wrote @file{rmail-spam-filter.el}, a spam filter for RMAIL. +@item Daiki Ueno wrote @file{starttls.el}, support for Transport Layer -Security protocol. +Security protocol, and the PGG package adding GnuPG and PGP support. @item Masanobu Umeda wrote: @@ -1422,7 +1477,7 @@ @item Masatake Yamato wrote @file{ld-script.el}, an editing mode for GNU -linker scripts. +linker scripts, and contributed subword handling in CC mode. @item Jonathan Yavner wrote @file{testcover.el}, a package for keeping track @@ -1430,6 +1485,8 @@ package. @item +Ryan Yeske wrote @file{rcirc.el} a simple Internet Relay Chat client. +@item Ilya Zakharevich and Bob Olson contributed @file{cperl-mode.el}, a major mode for editing Perl code. Ilya Zakharevich also wrote @file{tmm.el}, a mode for accessing the Emacs menu bar on a text-mode terminal.
--- a/man/basic.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/basic.texi Sat Oct 14 17:36:28 2006 +0000 @@ -480,7 +480,7 @@ straight arrow in the window's right fringe indicates a truncated line. - @xref{Display Custom}, for more about line truncation, + @xref{Line Truncation}, for more about line truncation, and other variables that control how text is displayed. @node Position Info
--- a/man/building.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/building.texi Sat Oct 14 17:36:28 2006 +0000 @@ -210,9 +210,9 @@ backquote or ``grave accent,'' not the single-quote. This command is available in all buffers, not just in @samp{*compilation*}; it displays the next error message at the top of one window and source -location of the error in another window. It also momentarily -highlights the relevant source line. You can change the behavior of -this highlighting with the variable @code{next-error-highlight}. +location of the error in another window. It also temporarily +highlights the relevant source line, for a period controlled by the +variable @code{next-error-highlight}. The first time @w{@kbd{C-x `}} is used after the start of a compilation, it moves to the first error's location. Subsequent uses of @kbd{C-x @@ -335,9 +335,11 @@ @section Searching with Grep under Emacs Just as you can run a compiler from Emacs and then visit the lines -with compilation errors, you can also run @code{grep} and -then visit the lines on which matches were found. This works by -treating the matches reported by @code{grep} as if they were ``errors.'' +with compilation errors, you can also run @code{grep} and then visit +the lines on which matches were found. This works by treating the +matches reported by @code{grep} as if they were ``errors.'' The +buffer of matches uses Grep mode, which is a variant of Compilation +mode (@pxref{Compilation Mode}). @table @kbd @item M-x grep @@ -962,8 +964,8 @@ @node Breakpoints Buffer @subsubsection Breakpoints Buffer - The breakpoints buffer shows the existing breakpoints and -watchpoints (@pxref{Breakpoints,,, gdb, The GNU debugger}). It has + The breakpoints buffer shows the existing breakpoints, watchpoints and +catchpoints (@pxref{Breakpoints,,, gdb, The GNU debugger}). It has these special commands, which mostly apply to the @dfn{current breakpoint}, the breakpoint which point is on.
--- a/man/calc.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/calc.texi Sat Oct 14 17:36:28 2006 +0000 @@ -203,7 +203,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -543,7 +543,7 @@ when it starts in an interactive mode: @smallexample -Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author} +Gnomovision version 69, Copyright (C) @var{yyyy} @var{name of author} Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -570,7 +570,7 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. @node Getting Started, Tutorial, Copying, Top
--- a/man/calendar.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/calendar.texi Sat Oct 14 17:36:28 2006 +0000 @@ -1204,11 +1204,12 @@ If you prefer the European style of writing dates---in which the day comes before the month---type @kbd{M-x european-calendar} while in the calendar, or set the variable @code{european-calendar-style} to @code{t} -@emph{before} using any calendar or diary command. This mode interprets -all dates in the diary in the European manner, and also uses European -style for displaying diary dates. (Note that there is no comma after -the @var{monthname} in the European style.) To go back to the (default) -American style of writing dates, type @kbd{M-x american-calendar}. +with @kbd{M-x customize}, or @emph{before} using any calendar or diary +command. This mode interprets all dates in the diary in the European +manner, and also uses European style for displaying diary dates. (Note +that there is no comma after the @var{monthname} in the European style.) +To go back to the (default) American style of writing dates, type +@kbd{M-x american-calendar}. You can use the name of a day of the week as a generic date which applies to any date falling on that day of the week. You can abbreviate
--- a/man/cc-mode.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/cc-mode.texi Sat Oct 14 17:36:28 2006 +0000 @@ -1624,8 +1624,16 @@ @dfn{subword}. Here are some examples: @multitable {@samp{NSGraphicsContext}} {@samp{NS}, @samp{Graphics}, and @samp{Context}} -@headitem Nomenclature +@c This could be converted to @headitem when we require Texinfo 4.7 +@iftex +@item @b{Nomenclature} + @tab @b{Subwords} +@end iftex +@ifnottex +@item Nomenclature @tab Subwords +@item --------------------------------------------------------- +@end ifnottex @item @samp{GtkWindow} @tab @samp{Gtk} and @samp{Window} @item @samp{EmacsFrameClass} @@ -1657,7 +1665,14 @@ @findex c-downcase-subword @findex downcase-subword (c-) @multitable @columnfractions .20 .40 .40 -@headitem Key @tab Word oriented command @tab Subword oriented command +@c This could be converted to @headitem when we require Texinfo 4.7 +@iftex +@item @b{Key} @tab @b{Word oriented command} @tab @b{Subword oriented command} +@end iftex +@ifnottex +@item Key @tab Word oriented command @tab Subword oriented command +@item ---------------------------------------------------------------------------- +@end ifnottex @item @kbd{M-f} @tab @code{forward-word} @tab @code{c-forward-subword} @item @kbd{M-b} @tab @code{backward-word} @tab @code{c-backward-subword} @item @kbd{M-@@} @tab @code{mark-word} @tab @code{c-mark-subword} @@ -3231,9 +3246,9 @@ the proper functioning of @ccmode{}. This variable is also bound in three other circumstances: -(i)@tie{}when calling a c-hanging-semi&comma-criteria function -(@pxref{Hanging Semicolons and Commas}; (ii)@tie{}when calling a -line-up function (@pxref{Custom Line-Up}; (iii)@tie{}when calling a +(i)@w{ }when calling a c-hanging-semi&comma-criteria function +(@pxref{Hanging Semicolons and Commas}; (ii)@w{ }when calling a +line-up function (@pxref{Custom Line-Up}; (iii)@w{ }when calling a c-special-indent-hook function (@pxref{Other Indentation}). @end defvar @@ -3630,8 +3645,8 @@ @item space-before-funcall Insert a space between the function name and the opening parenthesis of a function call. This produces function calls in the style -mandated by the GNU coding standards, e.g. @samp{signal@tie{}(SIGINT, -SIG_IGN)} and @samp{abort@tie{}()}. Clean up occurs when the opening +mandated by the GNU coding standards, e.g. @samp{signal@w{ }(SIGINT, +SIG_IGN)} and @samp{abort@w{ }()}. Clean up occurs when the opening parenthesis is typed. This clean-up should never be active in AWK Mode, since such a space is syntactically invalid for user defined functions.
--- a/man/custom.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/custom.texi Sat Oct 14 17:36:28 2006 +0000 @@ -231,7 +231,11 @@ top-level @code{Emacs} group and the second-level groups immediately under it. It looks like this, in part: +@c we want the buffer example to all be on one page, but unfortunately +@c that's quite a bit of text, so force all space to the bottom. +@page @smallexample +@group /- Emacs group: ---------------------------------------------------\ [State]: visible group members are all at standard values. Customization of the One True Editor. @@ -246,7 +250,7 @@ @var{more second-level groups} \- Emacs group end ------------------------------------------------/ - +@end group @end smallexample @noindent
--- a/man/display.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/display.texi Sat Oct 14 17:36:28 2006 +0000 @@ -23,11 +23,14 @@ * Font Lock:: Minor mode for syntactic highlighting using faces. * Highlight Interactively:: Tell Emacs what text to highlight. * Fringes:: Enabling or disabling window fringes. +* Displaying Boundaries:: Displaying top and bottom of the buffer. * Useless Whitespace:: Showing possibly-spurious trailing whitespace. * Selective Display:: Hiding lines with lots of indentation. * Optional Mode Line:: Optional mode line display features. * Text Display:: How text characters are normally displayed. * Cursor Display:: Features for displaying the cursor. +* Line Truncation:: Truncating lines to fit the screen width instead + of continuing them to multiple screen lines. * Display Custom:: Information on variables for customizing display. @end menu @@ -164,7 +167,7 @@ number @var{n}, then if you move point just a little off the screen---less than @var{n} lines---then Emacs scrolls the text just far enough to bring point back on screen. By default, -@code{scroll-conservatively} is 0. +@code{scroll-conservatively} is@tie{}0. @cindex aggressive scrolling @vindex scroll-up-aggressively @@ -202,8 +205,8 @@ @dfn{Horizontal scrolling} means shifting all the lines sideways within a window---so that some of the text near the left margin is not displayed at all. When the text in a window is scrolled horizontally, -text lines are truncated rather than continued (@pxref{Display -Custom}). Whenever a window shows truncated lines, Emacs +text lines are truncated rather than continued (@pxref{Line +Truncation}). Whenever a window shows truncated lines, Emacs automatically updates its horizontal scrolling whenever point moves off the left or right edge of the screen. You can also use these commands to do explicit horizontal scrolling. @@ -751,6 +754,40 @@ @kbd{M-x fringe-mode}. To enable and disable the fringes for the selected frame, use @kbd{M-x set-fringe-style}. +@node Displaying Boundaries +@section Displaying Boundaries + +@vindex indicate-buffer-boundaries + On a graphical display, Emacs can indicate the buffer boundaries in +the fringes. It indicates the first line and the last line with +angle images in the fringes. This can be combined with up and down +arrow images which say whether it is possible to scroll the window up +and down. + + The buffer-local variable @code{indicate-buffer-boundaries} controls +how the buffer boundaries and window scrolling is indicated in the +fringes. If the value is @code{left} or @code{right}, both angle and +arrow bitmaps are displayed in the left or right fringe, respectively. + + If value is an alist, each element @code{(@var{indicator} . +@var{position})} specifies the position of one of the indicators. +The @var{indicator} must be one of @code{top}, @code{bottom}, +@code{up}, @code{down}, or @code{t} which specifies the default +position for the indicators not present in the alist. +The @var{position} is one of @code{left}, @code{right}, or @code{nil} +which specifies not to show this indicator. + + For example, @code{((top . left) (t . right))} places the top angle +bitmap in left fringe, the bottom angle bitmap in right fringe, and +both arrow bitmaps in right fringe. To show just the angle bitmaps in +the left fringe, but no arrow bitmaps, use @code{((top . left) +(bottom . left))}. + +@vindex default-indicate-buffer-boundaries + The value of the variable @code{default-indicate-buffer-boundaries} +is the default value for @code{indicate-buffer-boundaries} in buffers +that do not override it. + @node Useless Whitespace @section Useless Whitespace @@ -1083,30 +1120,8 @@ hl-line-mode} to enable or disable it in the current buffer. @kbd{M-x global-hl-line-mode} enables or disables the same mode globally. -@node Display Custom -@section Customization of Display - - This section describes variables (@pxref{Variables}) that you can -change to customize how Emacs displays. Beginning users can skip -it. -@c the reason for that pxref is because an xref early in the -@c ``echo area'' section leads here. - -@vindex inverse-video - If the variable @code{inverse-video} is non-@code{nil}, Emacs attempts -to invert all the lines of the display from what they normally are. - -@vindex visible-bell - If the variable @code{visible-bell} is non-@code{nil}, Emacs attempts -to make the whole screen blink when it would normally make an audible bell -sound. This variable has no effect if your terminal does not have a way -to make the screen blink. - -@vindex echo-keystrokes - The variable @code{echo-keystrokes} controls the echoing of multi-character -keys; its value is the number of seconds of pause required to cause echoing -to start, or zero, meaning don't echo at all. The value takes effect when -there is someting to echo. @xref{Echo Area}. +@node Line Truncation +@section Truncation of Lines @cindex truncation @cindex line truncation, and fringes @@ -1145,36 +1160,30 @@ newline overflows into the right fringe, and the cursor appears in the fringe when positioned on that newline. -@vindex indicate-buffer-boundaries - On a graphical display, Emacs can indicate the buffer boundaries in -the fringes. It indicates the first line and the last line with -angle images in the fringes. This can be combined with up and down -arrow images which say whether it is possible to scroll the window up -and down. +@node Display Custom +@section Customization of Display - The buffer-local variable @code{indicate-buffer-boundaries} controls -how the buffer boundaries and window scrolling is indicated in the -fringes. If the value is @code{left} or @code{right}, both angle and -arrow bitmaps are displayed in the left or right fringe, respectively. + This section describes variables (@pxref{Variables}) that you can +change to customize how Emacs displays. Beginning users can skip +it. +@c the reason for that pxref is because an xref early in the +@c ``echo area'' section leads here. - If value is an alist, each element @code{(@var{indicator} . -@var{position})} specifies the position of one of the indicators. -The @var{indicator} must be one of @code{top}, @code{bottom}, -@code{up}, @code{down}, or @code{t} which specifies the default -position for the indicators not present in the alist. -The @var{position} is one of @code{left}, @code{right}, or @code{nil} -which specifies not to show this indicator. +@vindex inverse-video + If the variable @code{inverse-video} is non-@code{nil}, Emacs attempts +to invert all the lines of the display from what they normally are. - For example, @code{((top . left) (t . right))} places the top angle -bitmap in left fringe, the bottom angle bitmap in right fringe, and -both arrow bitmaps in right fringe. To show just the angle bitmaps in -the left fringe, but no arrow bitmaps, use @code{((top . left) -(bottom . left))}. +@vindex visible-bell + If the variable @code{visible-bell} is non-@code{nil}, Emacs attempts +to make the whole screen blink when it would normally make an audible bell +sound. This variable has no effect if your terminal does not have a way +to make the screen blink. -@vindex default-indicate-buffer-boundaries - The value of the variable @code{default-indicate-buffer-boundaries} -is the default value for @code{indicate-buffer-boundaries} in buffers -that do not override it. +@vindex echo-keystrokes + The variable @code{echo-keystrokes} controls the echoing of multi-character +keys; its value is the number of seconds of pause required to cause echoing +to start, or zero, meaning don't echo at all. The value takes effect when +there is someting to echo. @xref{Echo Area}. @vindex baud-rate The variable @anchor{baud-rate}@code{baud-rate} holds the output @@ -1197,6 +1206,17 @@ amount of time Emacs must remain busy before the busy indicator is displayed, by setting the variable @code{hourglass-delay}. +@vindex overline-margin + On graphical display, this variables specifies the vertical position +of an overline above the text, including the height of the overline +itself (1 pixel). The default value is 2 pixels. + +@vindex x-underline-at-descent-line + On graphical display, Emacs normally draws an underline at the +baseline level of the font. If @code{x-underline-at-descent-line} is +non-@code{nil}, Emacs draws the underline at the same height as the +font's descent line. + @findex tty-suppress-bold-inverse-default-colors On some text-only terminals, bold face and inverse video together result in text that is hard to read. Call the function @@ -1215,17 +1235,6 @@ assume, when resumed, that the screen page it is using still contains what Emacs last wrote there. -@vindex overline-margin - On graphical display, this variables specifies the number of pixes -the overline is shown above the text. The value includes the height of -the overline itself (1 pixel). The default value is 2 pixels. - -@vindex x-underline-at-descent-line - On graphical display, the underline is normally drawn at the -baseline level of the font. If @code{x-underline-at-descent-line} is -non-@code{nil}, the underline is drawn at the same position as the -font's decent line. - @ignore arch-tag: 2219f910-2ff0-4521-b059-1bd231a536c4 @end ignore
--- a/man/ebrowse.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/ebrowse.texi Sat Oct 14 17:36:28 2006 +0000 @@ -41,7 +41,7 @@ @titlepage @title Ebrowse User's Manual @sp 4 -@subtitle Ebrowse/Emacs 21 +@subtitle Ebrowse/Emacs @sp 1 @subtitle May 2000 @sp 5 @@ -59,7 +59,7 @@ @end ifnottex @menu -* Overview:: What is it and now does it work? +* Overview:: What is it and how does it work? * Generating browser files:: How to process C++ source files * Loading a Tree:: How to start browsing * Tree Buffers:: Traversing class hierarchies
--- a/man/emacs.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/emacs.texi Sat Oct 14 17:36:28 2006 +0000 @@ -4,8 +4,8 @@ @settitle GNU Emacs Manual @c The edition number appears in several places in this file -@set EDITION Fourteenth -@set EMACSVER 22.0.51 +@set EDITION Sixteenth +@set EMACSVER 22.1 @copying This is the @value{EDITION} edition of the @cite{GNU Emacs Manual}, @@ -329,11 +329,14 @@ * Font Lock:: Minor mode for syntactic highlighting using faces. * Highlight Interactively:: Tell Emacs what text to highlight. * Fringes:: Enabling or disabling window fringes. +* Displaying Boundaries:: Displaying top and bottom of the buffer. * Useless Whitespace:: Showing possibly-spurious trailing whitespace. * Selective Display:: Hiding lines with lots of indentation. * Optional Mode Line:: Optional mode line display features. * Text Display:: How text characters are normally displayed. * Cursor Display:: Features for displaying the cursor. +* Line Truncation:: Truncating lines to fit the screen width instead + of continuing them to multiple screen lines. * Display Custom:: Information on variables for customizing display. Searching and Replacement @@ -1020,70 +1023,83 @@ @node Acknowledgments, Intro, Distrib, Top @unnumberedsec Acknowledgments -Contributors to GNU Emacs include Per Abrahamsen, Tomas Abrahamsson, -Jay K.@: Adams, Joe Arceneaux, Miles Bader, David Bakhash, Eli -Barzilay, Steven L.@: Baur, Boaz Ben-Zvi, Ray Blaak, Jim Blandy, Per -Bothner, Terrence Brannon, Frank Bresz, Peter Breton, Emmanuel Briot, -Kevin Broadey, Vincent Broman, David M.@: Brown, Georges Brun-Cottan, -W@l{}odek Bzyl, Bill Carpenter, Per Cederqvist, Hans Chalupsky, Chris -Chase, Bob Chassell, Andrew Choi, James Clark, Mike Clarkson, Glynn -Clements, Andrew Csillag, Doug Cutting, Michael DeCorte, Gary Delp, -Matthieu Devin, Eri Ding, Jan Dj@"{a}rv, Carsten Dominik, Scott -Draves, Benjamin Drieu, Viktor Dukhovni, John Eaton, Rolf Ebert, -Stephen Eglen, Torbj@"orn Einarsson, Tsugutomo Enami, Hans Henrik -Eriksen, Michael Ernst, Ata Etemadi, Frederick Farnbach, Oscar -Figueiredo, Fred Fish, Karl Fogel, Gary Foster, Noah Friedman, -Hallvard Furuseth, Keith Gabryelski, Kevin Gallagher, Kevin Gallo, -Juan Le@'{o}n Lahoz Garc@'{i}a, Howard Gayle, Stephen Gildea, Julien -Gilles, David Gillespie, Bob Glickstein, Boris Goldowsky, Michelangelo -Grigni, Odd Gripenstam, Kai Gro@ss{}johann, Michael Gschwind, Henry -Guillaume, Doug Gwyn, Ken'ichi Handa, Chris Hanson, K. Shane Hartman, -John Heidemann, Jon K.@: Hellan, Markus Heritsch, Karl Heuer, Manabu -Higashida, Anders Holst, Kurt Hornik, Tom Houlder, Denis Howe, Lars -Ingebrigtsen, Andrew Innes, Seiichiro Inoue, Ulf Jasper, Michael -K. Johnson, Kyle Jones, Terry Jones, Simon Josefsson, Tomoji Kagatani, -Brewster Kahle, David Kaufman, Henry Kautz, Taichi Kawabata, Howard -Kaye, Michael Kifer, Richard King, Peter Kleiweg, Larry K.@: Kolodney, -Pavel Kobiakov, Larry K.@: Kolodney, David M.@: Koppelman, Koseki -Yoshinori, Robert Krawitz, Sebastian Kremer, Ryszard Kubiak, Geoff -Kuenning, David K@aa{}gedal, Daniel LaLiberte, Aaron Larson, James -R.@: Larus, Vinicius Jose Latorre, Frederic Lepied, Peter Liljenberg, -Lars Lindberg, Chris Lindblad, Anders Lindgren, Thomas Link, Dave -Love, Eric Ludlam, Alan Mackenzie, Christopher J.@: Madsen, -Neil M.@: Mager, Ken Manheimer, Bill Mann, Brian Marick, Simon -Marshall, Bengt Martensson, Charlie Martin, Thomas May, Roland McGrath, -Will Mengarini, David Megginson, Wayne Mesard, Brad Miller, Richard +Contributors to GNU Emacs include Jari Aalto, Per Abrahamsen, Tomas +Abrahamsson, Jay K.@: Adams, Michael Albinus, Nagy Andras, Ralf +Angeli, Joe Arceneaux, Miles Bader, David Bakhash, Juanma Barranquero, +Eli Barzilay, Steven L.@: Baur, Jay Belanger, Alexander L.@: Belikoff, +Boaz Ben-Zvi, Karl Berry, Ray Blaak, Jim Blandy, Johan Bockg@aa{}rd, +Per Bothner, Terrence Brannon, Frank Bresz, Peter Breton, Emmanuel +Briot, Kevin Broadey, Vincent Broman, David M.@: Brown, Georges +Brun-Cottan, Joe Buehler, W@l{}odek Bzyl, Bill Carpenter, Per +Cederqvist, Hans Chalupsky, Chris Chase, Bob Chassell, Andrew Choi, +Sacha Chua, James Clark, Mike Clarkson, Glynn Clements, Andrew +Csillag, Doug Cutting, Mathias Dahl, Satyaki Das, Michael DeCorte, +Gary Delp, Matthieu Devin, Eri Ding, Jan Dj@"{a}rv, Carsten Dominik, +Scott Draves, Benjamin Drieu, Viktor Dukhovni, John Eaton, Rolf Ebert, +Paul Eggert, Stephen Eglen, Torbj@"orn Einarsson, Tsugutomo Enami, +Hans Henrik Eriksen, Michael Ernst, Ata Etemadi, Frederick Farnbach, +Oscar Figueiredo, Fred Fish, Karl Fogel, Gary Foster, Romain +Francoise, Noah Friedman, Andreas Fuchs, Hallvard Furuseth, Keith +Gabryelski, Peter S.@: Galbraith, Kevin Gallagher, Kevin Gallo, Juan +Le@'{o}n Lahoz Garc@'{@dotless{i}}a, Howard Gayle, Stephen Gildea, Julien +Gilles, David Gillespie, Bob Glickstein, Deepak Goel, Boris Goldowsky, +Michelangelo Grigni, Odd Gripenstam, Kai Gro@ss{}johann, Michael +Gschwind, Henry Guillaume, Doug Gwyn, Ken'ichi Handa, Lars Hansen, +Chris Hanson, K. Shane Hartman, John Heidemann, Jon K.@: Hellan, +Jesper Harder, Markus Heritsch, Karl Heuer, Manabu Higashida, Anders +Holst, Jeffrey C.@: Honig, Kurt Hornik, Tom Houlder, Joakim Hove, +Denis Howe, Lars Ingebrigtsen, Andrew Innes, Seiichiro Inoue, Pavel +Janik, Paul Jarc, Ulf Jasper, Michael K. Johnson, Kyle Jones, Terry +Jones, Simon Josefsson, Arne J@/orgensen, Tomoji Kagatani, Brewster +Kahle, Lute Kamstra, David Kastrup, David Kaufman, Henry Kautz, Taichi +Kawabata, Howard Kaye, Michael Kifer, Richard King, Peter Kleiweg, +Shuhei Kobayashi, Pavel Kobiakov, Larry K.@: Kolodney, David M.@: +Koppelman, Koseki Yoshinori, Robert Krawitz, Sebastian Kremer, Ryszard +Kubiak, Geoff Kuenning, David K@aa{}gedal, Daniel LaLiberte, Mario +Lang, Aaron Larson, James R.@: Larus, Vinicius Jose Latorre, Werner +Lemberg, Frederic Lepied, Peter Liljenberg, Lars Lindberg, Chris +Lindblad, Anders Lindgren, Thomas Link, Juri Linkov, Francis Litterio, +Emilio C. Lopes, Dave Love, Sascha L@"{u}decke, Eric Ludlam,Alan +Mackenzie, Christopher J.@: Madsen, Neil M.@: Mager, Ken Manheimer, +Bill Mann, Brian Marick, Simon Marshall, Bengt Martensson, Charlie +Martin, Thomas May, Roland McGrath, Will Mengarini, David Megginson, +Ben A. Mesander, Wayne Mesard, Brad Miller, Lawrence Mitchell, Richard Mlynarik, Gerd Moellmann, Stefan Monnier, Morioka Tomohiko, Keith -Moore, Sen Nagata, Erik Naggum, Thomas Neumann, Thien-Thi Nguyen, Mike -Newton, Jurgen Nickelsen, Dan Nicolaescu, Jeff Norden, Andrew Norman, -Alexandre Oliva, Bob Olson, Takaaki Ota, Pieter E.@: J.@: Pareit, +Moore, Glenn Morris, Diane Murray, Sen Nagata, Erik Naggum, Thomas +Neumann, Thien-Thi Nguyen, Mike Newton, Jurgen Nickelsen, Dan +Nicolaescu, Hrvoje Niksic, Jeff Norden, Andrew Norman, Alexandre +Oliva, Bob Olson, Michael Olson, Takaaki Ota, Pieter E.@: J.@: Pareit, David Pearson, Jeff Peck, Damon Anton Permezel, Tom Perrine, William -M.@: Perry, Per Persson, Jens Petersen, Daniel Pfeiffer, Richard -L.@: Pieri, Fred Pierresteguy, Christian Plaunt, David Ponce, Francesco -A. Potorti, Michael D. Prange, Mukesh Prasad, Marko Rahamaa, Ashwin -Ram, Eric S. Raymond, Paul Reilly, Edward M. Reingold, Alex Rezinsky, -Rob Riepel, Nick Roberts, Roland B.@: Roberts, John Robinson, Danny -Roozendaal, William Rosenblatt, Guillermo J.@: Rozas, Ivar Rummelhoff, -Jason Rumney, Wolfgang Rupprecht, Kevin Ryde, James B. Salem, Masahiko -Sato, Holger Schauer, William Schelter, Ralph Schleicher, Gregor +M.@: Perry, Per Persson, Jens Petersen, Daniel Pfeiffer, Richard L.@: +Pieri, Fred Pierresteguy, Christian Plaunt, David Ponce, Francesco +A.@: Potorti, Michael D. Prange, Mukesh Prasad, Ken Raeburn, Marko +Rahamaa, Ashwin Ram, Eric S. Raymond, Paul Reilly, Edward M. Reingold, +Alex Rezinsky, Rob Riepel, David Reitter, Nick Roberts, Roland B.@: +Roberts, John Robinson, Danny Roozendaal, William Rosenblatt, +Guillermo J.@: Rozas, Martin Rudalics, Ivar Rummelhoff, Jason Rumney, +Wolfgang Rupprecht, Kevin Ryde, James B. Salem, Masahiko Sato, Jorgen +Schaefer, Holger Schauer, William Schelter, Ralph Schleicher, Gregor Schmid, Michael Schmidt, Ronald S. Schnell, Philippe Schnoebelen, Jan -Schormann, Alex Schroeder, Stephen Schoef, Randal Schwartz, Oliver -Seidel, Manuel Serrano, Hovav Shacham, Stanislav Shalunov, Mark -Shapiro, Richard Sharman, Olin Shivers, Espen Skoglund, Rick Sladkey, -Lynn Slater, Chris Smith, David Smith, Paul D.@: Smith, Andre Spiegel, -Michael Staats, William Sommerfeld, Michael Staats, Sam Steingold, Ake -Stenhoff, Peter Stephenson, Ken Stevens, Jonathan Stigelman, Martin -Stjernholm, Kim F.@: Storm, Steve Strassman, Olaf Sylvester, Naoto -Takahashi, Jean-Philippe Theberge, Jens T.@: Berger Thielemann, -Spencer Thomas, Jim Thompson, Tom Tromey, Daiki Ueno, Masanobu Umeda, -Rajesh Vaidheeswarran, Neil W.@: Van Dyke, Didier Verna, Ulrik Vieth, -Geoffrey Voelker, Johan Vromans, Inge Wallin, Colin Walters, Barry -Warsaw, Morten Welinder, Joseph Brian Wells, Rodney Whitby, John -Wiegley, Ed Wilkinson, Mike Williams, Bill Wohler, Steven A. Wood, -Dale R.@: Worley, Francis J.@: Wright, Felix S. T. Wu, Tom Wurgler, -Masatake Yamato, Jonathan Yavner, Ilya Zakharevich, Milan Zamazal, -Victor Zandy, Eli Zaretskii, Jamie Zawinski, Shenghuo Zhu, Ian -T.@: Zimmermann, Reto Zimmermann, Neal Ziring, and Detlev Zundel. +Schormann, Alex Schroeder, Stephen Schoef, Raymond Scholz, Randal +Schwartz, Oliver Seidel, Manuel Serrano, Hovav Shacham, Stanislav +Shalunov, Mark Shapiro, Richard Sharman, Olin Shivers, Espen Skoglund, +Rick Sladkey, Lynn Slater, Chris Smith, David Smith, Paul D.@: Smith, +Andre Spiegel, Michael Staats, William Sommerfeld, Michael Staats, +Reiner Steib, Sam Steingold, Ake Stenhoff, Peter Stephenson, Ken +Stevens, Jonathan Stigelman, Martin Stjernholm, Kim F.@: Storm, Steve +Strassman, Olaf Sylvester, Naoto Takahashi, Steven Tamm, Jean-Philippe +Theberge, Jens T.@: Berger Thielemann, Spencer Thomas, Jim Thompson, +Luc Teirlinck, Tom Tromey, Enami Tsugutomo, Eli Tziperman, Daiki Ueno, +Masanobu Umeda, Rajesh Vaidheeswarran, Neil W.@: Van Dyke, Didier +Verna, Ulrik Vieth, Geoffrey Voelker, Johan Vromans, Inge Wallin, John +Paul Wallington, Colin Walters, Barry Warsaw, Morten Welinder, Joseph +Brian Wells, Rodney Whitby, John Wiegley, Ed Wilkinson, Mike Williams, +Bill Wohler, Steven A. Wood, Dale R.@: Worley, Francis J.@: Wright, +Felix S. T. Wu, Tom Wurgler, Katsumi Yamaoka, Masatake Yamato, +Jonathan Yavner, Ryan Yeske, Chong Yidong, Ilya Zakharevich, Milan +Zamazal, Victor Zandy, Eli Zaretskii, Jamie Zawinski, Shenghuo Zhu, +Ian T.@: Zimmermann, Reto Zimmermann, Neal Ziring, Teodor Zlatanov, +and Detlev Zundel. @end iftex @node Intro, Glossary, Distrib, Top @@ -1193,7 +1209,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -1510,7 +1526,7 @@ @smallexample @var{one line to give the program's name and an idea of what it does.} -Copyright (C) 19@var{yy} @var{name of author} +Copyright (C) @var{yyyy} @var{name of author} This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -1533,7 +1549,7 @@ when it starts in an interactive mode: @smallexample -Gnomovision version 69, Copyright (C) 20@var{yy} @var{name of author} +Gnomovision version 69, Copyright (C) @var{yyyy} @var{name of author} Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' @@ -1565,7 +1581,7 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. @include doclicense.texi
--- a/man/faq.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/faq.texi Sat Oct 14 17:36:28 2006 +0000 @@ -1382,7 +1382,7 @@ number if the buffer's size in bytes is larger than the value of the variable @code{line-number-display-limit}. -As of Emacs 20, you can similarly display the current column with +You can similarly display the current column with @kbd{M-x column-number-mode}, or by putting the form @lisp @@ -2683,7 +2683,8 @@ @item Make the alias conditioned on the @code{EMACS} variable in the environment. When Emacs runs a subsidiary shell, it exports the -@code{EMACS} variable with the value @code{t} to that shell. You can +@code{EMACS} variable to that shell, with value equal to the absolute +file name of Emacs. You can unalias @code{ls} when that happens, thus limiting the alias to your interactive sessions. @@ -2753,7 +2754,7 @@ @example if ($?EMACS) then - if ("$EMACS" == t) then + if ("$EMACS" =~ /*) then if ($?tcsh) unset edit stty nl endif @@ -3847,8 +3848,8 @@ Or send reports to @email{bug-vm@@wonderworks.com} @end table -VM 7 works well with Emacs 21. Older versions of VM suitable for use -with older versions of Emacs are available from +VM 7 works well with Emacs 21 and Emacs 22. Older versions of VM +suitable for use with older versions of Emacs are available from @uref{ftp://ftp.wonderworks.com/pub/vm/, the same FTP site}.
--- a/man/files.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/files.texi Sat Oct 14 17:36:28 2006 +0000 @@ -155,6 +155,7 @@ @node Visiting @section Visiting Files @cindex visiting files +@cindex open file @table @kbd @item C-x C-f
--- a/man/frames.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/frames.texi Sat Oct 14 17:36:28 2006 +0000 @@ -516,13 +516,13 @@ @kindex C-z @r{(X windows)} @findex iconify-or-deiconify-frame Iconify the selected Emacs frame (@code{iconify-or-deiconify-frame}). +When typed on an Emacs frame's icon, deiconify instead. + The normal meaning of @kbd{C-z}, to suspend Emacs, is not useful under a graphical display that allows multiple applications to operate simultaneously in their own windows, so Emacs gives @kbd{C-z} a different binding in that case. -If you type this command on an Emacs frame's icon, it deiconifies the frame. - @item C-x 5 0 @kindex C-x 5 0 @findex delete-frame @@ -945,11 +945,18 @@ variable @code{x-gtk-show-hidden-files} controls whether to show hidden files by default. -@vindex x-use-old-gtk-file-dialog - For Gtk+ version 2.4 and 2.6, you can make Emacs use the old file dialog -by setting the variable @code{x-use-old-gtk-file-dialog} to a non-@code{nil} -value. If Emacs is built with a Gtk+ version that has only one file dialog, -the setting of this variable has no effect. +@vindex x-gtk-use-old-file-dialog + For Gtk+ versions 2.4 through 2.10, you can select the old file +dialog (@code{gtk-file-selector}) by setting the variable +@code{x-gtk-use-old-file-dialog} to a non-@code{nil} value. If it is +@code{nil}, Emacs uses @code{gtk-file-chooser}. If Emacs is built +with a Gtk+ version that has only one file dialog, this variable has +no effect. + +@vindex x-gtk-file-dialog-help-text + Emacs adds help text to the Gtk+ file chooser dialog. The variable +@code{x-gtk-file-dialog-help-text} specifies the text to add; if it is +@code{nil}, that disables the added text. @node Tooltips @section Tooltips
--- a/man/gnus-faq.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/gnus-faq.texi Sat Oct 14 17:36:28 2006 +0000 @@ -172,13 +172,14 @@ @subsubheading Answer -The latest released version of Gnus isn't included in -Emacs 21, therefor you should get the Gnus tarball from -@uref{http://www.gnus.org/dist/gnus.tar.gz} -or via anonymous FTP from +Gnus is released independent from releases of Emacs and XEmacs. +Therefore, the version bundled with Emacs or the version in XEmacs' +package system might not be up to date (e.g. Gnus 5.9 bundled with Emacs +20 is outdated). +@c +You can get the latest released version of Gnus from +@uref{http://www.gnus.org/dist/gnus.tar.gz} or via anonymous FTP from @uref{ftp://ftp.gnus.org/pub/gnus/gnus.tar.gz}. -If you use XEmacs instead of Emacs you can use XEmacs' -package system instead. @node [1.4] @subsubheading Question 1.4
--- a/man/gnus.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/gnus.texi Sat Oct 14 17:36:28 2006 +0000 @@ -2495,6 +2495,10 @@ groups under point---@code{gnus-subscribe-newsgroup-method} is not consulted. +Changes from the group editing commands are stored in +@file{~/.newsrc.eld} (@code{gnus-startup-file}). An alternative is the +variable @code{gnus-parameters}, @xref{Group Parameters}. + @table @kbd @item G m @@ -6348,9 +6352,9 @@ @item / n @kindex / n (Summary) @findex gnus-summary-limit-to-articles -Limit the summary buffer to the current article -(@code{gnus-summary-limit-to-articles}). Uses the process/prefix -convention (@pxref{Process/Prefix}). +With prefix @samp{n}, limit the summary buffer to the next @samp{n} +articles. If not given a prefix, use the process marked articles +instead. (@code{gnus-summary-limit-to-articles}). @item / w @kindex / w (Summary) @@ -13633,16 +13637,17 @@ @vindex pop3-movemail @vindex pop3-leave-mail-on-server If the @code{:program} and @code{:function} keywords aren't specified, -@code{pop3-movemail} will be used. If the -@code{pop3-leave-mail-on-server} is non-@code{nil} the mail is to be -left on the @acronym{POP} server after fetching when using -@code{pop3-movemail}. Note that POP servers maintain no state -information between sessions, so what the client believes is there and -what is actually there may not match up. If they do not, then the whole -thing can fall apart and leave you with a corrupt mailbox. - -Here are some examples. Fetch from the default @acronym{POP} server, -using the default user name, and default fetcher: +@code{pop3-movemail} will be used. If @code{pop3-leave-mail-on-server} +is non-@code{nil} the mail is to be left on the @acronym{POP} server +after fetching when using @code{pop3-movemail}. Note that POP servers +maintain no state information between sessions, so what the client +believes is there and what is actually there may not match up. If they +do not, then you may get duplicate mails or the whole thing can fall +apart and leave you with a corrupt mailbox. + +Here are some examples for getting mail from a @acronym{POP} server. +Fetch from the default @acronym{POP} server, using the default user +name, and default fetcher: @lisp (pop) @@ -22132,8 +22137,8 @@ @section Image Enhancements XEmacs, as well as Emacs 21@footnote{Emacs 21 on MS Windows doesn't -support images yet.}, is able to display pictures and stuff, so Gnus has -taken advantage of that. +support images, Emacs 22 does.} and up, are able to display pictures and +stuff, so Gnus has taken advantage of that. @menu * X-Face:: Display a funky, teensy black-and-white image. @@ -22183,7 +22188,7 @@ @code{gnus-article-x-face-command} variable. If this variable is a string, this string will be executed in a sub-shell. If it is a function, this function will be called with the face as the argument. -If the @code{gnus-article-x-face-too-ugly} (which is a regexp) matches +If @code{gnus-article-x-face-too-ugly} (which is a regexp) matches the @code{From} header, the face will not be shown. (Note: @code{x-face} is used in the variable/function names, not @@ -26537,7 +26542,9 @@ @item The option @code{mm-fill-flowed} can be used to disable treatment of ``format=flowed'' messages. Also, flowed text is disabled when sending -inline PGP signed messages. (New in Gnus 5.10.7) +inline PGP signed messages. @xref{Flowed text, , Flowed text, +emacs-mime, The Emacs MIME Manual}. (New in Gnus 5.10.7) +@c This entry is also present in the node "No Gnus". @item Gnus supports the generation of RFC 2298 Disposition Notification requests.
--- a/man/indent.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/indent.texi Sat Oct 14 17:36:28 2006 +0000 @@ -212,7 +212,7 @@ are present just to help you see where the colons are and know what to do. Note that the tab stops that control @code{tab-to-tab-stop} have nothing -to do with displaying tab characters in the buffer. @xref{Display Custom}, +to do with displaying tab characters in the buffer. @xref{Text Display}, for more information on that. @node Just Spaces,, Tab Stops, Indentation
--- a/man/mark.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/mark.texi Sat Oct 14 17:36:28 2006 +0000 @@ -334,11 +334,11 @@ @kbd{M-@@} (@code{mark-word}) puts the mark at the end of the next word, while @kbd{C-M-@@} (@code{mark-sexp}) puts it at the end of the next balanced expression (@pxref{Expressions}). These commands handle -arguments just like @kbd{M-f} and @kbd{C-M-f}. If you repeat these -commands, that extends the region. For example, you can type either -@kbd{C-u 2 M-@@} or @kbd{M-@@ M-@@} to mark the next two words. This -command also extends the region when the mark is active in Transient -Mark mode, regardless of the last command. +arguments just like @kbd{M-f} and @kbd{C-M-f}. Repeating these +commands extends the region. For example, you can type either +@kbd{C-u 2 M-@@} or @kbd{M-@@ M-@@} to mark the next two words. These +commands also extend the region in Transient Mark mode, regardless of +the last command. @kindex C-x h @findex mark-whole-buffer @@ -347,7 +347,7 @@ the beginning of the paragraph that surrounds or follows point, and puts the mark at the end of that paragraph (@pxref{Paragraphs}). It prepares the region so you can indent, case-convert, or kill a whole -paragraph. With prefix argument, if the argument's value is positive, +paragraph. With a prefix argument, if the argument's value is positive, @kbd{M-h} marks that many paragraphs starting with the one surrounding point. If the prefix argument is @minus{}@var{n}, @kbd{M-h} also marks @var{n} paragraphs, running back form the one surrounding point.
--- a/man/mh-e.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/mh-e.texi Sat Oct 14 17:36:28 2006 +0000 @@ -9288,7 +9288,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -9605,7 +9605,7 @@ @smallexample @var{one line to give the program's name and an idea of what it does.} -Copyright (C) 19@var{yy} @var{name of author} +Copyright (C) @var{yyyy} @var{name of author} This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -9628,7 +9628,7 @@ when it starts in an interactive mode: @smallexample -Gnomovision version 69, Copyright (C) 20@var{yy} @var{name of author} +Gnomovision version 69, Copyright (C) @var{yyyy} @var{name of author} Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' @@ -9660,7 +9660,7 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. @node Key Index, Command Index, GPL, Top
--- a/man/misc.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/misc.texi Sat Oct 14 17:36:28 2006 +0000 @@ -488,7 +488,8 @@ @cindex @env{EMACS} environment variable Unless the environment variable @env{EMACS} is already defined, -Emacs defines it in the subshell, with value @code{t}. A shell script +Emacs defines it in the subshell, with value equal to Emacs's absolute +file name. A shell script can check this variable to determine whether it has been run from an Emacs subshell.
--- a/man/org.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/org.texi Sat Oct 14 17:36:28 2006 +0000 @@ -2766,7 +2766,7 @@ @end example @noindent you indicate that at most one of @samp{@@WORK}, @samp{@@HOME}, -and @samp{@@SAILBOAT} should be selected. +and @samp{@@TENNISCLUB} should be selected. @noindent Don't forget to press @kbd{C-c C-c} with the cursor in one of these lines to activate any changes.
--- a/man/programs.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/programs.texi Sat Oct 14 17:36:28 2006 +0000 @@ -366,6 +366,7 @@ The basic indentation commands indent a single line according to the usual conventions of the language you are editing. +@need 1000 @table @kbd @item @key{TAB} Adjust indentation of current line.
--- a/man/rcirc.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/rcirc.texi Sat Oct 14 17:36:28 2006 +0000 @@ -118,7 +118,7 @@ @cindex redirection to random servers When you connect to the Freenode network -(@indicateurl{http://freenode.net/}), you point your IRC client at the +(@code{http://freenode.net/}), you point your IRC client at the server @code{irc.freenode.net}. That server will redirect your client to a random server on the network, such as @code{zelazny.freenode.net}. @@ -424,8 +424,8 @@ @cindex help about irc Typical IRC servers implement many more commands. You can read more about the fantastic world of IRC online at -@indicateurl{http://www.irchelp.org/}, the Internet Relay Chat (IRC) -help archive. +@uref{http://www.irchelp.org/, the Internet Relay Chat (IRC) help +archive}. @node Configuration, , Useful IRC commands, Reference @section Configuration
--- a/man/reftex.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/reftex.texi Sat Oct 14 17:36:28 2006 +0000 @@ -1929,8 +1929,8 @@ @lisp (add-hook 'mail-setup-hook (lambda () (define-key mail-mode-map "\C-c[" - (lambda () (interactive) - (require 'reftex) + (lambda () + (interactive) (let ((reftex-cite-format 'locally)) (reftex-citation)))))) @end lisp
--- a/man/search.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/search.texi Sat Oct 14 17:36:28 2006 +0000 @@ -16,7 +16,14 @@ Besides the usual @code{replace-string} command that finds all occurrences of one string and replaces them with another, Emacs has a more flexible replacement command called @code{query-replace}, which -asks interactively which occurrences to replace. +asks interactively which occurrences to replace. There are also +commands to find and operate on all matches for a pattern. + + You can also search multiple files under control of a tags +table (@pxref{Tags Search}) or through the Dired @kbd{A} command +(@pxref{Operating on Files}), or ask the @code{grep} program to do it +(@pxref{Grep Searching}). + @menu * Incremental Search:: Search happens as you type the string. @@ -1332,11 +1339,6 @@ If a match is split across lines, this command keeps all those lines. @end table - You can also search multiple files under control of a tags table -(@pxref{Tags Search}) or through the Dired @kbd{A} command -(@pxref{Operating on Files}), or ask the @code{grep} program to do it -(@pxref{Grep Searching}). - @ignore arch-tag: fd9d8e77-66af-491c-b212-d80999613e3e @end ignore
--- a/man/smtpmail.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/smtpmail.texi Sat Oct 14 17:36:28 2006 +0000 @@ -209,9 +209,12 @@ @cindex CRAM-MD5 @cindex LOGIN @cindex STARTTLS +@cindex TLS +@cindex SSL Many environments require SMTP clients to authenticate themselves before they are allowed to route mail via a server. The two following variables contains the authentication information needed for this. + The first variable, @code{smtpmail-auth-credentials}, instructs the SMTP library to use a SASL authentication step, currently only the CRAM-MD5 and LOGIN mechanisms are supported and will be selected in @@ -220,10 +223,17 @@ The second variable, @code{smtpmail-starttls-credentials}, instructs the SMTP library to connect to the server using STARTTLS. This means the protocol exchange may be integrity protected and confidential by -using TLS, and optionally also authentication of the client. This -feature uses the elisp package @file{starttls.el} (see it for more -information on customization), which in turn require that at least one -of the following external tools are installed: +using the Transport Layer Security (TLS) protocol, and optionally also +authentication of the client and server. + +TLS is a security protocol that is also known as SSL, although +strictly speaking, SSL is an older variant of TLS. TLS is backwards +compatible with SSL. In most mundane situations, the two terms are +equivalent. + +The TLS feature uses the elisp package @file{starttls.el} (see it for +more information on customization), which in turn require that at +least one of the following external tools are installed: @enumerate @item
--- a/man/texinfo.tex Sat Oct 14 16:56:21 2006 +0000 +++ b/man/texinfo.tex Sat Oct 14 17:36:28 2006 +0000 @@ -3,7 +3,7 @@ % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % -\def\texinfoversion{2006-07-17.16} +\def\texinfoversion{2006-08-26.17} % % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free @@ -2301,6 +2301,10 @@ }$% } +% @textdegree - the normal degrees sign. +% +\def\textdegree{$^\circ$} + % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. @@ -3524,6 +3528,7 @@ \definedummyword\point \definedummyword\print \definedummyword\result + \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist @@ -3657,6 +3662,7 @@ \def\point{.}% \def\print{-|}% \def\result{=>}% + \def\textdegree{degrees}% % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now.
--- a/man/text.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/text.texi Sat Oct 14 17:36:28 2006 +0000 @@ -34,10 +34,10 @@ @end iftex For text which contains embedded commands for text formatters, Emacs -has other major modes, each for a particular text formatter. Thus, for +has other major modes, each for a particular formatter. Thus, for input to @TeX{}, you would use @TeX{} @iftex -mode (@pxref{TeX Mode}). +mode (@pxref{TeX Mode,,@TeX{} Mode}). @end iftex @ifnottex mode. @@ -106,7 +106,7 @@ @item M-@@ Mark the end of the next word (@code{mark-word}). @item M-t -Transpose two words or drag a word across other words +Transpose two words or drag a word across others (@code{transpose-words}). @end table @@ -156,7 +156,7 @@ containing point with the following word. The delimiter characters between the words do not move. For example, @w{@samp{FOO, BAR}} transposes into @w{@samp{BAR, FOO}} rather than @samp{@w{BAR FOO,}}. @xref{Transpose}, for -more on transposition and on arguments to transposition commands. +more on transposition. @kindex M-@@ @findex mark-word @@ -230,7 +230,7 @@ It is useful to follow this convention, because it makes a distinction between periods that end a sentence and periods that indicate abbreviations; that enables the Emacs sentence commands to distinguish, -too. These commands to not stop for periods that indicate abbreviations. +too. These commands do not stop for periods that indicate abbreviations. @vindex sentence-end-double-space If you want to use just one space between sentences, you can set the @@ -253,10 +253,10 @@ for this purpose. @vindex sentence-end-without-period - Some languages do not use period to indicate end of sentence. For -example, a sentence in Thai text ends with double space but without a + Some languages do not use periods to indicate the end of a sentence. +For example, sentences in Thai end with a double space but without a period. Set the variable @code{sentence-end-without-period} to -@code{t} to tell the sentence commands that a period is not necessary. +@code{t} in such cases. @node Paragraphs @section Paragraphs @@ -267,7 +267,7 @@ @findex backward-paragraph @findex forward-paragraph - The Emacs commands for manipulating paragraphs are also Meta keys. + The Emacs commands for manipulating paragraphs are also on Meta keys. @table @kbd @item M-@{ @@ -938,7 +938,7 @@ Emacs provides two other modes for editing text that is to be passed through a text formatter to produce fancy formatted printed output. @xref{Nroff Mode}, for editing input to the formatter nroff. -@xref{TeX Mode}, for editing input to the formatter TeX. +@xref{TeX Mode,,@TeX{} Mode}, for editing input to the formatter TeX. Another mode is used for editing outlines. It allows you to view the text at various levels of detail. You can view either the outline @@ -1373,10 +1373,10 @@ also free software, like GNU Emacs. La@TeX{} is a simplified input format for @TeX{}, implemented by @TeX{} macros; it comes with @TeX{}. Sli@TeX{} is a special form of La@TeX{}.@footnote{Sli@TeX{} is -obsoleted by the @samp{slides} document class in recent La@TeX{} -versions.} Doc@TeX{} (@file{.dtx}) is a special file format in which -the La@TeX{} sources are written, combining sources with -documentation. +obsoleted by the @samp{slides} document class and other alternative +packages in recent La@TeX{} versions.} Doc@TeX{} (@file{.dtx}) is a +special file format in which the La@TeX{} sources are written, +combining sources with documentation. Emacs has a special @TeX{} mode for editing @TeX{} input files. It provides facilities for checking the balance of delimiters and for @@ -2356,8 +2356,8 @@ Normally, Emacs knows when you are editing formatted text because it recognizes the special annotations used in the file that you visited. -However, there are situations in which you must take special actions -to convert file contents or turn on Enriched mode: +However, sometimes you must take special actions to convert file +contents or turn on Enriched mode: @itemize @bullet @item @@ -2398,6 +2398,7 @@ text-based tables. Here is an example of such a table: @smallexample +@group +-----------------+--------------------------------+-----------------+ | Command | Description | Key Binding | +-----------------+--------------------------------+-----------------+ @@ -2414,6 +2415,7 @@ | |end of buffer, stop and signal | | | |error. | | +-----------------+--------------------------------+-----------------+ +@end group @end smallexample Table mode allows the contents of the table such as this one to be @@ -2800,6 +2802,7 @@ @c sticks out to accommodate for the removal of @samp in the @c produced output!! @smallexample +@group +-----------------------------------------------------------------+ |@samp{table-capture} is a powerful command, but mastering its | |power requires some practice. Here are some things it can do: | @@ -2816,6 +2819,7 @@ | the specified region is placed in that | | cell. | +-----------------------------------------------------------------+ +@end group @end smallexample @noindent
--- a/man/tramp.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/tramp.texi Sat Oct 14 17:36:28 2006 +0000 @@ -1931,12 +1931,16 @@ @chapter Reporting Bugs and Problems @cindex bug reports -Bugs and problems with @value{tramp} are actively worked on by the development -team. Feature requests and suggestions are also more than welcome. - -The @value{tramp} mailing list is a great place to get information on working -with @value{tramp}, solving problems and general discussion and advice on topics -relating to the package. +Bugs and problems with @value{tramp} are actively worked on by the +development team. Feature requests and suggestions are also more than +welcome. + +The @value{tramp} mailing list is a great place to get information on +working with @value{tramp}, solving problems and general discussion +and advice on topics relating to the package. It is moderated so +non-subscribers can post but messages will be delayed, possibly up to +48 hours (or longer in case of holidays), until the moderator approves +your message. The mailing list is at @email{tramp-devel@@gnu.org}. Messages sent to this address go to all the subscribers. This is @emph{not} the address
--- a/man/trampver.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/trampver.texi Sat Oct 14 17:36:28 2006 +0000 @@ -4,7 +4,7 @@ @c In the Tramp CVS, the version number is auto-frobbed from @c configure.ac, so you should edit that file and run @c "autoconf && ./configure" to change the version number. -@set trampver 2.0.53 +@set trampver 2.0.54 @c Other flags from configuration @set prefix /usr/local
--- a/man/widget.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/widget.texi Sat Oct 14 17:36:28 2006 +0000 @@ -158,7 +158,7 @@ @comment node-name, next, previous, up @section User Interface -A form consist of read only text for documentation and some fields, +A form consists of read only text for documentation and some fields, where each field contains two parts, a tag and a value. The tags are used to identify the fields, so the documentation can refer to the @samp{foo field}, meaning the field tagged with @samp{Foo}. Here is an @@ -195,7 +195,7 @@ @b{[Apply Form]} @b{[Reset Form]} @end example -The top level widgets in is example are tagged @samp{Name}, +The top level widgets in this example are tagged @samp{Name}, @samp{Choose}, @samp{Address}, @samp{_other work_}, @samp{Numbers}, @samp{Select multiple}, @samp{Select one}, @samp{[Apply Form]}, and @samp{[Reset Form]}. There are basically two things the user can do @@ -277,19 +277,19 @@ @cindex embedded buttons @item Embedded Buttons The @samp{@b{_other work_}} is an example of an embedded -button. Embedded buttons are not associated with a fields, but can serve +button. Embedded buttons are not associated with any fields, but can serve any purpose, such as implementing hypertext references. They are usually created by the @code{link} widget. @item The @samp{@b{[ ]}} and @samp{@b{[X]}} buttons Activating one of these will convert it to the other. This is useful -for implementing multiple-choice fields. You can create it with the +for implementing multiple-choice fields. You can create them with the @code{checkbox} widget. @item The @samp{@b{( )}} and @samp{@b{(*)}} buttons Only one radio button in a @code{radio-button-choice} widget can be selected at any time. When you invoke one of the unselected radio buttons, it will be selected and the previous selected radio button will become unselected. -@item The @samp{@b{[Apply Form]}} @samp{@b{[Reset Form]}} buttons +@item The @samp{@b{[Apply Form]}} and @samp{@b{[Reset Form]}} buttons These are explicit buttons made with the @code{push-button} widget. The main difference from the @code{link} widget is that the buttons will be displayed as GUI buttons when possible. @@ -492,7 +492,7 @@ are interpreted in a widget specific way. @cindex keyword arguments -The following keyword arguments that apply to all widgets: +The following keyword arguments apply to all widgets: @table @code @vindex value@r{ keyword} @@ -807,7 +807,7 @@ @end example The @var{value}, if present, is used to initialize the @code{:value} -property. The value should be a string, which will be inserted in +property. The value should be a string, which will be inserted in the field. This widget will match all string values. The following extra properties are recognized: @@ -1349,7 +1349,7 @@ @deffn Widget list The value of a @code{list} widget is a list containing the value of -each of its component. +each of its components. @end deffn @deffn Widget vector @@ -1359,11 +1359,11 @@ The above suffice for specifying fixed size lists and vectors. To get variable length lists and vectors, you can use a @code{choice}, -@code{set}, or @code{repeat} widgets together with the @code{:inline} -keywords. If any component of a composite widget has the @code{:inline} +@code{set}, or @code{repeat} widget together with the @code{:inline} +keyword. If any component of a composite widget has the @code{:inline} keyword set, its value must be a list which will then be spliced into the composite. For example, to specify a list whose first element must -be a file name, and whose remaining arguments should either by the +be a file name, and whose remaining arguments should either be the symbol @code{t} or two files, you can use the following widget specification: @@ -1390,7 +1390,7 @@ @deffn Widget set Allows you to specify a type which must be a list whose elements all -belong to given set. The elements of the list are not significant. +belong to the given set. The elements of the list are not significant. This is implemented on top of the @code{checklist} basic widget, and has a similar syntax. @end deffn
--- a/man/windows.texi Sat Oct 14 16:56:21 2006 +0000 +++ b/man/windows.texi Sat Oct 14 17:36:28 2006 +0000 @@ -64,10 +64,6 @@ displayed in the window. The selected window's mode line appears in a different color. @xref{Mode Line}, for full details on the mode line. -@iftex -@break -@end iftex - @node Split Window @section Splitting Windows @@ -116,7 +112,7 @@ if the variable @code{truncate-partial-width-windows} is non-@code{nil}, that forces truncation in all windows less than the full width of the screen, independent of the buffer being displayed -and its value for @code{truncate-lines}. @xref{Display Custom}. +and its value for @code{truncate-lines}. @xref{Line Truncation}. Horizontal scrolling is often used in side-by-side windows. @xref{Horizontal Scrolling}.
--- a/msdos/COPYING Sat Oct 14 16:56:21 2006 +0000 +++ b/msdos/COPYING Sat Oct 14 17:36:28 2006 +0000 @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -15,7 +15,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,7 +55,7 @@ The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest @@ -303,10 +303,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. @@ -336,5 +335,5 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
--- a/msdos/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/msdos/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,8 @@ +2006-09-15 Jay Belanger <belanger@truman.edu> + + * COPYING: Replace "Library Public License" by "Lesser Public + License" throughout. + 2005-09-10 Sven Joachim <svenjoac@gmx.de> (tiny change) * sed3v2.inp (GETOPT_H, GETOPTOBJS): Define to use getopt.h,
--- a/nt/COPYING Sat Oct 14 16:56:21 2006 +0000 +++ b/nt/COPYING Sat Oct 14 17:36:28 2006 +0000 @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -15,7 +15,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,7 +55,7 @@ The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest @@ -303,10 +303,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. @@ -336,5 +335,5 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
--- a/nt/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/nt/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,16 @@ +2006-09-24 Eli Zaretskii <eliz@gnu.org> + + * config.nt (HAVE_LANGINFO_CODESET): Define. + + * inc/langinfo.h: New file. + + * inc/nl_types.h: New file. + +2006-09-15 Jay Belanger <belanger@truman.edu> + + * COPYING: Replace "Library Public License" by "Lesser Public + License" throughout. + 2006-07-27 Jason Rumney <jasonr@gnu.org> * INSTALL: Add notes about Cygwin make to impatient section.
--- a/nt/INSTALL Sat Oct 14 16:56:21 2006 +0000 +++ b/nt/INSTALL Sat Oct 14 17:36:28 2006 +0000 @@ -103,7 +103,7 @@ If you use the MinGW port of GCC and GNU Make to build Emacs, there are some compatibility issues wrt Make and the shell that is run by Make, either the standard COMMAND.COM/CMD.EXE supplied with Windows - or sh.exe., a port of a Unixy shell. For reference, here is a list + or sh.exe., a port of a Unixy shell. For reference, below is a list of which builds of GNU Make are known to work or not, and whether they work in the presence and/or absence of sh.exe, the Cygwin port of Bash. Note that any version of Make that is compiled with Cygwin @@ -129,6 +129,8 @@ cygwin compiled gmake 3.77: fails[1, 5] fails[2, 5] cygwin compiled make 3.78.1: fails[5] fails[2, 5] cygwin compiled make 3.79.1: fails[3, 5] fails[2?, 5] + cygwin compiled make 3.80: fails?[6] fails?[6] + cygwin compiled make 3.81: fails fails?[6] mingw32 compiled make 3.79.1: okay okay mingw32 compiled make 3.80: okay unknown[6] mingw32 compiled make 3.81: okay okay[7]
--- a/nt/config.nt Sat Oct 14 16:56:21 2006 +0000 +++ b/nt/config.nt Sat Oct 14 17:36:28 2006 +0000 @@ -251,6 +251,7 @@ #define HAVE_SETSOCKOPT 1 #define HAVE_GETSOCKNAME 1 #define HAVE_GETPEERNAME 1 +#define HAVE_LANGINFO_CODESET 1 /* Local (unix) sockets are not supported. */ #undef HAVE_SYS_UN_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/inc/langinfo.h Sat Oct 14 17:36:28 2006 +0000 @@ -0,0 +1,64 @@ +/* Replacement langinfo.h file for building GNU Emacs on Windows. + Copyright (C) 2006 Free Software Foundation, Inc. + +This file is part of GNU Emacs. + +GNU Emacs is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Emacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef _LANGINFO_H +#define _LANGINFO_H + +#include <nl_types.h> + +enum { + CODESET, + DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7, + MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7, MON_8, MON_9, MON_10, + MON_11, MON_12, + + /* Number of enumerated values. */ + _NL_NUM +}; + +#define CODESET CODESET + +#define DAY_1 DAY_1 +#define DAY_2 DAY_2 +#define DAY_3 DAY_3 +#define DAY_4 DAY_4 +#define DAY_5 DAY_5 +#define DAY_6 DAY_6 +#define DAY_7 DAY_7 + +#define MON_1 MON_1 +#define MON_2 MON_2 +#define MON_3 MON_3 +#define MON_4 MON_4 +#define MON_5 MON_5 +#define MON_6 MON_6 +#define MON_7 MON_7 +#define MON_8 MON_8 +#define MON_9 MON_9 +#define MON_10 MON_10 +#define MON_11 MON_11 +#define MON_12 MON_12 + +extern char *nl_langinfo (nl_item); + +#endif /* _LANGINFO_H */ + +/* arch-tag: a8917b7c-fb2c-4685-902b-742d0f67661b + (do not change this comment) */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nt/inc/nl_types.h Sat Oct 14 17:36:28 2006 +0000 @@ -0,0 +1,29 @@ +/* Replacement nl_types.h file for building GNU Emacs on Windows. + Copyright (C) 2006 Free Software Foundation, Inc. + +This file is part of GNU Emacs. + +GNU Emacs is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Emacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef _NL_TYPES_H +#define _NL_TYPES_H + +typedef int nl_item; + +#endif /* _NL_TYPES_H */ + +/* arch-tag: 518aa765-b846-4a7a-a862-95fd022928a1 + (do not change this comment) */
--- a/src/COPYING Sat Oct 14 16:56:21 2006 +0000 +++ b/src/COPYING Sat Oct 14 17:36:28 2006 +0000 @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -15,7 +15,7 @@ General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,7 +55,7 @@ The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest @@ -303,10 +303,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. @@ -336,5 +335,5 @@ This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
--- a/src/ChangeLog Sat Oct 14 16:56:21 2006 +0000 +++ b/src/ChangeLog Sat Oct 14 17:36:28 2006 +0000 @@ -1,3 +1,672 @@ +2006-10-13 Chong Yidong <cyd@stupidchicken.com> + + * xdisp.c (decode_mode_spec): Ignore %c and %l constructs in frame + title. + +2006-10-12 Chong Yidong <cyd@stupidchicken.com> + + * keymap.c (Fkey_binding): Check Lisp_Object types before doing + XCAR and XINT. + +2006-10-12 Romain Francoise <romain@orebokech.com> + + * image.c (xbm_read_bitmap_data): Delete extra semicolon. + +2006-10-10 Stefan Monnier <monnier@iro.umontreal.ca> + + * eval.c: Include xterm.h for x_fully_uncatch_errors and friends. + + * dispextern.h: Declare x_create_bitmap_from_xpm_data. + + * xterm.c (x_check_expected_move): Remove unused var `count'. + + * xmenu.c (syms_of_xmenu): Use Ffset rather than Fdefalias, since + Fdefalias is not declared in any *.h file. + +2006-10-09 Chong Yidong <cyd@stupidchicken.com> + + * dispnew.c (sit_for): Sit forever if TIMEOUT is t. + + * keyboard.c (command_loop_1): Handle non-number values of + `minibuffer-message-timeout'. + (Fexecute_extended_command): Fix typo. + + * minibuf.c (temp_echo_area_glyphs): Sit for + `minibuffer-message-timeout' seconds. + +2006-10-08 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * macterm.c (mac_draw_image_string, mac_draw_image_string_16): + Add argument OVERSTRIKE_P. + (mac_draw_string_common, mac_draw_image_string_cg): Likewise. + Support overstrike. + (mac_draw_string, mac_draw_string_16): Remove functions. + (x_draw_glyph_string_foreground): Use overstrike when needed. + (x_draw_composite_glyph_string_foreground): Likewise. + Use mac_draw_image_string_16 instead of mac_draw_string_16. + (mac_load_query_font): Rename from XLoadQueryFont. Take argument F + instead of DPY. All uses changed. Don't save/restore font. + +2006-10-07 Ralf Angeli <angeli@caeruleus.net> + + * w32fns.c (w32_createwindow): Honour left and top positions if + supplied explicitly. + +2006-10-06 Kim F. Storm <storm@cua.dk> + + * xdisp.c (pos_visible_p): Fix value when EOB is visible. + +2006-10-05 Chong Yidong <cyd@stupidchicken.com> + + * frame.c (Qinhibit_face_set_after_frame_default): New var. + (syms_of_frame): Initialize it. + (x_set_frame_parameters): Avoid resetting :font attributes to the + new-frame defaults. + +2006-10-03 Stefan Monnier <monnier@iro.umontreal.ca> + + * lisp.h (clear_regexp_cache): Declare. + + * search.c (compile_pattern): Only check `cp->syntax_table' if needed. + (compile_pattern_1): Remember `used_syntax' in `cp->syntax_table'. + (clear_regexp_cache): Only flush those regexps which depend on + a syntax-table. + + * regex.c (regex_compile): Set the new `used_syntax' bit. + + * regex.h: Remove file local variables. + (struct re_pattern_buffer): New field `used_syntax'. + +2006-10-03 Kim F. Storm <storm@cua.dk> + + * process.c (list_processes_1): Run sentinels before removing dead + processes. Also remove `closed' network connections. + +2006-10-01 Stefan Monnier <monnier@iro.umontreal.ca> + + * xdisp.c (handle_fontified_prop): Don't fontify at EOB. + +2006-09-30 Eli Zaretskii <eliz@gnu.org> + + * config.in Regenerated. + +2006-09-29 Juri Linkov <juri@jurta.org> + + * buffer.c (syms_of_buffer): Reorder coding systems in the + docstring of %z to the real order displayed in the modeline. + +2006-09-28 Stefan Monnier <monnier@iro.umontreal.ca> + + * keymap.c (Fdefine_key): Yet another int/Lisp_Object mixup (YAILOM). + +2006-09-26 Chong Yidong <cyd@stupidchicken.com> + + * indent.c (Fvertical_motion): Do move back if the Lisp string + being displayed contains newlines. + +2006-09-26 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * macterm.c (mac_compute_glyph_string_overhangs, XLoadQueryFont) + [USE_CG_DRAWING]: Call mac_prepare_for_quickdraw before QDTextBounds. + +2006-09-26 Kenichi Handa <handa@m17n.org> + + * keymap.c (Fsingle_key_description): For an invalid char, return + "Invalid char code NNNNN". + +2006-09-25 Chong Yidong <cyd@stupidchicken.com> + + * callint.c (Fcall_interactively): Doc fix. + +2006-09-25 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * macterm.c (x_underline_at_descent_line): New variable. + (syms_of_macterm): DEFVAR_BOOL it. + (x_draw_glyph_string): Use it. + (XLoadQueryFont): Calculate min_bounds.descent and max_bounds.descent. + +2006-09-25 Kenichi Handa <handa@m17n.org> + + * keymap.c (Fsingle_key_description): Return unique names for + generic characters. + +2006-09-24 Richard Stallman <rms@gnu.org> + + * search.c (compile_pattern_1): Don't BLOCK_INPUT. + +2006-09-24 Eli Zaretskii <eliz@gnu.org> + + * makefile.w32-in ($(BLD)/fns.$(O), $(BLD)/w32proc.$(O)): + Depend on nt/inc/langinfo.h and nt/inc/nl_types.h. + + * w32proc.c (nl_langinfo): New function. + + * w32fns.c (w32-pass-alt-to-system, w32-alt-is-meta) + (w32-pass-lwindow-to-system, w32-enable-num-lock) + (w32-enable-caps-lock, w32-scroll-lock-modifier) + (w32-lwindow-modifier, w32-rwindow-modifier) + (w32-apps-modifier, w32-mouse-button-tolerance): Doc fix. + +2006-09-23 Juanma Barranquero <lekktu@gmail.com> + + * minibuf.c (Finternal_complete_buffer, Fread_minibuffer) + (Fdisplay_completion_list): Fix typos in docstrings. + +2006-09-23 Romain Francoise <romain@orebokech.com> + + * s/gnu-linux.h (MAIL_USE_FLOCK): Check for HAVE_LIBLOCKFILE too. + +2006-09-23 Kenichi Handa <handa@m17n.org> + + * keymap.c (Fmap_keymap): Docstring mentions about generic character. + +2006-09-22 Stefan Monnier <monnier@iro.umontreal.ca> + + * regex.c (analyse_first): For eight-bit-control chars, mark both the + char's value and its leading byte in the fastmap. + (re_search_2): When fast-scanning without translation, be careful to + check that we only match the leading byte of a multibyte char. + + * charset.h (PREV_CHAR_BOUNDARY): Make it work from within a char's + byte sequence. + (AT_CHAR_BOUNDARY): New macro. + +2006-09-22 Kenichi Handa <handa@m17n.org> + + * fns.c (optimize_sub_char_table): Don't optimize a sub-char-table + whose default value is non-nil. + +2006-09-22 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * gtkutil.c (xg_get_file_with_chooser): Only show C-l help for + Gtk+ versions < 2.10. + + * xfns.c (syms_of_xfns): Fix typo in help text for + x-gtk-file-dialog-help-text. + +2006-09-21 Kim F. Storm <storm@cua.dk> + + * fns.c (Fmemq): Refill doc string. + (Fmemql): New defun, like memq but using eql. + (syms_of_fns): Defsubr it. + +2006-09-20 Kim F. Storm <storm@cua.dk> + + * xdisp.c (pos_visible_p): CHARPOS < 0 means return info for + last visible glyph in window. + + * window.c (Fset_window_hscroll, Fwindow_line_height): + Doc fix. Use "off-window" instead of "off-screen". + (Fpos_visible_in_window_p): Likewise. + If POS is t, return info for last visible glyph in window. + +2006-09-19 Chong Yidong <cyd@stupidchicken.com> + + * search.c (struct regexp_cache): New entry syntax_table. + (compile_pattern_1): Set it. + (syms_of_search): Initialize it. + (compile_pattern): Require the syntax_table entry of the cache + element to match the current syntax table entry. + +2006-09-19 Stefan Monnier <monnier@iro.umontreal.ca> + + * window.c (Fwindow_end): Fix recent change. + +2006-09-19 Kim F. Storm <storm@cua.dk> + + * window.c (Fset_window_hscroll, Fpos_visible_in_window_p): + Doc fix. Use "off-screen" instead of "invisible". + (Fwindow_line_height): Make line numbers 0-based. Make line arg + optional; if nil, use current cursor row. Handle text terminals + properly. Return nil if non-interactive or pseudo-window. + +2006-09-19 Stefan Monnier <monnier@iro.umontreal.ca> + + * keymap.c: Include alloca.h if available. + (Fkey_binding): Only use AREF after checking it's a vector. + Remove unused var `window'. + +2006-09-19 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * emacs.c (shut_down_emacs) [!subprocesses]: Don't set + inhibit_sentinels. + + * mac.c [!MAC_OSX] (select): Fix argument name. + + * macmenu.c (enum mac_menu_kind, min_menu_id): New enumerator and + menu ID for Apple menu. + (menubar_selection_callback): Remove function. + (find_and_call_menu_selection): New function from xmenu.c. + (x_activate_menubar): Use it. + (set_frame_menubar): Don't use f->output_data.mac->menubar_active. + + * macterm.c (menubar_selection_callback): Remove extern. + (M_APPLE): Change to 234. + (do_apple_menu) [!TARGET_API_MAC_CARBON]: Make non-static. + (do_menu_choice): Remove function. + + * macterm.h (struct mac_output): Remove member menubar_active. + (do_menu_choice): Remove extern. + (do_apple_menu) [!TARGET_API_MAC_CARBON]: Add extern. + +2006-09-18 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * xfns.c (syms_of_xfns): Rename x_gtk_show_chooser_help_text to + x_gtk_file_dialog_help_text. + + * gtkutil.c (xg_uses_old_file_dialog): Rename x-use-old-gtk-file-dialog + to x-gtk-use-old-file-dialog. + (xg_get_file_with_chooser): Rename x_gtk_show_chooser_help_text to + x_gtk_file_dialog_help_text. + + * xfns.c (syms_of_xfns): Ditto. + +2006-09-18 Kim F. Storm <storm@cua.dk> + + * window.c (Fwindow_line_visibility): Remove. + (Fwindow_line_height): New defun replacing it. + (syms_of_window): Defsubr it. + +2006-09-18 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * mac.c (SELECT_USE_CFSOCKET) [MAC_OSX]: Set default to 1. + [MAC_OSX] (sys_select) [SELECT_USE_CFSOCKET]: Fix pointer type. + +2006-09-17 Jay Belanger <belanger@truman.edu> + + * gmalloc.c: + * md5.c: + * md5.h: + * strftime.c: Replace "GNU Library General Public License" by "GNU + General Public License" throughout. + +2006-09-17 Kim F. Storm <storm@cua.dk> + + * dispnew.c (update_text_area): Undo 2000-07-18 change. + Always redrawing whole row if line has mouse-face in it causes + excessive flickering of the mode line. + +2006-09-17 Chong Yidong <cyd@stupidchicken.com> + + * search.c (clear_regexp_cache): New function. + + * syntax.c (Fmodify_syntax_entry): Clear regexp cache. + +2006-09-16 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * gtkutil.c (xg_get_file_with_chooser): + Check x-gtk-show-chooser-help-text before adding the help text. + + * xfns.c (syms_of_xfns): New variable: x-gtk-show-chooser-help-text. + + * gtkutil.c (get_utf8_string): Try harder to convert to UTF8. Gtk+ + will simply crash if we fail. + +2006-09-16 Richard Stallman <rms@gnu.org> + + * regex.c (re_compile_pattern): Set gl_state.current_syntax_table. + +2006-09-15 Kim F. Storm <storm@cua.dk> + + * window.c (Fwindow_line_visibility): New defun for line-move-partial. + (syms_of_window): Defsubr it. + (Fwindow_end): Use window's buffer rather than current buffer. + +2006-09-15 Jay Belanger <belanger@truman.edu> + + * COPYING: Replace "Library Public License" by "Lesser Public + License" throughout. + +2006-09-15 David Kastrup <dak@gnu.org> + + * Makefile.in (keymap.o): Add "keymap.h" and "window.h" dependencies. + + * keymap.c: include "window.h". + (Fcommand_remapping): New optional POSITION argument. + (Fkey_binding): New optional POSITION argument. Completely rework + handling of mouse clicks to get the same order of keymaps as + `read-key-sequence' and heed POSITION. Also temporarily switch + buffers to location of mouse click and back. + + * keyboard.c (command_loop_1): Adjust call of `Fcommand_remapping' + for additional argument. + (parse_menu_item): Adjust call of `Fkey_binding' for additional + argument. + (read_key_sequence): If there are both `local-map' and `keymap' + text properties at some buffer position, heed both. + + * keymap.h: Declare additional optional arguments of + `Fcommand_remapping' and `Fkey_binding'. + +2006-09-15 Juanma Barranquero <lekktu@gmail.com> + + * indent.c (Fcurrent_column, Findent_to): Fix typos in docstring. + +2006-09-14 Andreas Schwab <schwab@suse.de> + + * print.c: Whitespace fixup. + +2006-09-14 Kim F. Storm <storm@cua.dk> + + * xdisp.c (produce_image_glyph): Automatically crop wide images at + right window edge so we can draw the cursor on the same row to + avoid confusing redisplay by placing the cursor outside the visible + window area. + +2006-09-13 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * xterm.c (x_initialize): Don't install Xt event timer here. + (x_timeout_atimer_activated_flag): New var. + (x_activate_timeout_atimer): New function to install Xt timer. + (x_send_scroll_bar_event, x_process_timeouts): Use it. + + * xmenu.c (x_menu_set_in_use, popup_activate_callback) + (create_and_show_popup_menu, create_and_show_dialog): Use it. + + * xterm.h (x_activate_timeout_atimer): Add prototype. + +2006-09-13 Richard Stallman <rms@gnu.org> + + * print.c (print_string): When printcharfun is t, + copy string contents and call strout on the copy. + + * keyboard.c (read_char): If end_time specified, don't put the + event into this_command_keys. + (read_key_sequence): If Voverriding_terminal_local_map is specified, + don't check Voverriding_local_map at all. + +2006-09-12 Stefan Monnier <monnier@iro.umontreal.ca> + + * textprop.c (Fnext_property_change, Fnext_single_property_change) + (Fprevious_property_change, Fprevious_single_property_change): + Avoid changing limit, so we can correctly catch the case where the + property is constant up to limit. + +2006-09-12 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * macfns.c (mac_window) [MAC_OS_X_VERSION_MAX_ALLOWED >= 1030]: + * macterm.c (XTread_socket) [MAC_OS_X_VERSION_MAX_ALLOWED >= 1030]: + Undo 2006-09-08 change. + +2006-09-11 Chong Yidong <cyd@stupidchicken.com> + + * keymap.c (Fkey_binding): Use string position for string objects. + +2006-09-11 Kim F. Storm <storm@cua.dk> + + * keymap.c (Fkey_binding): Fix last change. + + * editfns.c (Fmessage): Recommend using (message "%s" ...). + +2006-09-10 Chong Yidong <cyd@stupidchicken.com> + + * keymap.c (Fkey_binding): Check for local keymap for mouse click + events. + +2006-09-10 Kim F. Storm <storm@cua.dk> + + * keyboard.c (Finput_pending_p): Check Vunread_input_method_events + and Vunread_post_input_method_events. + + * dispnew.c (Fredisplay): Document return value. + +2006-09-10 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * xfns.c (Fx_close_connection): Call xg_display_close when USE_GTK. + + * gtkutil.c (xg_display_close): Always change default display if needed, + check for < Gtk+ version 2.10 before calling gdk_display_close. + +2006-09-10 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * mac.c [MAC_OSX] (sys_select): Check argument `nfds' more rigidly. + Make variable `ofds' static. Remove variable `maxfd'. + + * macfns.c (Fx_file_dialog): Remove unused variable `f'. + Call check_mac. + + * macmenu.c (Vmenu_updating_frame, syms_of_macmenu): + * w32menu.c (Vmenu_updating_frame, syms_of_w32menu): + Apply 2006-09-08 change for xmenu.c. + + * xfns.c (Fx_file_dialog): Call check_x. + +2006-09-10 Kim F. Storm <storm@cua.dk> + + * xdisp.c (get_window_cursor_type): Use hollow cursor on + non-transparent images. + +2006-09-09 Eli Zaretskii <eliz@gnu.org> + + * editfns.c (Fsystem_name): Mention "host" in the doc string. + (syms_of_editfns) <system-name>: Likewise. + +2006-08-27 Martin Rudalics <rudalics@gmx.at> + + * xdisp.c (mouse_autoselect_window): Remove. + (Vmouse_autoselect_window): New variable. DEFVAR_LISP it. + + * dispextern.h (mouse_autoselect_window): Remove extern. + (Vmouse_autoselect_window): Add extern. + + * macterm.c (XTread_socket): Test Vmouse_autoselect_window + instead of mouse_autoselect_window. + + * msdos.c (dos_rawgetc): Likewise. + + * w32term.c (w32_read_socket): Likewise. + + * xterm.c (handle_one_xevent): Likewise. + +2006-09-08 Richard Stallman <rms@gnu.org> + + * xdisp.c (Vmenu_updating_frame): Define here. + (syms_of_xdisp): DEFVAR it here. + (update_menu_bar): Always return hooks_run. + Set Vmenu_updating_frame. + + * xdisp.c (redisplay_internal): Test Vinhibit_redisplay + before calculating SELECTED_FRAME. + + * xmenu.c (Vmenu_updating_frame): Don't define here. + (syms_of_xmenu): Don't DEFVAR it here. + + * xterm.c (x_error_quitter): For BadName error, just return. + + * eval.c (find_handler_clause): Give up on debugger if INPUT_BLOCKED_P. + + * casetab.c (init_casetab_once): Call set_case_table. + + * emacs.c (shut_down_emacs): Set inhibit_sentinels. + + * process.c (inhibit_sentinels): New variable. + (exec_sentinel): Test inhibit_sentinels. + (init_process): Initialize it. + + * process.h (inhibit_sentinels): Add decl. + + * search.c (looking_at_1, string_match_1, search_command): + Make syntax table's canon table point to eqv table. + +2006-09-08 Andreas Schwab <schwab@suse.de> + + * print.c (strout): Fix whitespace. + +2006-09-08 Kim F. Storm <storm@cua.dk> + + * xterm.c (x_draw_glyph_string): Fix 2006-08-24 change. + +2006-09-08 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * mac.c [!MAC_OSX]: Don't include keyboard.h. + [!MAC_OSX] (select): Try detect_input_pending before ReceiveNextEvent + in the same BLOCK_INPUT block, in case that some input has already + been read asynchronously. Pretend to be interrupted by a signal + if some input is available. + [MAC_OSX] (select_and_poll_event, sys_select): Likewise. + (SELECT_POLLING_PERIOD_USEC) [SELECT_USE_CFSOCKET]: Change to 100000. + Now used for ReceiveNextEvent timeout instead of select timeout. + (EVENT_CLASS_SOCK) [SELECT_USE_CFSOCKET]: Remove macro. + [SELECT_USE_CFSOCKET] (socket_callback): Add non-blocking connect + support. Quit event loop. + [MAC_OSX] (sys_select) [SELECT_USE_CFSOCKET]: Add non-blocking + connect support. Reuse previously allocated CFRunLoopSource. + (Fmac_process_hi_command) [TARGET_API_MAC_CARBON]: New function. + (syms_of_mac) [TARGET_API_MAC_CARBON]: Defsubr it. + + * macfns.c (mac_window) [MAC_OS_X_VERSION_MAX_ALLOWED >= 1030]: + Specify kWindowAsyncDragAttribute. + + * macterm.c (mac_handle_origin_change, mac_handle_size_change) + (mac_get_ideal_size): New functions. + (x_set_offset, x_set_window_size, x_make_frame_visible) + (do_zoom_window, mac_handle_window_event, XTread_socket): Use them. + (install_window_handler, mac_handle_window_event) + [USE_CARBON_EVENTS]: Handle kEventWindowGetIdealSize and + kEventWindowBoundsChanged. + (XTread_socket) [MAC_OS_X_VERSION_MAX_ALLOWED >= 1030]: Don't call + DragWindow. + +2006-09-07 Andreas Schwab <schwab@suse.de> + + * m/ibms390x.h (START_FILES, LIB_STANDARD): Override to + use lib64 instead of lib. + +2006-09-06 Stefan Monnier <monnier@iro.umontreal.ca> + + * Makefile.in: Avoid double quotes when possible. + +2006-09-06 Kenichi Handa <handa@m17n.org> + + * editfns.c (Fformat_time_string): Use make_unibyte_string to make + a Lisp string from the result of emacs_memftimeu call. + +2006-09-06 Kim F. Storm <storm@cua.dk> + + * xdisp.c (pos_visible_p): Remove exact_mode_line_heights_p arg; + so calculate heights even when pos-visible-in-window-p is called + with partially = t. Don't overshoot last_visible_y in move_it_to. + Return row height and row number in new rowh and vpos args. + (cursor_row_fully_visible_p): First line is always "fully visible". + (try_window): Don't clear matrix if vscrolled. + + * lisp.h (pos_visible_p): Update prototype. + + * window.c (Fpos_visible_in_window_p): Adapt to new pos_visible_p. + Return row height and row number for partially visible rows. + Modify return value to a 2 element list for fully visible rows and + 6 for partially visible row. + (window_scroll_pixel_based): Use pos_visible_p directly instead of + Fpos_visible_in_window_p. Fix auto vscrolling for partially + visible lines. Only vscroll backwards if already vscrolled + forwards. Unconditionally vscroll forwards if PT is first (and + only) line. Set new window start instead of scrolling at + start/end of tall line. + +2006-09-05 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * macterm.c (install_window_handler, mac_handle_window_event) + [USE_CARBON_EVENTS]: Handle kEventWindowClose. + [USE_MAC_TSM] (mac_handle_text_input_event): Set modifiers for + ASCII keystroke event. + +2006-09-04 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * gtkutil.c (xg_get_file_with_chooser): Don't mention specific keys in + the file chooser message. Only call gtk_file_chooser_set_current_name + when action is SAVE. + +2006-09-04 Andreas Schwab <schwab@suse.de> + + * Makefile.in: Double all single and back quotes in C-style + comments to help fontifier. + +2006-09-03 Jason Rumney <jasonr@gnu.org> + + * w32.c (shutdown_handler): New function to exit cleanly on shutdown. + (globals_of_w32): Register it as a signal handler. + +2006-09-02 Juri Linkov <juri@jurta.org> + + * marker.c (Fmarker_position): Doc fix. + +2006-09-03 Eli Zaretskii <eliz@gnu.org> + + * window.c (syms_of_window) <split-height-threshold>: + <window-min-height, window-min-width>: Doc fix. + +2006-09-02 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * gtkutil.c (xg_get_file_with_chooser): Change file chooser message + for writing files. Call gtk_file_chooser_set_current_name to keep + default filename. + + * minibuf.c (Finternal_complete_buffer): Move after DEFUN:s it calls + +2006-09-02 Jindrich Makovicka <makovick@gmail.com> (tiny change) + + * fns.c (concat) [__GNUC__]: Declare with + `__attribute__((noinline))'. + + * eval.c (apply1, call2) [__GNUC__]: Declare with + `__attribute__((noinline))'. + +2006-09-02 Stuart D. Herring <herring@lanl.gov> + + * minibuf.c (Finternal_complete_buffer): New function. + (syms_of_minibuf): Defsubr it. + (Fread_buffer): Use it, instead of Vbuffer_alist. + +2006-09-01 Martin Rudalics <rudalics@gmx.at> + + * buffer.h (struct buffer_text): New field chars_modiff. + (CHARS_MODIFF, BUF_CHARS_MODIFF): New macros. + * buffer.c (Fbuffer_chars_modified_tick): New function returning + value of BUF_CHARS_MODIFF. + (syms_of_buffer): Defsubr it. + (Fget_buffer_create): Initialize BUF_CHARS_MODIFF. + * insdel.c (modify_region): New argument preserve_chars_modiff. + Set CHARS_MODIFF to MODIFF provided preserve_chars_modiff is zero. + (insert_1_both, insert_from_string_1, insert_from_buffer_1) + (adjust_after_replace, adjust_after_replace_noundo) + (replace_range, replace_range_2, del_range_2): Reset CHARS_MODIFF. + * lisp.h (modify_region): Add fourth argument in extern. + * casefiddle.c (casify_region): Call modify_region with fourth + argument zero to assert that CHARS_MODIFF is updated. + * editfns.c (Fsubst_char_in_region, Ftranslate_region_internal) + (Ftranspose_regions): Likewise. + * textprop.c (Fadd_text_properties, Fset_text_properties) + (Fremove_text_properties, Fremove_list_of_text_properties): + Call modify_region with fourth argument 1 to avoid that + CHARS_MODIFF is updated. + +2006-08-31 Richard Stallman <rms@gnu.org> + + * editfns.c (Fformat): Don't sign-extend for %o or %x. + +2006-08-29 Chong Yidong <cyd@stupidchicken.com> + + * indent.c (Fvertical_motion): Don't move back if we were + displaying a Lisp string, either. + +2006-08-28 Kim F. Storm <storm@cua.dk> + + * xdisp.c (get_window_cursor_type) [!HAVE_WINDOW_SYSTEM]: + Don't attempt to replace cursor on image glyphs. + +2006-08-28 Kenichi Handa <handa@m17n.org> + + * coding.c (Fdetect_coding_region, Fdetect_coding_string): Fix + docstring about ISO-2022 control characters. + +2006-08-28 Kim F. Storm <storm@cua.dk> + + * xdisp.c (get_window_cursor_type): Replace BOX cursor on images + with a hollow box cursor if image is larger than 32x32 (or the default + frame font if that is bigger). Replace any other cursor on images + with hollow box cursor, as redisplay doesn't support bar and hbar + cursors on images. + 2006-08-27 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> * alloc.c (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Undo previous @@ -18,11 +687,11 @@ * mac.c (create_apple_event_from_event_ref, select) (Fmac_get_file_creator, Fmac_get_file_type, Fmac_set_file_creator) (Fmac_set_file_type, cfstring_create_normalized) - (mac_get_system_locale, select_and_poll_event, sys_select): Use - OSStatus instead of OSErr. - - * macfns.c [TARGET_API_MAC_CARBON] (mac_update_proxy_icon): Don't - use FRAME_FILE_NAME. Use (FS)UpdateAlias. + (mac_get_system_locale, select_and_poll_event, sys_select): + Use OSStatus instead of OSErr. + + * macfns.c [TARGET_API_MAC_CARBON] (mac_update_proxy_icon): + Don't use FRAME_FILE_NAME. Use (FS)UpdateAlias. (Fx_create_frame): Apply 2006-07-03 for xfns.c. * macselect.c (get_scrap_from_symbol, clear_scrap, put_scrap_string) @@ -60,6 +729,10 @@ (Frename_file, Fadd_name_to_file, Fmake_symbolic_link): Simplify; remove NO_ARG_ARRAY stuff, use list2. +2006-08-25 Richard Stallman <rms@gnu.org> + + * buffer.c (Fswitch_to_buffer): Fix previous change. + 2006-08-25 Kim F. Storm <storm@cua.dk> * keyboard.c (Fcurrent_idle_time): Simplify. @@ -187,7 +860,6 @@ * xterm.c (x_term_init): Initialize dpyinfo->x_dnd_atoms* - 2006-08-10 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> * keyboard.c: Define in_sighandler. @@ -381,7 +1053,7 @@ (FletX, Flet, grow_specpdl): Use signal_error. (Feval, Ffuncall, funcall_lambda): Use xsignal1, xsignal2. - * alloc.c (buffer_memory_full, memory_full): Use xsignal. Remove loop. + * alloc.c (buffer_memory_full, memory_full): Use xsignal. Remove loop. (list1): New function. * lisp.h (list1): Add EXFUN. @@ -888,7 +1560,7 @@ (x_set_offset, x_check_fullscreen): Extensive changes to make frame positioning deterministic under X. - * xterm.h (x_output): Added members left_before_move and + * xterm.h (x_output): Add members left_before_move and top_before_move. Removed members expected_left and expected_top. 2006-06-16 Kim F. Storm <storm@cua.dk> @@ -1423,13 +2095,13 @@ 2006-05-18 Kim F. Storm <storm@cua.dk> - * xdisp.c (display_tool_bar_line): Restore entire tool-bar geometry when - backtracking in case last image doesn't fit on line. + * xdisp.c (display_tool_bar_line): Restore entire tool-bar + geometry when backtracking in case last image doesn't fit on line. 2006-05-18 MIYOSHI Masanori <miyoshi@meadowy.org> (tiny change) - * xdisp.c (display_tool_bar_line): Don't adjust tool-bar height by more than - height of one frame default line. + * xdisp.c (display_tool_bar_line): Don't adjust tool-bar height by + more than height of one frame default line. 2006-05-17 Richard Stallman <rms@gnu.org> @@ -2229,10 +2901,11 @@ * term.c: Define aliases for append_glyph and produce_stretch_glyph when `static' is defined to avoid name clash with those in xdisp.c. - * process.c (Faccept_process_output): Fix to comply with lisp reference. - Change arg "timeout" to "seconds" and allow both integer and float value. - Change arg "timeout-msec" to "millisec" and interpret" as milliseconds - rather than microseconds. Fix doc string accordingly. + * process.c (Faccept_process_output): Fix to comply with lisp + reference. Change arg "timeout" to "seconds" and allow both + integer and float value. Change arg "timeout-msec" to "millisec" + and interpret" as milliseconds rather than microseconds. Fix doc + string accordingly. 2006-03-21 Ken Raeburn <raeburn@raeburn.org> @@ -4442,7 +5115,8 @@ * xdisp.c (pos_visible_p): Convert w->hscroll to pixels before use. (remember_mouse_glyph): Clear RECT if mouse is over an image glyph. - * keyboard.c (make_lispy_position): Adjust wx for left margin if ON_TEXT. + * keyboard.c (make_lispy_position): Adjust wx for left margin if + ON_TEXT. (Fposn_at_x_y): Fix calculation of x coordinate. (Fposn_at_point): Return nil if point is hscrolled out of view. @@ -9936,7 +10610,6 @@ * xterm.c (xim_destroy_callback): Ditto. - 2004-10-20 B. Anyos <banyos@freemail.hu> (tiny change) * w32term.c (x_draw_glyph_string): Use overline_color for overlines. @@ -10940,7 +11613,8 @@ * search.c (match_limit, Fmatch_data, Fset_match_data): YAILOM. - * fontset.c (Fset_fontset_font): Remove unused vars `family' and `registry'. + * fontset.c (Fset_fontset_font): Remove unused vars `family' and + `registry'. * Makefile.in (${etc}DOC): Fix file name of make-docfile. @@ -13914,11 +14588,11 @@ pointer types. (Qrelative_width, Qalign_to): Remove unused variables. (Vvoid_text_area_pointer): Replace Vshow_text_cursor_in_void. - (QCmap, QCpointer, Qrect, Qcircle, Qpoly): New variables for - image maps. - (x_y_to_hpos_vpos): Return glyph relative coordinates through - new dx and dy args. - Remove buffer_only_p arg (always 0). Simplify code accordingly. + (QCmap, QCpointer, Qrect, Qcircle, Qpoly): New variables for image + maps. + (x_y_to_hpos_vpos): Return glyph relative coordinates through new + dx and dy args. Remove buffer_only_p arg (always 0). Simplify + code accordingly. (get_glyph_string_clip_rect): Draw cursor using glyph's rather than row's ascent and height, to get sensible height on tall rows. (build_desired_tool_bar_string): Remove Qimage extern. @@ -13931,14 +14605,16 @@ rectangular, circular, or polygon-shaped image hot-spot, (find_hot_spot): New function to search for image hot-spot. (Flookup_image_map): New defun to search for image hot-spot. - (define_frame_cursor1): New aux function to determine frame pointer. - (note_mode_line_or_margin_highlight, note_mouse_highlight): - Handle `pointer' text property and :pointer image property to - control frame pointer shape. Detect image hot-spots for pointer - and help_echo properties. Use define_frame_cursor1. - (note_mouse_highlight): Use Vvoid_text_area_pointer. - (syms_of_xdisp): Defsubr new defun. Intern and staticpro new variables. - DEFVAR_LISP Vvoid_text_area_pointer instead of Vshow_text_cursor_in_void. + (define_frame_cursor1): New aux function to determine frame + pointer. + (note_mode_line_or_margin_highlight, note_mouse_highlight): Handle + `pointer' text property and :pointer image property to control + frame pointer shape. Detect image hot-spots for pointer and + help_echo properties. Use define_frame_cursor1. + (note_mouse_highlight): Use Vvoid_text_area_pointer. + (syms_of_xdisp): Defsubr new defun. Intern and staticpro new + variables. DEFVAR_LISP Vvoid_text_area_pointer instead of + Vshow_text_cursor_in_void. * xfaces.c (cache_face): Abort if c->size exceeds MAX_FACE_ID. @@ -14422,8 +15098,8 @@ * alloc.c (lisp_align_malloc): If BASE is 0, call memory_full. * window.c (Fset_window_margins): Allow only integers as args. - (syms_of_window) <special-display-buffer-names, special-display-regexps>: - Doc fixes. + (syms_of_window) <special-display-buffer-names, + special-display-regexps>: Doc fixes. 2003-10-13 Lute Kamstra <lute@gnu.org> @@ -18423,6 +19099,14 @@ * Makefile.in (fns.o): Depend on coding.h. +2003-01-06 Dave Love <fx@gnu.org> + + * fns.c: Include coding.h. Use POINTER_TYPE*, not void*. + (Vlocale_coding_system): Declare. + (Qcodeset, Qdays, Qmonths, Qpaper): New. + (Flanginfo): New. + (syms_of_fns): Initialize new stuff. + 2003-01-07 Markus Rost <rost@math.ohio-state.edu> * minibuf.c (Fread_variable): Doc fix. @@ -22226,15 +22910,15 @@ * process.c (Qlocal, QCname, QCbuffer, QChost, QCservice, QCfamily) (QClocal, QCremote, QCserver, QCdatagram, QCnowait, QCnoquery, QCstop) - (QCcoding, QCoptions, QCfilter, QCsentinel, QClog, QCfeature): - New variables. + (QCcoding, QCoptions, QCfilter, QCsentinel, QClog, QCfeature): New + variables. (NETCONN1_P): New macro. (DATAGRAM_SOCKETS): New conditional symbol. (datagram_address): New array. (DATAGRAM_CONN_P, DATAGRAM_CHAN_P): New macros. (status_message): Use concat3. - (Fprocess_status): Add `listen' status to doc string. Return `stop' - for a stopped network process. + (Fprocess_status): Add `listen' status to doc string. Return + `stop' for a stopped network process. (Fset_process_buffer): Update contact plist for network process. (Fset_process_filter): Ditto. Don't enable input for stopped network processes. Server must listen, even if filter is t. @@ -22244,26 +22928,29 @@ (Fprocess_contact): Added KEY argument. Handle datagrams. (list_processes_1): Optionally show only processes with the query on exit flag set. Dynamically adjust column widths. Omit tty - column if not needed. Report stopped network processes. - Identify server and datagram network processes. + column if not needed. Report stopped network processes. Identify + server and datagram network processes. (Flist_processes): New optional arg `query-only'. (conv_sockaddr_to_lisp, get_lisp_to_sockaddr_size) (conv_lisp_to_sockaddr, set_socket_options) - (network_process_featurep, unwind_request_sigio): New helper functions. + (network_process_featurep, unwind_request_sigio): New helper + functions. (Fprocess_datagram_address, Fset_process_datagram_address): (Fset_network_process_options): New lisp functions. (Fopen_network_stream): Removed. Now defined in simple.el. - (Fmake_network_process): New lisp function. Code is based on previous - Fopen_network_stream, but heavily reworked with new property list based - argument list, support for datagrams, server processes, and local - sockets in addition to old client-only functionality. + (Fmake_network_process): New lisp function. Code is based on + previous Fopen_network_stream, but heavily reworked with new + property list based argument list, support for datagrams, server + processes, and local sockets in addition to old client-only + functionality. (server_accept_connection): New function. (wait_reading_process_input): Use it to handle incoming connects. Do not enable input on a new connection if process is stopped. - (read_process_output): Handle datagram sockets. Use 2k buffer for them. + (read_process_output): Handle datagram sockets. Use 2k buffer for + them. (send_process): Handle datagram sockets. - (Fstop_process, Fcontinue_process): Apply to network processes. A stopped - network process is indicated by setting command field to t . + (Fstop_process, Fcontinue_process): Apply to network processes. A + stopped network process is indicated by setting command field to t. (Fprocess_send_eof): No-op if datagram connection. (Fstatus_notify): Don't read input for a stream server socket or a stopped network process.
--- a/src/Makefile.in Sat Oct 14 16:56:21 2006 +0000 +++ b/src/Makefile.in Sat Oct 14 17:36:28 2006 +0000 @@ -74,13 +74,13 @@ #define NOT_C_CODE #include "config.h" -/* We won't really call alloca; - don't let the file name alloca.c get messed up. */ +/* We will not really call alloca; + do not let the file name alloca.c get messed up. */ #ifdef alloca #undef alloca #endif -/* Don't let the file name mktime.c get messed up. */ +/* Do not let the file name mktime.c get messed up. */ #ifdef mktime #undef mktime #endif @@ -95,7 +95,7 @@ #endif /* On some machines #define register is done in config; - don't let it interfere with this file. */ + do not let it interfere with this file. */ #undef register /* On some systems we may not be able to use the system make command. */ @@ -115,7 +115,7 @@ #endif #endif -/* Some machines don't find the standard C libraries in the usual place. */ +/* Some machines do not find the standard C libraries in the usual place. */ #ifndef ORDINARY_LINK #ifndef LIB_STANDARD #define LIB_STANDARD -lc @@ -247,7 +247,7 @@ #endif /* not ORDINARY_LINK */ -/* cc switches needed to make `asm' keyword work. +/* cc switches needed to make ``asm'' keyword work. Nothing special needed on most machines. */ #ifndef C_SWITCH_ASM #define C_SWITCH_ASM @@ -276,7 +276,7 @@ for use in Emacs. -DHAVE_CONFIG_H is needed for some other files to take advantage of - the information in `config.h'. */ + the information in ``config.h''. */ /* C_SWITCH_X_SITE must come before C_SWITCH_X_MACHINE and C_SWITCH_X_SYSTEM since it may have -I options that should override those two. */ @@ -336,7 +336,7 @@ #else /* not HAVE_MENUS */ -/* Otherwise, don't worry about the menu library at all. */ +/* Otherwise, do not worry about the menu library at all. */ LIBXMENU= #endif /* not HAVE_MENUS */ @@ -380,7 +380,7 @@ #ifdef LIBXT_STATIC /* We assume the config files have defined STATIC_OPTION since that might depend on the operating system. - (Don't forget you need different definitions with and without __GNUC__.) */ + (Do not forget you need different definitions with and without __GNUC__.) */ LIBXT= STATIC_OPTION $(LIBW) LIBXMU -lXt $(LIBXTR6) -lXext DYNAMIC_OPTION #else /* not LIBXT_STATIC */ LIBXT= $(LIBW) LIBXMU -lXt $(LIBXTR6) -lXext @@ -468,9 +468,9 @@ /* Versions of GCC >= 2.0 put their library, libgcc.a, in obscure places that are difficult to figure out at make time. Fortunately, these same versions allow you to pass arbitrary flags on to the - linker, so there's no reason not to use it as a linker. + linker, so there is no reason not to use it as a linker. - Well, it's not quite perfect. The `-nostdlib' keeps GCC from + Well, it is not quite perfect. The "-nostdlib" keeps GCC from searching for libraries in its internal directories, so we have to ask GCC explicitly where to find libgcc.a. */ @@ -487,9 +487,9 @@ #ifndef LINKER_WAS_SPECIFIED /* GCC passes any argument prefixed with -Xlinker directly to the - linker. See prefix-args.c for an explanation of why we don't do - this with the shell's `for' construct. - Note that some people don't have '.' in their paths, so we must + linker. See prefix-args.c for an explanation of why we do not do + this with the shell''s ``for'' construct. + Note that some people do not have '.' in their paths, so we must use ./prefix-args. */ #define YMF_PASS_LDFLAGS(flags) `./prefix-args -Xlinker flags` #else @@ -530,12 +530,12 @@ #endif /* not ORDINARY_LINK */ /* Flags to pass to LD only for temacs. */ -/* Don't split this line with a backslash. That can cause trouble with +/* Do not split this line with a backslash. That can cause trouble with some cpps. */ TEMACS_LDFLAGS = LD_SWITCH_SYSTEM LD_SWITCH_SYSTEM_TEMACS LD_SWITCH_MACHINE LD_SWITCH_MACHINE_TEMACS LD_SWITCH_SITE /* A macro which other sections of Makefile can redefine to munge the - flags before they're passed to LD. This is helpful if you have + flags before they are passed to LD. This is helpful if you have redefined LD to something odd, like "gcc". (The YMF prefix is a holdover from the old name "ymakefile".) */ @@ -705,8 +705,8 @@ #define TOOLTIP_SUPPORT #endif -/* List of Lisp files loaded into the dumped Emacs. It's arranged - like this because it's easier to generate it semi-mechanically from +/* List of Lisp files loaded into the dumped Emacs. It is arranged + like this because it is easier to generate it semi-mechanically from loadup.el this way. Note that this list should not include lisp files which might not @@ -913,7 +913,7 @@ We must unconditionally put them in the DOC file. We use ../lisp/ to start the file names to reduce the size of the argument list for make-docfile - for the sake of systems which can\'t handle large ones. */ + for the sake of systems which can''t handle large ones. */ SOME_MACHINE_LISP = ${dotdot}/lisp/mouse.elc \ ${dotdot}/lisp/select.elc ${dotdot}/lisp/scroll-bar.elc \ ${dotdot}/lisp/vmsproc.elc ${dotdot}/lisp/vms-patch.elc \ @@ -993,13 +993,13 @@ -o temacs ${STARTFILES} ${obj} ${otherobj} \ OBJECTS_MACHINE ${LIBES} -/* We don't use ALL_LDFLAGS because LD_SWITCH_SYSTEM and LD_SWITCH_MACHINE - often contain options that have to do with using Emacs's crt0, +/* We do not use ALL_LDFLAGS because LD_SWITCH_SYSTEM and LD_SWITCH_MACHINE + often contain options that have to do with using Emacs''s crt0, which are only good with temacs. */ prefix-args${EXEEXT}: prefix-args.c $(config_h) $(CC) $(ALL_CFLAGS) $(LDFLAGS) ${srcdir}/prefix-args.c -o prefix-args -/* Don't lose if this was not defined. */ +/* Do not lose if this was not defined. */ #ifndef OLDXMENU_OPTIONS #define OLDXMENU_OPTIONS #endif @@ -1062,7 +1062,7 @@ #endif /* not USE_X_TOOLKIT */ #else /* not (HAVE_X_WINDOWS && HAVE_X11 && HAVE_MENUS && ! HAVE_GTK) */ -/* We don\'t really need this, but satisfy the dependency. */ +/* We don''t really need this, but satisfy the dependency. */ stamp-oldxmenu: touch stamp-oldxmenu #endif /* not (HAVE_X_WINDOWS && HAVE_X11 && HAVE_MENUS && ! HAVE_GTK) */ @@ -1152,7 +1152,8 @@ systime.h dispextern.h syntax.h $(INTERVAL_SRC) blockinput.h \ atimer.h xterm.h puresize.h msdos.h keymap.h w32term.h macterm.h $(config_h) keymap.o: keymap.c buffer.h commands.h keyboard.h termhooks.h blockinput.h \ - atimer.h systime.h puresize.h charset.h intervals.h $(config_h) + atimer.h systime.h puresize.h charset.h intervals.h keymap.h window.h \ + $(config_h) lastfile.o: lastfile.c $(config_h) macros.o: macros.c window.h buffer.h commands.h macros.h keyboard.h \ dispextern.h $(config_h)
--- a/src/buffer.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/buffer.c Sat Oct 14 17:36:28 2006 +0000 @@ -387,6 +387,7 @@ BUF_ZV_BYTE (b) = BEG_BYTE; BUF_Z_BYTE (b) = BEG_BYTE; BUF_MODIFF (b) = 1; + BUF_CHARS_MODIFF (b) = 1; BUF_OVERLAY_MODIFF (b) = 1; BUF_SAVE_MODIFF (b) = 1; BUF_INTERVALS (b) = 0; @@ -1161,6 +1162,31 @@ return make_number (BUF_MODIFF (buf)); } + +DEFUN ("buffer-chars-modified-tick", Fbuffer_chars_modified_tick, + Sbuffer_chars_modified_tick, 0, 1, 0, + doc: /* Return BUFFER's character-change tick counter. +Each buffer has a character-change tick counter, which is set to the +value of the buffer's tick counter \(see `buffer-modified-tick'), each +time text in that buffer is inserted or deleted. By comparing the +values returned by two individual calls of `buffer-chars-modified-tick', +you can tell whether a character change occurred in that buffer in +between these calls. No argument or nil as argument means use current +buffer as BUFFER. */) + (buffer) + register Lisp_Object buffer; +{ + register struct buffer *buf; + if (NILP (buffer)) + buf = current_buffer; + else + { + CHECK_BUFFER (buffer); + buf = XBUFFER (buffer); + } + + return make_number (BUF_CHARS_MODIFF (buf)); +} DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 2, "sRename buffer (to new name): \nP", @@ -5495,7 +5521,7 @@ or print Bottom or All. %n -- print Narrow if appropriate. %t -- visited file is text or binary (if OS supports this distinction). - %z -- print mnemonics of buffer, terminal, and keyboard coding systems. + %z -- print mnemonics of keyboard, terminal, and buffer coding systems. %Z -- like %z, but including the end-of-line format. %e -- print error message about full memory. %[ -- print one [ for each recursive editing level. %] similar. @@ -6074,6 +6100,7 @@ defsubr (&Sbuffer_modified_p); defsubr (&Sset_buffer_modified_p); defsubr (&Sbuffer_modified_tick); + defsubr (&Sbuffer_chars_modified_tick); defsubr (&Srename_buffer); defsubr (&Sother_buffer); defsubr (&Sbuffer_enable_undo);
--- a/src/buffer.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/buffer.h Sat Oct 14 17:36:28 2006 +0000 @@ -82,6 +82,9 @@ /* Modification count. */ #define MODIFF (current_buffer->text->modiff) +/* Character modification count. */ +#define CHARS_MODIFF (current_buffer->text->chars_modiff) + /* Overlay modification count. */ #define OVERLAY_MODIFF (current_buffer->text->overlay_modiff) @@ -147,6 +150,9 @@ /* Modification count. */ #define BUF_MODIFF(buf) ((buf)->text->modiff) +/* Character modification count. */ +#define BUF_CHARS_MODIFF(buf) ((buf)->text->chars_modiff) + /* Modification count as of last visit or save. */ #define BUF_SAVE_MODIFF(buf) ((buf)->text->save_modiff) @@ -406,6 +412,10 @@ for this buffer. It is incremented for each such event, and never otherwise changed. */ + int chars_modiff; /* This is modified with character change + events for this buffer. It is set to + modiff for each such event, and never + otherwise changed. */ int save_modiff; /* Previous value of modiff, as of last time buffer visited or saved a file. */
--- a/src/callint.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/callint.c Sat Oct 14 17:36:28 2006 +0000 @@ -257,9 +257,11 @@ Optional second arg RECORD-FLAG non-nil means unconditionally put this command in the command-history. Otherwise, this is done only if an arg is read using the minibuffer. + Optional third arg KEYS, if given, specifies the sequence of events to -supply if the command inquires which events were used to invoke it. -If KEYS is omitted or nil, the return value of `this-command-keys' is used. */) +supply, as a vector, if the command inquires which events were used to +invoke it. If KEYS is omitted or nil, the return value of +`this-command-keys-vector' is used. */) (function, record_flag, keys) Lisp_Object function, record_flag, keys; {
--- a/src/casefiddle.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/casefiddle.c Sat Oct 14 17:36:28 2006 +0000 @@ -187,7 +187,7 @@ validate_region (&b, &e); start = XFASTINT (b); end = XFASTINT (e); - modify_region (current_buffer, start, end); + modify_region (current_buffer, start, end, 0); record_change (start, end - start); start_byte = CHAR_TO_BYTE (start); end_byte = CHAR_TO_BYTE (end);
--- a/src/casetab.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/casetab.c Sat Oct 14 17:36:28 2006 +0000 @@ -262,6 +262,9 @@ : i))); XCHAR_TABLE (down)->extras[2] = Fcopy_sequence (up); + + /* Fill in what isn't filled in. */ + set_case_table (down, 1); } void
--- a/src/charset.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/charset.h Sat Oct 14 17:36:28 2006 +0000 @@ -658,22 +658,34 @@ } while (0) -/* If P is after LIMIT, advance P to the previous character boundary. - It assumes that P is already at a character boundary of the sane - mulitbyte form whose beginning address is LIMIT. */ +/* If P is after LIMIT, advance P to the previous character boundary. */ #define PREV_CHAR_BOUNDARY(p, limit) \ do { \ if ((p) > (limit)) \ { \ const unsigned char *p0 = (p); \ + const unsigned char *p_limit = max (limit, p0 - MAX_MULTIBYTE_LENGTH);\ do { \ p0--; \ - } while (p0 >= limit && ! CHAR_HEAD_P (*p0)); \ - (p) = (BYTES_BY_CHAR_HEAD (*p0) == (p) - p0) ? p0 : (p) - 1; \ + } while (p0 >= p_limit && ! CHAR_HEAD_P (*p0)); \ + /* If BBCH(*p0) > p-p0, it means we were not on a boundary. */ \ + (p) = (BYTES_BY_CHAR_HEAD (*p0) >= (p) - p0) ? p0 : (p) - 1; \ } \ } while (0) +#define AT_CHAR_BOUNDARY_P(result, p, limit) \ + do { \ + if (CHAR_HEAD_P (*(p)) || (p) <= limit) \ + /* Optimization for the common case. */ \ + (result) = 1; \ + else \ + { \ + const unsigned char *p_aux = (p)+1; \ + PREV_CHAR_BOUNDARY (p_aux, limit); \ + (result) = (p_aux == (p)); \ + } \ +} while (0) #ifdef emacs
--- a/src/coding.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/coding.c Sat Oct 14 17:36:28 2006 +0000 @@ -6654,7 +6654,8 @@ the coding system `undecided' is specified. The list is ordered by priority decided in the current language environment. -If only ASCII characters are found, it returns a list of single element +If only ASCII characters are found (except for such ISO-2022 control +characters ISO-2022 as ESC), it returns a list of single element `undecided' or its subsidiary coding system according to a detected end-of-line format. @@ -6701,7 +6702,8 @@ `undecided' is specified. The list is ordered by priority decided in the current language environment. -If only ASCII characters are found, it returns a list of single element +If only ASCII characters are found (except for such ISO-2022 control +characters ISO-2022 as ESC), it returns a list of single element `undecided' or its subsidiary coding system according to a detected end-of-line format.
--- a/src/dispextern.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/dispextern.h Sat Oct 14 17:36:28 2006 +0000 @@ -2679,7 +2679,7 @@ extern int help_echo_pos; extern struct frame *last_mouse_frame; extern int last_tool_bar_item; -extern int mouse_autoselect_window; +extern Lisp_Object Vmouse_autoselect_window; extern int unibyte_display_via_language_environment; extern void reseat_at_previous_visible_line_start P_ ((struct it *)); @@ -2773,6 +2773,9 @@ extern int x_create_bitmap_from_data P_ ((struct frame *, char *, unsigned int, unsigned int)); extern int x_create_bitmap_from_file P_ ((struct frame *, Lisp_Object)); +#if defined (HAVE_XPM) && defined (HAVE_X_WINDOWS) +extern int x_create_bitmap_from_xpm_data P_ ((struct frame *f, char **bits)); +#endif #ifndef x_destroy_bitmap extern void x_destroy_bitmap P_ ((struct frame *, int)); #endif
--- a/src/dispnew.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/dispnew.c Sat Oct 14 17:36:28 2006 +0000 @@ -4409,7 +4409,12 @@ || desired_row->phys_height != current_row->phys_height || desired_row->visible_height != current_row->visible_height || current_row->overlapped_p +#if 0 + /* This causes excessive flickering when mouse is moved across + the mode line. Luckily everything seems to work just fine + without doing this. KFS 2006-09-17. */ || current_row->mouse_face_p +#endif || current_row->x != desired_row->x) { rif->cursor_to (vpos, 0, desired_row->y, desired_row->x); @@ -6529,7 +6534,8 @@ /* This is just like wait_reading_process_output, except that it does redisplay. - TIMEOUT is number of seconds to wait (float or integer). + TIMEOUT is number of seconds to wait (float or integer), + or t to wait forever. READING is 1 if reading input. If DO_DISPLAY is >0 display process output while waiting. If DO_DISPLAY is >1 perform an initial redisplay before waiting. @@ -6562,10 +6568,15 @@ sec = (int) seconds; usec = (int) ((seconds - sec) * 1000000); } + else if (EQ (timeout, Qt)) + { + sec = 0; + usec = 0; + } else wrong_type_argument (Qnumberp, timeout); - if (sec == 0 && usec == 0) + if (sec == 0 && usec == 0 && !EQ (timeout, Qt)) return Qt; #ifdef SIGIO @@ -6582,7 +6593,8 @@ DEFUN ("redisplay", Fredisplay, Sredisplay, 0, 1, 0, doc: /* Perform redisplay if no input is available. If optional arg FORCE is non-nil or `redisplay-dont-pause' is non-nil, -perform a full redisplay even if input is available. */) +perform a full redisplay even if input is available. +Return t if redisplay was performed, nil otherwise. */) (force) Lisp_Object force; {
--- a/src/editfns.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/editfns.c Sat Oct 14 17:36:28 2006 +0000 @@ -1390,7 +1390,7 @@ } DEFUN ("system-name", Fsystem_name, Ssystem_name, 0, 0, 0, - doc: /* Return the name of the machine you are running on, as a string. */) + doc: /* Return the host name of the machine you are running on, as a string. */) () { return Vsystem_name; @@ -1694,7 +1694,7 @@ SBYTES (format_string), tm, ut); if ((result > 0 && result < size) || (result == 0 && buf[0] == '\0')) - return code_convert_string_norecord (make_string (buf, result), + return code_convert_string_norecord (make_unibyte_string (buf, result), Vlocale_coding_system, 0); /* If buffer was too small, make it bigger and try again. */ @@ -2781,7 +2781,7 @@ else if (!changed) { changed = -1; - modify_region (current_buffer, pos, XINT (end)); + modify_region (current_buffer, pos, XINT (end), 0); if (! NILP (noundo)) { @@ -2897,7 +2897,7 @@ pos = XINT (start); pos_byte = CHAR_TO_BYTE (pos); end_pos = XINT (end); - modify_region (current_buffer, pos, XINT (end)); + modify_region (current_buffer, pos, XINT (end), 0); cnt = 0; for (; pos < end_pos; ) @@ -3178,6 +3178,9 @@ The first argument is a format control string, and the rest are data to be formatted under control of the string. See `format' for details. +Note: Use (message "%s" VALUE) to print the value of expressions and +variables to avoid accidentally interpreting `%' as format specifiers. + If the first argument is nil or the empty string, the function clears any existing message; this lets the minibuffer contents show. See also `current-message'. @@ -3758,7 +3761,13 @@ this_format[format - this_format_start] = 0; if (INTEGERP (args[n])) - sprintf (p, this_format, XINT (args[n])); + { + if (format[-1] == 'd') + sprintf (p, this_format, XINT (args[n])); + /* Don't sign-extend for octal or hex printing. */ + else + sprintf (p, this_format, XUINT (args[n])); + } else sprintf (p, this_format, XFLOAT_DATA (args[n])); @@ -4162,7 +4171,7 @@ if (end1 == start2) /* adjacent regions */ { - modify_region (current_buffer, start1, end2); + modify_region (current_buffer, start1, end2, 0); record_change (start1, len1 + len2); tmp_interval1 = copy_intervals (cur_intv, start1, len1); @@ -4218,8 +4227,8 @@ { USE_SAFE_ALLOCA; - modify_region (current_buffer, start1, end1); - modify_region (current_buffer, start2, end2); + modify_region (current_buffer, start1, end1, 0); + modify_region (current_buffer, start2, end2, 0); record_change (start1, len1); record_change (start2, len2); tmp_interval1 = copy_intervals (cur_intv, start1, len1); @@ -4248,7 +4257,7 @@ { USE_SAFE_ALLOCA; - modify_region (current_buffer, start1, end2); + modify_region (current_buffer, start1, end2, 0); record_change (start1, (end2 - start1)); tmp_interval1 = copy_intervals (cur_intv, start1, len1); tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); @@ -4279,7 +4288,7 @@ USE_SAFE_ALLOCA; record_change (start1, (end2 - start1)); - modify_region (current_buffer, start1, end2); + modify_region (current_buffer, start1, end2, 0); tmp_interval1 = copy_intervals (cur_intv, start1, len1); tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); @@ -4364,7 +4373,7 @@ Vbuffer_access_fontified_property = Qnil; DEFVAR_LISP ("system-name", &Vsystem_name, - doc: /* The name of the machine Emacs is running on. */); + doc: /* The host name of the machine Emacs is running on. */); DEFVAR_LISP ("user-full-name", &Vuser_full_name, doc: /* The full name of the user logged in. */);
--- a/src/emacs.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/emacs.c Sat Oct 14 17:36:28 2006 +0000 @@ -2138,6 +2138,9 @@ stuff_buffered_input (stuff); +#ifdef subprocesses + inhibit_sentinels = 1; +#endif kill_buffer_processes (Qnil); Fdo_auto_save (Qt, Qnil);
--- a/src/eval.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/eval.c Sat Oct 14 17:36:28 2006 +0000 @@ -28,6 +28,10 @@ #include "dispextern.h" #include <setjmp.h> +#if HAVE_X_WINDOWS +#include "xterm.h" +#endif + /* This definition is duplicated in alloc.c and keyboard.c */ /* Putting it in lisp.h makes cc bomb out! */ @@ -199,6 +203,14 @@ static Lisp_Object funcall_lambda P_ ((Lisp_Object, int, Lisp_Object*)); static void unwind_to_catch P_ ((struct catchtag *, Lisp_Object)) NO_RETURN; + +#if __GNUC__ +/* "gcc -O3" enables automatic function inlining, which optimizes out + the arguments for the invocations of these functions, whereas they + expect these values on the stack. */ +Lisp_Object apply1 () __attribute__((noinline)); +Lisp_Object call2 () __attribute__((noinline)); +#endif void init_eval_once () @@ -1906,6 +1918,9 @@ max_specpdl_size--; } if (! no_debugger + /* Don't try to run the debugger with interrupts blocked. + The editing loop would return anyway. */ + && ! INPUT_BLOCKED_P && (EQ (sig_symbol, Qquit) ? debug_on_quit : wants_debugger (Vdebug_on_error, conditions))
--- a/src/fns.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/fns.c Sat Oct 14 17:36:28 2006 +0000 @@ -387,7 +387,12 @@ return i1 < SCHARS (s2) ? Qt : Qnil; } -static Lisp_Object concat (); +#if __GNUC__ +/* "gcc -O3" enables automatic function inlining, which optimizes out + the arguments for the invocations of this function, whereas it + expects these values on the stack. */ +static Lisp_Object concat () __attribute__((noinline)); +#endif /* ARGSUSED */ Lisp_Object @@ -1459,11 +1464,10 @@ } DEFUN ("memq", Fmemq, Smemq, 2, 2, 0, - doc: /* Return non-nil if ELT is an element of LIST. -Comparison done with `eq'. The value is actually the tail of LIST -whose car is ELT. */) +doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eq'. +The value is actually the tail of LIST whose car is ELT. */) (elt, list) - Lisp_Object elt, list; + register Lisp_Object elt, list; { while (1) { @@ -1486,6 +1490,30 @@ return list; } +DEFUN ("memql", Fmemql, Smemql, 2, 2, 0, +doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eql'. +The value is actually the tail of LIST whose car is ELT. */) + (elt, list) + register Lisp_Object elt; + Lisp_Object list; +{ + register Lisp_Object tail; + + if (!FLOATP (elt)) + return Fmemq (elt, list); + + for (tail = list; !NILP (tail); tail = XCDR (tail)) + { + register Lisp_Object tem; + CHECK_LIST_CONS (tail, list); + tem = XCAR (tail); + if (FLOATP (tem) && internal_equal (elt, tem, 0, 0)) + return tail; + QUIT; + } + return Qnil; +} + DEFUN ("assq", Fassq, Sassq, 2, 2, 0, doc: /* Return non-nil if KEY is `eq' to the car of an element of LIST. The value is actually the first element of LIST whose car is KEY. @@ -2749,7 +2777,8 @@ else from = 32, to = 128; - if (!SUB_CHAR_TABLE_P (*table)) + if (!SUB_CHAR_TABLE_P (*table) + || ! NILP (XCHAR_TABLE (*table)->defalt)) return; elt = XCHAR_TABLE (*table)->contents[from++]; for (; from < to; from++) @@ -2764,7 +2793,7 @@ Lisp_Object table; { Lisp_Object elt; - int dim; + int dim, chars; int i, j; CHECK_CHAR_TABLE (table); @@ -2775,10 +2804,11 @@ if (!SUB_CHAR_TABLE_P (elt)) continue; dim = CHARSET_DIMENSION (i - 128); + chars = CHARSET_CHARS (i - 128); if (dim == 2) for (j = 32; j < SUB_CHAR_TABLE_ORDINARY_SLOTS; j++) - optimize_sub_char_table (XCHAR_TABLE (elt)->contents + j, dim); - optimize_sub_char_table (XCHAR_TABLE (table)->contents + i, dim); + optimize_sub_char_table (XCHAR_TABLE (elt)->contents + j, chars); + optimize_sub_char_table (XCHAR_TABLE (table)->contents + i, chars); } return Qnil; } @@ -5831,6 +5861,7 @@ defsubr (&Selt); defsubr (&Smember); defsubr (&Smemq); + defsubr (&Smemql); defsubr (&Sassq); defsubr (&Sassoc); defsubr (&Srassq);
--- a/src/frame.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/frame.c Sat Oct 14 17:36:28 2006 +0000 @@ -115,6 +115,7 @@ Lisp_Object Qfullscreen, Qfullwidth, Qfullheight, Qfullboth; +Lisp_Object Qinhibit_face_set_after_frame_default; Lisp_Object Qface_set_after_frame_default; Lisp_Object Vterminal_frame; @@ -3036,12 +3037,20 @@ || EQ (prop, Qfullscreen)) { register Lisp_Object param_index, old_value; + int count = SPECPDL_INDEX (); old_value = get_frame_param (f, prop); fullscreen_is_being_set |= EQ (prop, Qfullscreen); if (NILP (Fequal (val, old_value))) { + /* For :font attributes, the frame_parm_handler + x_set_font calls `face-set-after-frame-default'. + Unless we bind inhibit-face-set-after-frame-default + here, this would reset the :font attribute that we + just applied to the default value for new faces. */ + specbind (Qinhibit_face_set_after_frame_default, Qt); + store_frame_param (f, prop, val); param_index = Fget (prop, Qx_frame_parameter); @@ -3050,6 +3059,7 @@ < sizeof (frame_parms)/sizeof (frame_parms[0])) && FRAME_RIF (f)->frame_parm_handlers[XINT (param_index)]) (*(FRAME_RIF (f)->frame_parm_handlers[XINT (param_index)])) (f, val, old_value); + unbind_to (count, Qnil); } } } @@ -4321,6 +4331,10 @@ Qface_set_after_frame_default = intern ("face-set-after-frame-default"); staticpro (&Qface_set_after_frame_default); + Qinhibit_face_set_after_frame_default + = intern ("inhibit-face-set-after-frame-default"); + staticpro (&Qinhibit_face_set_after_frame_default); + Qfullwidth = intern ("fullwidth"); staticpro (&Qfullwidth); Qfullheight = intern ("fullheight");
--- a/src/gmalloc.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/gmalloc.c Sat Oct 14 17:36:28 2006 +0000 @@ -10,17 +10,17 @@ Written May 1989 by Mike Haertel. This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as +modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. +General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If +You should have received a copy of the GNU General Public +License along with this library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -329,17 +329,17 @@ Written May 1989 by Mike Haertel. This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as +modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. +General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If +You should have received a copy of the GNU General Public +License along with this library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -932,17 +932,17 @@ Written May 1989 by Mike Haertel. This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as +modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. +General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If +You should have received a copy of the GNU General Public +License along with this library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -1251,17 +1251,17 @@ Written May 1989 by Mike Haertel. This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as +modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. +General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If +You should have received a copy of the GNU General Public +License along with this library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -1496,17 +1496,17 @@ /* Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc. This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as +modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. +General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If +You should have received a copy of the GNU General Public +License along with this library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -1593,17 +1593,17 @@ /* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc. This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as +modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. +General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If +You should have received a copy of the GNU General Public +License along with this library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ @@ -1693,17 +1693,17 @@ Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc. This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as +modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. +General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If +You should have received a copy of the GNU General Public +License along with this library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -1760,17 +1760,17 @@ Written May 1989 by Mike Haertel. This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as +modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. +General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If +You should have received a copy of the GNU General Public +License along with this library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
--- a/src/gtkutil.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/gtkutil.c Sat Oct 14 17:36:28 2006 +0000 @@ -131,14 +131,8 @@ #ifdef HAVE_GTK_MULTIDISPLAY GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (dpy); - /* GTK 2.2 has a bug that makes gdk_display_close crash (bug - http://bugzilla.gnome.org/show_bug.cgi?id=85715). This way - we can continue running, but there will be memory leaks. */ - -#if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 4 - /* If this is the default display, we must change it before calling - dispose, otherwise it will crash. */ + dispose, otherwise it will crash on some Gtk+ versions. */ if (gdk_display_get_default () == gdpy) { struct x_display_info *dpyinfo; @@ -160,10 +154,14 @@ gdpy_new); } + /* GTK 2.2-2.8 has a bug that makes gdk_display_close crash (bug + http://bugzilla.gnome.org/show_bug.cgi?id=85715). This way + we can continue running, but there will be memory leaks. */ + +#if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 10 g_object_run_dispose (G_OBJECT (gdpy)); - #else - /* I hope this will be fixed in GTK 2.4. It is what bug 85715 says. */ + /* This seems to be fixed in GTK 2.10. */ gdk_display_close (gdpy); #endif #endif /* HAVE_GTK_MULTIDISPLAY */ @@ -509,10 +507,66 @@ { char *utf8_str = str; + if (!str) return NULL; + /* If not UTF-8, try current locale. */ - if (str && !g_utf8_validate (str, -1, NULL)) + if (!g_utf8_validate (str, -1, NULL)) utf8_str = g_locale_to_utf8 (str, -1, 0, 0, 0); + if (!utf8_str) + { + /* Probably some control characters in str. Escape them. */ + size_t nr_bad = 0; + gsize bytes_read; + gsize bytes_written; + unsigned char *p = (unsigned char *)str; + char *cp, *up; + GError *error = NULL; + + while (! (cp = g_locale_to_utf8 (p, -1, &bytes_read, + &bytes_written, &error)) + && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE) + { + ++nr_bad; + p += bytes_written+1; + g_error_free (error); + error = NULL; + } + + if (error) + { + g_error_free (error); + error = NULL; + } + if (cp) g_free (cp); + + up = utf8_str = xmalloc (strlen (str) + nr_bad * 4 + 1); + p = str; + + while (! (cp = g_locale_to_utf8 (p, -1, &bytes_read, + &bytes_written, &error)) + && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE) + { + strncpy (up, p, bytes_written); + sprintf (up + bytes_written, "\\%03o", p[bytes_written]); + up[bytes_written+4] = '\0'; + up += bytes_written+4; + p += bytes_written+1; + g_error_free (error); + error = NULL; + } + + if (cp) + { + strcat (utf8_str, cp); + g_free (cp); + } + if (error) + { + g_error_free (error); + error = NULL; + } + } return utf8_str; } @@ -1158,8 +1212,8 @@ xg_uses_old_file_dialog () { #ifdef HAVE_GTK_FILE_BOTH - extern int x_use_old_gtk_file_dialog; - return x_use_old_gtk_file_dialog; + extern int x_gtk_use_old_file_dialog; + return x_gtk_use_old_file_dialog; #else /* ! HAVE_GTK_FILE_BOTH */ #ifdef HAVE_GTK_FILE_SELECTION_NEW @@ -1296,6 +1350,8 @@ GTK_FILE_CHOOSER_ACTION_OPEN : GTK_FILE_CHOOSER_ACTION_SAVE); extern int x_gtk_show_hidden_files; + extern int x_gtk_file_dialog_help_text; + if (only_dir_p) action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; @@ -1323,16 +1379,24 @@ g_signal_connect (G_OBJECT (filewin), "notify", G_CALLBACK (xg_toggle_notify_cb), wtoggle); - message[0] = '\0'; - if (action != GTK_FILE_CHOOSER_ACTION_SAVE) - strcat (message, "\nType C-l to display a file name text entry box.\n"); - strcat (message, "\nIf you don't like this file selector, customize " - "use-file-dialog\nto turn it off, or type C-x C-f to visit files."); - - wmessage = gtk_label_new (message); - gtk_widget_show (wmessage); + if (x_gtk_file_dialog_help_text) + { + message[0] = '\0'; + /* Gtk+ 2.10 has the file name text entry box integrated in the dialog. + Show the C-l help text only for versions < 2.10. */ + if (gtk_check_version (2, 10, 0) && action != GTK_FILE_CHOOSER_ACTION_SAVE) + strcat (message, "\nType C-l to display a file name text entry box.\n"); + strcat (message, "\nIf you don't like this file selector, use the " + "corresponding\nkey binding or customize " + "use-file-dialog to turn it off."); + + wmessage = gtk_label_new (message); + gtk_widget_show (wmessage); + } + gtk_box_pack_start (GTK_BOX (wbox), wtoggle, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (wbox), wmessage, FALSE, FALSE, 0); + if (x_gtk_file_dialog_help_text) + gtk_box_pack_start (GTK_BOX (wbox), wmessage, FALSE, FALSE, 0); gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (filewin), wbox); if (default_filename) @@ -1340,6 +1404,7 @@ Lisp_Object file; struct gcpro gcpro1; GCPRO1 (file); + char *utf8_filename; file = build_string (default_filename); @@ -1347,14 +1412,23 @@ an absolute name starting with /. */ if (default_filename[0] != '/') file = Fexpand_file_name (file, Qnil); - - default_filename = SSDATA (file); - if (Ffile_directory_p (file)) + + utf8_filename = SSDATA (ENCODE_UTF_8 (file)); + if (! NILP (Ffile_directory_p (file))) gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filewin), - default_filename); + utf8_filename); else - gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filewin), - default_filename); + { + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filewin), + utf8_filename); + if (action == GTK_FILE_CHOOSER_ACTION_SAVE) + { + char *cp = strrchr (utf8_filename, '/'); + if (cp) ++cp; + else cp = utf8_filename; + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filewin), cp); + } + } UNGCPRO; }
--- a/src/image.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/image.c Sat Oct 14 17:36:28 2006 +0000 @@ -3153,7 +3153,7 @@ expect_ident ("define"); expect (XBM_TK_IDENT); - if (LA1 == XBM_TK_NUMBER); + if (LA1 == XBM_TK_NUMBER) { char *p = strrchr (buffer, '_'); p = p ? p + 1 : buffer;
--- a/src/indent.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/indent.c Sat Oct 14 17:36:28 2006 +0000 @@ -337,8 +337,8 @@ doc: /* Return the horizontal position of point. Beginning of line is column 0. This is calculated by adding together the widths of all the displayed representations of the character between the start of the previous line -and point. (eg control characters will have a width of 2 or 4, tabs -will have a variable width) +and point (eg. control characters will have a width of 2 or 4, tabs +will have a variable width). Ignores finite width of frame, which means that this function may return values greater than (frame-width). Whether the line is visible (if `selective-display' is t) has no effect; @@ -736,8 +736,8 @@ DEFUN ("indent-to", Findent_to, Sindent_to, 1, 2, "NIndent to column: ", doc: /* Indent from point with tabs and spaces until COLUMN is reached. -Optional second argument MININUM says always do at least MININUM spaces -even if that goes past COLUMN; by default, MININUM is zero. */) +Optional second argument MINIMUM says always do at least MINIMUM spaces +even if that goes past COLUMN; by default, MINIMUM is zero. */) (column, minimum) Lisp_Object column, minimum; { @@ -2076,7 +2076,7 @@ { int it_start; int oselective; - int start_on_image_or_stretch_p; + int it_overshoot_expected_p; SET_TEXT_POS (pt, PT, PT_BYTE); start_display (&it, w, pt); @@ -2088,8 +2088,26 @@ while the end position is really at some X > 0, the same X that PT had. */ it_start = IT_CHARPOS (it); - start_on_image_or_stretch_p = (it.method == GET_FROM_IMAGE - || it.method == GET_FROM_STRETCH); + + /* We expect the call to move_it_to, further down, to overshoot + if the starting point is on an image, stretch glyph, or Lisp + string. We won't need to backtrack in this situation, except + for one corner case: when the Lisp string contains a + newline. */ + if (it.method == GET_FROM_STRING) + { + const char *s = SDATA (it.string); + const char *e = s + SBYTES (it.string); + + while (s < e && *s != '\n') + ++s; + + it_overshoot_expected_p = (s == e); + } + else + it_overshoot_expected_p = (it.method == GET_FROM_IMAGE + || it.method == GET_FROM_STRETCH); + reseat_at_previous_visible_line_start (&it); it.current_x = it.hpos = 0; /* Temporarily disable selective display so we don't move too far */ @@ -2100,10 +2118,9 @@ /* Move back if we got too far. This may happen if truncate-lines is on and PT is beyond right margin. - It may also happen if it_start is on an image or a stretch - glyph -- in that case, don't go back. */ + Don't go back if the overshoot is expected (see above). */ if (IT_CHARPOS (it) > it_start && XINT (lines) > 0 - && !start_on_image_or_stretch_p) + && !it_overshoot_expected_p) move_it_by_lines (&it, -1, 0); it.vpos = 0;
--- a/src/insdel.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/insdel.c Sat Oct 14 17:36:28 2006 +0000 @@ -1007,6 +1007,7 @@ will add up to the right stuff in the undo list. */ record_insert (PT, nchars); MODIFF++; + CHARS_MODIFF = MODIFF; bcopy (string, GPT_ADDR, nbytes); @@ -1144,6 +1145,7 @@ record_insert (PT, nchars); MODIFF++; + CHARS_MODIFF = MODIFF; GAP_SIZE -= outgoing_nbytes; GPT += nchars; @@ -1295,6 +1297,7 @@ record_insert (PT, nchars); MODIFF++; + CHARS_MODIFF = MODIFF; GAP_SIZE -= outgoing_nbytes; GPT += nchars; @@ -1403,6 +1406,7 @@ if (len == 0) evaporate_overlays (from); MODIFF++; + CHARS_MODIFF = MODIFF; } /* Like adjust_after_replace, but doesn't require PREV_TEXT. @@ -1453,6 +1457,7 @@ if (len == 0) evaporate_overlays (from); MODIFF++; + CHARS_MODIFF = MODIFF; } /* Record undo information, adjust markers and position keepers for an @@ -1645,6 +1650,7 @@ CHECK_MARKERS (); MODIFF++; + CHARS_MODIFF = MODIFF; UNGCPRO; signal_after_change (from, nchars_del, GPT - from); @@ -1769,6 +1775,7 @@ CHECK_MARKERS (); MODIFF++; + CHARS_MODIFF = MODIFF; } /* Delete characters in current buffer @@ -1950,6 +1957,7 @@ if (! EQ (current_buffer->undo_list, Qt)) record_delete (from, deletion); MODIFF++; + CHARS_MODIFF = MODIFF; /* Relocate point as if it were a marker. */ if (from < PT) @@ -1990,12 +1998,15 @@ character positions START to END. This checks the read-only properties of the region, calls the necessary modification hooks, and warns the next redisplay that it should pay attention to that - area. */ + area. + + If PRESERVE_CHARS_MODIFF is non-zero, do not update CHARS_MODIFF. + Otherwise set CHARS_MODIFF to the new value of MODIFF. */ void -modify_region (buffer, start, end) +modify_region (buffer, start, end, preserve_chars_modiff) struct buffer *buffer; - int start, end; + int start, end, preserve_chars_modiff; { struct buffer *old_buffer = current_buffer; @@ -2009,6 +2020,8 @@ if (MODIFF <= SAVE_MODIFF) record_first_change (); MODIFF++; + if (! preserve_chars_modiff) + CHARS_MODIFF = MODIFF; buffer->point_before_scroll = Qnil;
--- a/src/keyboard.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/keyboard.c Sat Oct 14 17:36:28 2006 +0000 @@ -1619,15 +1619,17 @@ if (minibuf_level && !NILP (echo_area_buffer[0]) - && EQ (minibuf_window, echo_area_window) - && NUMBERP (Vminibuffer_message_timeout)) + && EQ (minibuf_window, echo_area_window)) { /* Bind inhibit-quit to t so that C-g gets read in rather than quitting back to the minibuffer. */ int count = SPECPDL_INDEX (); specbind (Qinhibit_quit, Qt); - sit_for (Vminibuffer_message_timeout, 0, 2); + if (NUMBERP (Vminibuffer_message_timeout)) + sit_for (Vminibuffer_message_timeout, 0, 2); + else + sit_for (Qt, 0, 2); /* Clear the echo area. */ message2 (0, 0, 0); @@ -1747,7 +1749,7 @@ if (SYMBOLP (cmd)) { Lisp_Object cmd1; - if (cmd1 = Fcommand_remapping (cmd), !NILP (cmd1)) + if (cmd1 = Fcommand_remapping (cmd, Qnil), !NILP (cmd1)) cmd = cmd1; } @@ -3365,8 +3367,9 @@ goto retry; } - if (! reread || this_command_key_count == 0 - || this_command_key_count_reset) + if ((! reread || this_command_key_count == 0 + || this_command_key_count_reset) + && !end_time) { /* Don't echo mouse motion events. */ @@ -7700,7 +7703,7 @@ Lisp_Object prefix; if (!NILP (tem)) - tem = Fkey_binding (tem, Qnil, Qnil); + tem = Fkey_binding (tem, Qnil, Qnil, Qnil); prefix = AREF (item_properties, ITEM_PROPERTY_KEYEQ); if (CONSP (prefix)) @@ -8954,17 +8957,25 @@ the initial keymaps from the current buffer. */ nmaps = 0; - if (!NILP (current_kboard->Voverriding_terminal_local_map) - || !NILP (Voverriding_local_map)) - { - if (3 > nmaps_allocated) - { - submaps = (Lisp_Object *) alloca (3 * sizeof (submaps[0])); - defs = (Lisp_Object *) alloca (3 * sizeof (defs[0])); - nmaps_allocated = 3; + if (!NILP (current_kboard->Voverriding_terminal_local_map)) + { + if (2 > nmaps_allocated) + { + submaps = (Lisp_Object *) alloca (2 * sizeof (submaps[0])); + defs = (Lisp_Object *) alloca (2 * sizeof (defs[0])); + nmaps_allocated = 2; } if (!NILP (current_kboard->Voverriding_terminal_local_map)) submaps[nmaps++] = current_kboard->Voverriding_terminal_local_map; + } + else if (!NILP (Voverriding_local_map)) + { + if (2 > nmaps_allocated) + { + submaps = (Lisp_Object *) alloca (2 * sizeof (submaps[0])); + defs = (Lisp_Object *) alloca (2 * sizeof (defs[0])); + nmaps_allocated = 2; + } if (!NILP (Voverriding_local_map)) submaps[nmaps++] = Voverriding_local_map; } @@ -9332,16 +9343,19 @@ if (!EQ (map_here, orig_local_map)) { orig_local_map = map_here; - keybuf[t] = key; - mock_input = t + 1; - - goto replay_sequence; + ++localized_local_map; } + map_here = get_local_map (XINT (pos), current_buffer, Qkeymap); if (!EQ (map_here, orig_keymap)) { orig_keymap = map_here; + ++localized_local_map; + } + + if (localized_local_map > 1) + { keybuf[t] = key; mock_input = t + 1; @@ -10177,7 +10191,7 @@ if (NILP (echo_area_buffer[0])) waited = sit_for (make_number (0), 0, 2); else if (NUMBERP (Vsuggest_key_bindings)) - waited = sit_for (Vminibuffer_message_timeout, 0, 2); + waited = sit_for (Vsuggest_key_bindings, 0, 2); else waited = sit_for (make_number (2), 0, 2); @@ -10299,7 +10313,9 @@ if there is a doubt, the value is t. */) () { - if (!NILP (Vunread_command_events) || unread_command_char != -1) + if (!NILP (Vunread_command_events) || unread_command_char != -1 + || !NILP (Vunread_post_input_method_events) + || !NILP (Vunread_input_method_events)) return (Qt); get_input_pending (&input_pending,
--- a/src/keymap.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/keymap.c Sat Oct 14 17:36:28 2006 +0000 @@ -23,6 +23,9 @@ #include <config.h> #include <stdio.h> +#if HAVE_ALLOCA_H +# include <alloca.h> +#endif #include "lisp.h" #include "commands.h" #include "buffer.h" @@ -34,6 +37,7 @@ #include "puresize.h" #include "intervals.h" #include "keymap.h" +#include "window.h" /* The number of elements in keymap vectors. */ #define DENSE_TABLE_SIZE (0200) @@ -739,7 +743,10 @@ DEFUN ("map-keymap", Fmap_keymap, Smap_keymap, 2, 3, 0, doc: /* Call FUNCTION once for each event binding in KEYMAP. FUNCTION is called with two arguments: the event that is bound, and -the definition it is bound to. +the definition it is bound to. If the event is an integer, it may be +a generic character (see Info node `(elisp)Splitting Characters'), and +that means that all actual character events belonging to that generic +character are bound to the definition. If KEYMAP has a parent, the parent's bindings are included as well. This works recursively: if the parent has itself a parent, then the @@ -1142,7 +1149,7 @@ meta_bit = VECTORP (key) ? meta_modifier : 0x80; - if (VECTORP (def) && ASIZE (def) > 0 && CONSP (AREF (def, make_number (0)))) + if (VECTORP (def) && ASIZE (def) > 0 && CONSP (AREF (def, 0))) { /* DEF is apparently an XEmacs-style keyboard macro. */ Lisp_Object tmp = Fmake_vector (make_number (ASIZE (def)), Qnil); int i = ASIZE (def); @@ -1209,17 +1216,23 @@ /* This function may GC (it calls Fkey_binding). */ -DEFUN ("command-remapping", Fcommand_remapping, Scommand_remapping, 1, 1, 0, +DEFUN ("command-remapping", Fcommand_remapping, Scommand_remapping, 1, 2, 0, doc: /* Return the remapping for command COMMAND in current keymaps. -Returns nil if COMMAND is not remapped (or not a symbol). */) - (command) - Lisp_Object command; +Returns nil if COMMAND is not remapped (or not a symbol). + +If the optional argument POSITION is non-nil, it specifies a mouse +position as returned by `event-start' and `event-end', and the +remapping occurs in the keymaps associated with it. It can also be a +number or marker, in which case the keymap properties at the specified +buffer position instead of point are used. */) + (command, position) + Lisp_Object command, position; { if (!SYMBOLP (command)) return Qnil; ASET (command_remapping_vector, 1, command); - return Fkey_binding (command_remapping_vector, Qnil, Qt); + return Fkey_binding (command_remapping_vector, Qnil, Qt, position); } /* Value is number if KEY is too long; nil if valid but has no definition. */ @@ -1545,7 +1558,7 @@ /* GC is possible in this function if it autoloads a keymap. */ -DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 3, 0, +DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 4, 0, doc: /* Return the binding for command KEY in current keymaps. KEY is a string or vector, a sequence of keystrokes. The binding is probably a symbol with a function definition. @@ -1559,24 +1572,82 @@ Like the normal command loop, `key-binding' will remap the command resulting from looking up KEY by looking up the command in the current keymaps. However, if the optional third argument NO-REMAP -is non-nil, `key-binding' returns the unmapped command. */) - (key, accept_default, no_remap) - Lisp_Object key, accept_default, no_remap; +is non-nil, `key-binding' returns the unmapped command. + +If KEY is a key sequence initiated with the mouse, the used keymaps +will depend on the clicked mouse position with regard to the buffer +and possible local keymaps on strings. + +If the optional argument POSITION is non-nil, it specifies a mouse +position as returned by `event-start' and `event-end', and the lookup +occurs in the keymaps associated with it instead of KEY. It can also +be a number or marker, in which case the keymap properties at the +specified buffer position instead of point are used. + */) + (key, accept_default, no_remap, position) + Lisp_Object key, accept_default, no_remap, position; { Lisp_Object *maps, value; int nmaps, i; - struct gcpro gcpro1; - - GCPRO1 (key); - - if (!NILP (current_kboard->Voverriding_terminal_local_map)) + struct gcpro gcpro1, gcpro2; + int count = SPECPDL_INDEX (); + + GCPRO2 (key, position); + + if (NILP (position) && VECTORP (key)) + { + Lisp_Object event + /* mouse events may have a symbolic prefix indicating the + scrollbar or mode line */ + = AREF (key, SYMBOLP (AREF (key, 0)) && ASIZE (key) > 1 ? 1 : 0); + + /* We are not interested in locations without event data */ + + if (EVENT_HAS_PARAMETERS (event)) + { + Lisp_Object kind = EVENT_HEAD_KIND (EVENT_HEAD (event)); + if (CONSP (XCDR (event)) && EQ (kind, Qmouse_click)) + position = EVENT_START (event); + } + } + + /* Key sequences beginning with mouse clicks + are read using the keymaps of the buffer clicked on, not + the current buffer. So we may have to switch the buffer + here. */ + + if (CONSP (position)) + { + Lisp_Object window; + + window = POSN_WINDOW (position); + + if (WINDOWP (window) + && BUFFERP (XWINDOW (window)->buffer) + && XBUFFER (XWINDOW (window)->buffer) != current_buffer) + { + /* Arrange to go back to the original buffer once we're done + processing the key sequence. We don't use + save_excursion_{save,restore} here, in analogy to + `read-key-sequence' to avoid saving point. Maybe this + would not be a problem here, but it is easier to keep + things the same. + */ + + record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); + + set_buffer_internal (XBUFFER (XWINDOW (window)->buffer)); + } + } + + if (! NILP (current_kboard->Voverriding_terminal_local_map)) { value = Flookup_key (current_kboard->Voverriding_terminal_local_map, key, accept_default); if (! NILP (value) && !INTEGERP (value)) goto done; } - else if (!NILP (Voverriding_local_map)) + else if (! NILP (Voverriding_local_map)) { value = Flookup_key (Voverriding_local_map, key, accept_default); if (! NILP (value) && !INTEGERP (value)) @@ -1584,12 +1655,71 @@ } else { - Lisp_Object local; - - local = get_local_map (PT, current_buffer, Qkeymap); - if (! NILP (local)) + Lisp_Object keymap, local_map; + EMACS_INT pt; + + pt = INTEGERP (position) ? XINT (position) + : MARKERP (position) ? marker_position (position) + : PT; + + local_map = get_local_map (pt, current_buffer, Qlocal_map); + keymap = get_local_map (pt, current_buffer, Qkeymap); + + if (CONSP (position)) { - value = Flookup_key (local, key, accept_default); + Lisp_Object string; + + /* For a mouse click, get the local text-property keymap + of the place clicked on, rather than point. */ + + if (POSN_INBUFFER_P (position)) + { + Lisp_Object pos; + + pos = POSN_BUFFER_POSN (position); + if (INTEGERP (pos) + && XINT (pos) >= BEG && XINT (pos) <= Z) + { + local_map = get_local_map (XINT (pos), + current_buffer, Qlocal_map); + + keymap = get_local_map (XINT (pos), + current_buffer, Qkeymap); + } + } + + /* If on a mode line string with a local keymap, + or for a click on a string, i.e. overlay string or a + string displayed via the `display' property, + consider `local-map' and `keymap' properties of + that string. */ + + if (string = POSN_STRING (position), + (CONSP (string) && STRINGP (XCAR (string)))) + { + Lisp_Object pos, map; + + pos = XCDR (string); + string = XCAR (string); + if (INTEGERP (pos) + && XINT (pos) >= 0 + && XINT (pos) < SCHARS (string)) + { + map = Fget_text_property (pos, Qlocal_map, string); + if (!NILP (map)) + local_map = map; + + map = Fget_text_property (pos, Qkeymap, string); + if (!NILP (map)) + keymap = map; + } + } + + } + + if (! NILP (keymap)) + { + value = Flookup_key (keymap, key, accept_default); if (! NILP (value) && !INTEGERP (value)) goto done; } @@ -1606,10 +1736,9 @@ goto done; } - local = get_local_map (PT, current_buffer, Qlocal_map); - if (! NILP (local)) + if (! NILP (local_map)) { - value = Flookup_key (local, key, accept_default); + value = Flookup_key (local_map, key, accept_default); if (! NILP (value) && !INTEGERP (value)) goto done; } @@ -1618,6 +1747,8 @@ value = Flookup_key (current_global_map, key, accept_default); done: + unbind_to (count, Qnil); + UNGCPRO; if (NILP (value) || INTEGERP (value)) return Qnil; @@ -1628,7 +1759,7 @@ if (NILP (no_remap) && SYMBOLP (value)) { Lisp_Object value1; - if (value1 = Fcommand_remapping (value), !NILP (value1)) + if (value1 = Fcommand_remapping (value, position), !NILP (value1)) value = value1; } @@ -2247,16 +2378,29 @@ else SPLIT_CHAR (without_bits, charset, c1, c2); - if (charset - && CHARSET_DEFINED_P (charset) - && ((c1 >= 0 && c1 < 32) - || (c2 >= 0 && c2 < 32))) + if (! CHAR_VALID_P (without_bits, 1)) + { + char buf[256]; + + sprintf (buf, "Invalid char code %d", XINT (key)); + return build_string (buf); + } + else if (charset + && ((c1 == 0 && c2 == -1) || c2 == 0)) { /* Handle a generic character. */ Lisp_Object name; - name = CHARSET_TABLE_INFO (charset, CHARSET_LONG_NAME_IDX); + char buf[256]; + + name = CHARSET_TABLE_INFO (charset, CHARSET_SHORT_NAME_IDX); CHECK_STRING (name); - return concat2 (build_string ("Character set "), name); + if (c1 == 0) + /* Only a charset is specified. */ + sprintf (buf, "Generic char %d: all of ", without_bits); + else + /* 1st code-point of 2-dimensional charset is specified. */ + sprintf (buf, "Generic char %d: row %d of ", without_bits, c1); + return concat2 (build_string (buf), name); } else { @@ -2429,7 +2573,7 @@ if (NILP (no_remap) && SYMBOLP (definition)) { Lisp_Object tem; - if (tem = Fcommand_remapping (definition), !NILP (tem)) + if (tem = Fcommand_remapping (definition, Qnil), !NILP (tem)) return Qnil; }
--- a/src/keymap.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/keymap.h Sat Oct 14 17:36:28 2006 +0000 @@ -29,8 +29,8 @@ EXFUN (Fkeymap_prompt, 1); EXFUN (Fdefine_key, 3); EXFUN (Flookup_key, 3); -EXFUN (Fcommand_remapping, 1); -EXFUN (Fkey_binding, 3); +EXFUN (Fcommand_remapping, 2); +EXFUN (Fkey_binding, 4); EXFUN (Fkey_description, 2); EXFUN (Fsingle_key_description, 2); EXFUN (Fwhere_is_internal, 5);
--- a/src/lisp.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/lisp.h Sat Oct 14 17:36:28 2006 +0000 @@ -2471,7 +2471,7 @@ extern void del_range_byte P_ ((int, int, int)); extern void del_range_both P_ ((int, int, int, int, int)); extern Lisp_Object del_range_2 P_ ((int, int, int, int, int)); -extern void modify_region P_ ((struct buffer *, int, int)); +extern void modify_region P_ ((struct buffer *, int, int, int)); extern void prepare_to_modify_buffer P_ ((int, int, int *)); extern void signal_before_change P_ ((int, int, int *)); extern void signal_after_change P_ ((int, int, int)); @@ -2538,7 +2538,7 @@ extern void init_xdisp P_ ((void)); extern Lisp_Object safe_eval P_ ((Lisp_Object)); extern int pos_visible_p P_ ((struct window *, int, int *, - int *, int *, int *, int)); + int *, int *, int *, int *, int *)); /* Defined in vm-limit.c. */ extern void memory_warnings P_ ((POINTER_TYPE *, void (*warnfun) ())); @@ -2920,6 +2920,7 @@ extern int find_next_newline_no_quit P_ ((int, int)); extern int find_before_next_newline P_ ((int, int, int)); extern void syms_of_search P_ ((void)); +extern void clear_regexp_cache P_ ((void)); /* defined in minibuf.c */
--- a/src/m/ibms390x.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/m/ibms390x.h Sat Oct 14 17:36:28 2006 +0000 @@ -159,5 +159,11 @@ #define XPNTR(a) XUINT (a) +#undef START_FILES +#define START_FILES pre-crt0.o /usr/lib64/crt1.o /usr/lib64/crti.o + +#undef LIB_STANDARD +#define LIB_STANDARD -lgcc -lc -lgcc /usr/lib64/crtn.o + /* arch-tag: 4b87653c-6add-4663-8691-7d9dc17b5519 (do not change this comment) */
--- a/src/mac.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/mac.c Sat Oct 14 17:36:28 2006 +0000 @@ -2413,75 +2413,69 @@ } -#include "keyboard.h" -extern Boolean mac_wait_next_event (EventRecord *, UInt32, Boolean); +extern Boolean mac_wait_next_event P_ ((EventRecord *, UInt32, Boolean)); int -select (n, rfds, wfds, efds, timeout) - int n; - SELECT_TYPE *rfds; - SELECT_TYPE *wfds; - SELECT_TYPE *efds; - struct timeval *timeout; +select (nfds, rfds, wfds, efds, timeout) + int nfds; + SELECT_TYPE *rfds, *wfds, *efds; + EMACS_TIME *timeout; { - OSStatus err; -#if TARGET_API_MAC_CARBON - EventTimeout timeout_sec = - (timeout - ? (EMACS_SECS (*timeout) * kEventDurationSecond - + EMACS_USECS (*timeout) * kEventDurationMicrosecond) - : kEventDurationForever); - - BLOCK_INPUT; - err = ReceiveNextEvent (0, NULL, timeout_sec, kEventLeaveInQueue, NULL); - UNBLOCK_INPUT; -#else /* not TARGET_API_MAC_CARBON */ - EventRecord e; - UInt32 sleep_time = EMACS_SECS (*timeout) * 60 + - ((EMACS_USECS (*timeout) * 60) / 1000000); + OSStatus err = noErr; /* Can only handle wait for keyboard input. */ - if (n > 1 || wfds || efds) + if (nfds > 1 || wfds || efds) return -1; - /* Also return true if an event other than a keyDown has occurred. - This causes kbd_buffer_get_event in keyboard.c to call - read_avail_input which in turn calls XTread_socket to poll for - these events. Otherwise these never get processed except but a - very slow poll timer. */ - if (mac_wait_next_event (&e, sleep_time, false)) - err = noErr; + /* Try detect_input_pending before ReceiveNextEvent in the same + BLOCK_INPUT block, in case that some input has already been read + asynchronously. */ + BLOCK_INPUT; + if (!detect_input_pending ()) + { +#if TARGET_API_MAC_CARBON + EventTimeout timeoutval = + (timeout + ? (EMACS_SECS (*timeout) * kEventDurationSecond + + EMACS_USECS (*timeout) * kEventDurationMicrosecond) + : kEventDurationForever); + + if (timeoutval == 0.0) + err = eventLoopTimedOutErr; + else + err = ReceiveNextEvent (0, NULL, timeoutval, + kEventLeaveInQueue, NULL); +#else /* not TARGET_API_MAC_CARBON */ + EventRecord e; + UInt32 sleep_time = EMACS_SECS (*timeout) * 60 + + ((EMACS_USECS (*timeout) * 60) / 1000000); + + if (sleep_time == 0) + err = -9875; /* eventLoopTimedOutErr */ + else + { + if (mac_wait_next_event (&e, sleep_time, false)) + err = noErr; + else + err = -9875; /* eventLoopTimedOutErr */ + } +#endif /* not TARGET_API_MAC_CARBON */ + } + UNBLOCK_INPUT; + + if (err == noErr) + { + /* Pretend that `select' is interrupted by a signal. */ + detect_input_pending (); + errno = EINTR; + return -1; + } else - err = -9875; /* eventLoopTimedOutErr */ -#endif /* not TARGET_API_MAC_CARBON */ - - if (FD_ISSET (0, rfds)) - if (err == noErr) - return 1; - else - { + { + if (rfds) FD_ZERO (rfds); - return 0; - } - else - if (err == noErr) - { - if (input_polling_used ()) - { - /* It could be confusing if a real alarm arrives while - processing the fake one. Turn it off and let the - handler reset it. */ - extern void poll_for_input_1 P_ ((void)); - int old_poll_suppress_count = poll_suppress_count; - poll_suppress_count = 1; - poll_for_input_1 (); - poll_suppress_count = old_poll_suppress_count; - } - errno = EINTR; - return -1; - } - else return 0; + } } @@ -4904,6 +4898,30 @@ return result; } + +DEFUN ("mac-process-hi-command", Fmac_process_hi_command, Smac_process_hi_command, 1, 1, 0, + doc: /* Send a HI command whose ID is COMMAND-ID to the command chain. +COMMAND-ID must be a 4-character string. Some common command IDs are +defined in the Carbon Event Manager. */) + (command_id) + Lisp_Object command_id; +{ + OSStatus err; + HICommand command; + + bzero (&command, sizeof (HICommand)); + command.commandID = mac_get_code_from_arg (command_id, 0); + + BLOCK_INPUT; + err = ProcessHICommand (&command); + UNBLOCK_INPUT; + + if (err != noErr) + error ("HI command (command ID: '%s') not handled.", SDATA (command_id)); + + return Qnil; +} + #endif /* TARGET_API_MAC_CARBON */ @@ -4944,23 +4962,26 @@ -> Use `select'. 2. Sockets are not involved. -> Use ReceiveNextEvent. - 3. [If SELECT_USE_CFSOCKET is defined] - Only the window event channel and socket read channels are + 3. [If SELECT_USE_CFSOCKET is set] + Only the window event channel and socket read/write channels are involved, and timeout is not too short (greater than SELECT_TIMEOUT_THRESHHOLD_RUNLOOP seconds). -> Create CFSocket for each socket and add it into the current - event RunLoop so that a `ready-to-read' event can be posted - to the event queue that is also used for window events. Then - ReceiveNextEvent can wait for both kinds of inputs. + event RunLoop so that the current event loop gets quit when + the socket becomes ready. Then ReceiveNextEvent can wait for + both kinds of inputs. 4. Otherwise. -> Periodically poll the window input channel while repeatedly executing `select' with a short timeout (SELECT_POLLING_PERIOD_USEC microseconds). */ -#define SELECT_POLLING_PERIOD_USEC 20000 -#ifdef SELECT_USE_CFSOCKET +#ifndef SELECT_USE_CFSOCKET +#define SELECT_USE_CFSOCKET 1 +#endif + +#define SELECT_POLLING_PERIOD_USEC 100000 +#if SELECT_USE_CFSOCKET #define SELECT_TIMEOUT_THRESHOLD_RUNLOOP 0.2 -#define EVENT_CLASS_SOCK 'Sock' static void socket_callback (s, type, address, data, info) @@ -4970,196 +4991,211 @@ const void *data; void *info; { - EventRef event; - - CreateEvent (NULL, EVENT_CLASS_SOCK, 0, 0, kEventAttributeNone, &event); - PostEventToQueue (GetCurrentEventQueue (), event, kEventPriorityStandard); - ReleaseEvent (event); + int fd = CFSocketGetNative (s); + SELECT_TYPE *ofds = (SELECT_TYPE *)info; + + if ((type == kCFSocketReadCallBack && FD_ISSET (fd, &ofds[0])) + || (type == kCFSocketConnectCallBack && FD_ISSET (fd, &ofds[1]))) + QuitEventLoop (GetCurrentEventLoop ()); } #endif /* SELECT_USE_CFSOCKET */ static int -select_and_poll_event (n, rfds, wfds, efds, timeout) - int n; - SELECT_TYPE *rfds; - SELECT_TYPE *wfds; - SELECT_TYPE *efds; - struct timeval *timeout; +select_and_poll_event (nfds, rfds, wfds, efds, timeout) + int nfds; + SELECT_TYPE *rfds, *wfds, *efds; + EMACS_TIME *timeout; { - int r; - OSStatus err; - - r = select (n, rfds, wfds, efds, timeout); - if (r != -1) + OSStatus err = noErr; + int r = 0; + + /* Try detect_input_pending before ReceiveNextEvent in the same + BLOCK_INPUT block, in case that some input has already been read + asynchronously. */ + BLOCK_INPUT; + if (!detect_input_pending ()) { - BLOCK_INPUT; - err = ReceiveNextEvent (0, NULL, kEventDurationNoWait, - kEventLeaveInQueue, NULL); - UNBLOCK_INPUT; - if (err == noErr) + EMACS_TIME select_timeout; + EventTimeout timeoutval = + (timeout + ? (EMACS_SECS (*timeout) * kEventDurationSecond + + EMACS_USECS (*timeout) * kEventDurationMicrosecond) + : kEventDurationForever); + + EMACS_SET_SECS_USECS (select_timeout, 0, 0); + r = select (nfds, rfds, wfds, efds, &select_timeout); + if (timeoutval == 0.0) + err = eventLoopTimedOutErr; + else if (r == 0) { - FD_SET (0, rfds); - r++; +#if USE_CG_DRAWING + mac_prepare_for_quickdraw (NULL); +#endif + err = ReceiveNextEvent (0, NULL, timeoutval, + kEventLeaveInQueue, NULL); } } - return r; + UNBLOCK_INPUT; + + if (r != 0) + return r; + else if (err == noErr) + { + /* Pretend that `select' is interrupted by a signal. */ + detect_input_pending (); + errno = EINTR; + return -1; + } + else + return 0; } -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1020 -#undef SELECT_INVALIDATE_CFSOCKET -#endif - int -sys_select (n, rfds, wfds, efds, timeout) - int n; - SELECT_TYPE *rfds; - SELECT_TYPE *wfds; - SELECT_TYPE *efds; - struct timeval *timeout; +sys_select (nfds, rfds, wfds, efds, timeout) + int nfds; + SELECT_TYPE *rfds, *wfds, *efds; + EMACS_TIME *timeout; { - OSStatus err; - int i, r; + OSStatus err = noErr; + int r; EMACS_TIME select_timeout; + static SELECT_TYPE ofds[3]; if (inhibit_window_system || noninteractive - || rfds == NULL || !FD_ISSET (0, rfds)) - return select (n, rfds, wfds, efds, timeout); + || nfds < 1 || rfds == NULL || !FD_ISSET (0, rfds)) + return select (nfds, rfds, wfds, efds, timeout); FD_CLR (0, rfds); - - if (wfds == NULL && efds == NULL) + ofds[0] = *rfds; + + if (wfds) + ofds[1] = *wfds; + else + FD_ZERO (&ofds[1]); + + if (efds) + ofds[2] = *efds; + else { - int nsocks = 0; - SELECT_TYPE orfds = *rfds; - - EventTimeout timeout_sec = + EventTimeout timeoutval = (timeout ? (EMACS_SECS (*timeout) * kEventDurationSecond + EMACS_USECS (*timeout) * kEventDurationMicrosecond) : kEventDurationForever); - for (i = 1; i < n; i++) - if (FD_ISSET (i, rfds)) - nsocks++; - - if (nsocks == 0) + FD_SET (0, rfds); /* sentinel */ + do { - BLOCK_INPUT; - err = ReceiveNextEvent (0, NULL, timeout_sec, - kEventLeaveInQueue, NULL); - UNBLOCK_INPUT; - if (err == noErr) - { - FD_SET (0, rfds); - return 1; - } - else - return 0; + nfds--; } - -#if USE_CG_DRAWING - mac_prepare_for_quickdraw (NULL); -#endif + while (!(FD_ISSET (nfds, rfds) || (wfds && FD_ISSET (nfds, wfds)))); + nfds++; + FD_CLR (0, rfds); + + if (nfds == 1) + return select_and_poll_event (nfds, rfds, wfds, efds, timeout); + /* Avoid initial overhead of RunLoop setup for the case that some input is already available. */ EMACS_SET_SECS_USECS (select_timeout, 0, 0); - r = select_and_poll_event (n, rfds, wfds, efds, &select_timeout); - if (r != 0 || timeout_sec == 0.0) + r = select_and_poll_event (nfds, rfds, wfds, efds, &select_timeout); + if (r != 0 || timeoutval == 0.0) return r; - *rfds = orfds; - -#ifdef SELECT_USE_CFSOCKET - if (timeout_sec > 0 && timeout_sec <= SELECT_TIMEOUT_THRESHOLD_RUNLOOP) + *rfds = ofds[0]; + if (wfds) + *wfds = ofds[1]; + +#if SELECT_USE_CFSOCKET + if (timeoutval > 0 && timeoutval <= SELECT_TIMEOUT_THRESHOLD_RUNLOOP) goto poll_periodically; - { - CFRunLoopRef runloop = - (CFRunLoopRef) GetCFRunLoopFromEventLoop (GetCurrentEventLoop ()); - EventTypeSpec specs[] = {{EVENT_CLASS_SOCK, 0}}; -#ifdef SELECT_INVALIDATE_CFSOCKET - CFSocketRef *shead, *s; -#else - CFRunLoopSourceRef *shead, *s; -#endif - - BLOCK_INPUT; - -#ifdef SELECT_INVALIDATE_CFSOCKET - shead = xmalloc (sizeof (CFSocketRef) * nsocks); -#else - shead = xmalloc (sizeof (CFRunLoopSourceRef) * nsocks); -#endif - s = shead; - for (i = 1; i < n; i++) - if (FD_ISSET (i, rfds)) - { - CFSocketRef socket = - CFSocketCreateWithNative (NULL, i, kCFSocketReadCallBack, - socket_callback, NULL); - CFRunLoopSourceRef source = - CFSocketCreateRunLoopSource (NULL, socket, 0); - -#ifdef SELECT_INVALIDATE_CFSOCKET - CFSocketSetSocketFlags (socket, 0); + /* Try detect_input_pending before ReceiveNextEvent in the same + BLOCK_INPUT block, in case that some input has already been + read asynchronously. */ + BLOCK_INPUT; + if (!detect_input_pending ()) + { + int minfd, fd; + CFRunLoopRef runloop = + (CFRunLoopRef) GetCFRunLoopFromEventLoop (GetCurrentEventLoop ()); + static CFSocketContext context = {0, ofds, NULL, NULL, NULL}; + static CFMutableDictionaryRef sources; + + if (sources == NULL) + sources = + CFDictionaryCreateMutable (NULL, 0, NULL, + &kCFTypeDictionaryValueCallBacks); + + for (minfd = 1; ; minfd++) /* nfds-1 works as a sentinel. */ + if (FD_ISSET (minfd, rfds) || (wfds && FD_ISSET (minfd, wfds))) + break; + + for (fd = minfd; fd < nfds; fd++) + if (FD_ISSET (fd, rfds) || (wfds && FD_ISSET (fd, wfds))) + { + void *key = (void *) fd; + CFRunLoopSourceRef source = + (CFRunLoopSourceRef) CFDictionaryGetValue (sources, key); + + if (source == NULL) + { + CFSocketRef socket = + CFSocketCreateWithNative (NULL, fd, + (kCFSocketReadCallBack + | kCFSocketConnectCallBack), + socket_callback, &context); + + if (socket == NULL) + continue; + source = CFSocketCreateRunLoopSource (NULL, socket, 0); + CFRelease (socket); + if (source == NULL) + continue; + CFDictionaryAddValue (sources, key, source); + CFRelease (source); + } + CFRunLoopAddSource (runloop, source, kCFRunLoopDefaultMode); + } + +#if USE_CG_DRAWING + mac_prepare_for_quickdraw (NULL); #endif - CFRunLoopAddSource (runloop, source, kCFRunLoopDefaultMode); -#ifdef SELECT_INVALIDATE_CFSOCKET - CFRelease (source); - *s = socket; -#else - CFRelease (socket); - *s = source; -#endif - s++; - } - - err = ReceiveNextEvent (0, NULL, timeout_sec, kEventLeaveInQueue, NULL); - - do - { - --s; -#ifdef SELECT_INVALIDATE_CFSOCKET - CFSocketInvalidate (*s); -#else - CFRunLoopRemoveSource (runloop, *s, kCFRunLoopDefaultMode); -#endif - CFRelease (*s); - } - while (s != shead); - - xfree (shead); - - if (err) - { - FD_ZERO (rfds); - r = 0; - } - else - { - FlushEventsMatchingListFromQueue (GetCurrentEventQueue (), - GetEventTypeCount (specs), - specs); - EMACS_SET_SECS_USECS (select_timeout, 0, 0); - r = select_and_poll_event (n, rfds, wfds, efds, &select_timeout); - } - - UNBLOCK_INPUT; - - return r; - } + err = ReceiveNextEvent (0, NULL, timeoutval, + kEventLeaveInQueue, NULL); + + for (fd = minfd; fd < nfds; fd++) + if (FD_ISSET (fd, rfds) || (wfds && FD_ISSET (fd, wfds))) + { + void *key = (void *) fd; + CFRunLoopSourceRef source = + (CFRunLoopSourceRef) CFDictionaryGetValue (sources, key); + + CFRunLoopRemoveSource (runloop, source, kCFRunLoopDefaultMode); + } + } + UNBLOCK_INPUT; + + if (err == noErr || err == eventLoopQuitErr) + { + EMACS_SET_SECS_USECS (select_timeout, 0, 0); + return select_and_poll_event (nfds, rfds, wfds, efds, + &select_timeout); + } + else + { + FD_ZERO (rfds); + if (wfds) + FD_ZERO (wfds); + return 0; + } #endif /* SELECT_USE_CFSOCKET */ } poll_periodically: { EMACS_TIME end_time, now, remaining_time; - SELECT_TYPE orfds = *rfds, owfds, oefds; - - if (wfds) - owfds = *wfds; - if (efds) - oefds = *efds; + if (timeout) { remaining_time = *timeout; @@ -5172,15 +5208,15 @@ EMACS_SET_SECS_USECS (select_timeout, 0, SELECT_POLLING_PERIOD_USEC); if (timeout && EMACS_TIME_LT (remaining_time, select_timeout)) select_timeout = remaining_time; - r = select_and_poll_event (n, rfds, wfds, efds, &select_timeout); + r = select_and_poll_event (nfds, rfds, wfds, efds, &select_timeout); if (r != 0) return r; - *rfds = orfds; + *rfds = ofds[0]; if (wfds) - *wfds = owfds; + *wfds = ofds[1]; if (efds) - *efds = oefds; + *efds = ofds[2]; if (timeout) { @@ -5190,12 +5226,8 @@ } while (!timeout || EMACS_TIME_LT (now, end_time)); - FD_ZERO (rfds); - if (wfds) - FD_ZERO (wfds); - if (efds) - FD_ZERO (efds); - return 0; + EMACS_SET_SECS_USECS (select_timeout, 0, 0); + return select_and_poll_event (nfds, rfds, wfds, efds, &select_timeout); } } @@ -5387,6 +5419,7 @@ #if TARGET_API_MAC_CARBON defsubr (&Smac_get_preference); defsubr (&Smac_code_convert_string); + defsubr (&Smac_process_hi_command); #endif defsubr (&Smac_set_file_creator);
--- a/src/macfns.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/macfns.c Sat Oct 14 17:36:28 2006 +0000 @@ -4342,13 +4342,14 @@ (prompt, dir, default_filename, mustmatch, only_dir_p) Lisp_Object prompt, dir, default_filename, mustmatch, only_dir_p; { - struct frame *f = SELECTED_FRAME (); Lisp_Object file = Qnil; int count = SPECPDL_INDEX (); struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6; char filename[MAXPATHLEN]; static NavEventUPP mac_nav_event_callbackUPP = NULL; + check_mac (); + GCPRO6 (prompt, dir, default_filename, mustmatch, file, only_dir_p); CHECK_STRING (prompt); CHECK_STRING (dir);
--- a/src/macmenu.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/macmenu.c Sat Oct 14 17:36:28 2006 +0000 @@ -64,7 +64,8 @@ enum mac_menu_kind { /* Menu ID range */ MAC_MENU_APPLE, /* 0 (Reserved by Apple) */ - MAC_MENU_MENU_BAR, /* 1 .. 234 */ + MAC_MENU_MENU_BAR, /* 1 .. 233 */ + MAC_MENU_M_APPLE, /* 234 (== M_APPLE) */ MAC_MENU_POPUP, /* 235 */ MAC_MENU_DRIVER, /* 236 .. 255 (Reserved) */ MAC_MENU_MENU_BAR_SUB, /* 256 .. 16383 */ @@ -72,7 +73,7 @@ MAC_MENU_END /* 32768 */ }; -static const int min_menu_id[] = {0, 1, 235, 236, 256, 16384, 32768}; +static const int min_menu_id[] = {0, 1, 234, 235, 236, 256, 16384, 32768}; #define DIALOG_WINDOW_RESOURCE 130 @@ -158,10 +159,10 @@ #define FALSE 0 #endif /* no TRUE */ -Lisp_Object Vmenu_updating_frame; - Lisp_Object Qdebug_on_next_call; +extern Lisp_Object Vmenu_updating_frame; + extern Lisp_Object Qmenu_bar, Qmac_apple_event; extern Lisp_Object QCtoggle, QCradio; @@ -196,6 +197,8 @@ static void list_of_panes P_ ((Lisp_Object)); static void list_of_items P_ ((Lisp_Object)); +static void find_and_call_menu_selection P_ ((FRAME_PTR, int, Lisp_Object, + void *)); static int fill_menu P_ ((MenuHandle, widget_value *, enum mac_menu_kind, int)); static void fill_menubar P_ ((widget_value *, int)); static void dispose_menus P_ ((enum mac_menu_kind, int)); @@ -1015,39 +1018,63 @@ FRAME_PTR f; { SInt32 menu_choice; + SInt16 menu_id, menu_item; extern Point saved_menu_event_location; set_frame_menubar (f, 0, 1); BLOCK_INPUT; menu_choice = MenuSelect (saved_menu_event_location); - do_menu_choice (menu_choice); + menu_id = HiWord (menu_choice); + menu_item = LoWord (menu_choice); + +#if !TARGET_API_MAC_CARBON + if (menu_id == min_menu_id[MAC_MENU_M_APPLE]) + do_apple_menu (menu_item); + else +#endif + if (menu_id) + { + MenuHandle menu = GetMenuHandle (menu_id); + + if (menu) + { + UInt32 refcon; + + GetMenuItemRefCon (menu, menu_item, &refcon); + find_and_call_menu_selection (f, f->menu_bar_items_used, + f->menu_bar_vector, (void *) refcon); + } + } + + HiliteMenu (0); UNBLOCK_INPUT; } -/* This callback is called from the menu bar pulldown menu - when the user makes a selection. - Figure out what the user chose - and put the appropriate events into the keyboard buffer. */ - -void -menubar_selection_callback (FRAME_PTR f, int client_data) +/* Find the menu selection and store it in the keyboard buffer. + F is the frame the menu is on. + MENU_BAR_ITEMS_USED is the length of VECTOR. + VECTOR is an array of menu events for the whole menu. */ + +static void +find_and_call_menu_selection (f, menu_bar_items_used, vector, client_data) + FRAME_PTR f; + int menu_bar_items_used; + Lisp_Object vector; + void *client_data; { Lisp_Object prefix, entry; - Lisp_Object vector; Lisp_Object *subprefix_stack; int submenu_depth = 0; int i; - if (!f) - return; entry = Qnil; - subprefix_stack = (Lisp_Object *) alloca (f->menu_bar_items_used * sizeof (Lisp_Object)); - vector = f->menu_bar_vector; + subprefix_stack = (Lisp_Object *) alloca (menu_bar_items_used * sizeof (Lisp_Object)); prefix = Qnil; i = 0; - while (i < f->menu_bar_items_used) + + while (i < menu_bar_items_used) { if (EQ (XVECTOR (vector)->contents[i], Qnil)) { @@ -1105,13 +1132,11 @@ buf.arg = entry; kbd_buffer_store_event (&buf); - f->output_data.mac->menubar_active = 0; return; } i += MENU_ITEMS_ITEM_LENGTH; } } - f->output_data.mac->menubar_active = 0; } /* Allocate a widget_value, blocking input. */ @@ -1508,10 +1533,6 @@ int *submenu_start, *submenu_end; int *submenu_top_level_items, *submenu_n_panes; - /* We must not change the menubar when actually in use. */ - if (f->output_data.mac->menubar_active) - return; - XSETFRAME (Vmenu_updating_frame, f); if (! menubar_widget) @@ -2630,11 +2651,6 @@ Qdebug_on_next_call = intern ("debug-on-next-call"); staticpro (&Qdebug_on_next_call); - DEFVAR_LISP ("menu-updating-frame", &Vmenu_updating_frame, - doc: /* Frame for which we are updating a menu. -The enable predicate for a menu command should check this variable. */); - Vmenu_updating_frame = Qnil; - defsubr (&Sx_popup_menu); #ifdef HAVE_MENUS defsubr (&Sx_popup_dialog);
--- a/src/macterm.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/macterm.c Sat Oct 14 17:36:28 2006 +0000 @@ -108,6 +108,10 @@ (Not yet supported.) */ int x_use_underline_position_properties; +/* Non-zero means to draw the underline at the same place as the descent line. */ + +int x_underline_at_descent_line; + /* This is a chain of structures for all the X displays currently in use. */ @@ -261,9 +265,6 @@ static XCharStruct *mac_per_char_metric P_ ((XFontStruct *, XChar2b *, int)); static void XSetFont P_ ((Display *, GC, XFontStruct *)); -/* Defined in macmenu.h. */ -extern void menubar_selection_callback (FRAME_PTR, int); - #define GC_FORE_COLOR(gc) (&(gc)->fore_color) #define GC_BACK_COLOR(gc) (&(gc)->back_color) #define GC_FONT(gc) ((gc)->xgcv.font) @@ -890,12 +891,13 @@ static void -mac_draw_string_common (f, gc, x, y, buf, nchars, bg_width, bytes_per_char) +mac_draw_string_common (f, gc, x, y, buf, nchars, bg_width, + overstrike_p, bytes_per_char) struct frame *f; GC gc; int x, y; char *buf; - int nchars, bg_width, bytes_per_char; + int nchars, bg_width, overstrike_p, bytes_per_char; { SetPortWindowPort (FRAME_MAC_WINDOW (f)); @@ -945,6 +947,13 @@ ATSUDrawText (text_layout, kATSUFromTextBeginning, kATSUToTextEnd, kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc); + if (overstrike_p) + { + MoveTo (x + 1, y); + ATSUDrawText (text_layout, + kATSUFromTextBeginning, kATSUToTextEnd, + kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc); + } mac_end_clip (gc); #ifdef MAC_OSX } @@ -988,9 +997,15 @@ sizeof (tags) / sizeof (tags[0]), tags, sizes, values); if (err == noErr) - ATSUDrawText (text_layout, - kATSUFromTextBeginning, kATSUToTextEnd, - Long2Fix (x), Long2Fix (port_height - y)); + { + ATSUDrawText (text_layout, + kATSUFromTextBeginning, kATSUToTextEnd, + Long2Fix (x), Long2Fix (port_height - y)); + if (overstrike_p) + ATSUDrawText (text_layout, + kATSUFromTextBeginning, kATSUToTextEnd, + Long2Fix (x + 1), Long2Fix (port_height - y)); + } #if USE_CG_DRAWING mac_end_cg_clip (f); context = NULL; @@ -1056,6 +1071,12 @@ TextFace (GC_FONT (gc)->mac_fontface); MoveTo (x, y); DrawText (buf, 0, nchars * bytes_per_char); + if (overstrike_p) + { + TextMode (srcOr); + MoveTo (x + 1, y); + DrawText (buf, 0, nchars * bytes_per_char); + } if (bg_width) RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); mac_end_clip (gc); @@ -1068,59 +1089,33 @@ } -/* Mac replacement for XDrawString. */ - -static void -mac_draw_string (f, gc, x, y, buf, nchars) +/* Mac replacement for XDrawImageString. */ + +static void +mac_draw_image_string (f, gc, x, y, buf, nchars, bg_width, overstrike_p) struct frame *f; GC gc; int x, y; char *buf; - int nchars; -{ - mac_draw_string_common (f, gc, x, y, buf, nchars, 0, 1); -} - - -/* Mac replacement for XDrawString16. */ - -static void -mac_draw_string_16 (f, gc, x, y, buf, nchars) + int nchars, bg_width, overstrike_p; +{ + mac_draw_string_common (f, gc, x, y, buf, nchars, bg_width, + overstrike_p, 1); +} + + +/* Mac replacement for XDrawImageString16. */ + +static void +mac_draw_image_string_16 (f, gc, x, y, buf, nchars, bg_width, overstrike_p) struct frame *f; GC gc; int x, y; XChar2b *buf; - int nchars; -{ - mac_draw_string_common (f, gc, x, y, (char *) buf, nchars, 0, 2); -} - - -/* Mac replacement for XDrawImageString. */ - -static void -mac_draw_image_string (f, gc, x, y, buf, nchars, bg_width) - struct frame *f; - GC gc; - int x, y; - char *buf; - int nchars, bg_width; -{ - mac_draw_string_common (f, gc, x, y, buf, nchars, bg_width, 1); -} - - -/* Mac replacement for XDrawString16. */ - -static void -mac_draw_image_string_16 (f, gc, x, y, buf, nchars, bg_width) - struct frame *f; - GC gc; - int x, y; - XChar2b *buf; - int nchars, bg_width; -{ - mac_draw_string_common (f, gc, x, y, (char *) buf, nchars, bg_width, 2); + int nchars, bg_width, overstrike_p; +{ + mac_draw_string_common (f, gc, x, y, (char *) buf, nchars, bg_width, + overstrike_p, 2); } @@ -1294,12 +1289,12 @@ } static int -mac_draw_image_string_cg (f, gc, x, y, buf, nchars, bg_width) +mac_draw_image_string_cg (f, gc, x, y, buf, nchars, bg_width, overstrike_p) struct frame *f; GC gc; int x, y; XChar2b *buf; - int nchars, bg_width; + int nchars, bg_width, overstrike_p; { CGrafPtr port; float port_height, gx, gy; @@ -1361,10 +1356,17 @@ #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030 CGContextSetTextPosition (context, gx, gy); CGContextShowGlyphsWithAdvances (context, glyphs, advances, nchars); + if (overstrike_p) + { + CGContextSetTextPosition (context, gx + 1.0f, gy); + CGContextShowGlyphsWithAdvances (context, glyphs, advances, nchars); + } #else for (i = 0; i < nchars; i++) { CGContextShowGlyphsAtPoint (context, gx, gy, glyphs + i, 1); + if (overstrike_p) + CGContextShowGlyphsAtPoint (context, gx + 1.0f, gy, glyphs + i, 1); gx += advances[i].width; } #endif @@ -2633,6 +2635,11 @@ Rect r; MacFontStruct *font = s->font; +#if USE_CG_DRAWING + mac_prepare_for_quickdraw (s->f); +#endif + SetPortWindowPort (FRAME_MAC_WINDOW (s->f)); + TextFont (font->mac_fontnum); TextSize (font->mac_fontsize); TextFace (font->mac_fontface); @@ -2765,15 +2772,18 @@ #if USE_CG_TEXT_DRAWING if (!s->two_byte_p && mac_draw_image_string_cg (s->f, s->gc, x, s->ybase - boff, - s->char2b, s->nchars, bg_width)) + s->char2b, s->nchars, bg_width, + s->face->overstrike)) ; else #endif mac_draw_image_string_16 (s->f, s->gc, x, s->ybase - boff, - s->char2b, s->nchars, bg_width); + s->char2b, s->nchars, bg_width, + s->face->overstrike); else mac_draw_image_string (s->f, s->gc, x, s->ybase - boff, - char1b, s->nchars, bg_width); + char1b, s->nchars, bg_width, + s->face->overstrike); } } @@ -2809,10 +2819,10 @@ else { for (i = 0; i < s->nchars; i++, ++s->gidx) - mac_draw_string_16 (s->f, s->gc, - x + s->cmp->offsets[s->gidx * 2], - s->ybase - s->cmp->offsets[s->gidx * 2 + 1], - s->char2b + i, 1); + mac_draw_image_string_16 (s->f, s->gc, + x + s->cmp->offsets[s->gidx * 2], + s->ybase - s->cmp->offsets[s->gidx * 2 + 1], + s->char2b + i, 1, 0, s->face->overstrike); } } @@ -3674,18 +3684,45 @@ /* Draw underline. */ if (s->face->underline_p) { - unsigned long h = 1; - unsigned long dy = s->height - h; + unsigned long tem, h; + int y; + +#if 0 + /* Get the underline thickness. Default is 1 pixel. */ + if (!XGetFontProperty (s->font, XA_UNDERLINE_THICKNESS, &h)) +#endif + h = 1; + + y = s->y + s->height - h; + if (!x_underline_at_descent_line) + { + /* Get the underline position. This is the recommended + vertical offset in pixels from the baseline to the top of + the underline. This is a signed value according to the + specs, and its default is + + ROUND ((maximum descent) / 2), with + ROUND(x) = floor (x + 0.5) */ + +#if 0 + if (x_use_underline_position_properties + && XGetFontProperty (s->font, XA_UNDERLINE_POSITION, &tem)) + y = s->ybase + (long) tem; + else +#endif + if (s->face->font) + y = s->ybase + (s->face->font->max_bounds.descent + 1) / 2; + } if (s->face->underline_defaulted_p) - mac_fill_rectangle (s->f, s->gc, s->x, s->y + dy, + mac_fill_rectangle (s->f, s->gc, s->x, y, s->background_width, h); else { XGCValues xgcv; XGetGCValues (s->display, s->gc, GCForeground, &xgcv); XSetForeground (s->display, s->gc, s->face->underline_color); - mac_fill_rectangle (s->f, s->gc, s->x, s->y + dy, + mac_fill_rectangle (s->f, s->gc, s->x, y, s->background_width, h); XSetForeground (s->display, s->gc, xgcv.foreground); } @@ -5805,6 +5842,57 @@ #endif /* not TARGET_API_MAC_CARBON */ } +static void +mac_handle_origin_change (f) + struct frame *f; +{ + x_real_positions (f, &f->left_pos, &f->top_pos); +} + +static void +mac_handle_size_change (f, pixelwidth, pixelheight) + struct frame *f; + int pixelwidth, pixelheight; +{ + int cols, rows; + + cols = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, pixelwidth); + rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, pixelheight); + + if (cols != FRAME_COLS (f) + || rows != FRAME_LINES (f) + || pixelwidth != FRAME_PIXEL_WIDTH (f) + || pixelheight != FRAME_PIXEL_HEIGHT (f)) + { + /* We pass 1 for DELAY since we can't run Lisp code inside of + a BLOCK_INPUT. */ + change_frame_size (f, rows, cols, 0, 1, 0); + FRAME_PIXEL_WIDTH (f) = pixelwidth; + FRAME_PIXEL_HEIGHT (f) = pixelheight; + SET_FRAME_GARBAGED (f); + + /* If cursor was outside the new size, mark it as off. */ + mark_window_cursors_off (XWINDOW (f->root_window)); + + /* Clear out any recollection of where the mouse highlighting + was, since it might be in a place that's outside the new + frame size. Actually checking whether it is outside is a + pain in the neck, so don't try--just let the highlighting be + done afresh with new size. */ + cancel_mouse_face (f); + +#if TARGET_API_MAC_CARBON + if (f->output_data.mac->hourglass_control) + { +#if USE_CG_DRAWING + mac_prepare_for_quickdraw (f); +#endif + MoveControl (f->output_data.mac->hourglass_control, + pixelwidth - HOURGLASS_WIDTH, 0); + } +#endif + } +} /* Calculate the absolute position in frame F @@ -5885,7 +5973,10 @@ ConstrainWindowToScreen (FRAME_MAC_WINDOW (f), kWindowTitleBarRgn, kWindowConstrainMoveRegardlessOfFit | kWindowConstrainAllowPartial, NULL, NULL); - x_real_positions (f, &f->left_pos, &f->top_pos); +#if USE_CARBON_EVENTS + if (!NILP (tip_frame) && XFRAME (tip_frame) == f) +#endif + mac_handle_origin_change (f); #else { Rect inner, outer, screen_rect, dummy; @@ -5959,50 +6050,11 @@ x_wm_set_size_hint (f, (long) 0, 0); SizeWindow (FRAME_MAC_WINDOW (f), pixelwidth, pixelheight, 0); -#if TARGET_API_MAC_CARBON - if (f->output_data.mac->hourglass_control) - { -#if USE_CG_DRAWING - mac_prepare_for_quickdraw (f); -#endif - MoveControl (f->output_data.mac->hourglass_control, - pixelwidth - HOURGLASS_WIDTH, 0); - } -#endif - - /* Now, strictly speaking, we can't be sure that this is accurate, - but the window manager will get around to dealing with the size - change request eventually, and we'll hear how it went when the - ConfigureNotify event gets here. - - We could just not bother storing any of this information here, - and let the ConfigureNotify event set everything up, but that - might be kind of confusing to the Lisp code, since size changes - wouldn't be reported in the frame parameters until some random - point in the future when the ConfigureNotify event arrives. - - We pass 1 for DELAY since we can't run Lisp code inside of - a BLOCK_INPUT. */ - change_frame_size (f, rows, cols, 0, 1, 0); - FRAME_PIXEL_WIDTH (f) = pixelwidth; - FRAME_PIXEL_HEIGHT (f) = pixelheight; - - /* We've set {FRAME,PIXEL}_{WIDTH,HEIGHT} to the values we hope to - receive in the ConfigureNotify event; if we get what we asked - for, then the event won't cause the screen to become garbaged, so - we have to make sure to do it here. */ - SET_FRAME_GARBAGED (f); - - XFlush (FRAME_X_DISPLAY (f)); - - /* If cursor was outside the new size, mark it as off. */ - mark_window_cursors_off (XWINDOW (f->root_window)); - - /* Clear out any recollection of where the mouse highlighting was, - since it might be in a place that's outside the new frame size. - Actually checking whether it is outside is a pain in the neck, - so don't try--just let the highlighting be done afresh with new size. */ - cancel_mouse_face (f); + +#if USE_CARBON_EVENTS + if (!NILP (tip_frame) && f == XFRAME (tip_frame)) +#endif + mac_handle_size_change (f, pixelwidth, pixelheight); UNBLOCK_INPUT; } @@ -6213,7 +6265,10 @@ kWindowCascadeOnParentWindowScreen #endif ); - x_real_positions (f, &f->left_pos, &f->top_pos); +#if USE_CARBON_EVENTS + if (!NILP (tip_frame) && f == XFRAME (tip_frame)) +#endif + mac_handle_origin_change (f); } else #endif @@ -7731,14 +7786,16 @@ } -/* XLoadQueryFont creates and returns an internal representation for a - font in a MacFontStruct struct. There is really no concept +/* mac_load_query_font creates and returns an internal representation + for a font in a MacFontStruct struct. There is really no concept corresponding to "loading" a font on the Mac. But we check its existence and find the font number and all other information for it and store them in the returned MacFontStruct. */ static MacFontStruct * -XLoadQueryFont (Display *dpy, char *fontname) +mac_load_query_font (f, fontname) + struct frame *f; + char *fontname; { int size; char *name; @@ -7949,23 +8006,13 @@ else #endif { - GrafPtr port; - SInt16 old_fontnum, old_fontsize; - Style old_fontface; FontInfo the_fontinfo; int is_two_byte_font; - /* Save the current font number used. */ - GetPort (&port); -#if TARGET_API_MAC_CARBON - old_fontnum = GetPortTextFont (port); - old_fontsize = GetPortTextSize (port); - old_fontface = GetPortTextFace (port); -#else - old_fontnum = port->txFont; - old_fontsize = port->txSize; - old_fontface = port->txFace; -#endif +#if USE_CG_DRAWING + mac_prepare_for_quickdraw (f); +#endif + SetPortWindowPort (FRAME_MAC_WINDOW (f)); TextFont (fontnum); TextSize (size); @@ -8047,11 +8094,6 @@ for (c = 0x21, pcm = space_bounds + 1; c <= 0xff; c++, pcm++) mac_query_char_extents (NULL, c, NULL, NULL, pcm, NULL); } - - /* Restore previous font number, size and face. */ - TextFont (old_fontnum); - TextSize (old_fontsize); - TextFace (old_fontface); } if (space_bounds) @@ -8070,6 +8112,8 @@ pcm->width); font->min_bounds.ascent = min (font->min_bounds.ascent, pcm->ascent); + font->min_bounds.descent = min (font->min_bounds.descent, + pcm->descent); font->max_bounds.lbearing = max (font->max_bounds.lbearing, pcm->lbearing); @@ -8079,6 +8123,8 @@ pcm->width); font->max_bounds.ascent = max (font->max_bounds.ascent, pcm->ascent); + font->max_bounds.descent = max (font->max_bounds.descent, + pcm->descent); } if ( #if USE_ATSUI @@ -8187,7 +8233,7 @@ fontname = (char *) SDATA (XCAR (font_names)); BLOCK_INPUT; - font = (MacFontStruct *) XLoadQueryFont (FRAME_MAC_DISPLAY (f), fontname); + font = mac_load_query_font (f, fontname); UNBLOCK_INPUT; if (!font) return NULL; @@ -8474,7 +8520,7 @@ #endif #endif /* ! TARGET_API_MAC_CARBON */ -#define M_APPLE 128 +#define M_APPLE 234 #define I_ABOUT 1 #define WINDOW_RESOURCE 128 @@ -9064,10 +9110,10 @@ } #endif -static void +#if !TARGET_API_MAC_CARBON +void do_apple_menu (SInt16 menu_item) { -#if !TARGET_API_MAC_CARBON Str255 item_name; SInt16 da_driver_refnum; @@ -9078,43 +9124,8 @@ GetMenuItemText (GetMenuHandle (M_APPLE), menu_item, item_name); da_driver_refnum = OpenDeskAcc (item_name); } +} #endif /* !TARGET_API_MAC_CARBON */ -} - -void -do_menu_choice (SInt32 menu_choice) -{ - SInt16 menu_id, menu_item; - - menu_id = HiWord (menu_choice); - menu_item = LoWord (menu_choice); - - switch (menu_id) - { - case 0: - break; - - case M_APPLE: - do_apple_menu (menu_item); - break; - - default: - { - struct frame *f = mac_focus_frame (&one_mac_display_info); - MenuHandle menu = GetMenuHandle (menu_id); - if (menu) - { - UInt32 refcon; - - GetMenuItemRefCon (menu, menu_item, &refcon); - menubar_selection_callback (f, refcon); - } - } - } - - HiliteMenu (0); -} - /* Handle drags in size box. Based on code contributed by Ben Mesander and IM - Window Manager A. */ @@ -9165,6 +9176,32 @@ } +#if TARGET_API_MAC_CARBON +static Point +mac_get_ideal_size (f) + struct frame *f; +{ + struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f); + WindowPtr w = FRAME_MAC_WINDOW (f); + Point ideal_size; + Rect standard_rect; + int height, width, columns, rows; + + ideal_size.h = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, DEFAULT_NUM_COLS); + ideal_size.v = dpyinfo->height; + IsWindowInStandardState (w, &ideal_size, &standard_rect); + /* Adjust the standard size according to character boundaries. */ + width = standard_rect.right - standard_rect.left; + height = standard_rect.bottom - standard_rect.top; + columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, width); + rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, height); + ideal_size.h = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, columns); + ideal_size.v = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, rows); + + return ideal_size; +} +#endif + /* Handle clicks in zoom box. Calculation of "standard state" based on code in IM - Window Manager A and code contributed by Ben Mesander. The standard state of an Emacs window is 80-characters @@ -9174,39 +9211,28 @@ do_zoom_window (WindowPtr w, int zoom_in_or_out) { Rect zoom_rect, port_rect; - int columns, rows, width, height; + int width, height; struct frame *f = mac_window_to_frame (w); - struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f); #if TARGET_API_MAC_CARBON - Point standard_size; - - standard_size.h = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, DEFAULT_NUM_COLS); - standard_size.v = dpyinfo->height; - - if (IsWindowInStandardState (w, &standard_size, &zoom_rect)) + Point ideal_size = mac_get_ideal_size (f); + + GetWindowBounds (w, kWindowContentRgn, &port_rect); + if (IsWindowInStandardState (w, &ideal_size, &zoom_rect) + && port_rect.left == zoom_rect.left + && port_rect.top == zoom_rect.top) zoom_in_or_out = inZoomIn; else - { - /* Adjust the standard size according to character boundaries. */ - - columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, zoom_rect.right - zoom_rect.left); - rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, zoom_rect.bottom - zoom_rect.top); - standard_size.h = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, columns); - standard_size.v = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, rows); - GetWindowBounds (w, kWindowContentRgn, &port_rect); - if (IsWindowInStandardState (w, &standard_size, &zoom_rect) - && port_rect.left == zoom_rect.left - && port_rect.top == zoom_rect.top) - zoom_in_or_out = inZoomIn; - else - zoom_in_or_out = inZoomOut; - } - - ZoomWindowIdeal (w, zoom_in_or_out, &standard_size); + zoom_in_or_out = inZoomOut; + +#ifdef MAC_OS8 + mac_clear_window (f); +#endif + ZoomWindowIdeal (w, zoom_in_or_out, &ideal_size); #else /* not TARGET_API_MAC_CARBON */ GrafPtr save_port; Point top_left; - int w_title_height; + int w_title_height, rows; + struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f); GetPort (&save_port); @@ -9245,6 +9271,7 @@ SetPort (save_port); #endif /* not TARGET_API_MAC_CARBON */ +#if !USE_CARBON_EVENTS /* retrieve window size and update application values */ #if TARGET_API_MAC_CARBON GetWindowPortBounds (w, &port_rect); @@ -9254,20 +9281,9 @@ height = port_rect.bottom - port_rect.top; width = port_rect.right - port_rect.left; - if (width != FRAME_PIXEL_WIDTH (f) - || height != FRAME_PIXEL_HEIGHT (f)) - { - rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, height); - columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, width); - - change_frame_size (f, rows, columns, 0, 1, 0); - SET_FRAME_GARBAGED (f); - cancel_mouse_face (f); - - FRAME_PIXEL_WIDTH (f) = width; - FRAME_PIXEL_HEIGHT (f) = height; - } - x_real_positions (f, &f->left_pos, &f->top_pos); + mac_handle_size_change (f, width, height); + mac_handle_origin_change (f); +#endif } void @@ -9406,6 +9422,7 @@ { WindowPtr wp; OSStatus result, err; + struct frame *f; UInt32 attributes; XSizeHints *size_hints; @@ -9414,6 +9431,7 @@ if (err != noErr) return eventNotHandledErr; + f = mac_window_to_frame (wp); switch (GetEventKind (event)) { case kEventWindowUpdate: @@ -9424,6 +9442,21 @@ do_window_update (wp); return noErr; + case kEventWindowGetIdealSize: + result = CallNextEventHandler (next_handler, event); + if (result != eventNotHandledErr) + return result; + + { + Point ideal_size = mac_get_ideal_size (f); + + err = SetEventParameter (event, kEventParamDimensions, + typeQDPoint, sizeof (Point), &ideal_size); + if (err == noErr) + return noErr; + } + break; + case kEventWindowBoundsChanging: result = CallNextEventHandler (next_handler, event); if (result != eventNotHandledErr) @@ -9434,7 +9467,7 @@ if (err != noErr) break; - size_hints = FRAME_SIZE_HINTS (mac_window_to_frame (wp)); + size_hints = FRAME_SIZE_HINTS (f); if ((attributes & kWindowBoundsChangeUserResize) && ((size_hints->flags & (PResizeInc | PBaseSize | PMinSize)) == (PResizeInc | PBaseSize | PMinSize))) @@ -9475,17 +9508,58 @@ } break; + case kEventWindowBoundsChanged: + err = GetEventParameter (event, kEventParamAttributes, typeUInt32, + NULL, sizeof (UInt32), NULL, &attributes); + if (err != noErr) + break; + + if (attributes & kWindowBoundsChangeSizeChanged) + { + Rect bounds; + + err = GetEventParameter (event, kEventParamCurrentBounds, + typeQDRectangle, NULL, sizeof (Rect), + NULL, &bounds); + if (err == noErr) + { + int width, height; + + width = bounds.right - bounds.left; + height = bounds.bottom - bounds.top; + mac_handle_size_change (f, width, height); + } + } + + if (attributes & kWindowBoundsChangeOriginChanged) + mac_handle_origin_change (f); + + return noErr; + case kEventWindowShown: case kEventWindowHidden: case kEventWindowExpanded: case kEventWindowCollapsed: result = CallNextEventHandler (next_handler, event); - mac_handle_visibility_change (mac_window_to_frame (wp)); + mac_handle_visibility_change (f); return noErr; break; + case kEventWindowClose: + result = CallNextEventHandler (next_handler, event); + { + struct input_event buf; + + EVENT_INIT (buf); + buf.kind = DELETE_WINDOW_EVENT; + XSETFRAME (buf.frame_or_window, f); + buf.arg = Qnil; + kbd_buffer_store_event (&buf); + } + return noErr; + #ifdef MAC_OSX case kEventWindowToolbarSwitchMode: result = CallNextEventHandler (next_handler, event); @@ -9775,6 +9849,8 @@ read_socket_inev->kind = ASCII_KEYSTROKE_EVENT; read_socket_inev->code = code; read_socket_inev->modifiers = + mac_to_emacs_modifiers (modifiers); + read_socket_inev->modifiers |= (extra_keyboard_modifiers & (meta_modifier | alt_modifier | hyper_modifier | super_modifier)); @@ -9894,11 +9970,14 @@ #if USE_CARBON_EVENTS EventTypeSpec specs_window[] = {{kEventClassWindow, kEventWindowUpdate}, + {kEventClassWindow, kEventWindowGetIdealSize}, {kEventClassWindow, kEventWindowBoundsChanging}, + {kEventClassWindow, kEventWindowBoundsChanged}, {kEventClassWindow, kEventWindowShown}, {kEventClassWindow, kEventWindowHidden}, {kEventClassWindow, kEventWindowExpanded}, {kEventClassWindow, kEventWindowCollapsed}, + {kEventClassWindow, kEventWindowClose}, #ifdef MAC_OSX {kEventClassWindow, kEventWindowToolbarSwitchMode}, #endif @@ -10457,12 +10536,14 @@ DragWindow (window_ptr, er.where, &qd.screenBits.bounds); #endif /* not TARGET_API_MAC_CARBON */ /* Update the frame parameters. */ +#if !USE_CARBON_EVENTS { struct frame *f = mac_window_to_frame (window_ptr); if (f && !f->async_iconified) - x_real_positions (f, &f->left_pos, &f->top_pos); + mac_handle_origin_change (f); } +#endif break; case inGoAway: @@ -10561,7 +10642,7 @@ else { /* Generate SELECT_WINDOW_EVENTs when needed. */ - if (mouse_autoselect_window) + if (!NILP (Vmouse_autoselect_window)) { Lisp_Object window; @@ -11571,6 +11652,14 @@ NOTE: Not supported on Mac yet. */); x_use_underline_position_properties = 0; + DEFVAR_BOOL ("x-underline-at-descent-line", + &x_underline_at_descent_line, + doc: /* *Non-nil means to draw the underline at the same place as the descent line. +nil means to draw the underline according to the value of the variable +`x-use-underline-position-properties', which is usually at the baseline +level. The default value is nil. */); + x_underline_at_descent_line = 0; + DEFVAR_LISP ("x-toolkit-scroll-bars", &Vx_toolkit_scroll_bars, doc: /* If not nil, Emacs uses toolkit scroll bars. */); #ifdef USE_TOOLKIT_SCROLL_BARS
--- a/src/macterm.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/macterm.h Sat Oct 14 17:36:28 2006 +0000 @@ -226,7 +226,8 @@ }; /* The collection of data describing a window on the Mac. */ -struct mac_output { +struct mac_output +{ /* Placeholder for things accessed through output_data.x. Must appear first. */ struct x_output x_compatible; @@ -316,9 +317,6 @@ /* Nonzero means tried already to make this frame visible. */ char asked_for_visible; - /* Nonzero means menubar is currently active. */ - char menubar_active; - /* Relief GCs, colors etc. */ struct relief { @@ -626,8 +624,10 @@ extern OSStatus mac_set_font_info_for_selection P_ ((struct frame *, int, int)); extern OSStatus install_window_handler P_ ((WindowPtr)); extern void remove_window_handler P_ ((WindowPtr)); -extern void do_menu_choice P_ ((SInt32)); extern OSStatus mac_post_mouse_moved_event P_ ((void)); +#if !TARGET_API_MAC_CARBON +extern void do_apple_menu P_ ((SInt16)); +#endif #if USE_CG_DRAWING extern void mac_prepare_for_quickdraw P_ ((struct frame *)); #endif
--- a/src/makefile.w32-in Sat Oct 14 16:56:21 2006 +0000 +++ b/src/makefile.w32-in Sat Oct 14 17:36:28 2006 +0000 @@ -678,6 +678,8 @@ $(EMACS_ROOT)/src/s/ms-w32.h \ $(EMACS_ROOT)/src/m/intel386.h \ $(EMACS_ROOT)/src/config.h \ + $(EMACS_ROOT)/nt/inc/langinfo.h \ + $(EMACS_ROOT)/nt/inc/nl_types.h \ $(SRC)/atimer.h \ $(SRC)/blockinput.h \ $(SRC)/buffer.h \ @@ -993,6 +995,8 @@ $(SRC)/w32proc.c \ $(SRC)/s/ms-w32.h \ $(SRC)/m/intel386.h \ + $(EMACS_ROOT)/nt/inc/langinfo.h \ + $(EMACS_ROOT)/nt/inc/nl_types.h \ $(SRC)/config.h \ $(SRC)/process.h \ $(SRC)/syssignal.h \
--- a/src/marker.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/marker.c Sat Oct 14 17:36:28 2006 +0000 @@ -460,7 +460,8 @@ } DEFUN ("marker-position", Fmarker_position, Smarker_position, 1, 1, 0, - doc: /* Return the position MARKER points at, as a character number. */) + doc: /* Return the position MARKER points at, as a character number. +Returns nil if MARKER points nowhere. */) (marker) Lisp_Object marker; {
--- a/src/md5.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/md5.c Sat Oct 14 17:36:28 2006 +0000 @@ -5,17 +5,17 @@ This file is part of the GNU Emacs. The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. + General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, + You should have received a copy of the GNU General Public + License along with the GNU C Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
--- a/src/md5.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/md5.h Sat Oct 14 17:36:28 2006 +0000 @@ -5,17 +5,17 @@ This file is part of GNU Emacs. The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. + General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, + You should have received a copy of the GNU General Public + License along with the GNU C Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
--- a/src/minibuf.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/minibuf.c Sat Oct 14 17:36:28 2006 +0000 @@ -1027,7 +1027,7 @@ Prompt with PROMPT. If non-nil, optional second arg INITIAL-CONTENTS is a string to insert in the minibuffer before reading. \(INITIAL-CONTENTS can also be a cons of a string and an integer. Such -arguments are used as in `read-from-minibuffer') */) +arguments are used as in `read-from-minibuffer'.) */) (prompt, initial_contents) Lisp_Object prompt, initial_contents; { @@ -1201,8 +1201,8 @@ prompt = Fformat (3, args); } - return Fcompleting_read (prompt, Vbuffer_alist, Qnil, - require_match, Qnil, Qbuffer_name_history, + return Fcompleting_read (prompt, intern ("internal-complete-buffer"), + Qnil, require_match, Qnil, Qbuffer_name_history, def, Qnil); } else @@ -1911,6 +1911,24 @@ return Qt; } +DEFUN ("internal-complete-buffer", Finternal_complete_buffer, Sinternal_complete_buffer, 3, 3, 0, + doc: /* Perform completion on buffer names. +If the argument FLAG is nil, invoke `try-completion', if it's t, invoke +`all-completions', otherwise invoke `test-completion'. + +The arguments STRING and PREDICATE are as in `try-completion', +`all-completions', and `test-completion'. */) + (string, predicate, flag) + Lisp_Object string, predicate, flag; +{ + if (NILP (flag)) + return Ftry_completion (string, Vbuffer_alist, predicate); + else if (EQ (flag, Qt)) + return Fall_completions (string, Vbuffer_alist, predicate, Qt); + else /* assume `lambda' */ + return Ftest_completion (string, Vbuffer_alist, predicate); +} + /* returns: * 0 no possible completion * 1 was already an exact and unique completion @@ -2399,7 +2417,7 @@ It is used to put faces, `completions-first-difference' and `completions-common-part' on the completion buffer. The `completions-common-part' face is put on the common substring -specified by COMMON-SUBSTRING. If COMMON-SUBSTRING is nil +specified by COMMON-SUBSTRING. If COMMON-SUBSTRING is nil and the current buffer is not the minibuffer, the faces are not put. Internally, COMMON-SUBSTRING is bound to `completion-common-substring' during running `completion-setup-hook'. */) @@ -2680,6 +2698,8 @@ that has no possible completions, and other quick, unobtrusive messages. */ +extern Lisp_Object Vminibuffer_message_timeout; + void temp_echo_area_glyphs (string) Lisp_Object string; @@ -2698,7 +2718,12 @@ insert_from_string (string, 0, 0, SCHARS (string), SBYTES (string), 0); SET_PT_BOTH (opoint, opoint_byte); Vinhibit_quit = Qt; - sit_for (make_number (2), 0, 2); + + if (NUMBERP (Vminibuffer_message_timeout)) + sit_for (Vminibuffer_message_timeout, 0, 2); + else + sit_for (Qt, 0, 2); + del_range_both (osize, osize_byte, ZV, ZV_BYTE, 1); SET_PT_BOTH (opoint, opoint_byte); if (!NILP (Vquit_flag)) @@ -2921,6 +2946,7 @@ defsubr (&Sread_string); defsubr (&Sread_command); defsubr (&Sread_variable); + defsubr (&Sinternal_complete_buffer); defsubr (&Sread_buffer); defsubr (&Sread_no_blanks_input); defsubr (&Sminibuffer_depth);
--- a/src/msdos.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/msdos.c Sat Oct 14 17:36:28 2006 +0000 @@ -3381,7 +3381,7 @@ } /* Generate SELECT_WINDOW_EVENTs when needed. */ - if (mouse_autoselect_window) + if (!NILP (Vmouse_autoselect_window)) { mouse_window = window_from_coordinates (SELECTED_FRAME(), mouse_last_x,
--- a/src/print.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/print.c Sat Oct 14 17:36:28 2006 +0000 @@ -216,7 +216,7 @@ if (MARKERP (printcharfun)) \ { \ EMACS_INT marker_pos; \ - if (!(XMARKER (printcharfun)->buffer)) \ + if (! XMARKER (printcharfun)->buffer) \ error ("Marker does not point anywhere"); \ if (XMARKER (printcharfun)->buffer != current_buffer) \ set_buffer_internal (XMARKER (printcharfun)->buffer); \ @@ -289,7 +289,7 @@ SET_PT_BOTH (old_point + (old_point >= start_point \ ? PT - start_point : 0), \ old_point_byte + (old_point_byte >= start_point_byte \ - ? PT_BYTE - start_point_byte : 0)); \ + ? PT_BYTE - start_point_byte : 0)); \ if (old != current_buffer) \ set_buffer_internal (old); @@ -364,7 +364,10 @@ print_buffer. PRINTCHARFUN t means output to the echo area or to stdout if non-interactive. If neither nil nor t, call Lisp function PRINTCHARFUN for each character printed. MULTIBYTE - non-zero means PTR contains multibyte characters. */ + non-zero means PTR contains multibyte characters. + + In the case where PRINTCHARFUN is nil, it is safe for PTR to point + to data in a Lisp string. Otherwise that is not safe. */ static void strout (ptr, size, size_byte, printcharfun, multibyte) @@ -413,7 +416,7 @@ if (size == size_byte) { for (i = 0; i < size; ++i) - insert_char ((unsigned char )*ptr++); + insert_char ((unsigned char) *ptr++); } else { @@ -497,10 +500,29 @@ else chars = SBYTES (string); - /* strout is safe for output to a frame (echo area) or to print_buffer. */ - strout (SDATA (string), - chars, SBYTES (string), - printcharfun, STRING_MULTIBYTE (string)); + if (EQ (printcharfun, Qt)) + { + /* Output to echo area. */ + int nbytes = SBYTES (string); + char *buffer; + + /* Copy the string contents so that relocation of STRING by + GC does not cause trouble. */ + USE_SAFE_ALLOCA; + + SAFE_ALLOCA (buffer, char *, nbytes); + bcopy (SDATA (string), buffer, nbytes); + + strout (buffer, chars, SBYTES (string), + printcharfun, STRING_MULTIBYTE (string)); + + SAFE_FREE (); + } + else + /* No need to copy, since output to print_buffer can't GC. */ + strout (SDATA (string), + chars, SBYTES (string), + printcharfun, STRING_MULTIBYTE (string)); } else { @@ -934,7 +956,7 @@ print_output_debug_flag = x; } -#if defined(GNU_LINUX) +#if defined (GNU_LINUX) /* This functionality is not vitally important in general, so we rely on non-portable ability to use stderr as lvalue. */ @@ -954,7 +976,7 @@ Lisp_Object file, append; { if (initial_stderr_stream != NULL) - fclose(stderr); + fclose (stderr); stderr = initial_stderr_stream; initial_stderr_stream = NULL; @@ -962,7 +984,7 @@ { file = Fexpand_file_name (file, Qnil); initial_stderr_stream = stderr; - stderr = fopen(SDATA (file), NILP (append) ? "w" : "a"); + stderr = fopen (SDATA (file), NILP (append) ? "w" : "a"); if (stderr == NULL) { stderr = initial_stderr_stream; @@ -2030,7 +2052,7 @@ /* Do you think this is necessary? */ if (XMARKER (obj)->insertion_type != 0) strout ("(moves after insertion) ", -1, -1, printcharfun, 0); - if (!(XMARKER (obj)->buffer)) + if (! XMARKER (obj)->buffer) strout ("in no buffer", -1, -1, printcharfun, 0); else { @@ -2044,7 +2066,7 @@ case Lisp_Misc_Overlay: strout ("#<overlay ", -1, -1, printcharfun, 0); - if (!(XMARKER (OVERLAY_START (obj))->buffer)) + if (! XMARKER (OVERLAY_START (obj))->buffer) strout ("in no buffer", -1, -1, printcharfun, 0); else { @@ -2091,8 +2113,8 @@ case Lisp_Misc_Kboard_Objfwd: strout ("#<kboard_objfwd to ", -1, -1, printcharfun, 0); - print_object (*(Lisp_Object *)((char *) current_kboard - + XKBOARD_OBJFWD (obj)->offset), + print_object (*(Lisp_Object *) ((char *) current_kboard + + XKBOARD_OBJFWD (obj)->offset), printcharfun, escapeflag); PRINTCHAR ('>'); break; @@ -2178,7 +2200,7 @@ print_object (make_number (interval->position), printcharfun, 1); PRINTCHAR (' '); print_object (make_number (interval->position + LENGTH (interval)), - printcharfun, 1); + printcharfun, 1); PRINTCHAR (' '); print_object (interval->plist, printcharfun, 1); }
--- a/src/process.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/process.c Sat Oct 14 17:36:28 2006 +0000 @@ -318,6 +318,12 @@ #define POLL_FOR_INPUT #endif +static Lisp_Object get_process (); +static void exec_sentinel (); + +extern EMACS_TIME timer_check (); +extern int timers_run; + /* Mask of bits indicating the descriptors that we wait for input on. */ static SELECT_TYPE input_wait_mask; @@ -386,15 +392,13 @@ #define DATAGRAM_CONN_P(proc) (0) #endif -static Lisp_Object get_process (); -static void exec_sentinel (); - -extern EMACS_TIME timer_check (); -extern int timers_run; - /* Maximum number of bytes to send to a pty without an eof. */ static int pty_max_bytes; +/* Nonzero means don't run process sentinels. This is used + when exiting. */ +int inhibit_sentinels; + #ifdef HAVE_PTYS #ifdef HAVE_PTY_H #include <pty.h> @@ -1310,6 +1314,7 @@ register struct Lisp_Process *p; char tembuf[300]; int w_proc, w_buffer, w_tty; + int exited = 0; Lisp_Object i_status, i_buffer, i_tty, i_command; w_proc = 4; /* Proc */ @@ -1436,8 +1441,8 @@ } } - if (EQ (symbol, Qsignal) || EQ (symbol, Qexit)) - remove_process (proc); + if (EQ (symbol, Qsignal) || EQ (symbol, Qexit) || EQ (symbol, Qclosed)) + exited++; Findent_to (i_buffer, minspace); if (NILP (p->buffer)) @@ -1501,6 +1506,8 @@ insert_string ("\n"); } } + if (exited) + status_notify (NULL); return Qnil; } @@ -6564,6 +6571,9 @@ int outer_running_asynch_code = running_asynch_code; int waiting = waiting_for_user_input_p; + if (inhibit_sentinels) + return; + /* No need to gcpro these, because all we do with them later is test them for EQness, and none of them should be a string. */ odeactivate = Vdeactivate_mark; @@ -6885,6 +6895,8 @@ { register int i; + inhibit_sentinels = 0; + #ifdef SIGCHLD #ifndef CANNOT_DUMP if (! noninteractive || initialized)
--- a/src/process.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/process.h Sat Oct 14 17:36:28 2006 +0000 @@ -161,5 +161,9 @@ #define NULL_DEVICE "/dev/null" #endif +/* Nonzero means don't run process sentinels. This is used + when exiting. */ +extern int inhibit_sentinels; + /* arch-tag: dffedfc4-d7bc-4b58-a26f-c16155449c72 (do not change this comment) */
--- a/src/regex.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/regex.c Sat Oct 14 17:36:28 2006 +0000 @@ -2530,6 +2530,7 @@ bufp->syntax = syntax; bufp->fastmap_accurate = 0; bufp->not_bol = bufp->not_eol = 0; + bufp->used_syntax = 0; /* Set `used' to zero, so that if we return an error, the pattern printer (for debugging) will think there's no pattern. We reset it @@ -2942,6 +2943,14 @@ SET_LIST_BIT (translated); } + /* In most cases the matching rule for char classes + only uses the syntax table for multibyte chars, + so that the content of the syntax-table it is not + hardcoded in the range_table. SPACE and WORD are + the two exceptions. */ + if ((1 << cc) & ((1 << RECC_SPACE) | (1 << RECC_WORD))) + bufp->used_syntax = 1; + /* Repeat the loop. */ continue; } @@ -3877,11 +3886,13 @@ if (fastmap) { int c = RE_STRING_CHAR (p + 1, pend - p); - + /* When fast-scanning, the fastmap can be indexed either with + a char (smaller than 256) or with the first byte of + a char's byte sequence. So we have to conservatively add + both to the table. */ if (SINGLE_BYTE_CHAR_P (c)) fastmap[c] = 1; - else - fastmap[p[1]] = 1; + fastmap[p[1]] = 1; } break; @@ -3899,6 +3910,10 @@ So any that are not listed in the charset are possible matches, even in multibyte buffers. */ if (!fastmap) break; + /* We don't need to mark LEADING_CODE_8_BIT_CONTROL specially + because it will automatically be set when needed by virtue of + being larger than the highest char of its charset (0xbf) but + smaller than (1<<BYTEWIDTH). */ for (j = CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) fastmap[j] = 1; @@ -3909,7 +3924,13 @@ for (j = CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH - 1, p++; j >= 0; j--) if (!!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) ^ not) - fastmap[j] = 1; + { + fastmap[j] = 1; +#ifdef emacs + if (j >= 0x80 && j < 0xa0) + fastmap[LEADING_CODE_8_BIT_CONTROL] = 1; +#endif + } if ((not && multibyte) /* Any character set can possibly contain a character @@ -4352,11 +4373,33 @@ } } else - while (range > lim && !fastmap[*d]) + do { - d++; - range--; - } + re_char *d_start = d; + while (range > lim && !fastmap[*d]) + { + d++; + range--; + } +#ifdef emacs + if (multibyte && range > lim) + { + /* Check that we are at the beginning of a char. */ + int at_boundary; + AT_CHAR_BOUNDARY_P (at_boundary, d, d_start); + if (at_boundary) + break; + else + { /* We have matched an internal byte of a char + rather than the leading byte, so it's a false + positive: we should keep scanning. */ + d++; range--; + } + } + else +#endif + break; + } while (1); startpos += irange - range; } @@ -6197,6 +6240,10 @@ { reg_errcode_t ret; +#ifdef emacs + gl_state.current_syntax_table = current_buffer->syntax_table; +#endif + /* GNU code is written to assume at least RE_NREGS registers will be set (and at least one extra will be -1). */ bufp->regs_allocated = REGS_UNALLOCATED;
--- a/src/regex.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/regex.h Sat Oct 14 17:36:28 2006 +0000 @@ -392,6 +392,10 @@ /* Similarly for an end-of-line anchor. */ unsigned not_eol : 1; + /* If true, the compilation of the pattern had to look up the syntax table, + so the compiled pattern is only valid for the current syntax table. */ + unsigned used_syntax : 1; + #ifdef emacs /* If true, multi-byte form in the `buffer' should be recognized as a multibyte character. */ @@ -614,13 +618,5 @@ #endif /* regex.h */ -/* -Local variables: -make-backup-files: t -version-control: t -trim-versions-without-asking: nil -End: -*/ - /* arch-tag: bda6e3ec-3c02-4237-a55a-01ad2e120083 (do not change this comment) */
--- a/src/s/gnu-linux.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/s/gnu-linux.h Sat Oct 14 17:36:28 2006 +0000 @@ -142,8 +142,12 @@ movemail.c will use `maillock' when MAILDIR, HAVE_LIBMAIL and HAVE_MAILLOCK_H are defined, so the following appears to be the correct logic. -- fx */ +/* We must check for HAVE_LIBLOCKFILE too, as movemail does. + liblockfile is a Free Software replacement for libmail, used on + Debian systems and elsewhere. -rfr */ -#if !(defined (HAVE_LIBMAIL) && defined (HAVE_MAILLOCK_H)) +#if !((defined (HAVE_LIBMAIL) || defined (HAVE_LIBLOCKFILE)) && \ + defined (HAVE_MAILLOCK_H)) #define MAIL_USE_FLOCK #endif
--- a/src/search.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/search.c Sat Oct 14 17:36:28 2006 +0000 @@ -42,6 +42,10 @@ { struct regexp_cache *next; Lisp_Object regexp, whitespace_regexp; + /* Syntax table for which the regexp applies. We need this because + of character classes. If this is t, then the compiled pattern is valid + for any syntax-table. */ + Lisp_Object syntax_table; struct re_pattern_buffer buf; char fastmap[0400]; /* Nonzero means regexp was compiled to do full POSIX backtracking. */ @@ -167,7 +171,11 @@ cp->posix = posix; cp->buf.multibyte = multibyte; cp->whitespace_regexp = Vsearch_spaces_regexp; - BLOCK_INPUT; + /* rms: I think BLOCK_INPUT is not needed here any more, + because regex.c defines malloc to call xmalloc. + Using BLOCK_INPUT here means the debugger won't run if an error occurs. + So let's turn it off. */ + /* BLOCK_INPUT; */ old = re_set_syntax (RE_SYNTAX_EMACS | (posix ? 0 : RE_NO_POSIX_BACKTRACKING)); @@ -177,10 +185,14 @@ val = (char *) re_compile_pattern ((char *)raw_pattern, raw_pattern_size, &cp->buf); + /* If the compiled pattern hard codes some of the contents of the + syntax-table, it can only be reused with *this* syntax table. */ + cp->syntax_table = cp->buf.used_syntax ? current_buffer->syntax_table : Qt; + re_set_whitespace_regexp (NULL); re_set_syntax (old); - UNBLOCK_INPUT; + /* UNBLOCK_INPUT; */ if (val) xsignal1 (Qinvalid_regexp, build_string (val)); @@ -204,6 +216,24 @@ } } +/* Clear the regexp cache w.r.t. a particular syntax table, + because it was changed. + There is no danger of memory leak here because re_compile_pattern + automagically manages the memory in each re_pattern_buffer struct, + based on its `allocated' and `buffer' values. */ +void +clear_regexp_cache () +{ + int i; + + for (i = 0; i < REGEXP_CACHE_SIZE; ++i) + /* It's tempting to compare with the syntax-table we've actually changd, + but it's not sufficient because char-table inheritance mewans that + modifying one syntax-table can change others at the same time. */ + if (!EQ (searchbufs[i].syntax_table, Qt)) + searchbufs[i].regexp = Qnil; +} + /* Compile a regexp if necessary, but first check to see if there's one in the cache. PATTERN is the pattern to compile. @@ -240,6 +270,8 @@ && EQ (cp->buf.translate, (! NILP (translate) ? translate : make_number (0))) && cp->posix == posix && cp->buf.multibyte == multibyte + && (EQ (cp->syntax_table, Qt) + || EQ (cp->syntax_table, current_buffer->syntax_table)) && !NILP (Fequal (cp->whitespace_regexp, Vsearch_spaces_regexp))) break; @@ -284,6 +316,10 @@ if (running_asynch_code) save_search_regs (); + /* This is so set_image_of_range_1 in regex.c can find the EQV table. */ + XCHAR_TABLE (current_buffer->case_canon_table)->extras[2] + = current_buffer->case_eqv_table; + CHECK_STRING (string); bufp = compile_pattern (string, &search_regs, (!NILP (current_buffer->case_fold_search) @@ -391,6 +427,10 @@ pos_byte = string_char_to_byte (string, pos); } + /* This is so set_image_of_range_1 in regex.c can find the EQV table. */ + XCHAR_TABLE (current_buffer->case_canon_table)->extras[2] + = current_buffer->case_eqv_table; + bufp = compile_pattern (regexp, &search_regs, (!NILP (current_buffer->case_fold_search) ? current_buffer->case_canon_table : Qnil), @@ -930,6 +970,10 @@ lim_byte = CHAR_TO_BYTE (lim); } + /* This is so set_image_of_range_1 in regex.c can find the EQV table. */ + XCHAR_TABLE (current_buffer->case_canon_table)->extras[2] + = current_buffer->case_eqv_table; + np = search_buffer (string, PT, PT_BYTE, lim, lim_byte, n, RE, (!NILP (current_buffer->case_fold_search) ? current_buffer->case_canon_table @@ -3086,8 +3130,10 @@ searchbufs[i].buf.fastmap = searchbufs[i].fastmap; searchbufs[i].regexp = Qnil; searchbufs[i].whitespace_regexp = Qnil; + searchbufs[i].syntax_table = Qnil; staticpro (&searchbufs[i].regexp); staticpro (&searchbufs[i].whitespace_regexp); + staticpro (&searchbufs[i].syntax_table); searchbufs[i].next = (i == REGEXP_CACHE_SIZE-1 ? 0 : &searchbufs[i+1]); } searchbuf_head = &searchbufs[0];
--- a/src/strftime.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/strftime.c Sat Oct 14 17:36:28 2006 +0000 @@ -7,17 +7,17 @@ This file is part of the GNU Emacs. This program is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. + General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, + You should have received a copy of the GNU General Public + License along with the GNU C Library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
--- a/src/syntax.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/syntax.c Sat Oct 14 17:36:28 2006 +0000 @@ -1039,6 +1039,11 @@ check_syntax_table (syntax_table); SET_RAW_SYNTAX_ENTRY (syntax_table, XINT (c), Fstring_to_syntax (newentry)); + + /* We clear the regexp cache, since character classes can now have + different values from those in the compiled regexps.*/ + clear_regexp_cache (); + return Qnil; }
--- a/src/textprop.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/textprop.c Sat Oct 14 17:36:28 2006 +0000 @@ -1001,17 +1001,16 @@ && (NILP (limit) || next->position < XFASTINT (limit))) next = next_interval (next); - if (NULL_INTERVAL_P (next)) + if (NULL_INTERVAL_P (next) + || (next->position + >= (INTEGERP (limit) + ? XFASTINT (limit) + : (STRINGP (object) + ? SCHARS (object) + : BUF_ZV (XBUFFER (object)))))) return limit; - if (NILP (limit)) - XSETFASTINT (limit, (STRINGP (object) - ? SCHARS (object) - : BUF_ZV (XBUFFER (object)))); - if (!(next->position < XFASTINT (limit))) - return limit; - - XSETFASTINT (position, next->position); - return position; + else + return make_number (next->position); } /* Return 1 if there's a change in some property between BEG and END. */ @@ -1083,16 +1082,16 @@ && (NILP (limit) || next->position < XFASTINT (limit))) next = next_interval (next); - if (NULL_INTERVAL_P (next)) + if (NULL_INTERVAL_P (next) + || (next->position + >= (INTEGERP (limit) + ? XFASTINT (limit) + : (STRINGP (object) + ? SCHARS (object) + : BUF_ZV (XBUFFER (object)))))) return limit; - if (NILP (limit)) - XSETFASTINT (limit, (STRINGP (object) - ? SCHARS (object) - : BUF_ZV (XBUFFER (object)))); - if (!(next->position < XFASTINT (limit))) - return limit; - - return make_number (next->position); + else + return make_number (next->position); } DEFUN ("previous-property-change", Fprevious_property_change, @@ -1132,14 +1131,15 @@ && (NILP (limit) || (previous->position + LENGTH (previous) > XFASTINT (limit)))) previous = previous_interval (previous); - if (NULL_INTERVAL_P (previous)) + + if (NULL_INTERVAL_P (previous) + || (previous->position + LENGTH (previous) + <= (INTEGERP (limit) + ? XFASTINT (limit) + : (STRINGP (object) ? 0 : BUF_BEGV (XBUFFER (object)))))) return limit; - if (NILP (limit)) - XSETFASTINT (limit, (STRINGP (object) ? 0 : BUF_BEGV (XBUFFER (object)))); - if (!(previous->position + LENGTH (previous) > XFASTINT (limit))) - return limit; - - return make_number (previous->position + LENGTH (previous)); + else + return make_number (previous->position + LENGTH (previous)); } DEFUN ("previous-single-property-change", Fprevious_single_property_change, @@ -1184,14 +1184,15 @@ && (NILP (limit) || (previous->position + LENGTH (previous) > XFASTINT (limit)))) previous = previous_interval (previous); - if (NULL_INTERVAL_P (previous)) + + if (NULL_INTERVAL_P (previous) + || (previous->position + LENGTH (previous) + <= (INTEGERP (limit) + ? XFASTINT (limit) + : (STRINGP (object) ? 0 : BUF_BEGV (XBUFFER (object)))))) return limit; - if (NILP (limit)) - XSETFASTINT (limit, (STRINGP (object) ? 0 : BUF_BEGV (XBUFFER (object)))); - if (!(previous->position + LENGTH (previous) > XFASTINT (limit))) - return limit; - - return make_number (previous->position + LENGTH (previous)); + else + return make_number (previous->position + LENGTH (previous)); } /* Callers note, this can GC when OBJECT is a buffer (or nil). */ @@ -1253,7 +1254,7 @@ } if (BUFFERP (object)) - modify_region (XBUFFER (object), XINT (start), XINT (end)); + modify_region (XBUFFER (object), XINT (start), XINT (end), 1); /* We are at the beginning of interval I, with LEN chars to scan. */ for (;;) @@ -1393,7 +1394,7 @@ } if (BUFFERP (object)) - modify_region (XBUFFER (object), XINT (start), XINT (end)); + modify_region (XBUFFER (object), XINT (start), XINT (end), 1); set_text_properties_1 (start, end, properties, object, i); @@ -1541,7 +1542,7 @@ } if (BUFFERP (object)) - modify_region (XBUFFER (object), XINT (start), XINT (end)); + modify_region (XBUFFER (object), XINT (start), XINT (end), 1); /* We are at the beginning of an interval, with len to scan */ for (;;) @@ -1655,7 +1656,7 @@ if (LENGTH (i) == len) { if (!modified && BUFFERP (object)) - modify_region (XBUFFER (object), XINT (start), XINT (end)); + modify_region (XBUFFER (object), XINT (start), XINT (end), 1); remove_properties (Qnil, properties, i, object); if (BUFFERP (object)) signal_after_change (XINT (start), XINT (end) - XINT (start), @@ -1668,7 +1669,7 @@ i = split_interval_left (i, len); copy_properties (unchanged, i); if (!modified && BUFFERP (object)) - modify_region (XBUFFER (object), XINT (start), XINT (end)); + modify_region (XBUFFER (object), XINT (start), XINT (end), 1); remove_properties (Qnil, properties, i, object); if (BUFFERP (object)) signal_after_change (XINT (start), XINT (end) - XINT (start), @@ -1679,7 +1680,7 @@ if (interval_has_some_properties_list (properties, i)) { if (!modified && BUFFERP (object)) - modify_region (XBUFFER (object), XINT (start), XINT (end)); + modify_region (XBUFFER (object), XINT (start), XINT (end), 1); remove_properties (Qnil, properties, i, object); modified = 1; }
--- a/src/w32.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/w32.c Sat Oct 14 17:36:28 2006 +0000 @@ -4113,6 +4113,25 @@ } /* + shutdown_handler ensures that buffers' autosave files are + up to date when the user logs off, or the system shuts down. +*/ +BOOL WINAPI shutdown_handler(DWORD type) +{ + /* Ctrl-C and Ctrl-Break are already suppressed, so don't handle them. */ + if (type == CTRL_CLOSE_EVENT /* User closes console window. */ + || type == CTRL_LOGOFF_EVENT /* User logs off. */ + || type == CTRL_SHUTDOWN_EVENT) /* User shutsdown. */ + { + /* Shut down cleanly, making sure autosave files are up to date. */ + shut_down_emacs (0, 0, Qnil); + } + + /* Allow other handlers to handle this signal. */ + return FALSE; +} + +/* globals_of_w32 is used to initialize those global variables that must always be initialized on startup even when the global variable initialized is non zero (see the function main in emacs.c). @@ -4124,6 +4143,11 @@ g_b_init_get_token_information = 0; g_b_init_lookup_account_sid = 0; g_b_init_get_sid_identifier_authority = 0; + /* The following sets a handler for shutdown notifications for + console apps. This actually applies to Emacs in both console and + GUI modes, since we had to fool windows into thinking emacs is a + console application to get console mode to work. */ + SetConsoleCtrlHandler(shutdown_handler, TRUE); } /* end of nt.c */
--- a/src/w32fns.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/w32fns.c Sat Oct 14 17:36:28 2006 +0000 @@ -2108,7 +2108,12 @@ } } - if (EQ (left, Qunbound) && EQ (top, Qunbound)) + if (f->size_hint_flags & USPosition || f->size_hint_flags & PPosition) + { + XSETINT (left, f->left_pos); + XSETINT (top, f->top_pos); + } + else if (EQ (left, Qunbound) && EQ (top, Qunbound)) { /* When called with RES_TYPE_NUMBER, w32_get_arg will return zero for anything that is not a number and is not Qunbound. */ @@ -8609,14 +8614,15 @@ Vw32_color_map = Qnil; DEFVAR_LISP ("w32-pass-alt-to-system", &Vw32_pass_alt_to_system, - doc: /* Non-nil if alt key presses are passed on to Windows. -When non-nil, for example, alt pressed and released and then space will -open the System menu. When nil, Emacs silently swallows alt key events. */); + doc: /* Non-nil if Alt key presses are passed on to Windows. +When non-nil, for example, Alt pressed and released and then space will +open the System menu. When nil, Emacs processes the Alt key events, and +then silently swallows them. */); Vw32_pass_alt_to_system = Qnil; DEFVAR_LISP ("w32-alt-is-meta", &Vw32_alt_is_meta, - doc: /* Non-nil if the alt key is to be considered the same as the meta key. -When nil, Emacs will translate the alt key to the Alt modifier, and not Meta. */); + doc: /* Non-nil if the Alt key is to be considered the same as the META key. +When nil, Emacs will translate the Alt key to the ALT modifier, not to META. */); Vw32_alt_is_meta = Qt; DEFVAR_INT ("w32-quit-key", &w32_quit_key, @@ -8625,14 +8631,32 @@ DEFVAR_LISP ("w32-pass-lwindow-to-system", &Vw32_pass_lwindow_to_system, - doc: /* Non-nil if the left \"Windows\" key is passed on to Windows. -When non-nil, the Start menu is opened by tapping the key. */); + doc: /* If non-nil, the left \"Windows\" key is passed on to Windows. + +When non-nil, the Start menu is opened by tapping the key. +If you set this to nil, the left \"Windows\" key is processed by Emacs +according to the value of `w32-lwindow-modifier', which see. + +Note that some combinations of the left \"Windows\" key with other keys are +caught by Windows at low level, and so binding them in Emacs will have no +effect. For example, <lwindow>-r always pops up the Windows Run dialog, +<lwindow>-<Pause> pops up the "System Properties" dialog, etc. However, see +the doc string of `w32-phantom-key-code'. */); Vw32_pass_lwindow_to_system = Qt; DEFVAR_LISP ("w32-pass-rwindow-to-system", &Vw32_pass_rwindow_to_system, - doc: /* Non-nil if the right \"Windows\" key is passed on to Windows. -When non-nil, the Start menu is opened by tapping the key. */); + doc: /* If non-nil, the right \"Windows\" key is passed on to Windows. + +When non-nil, the Start menu is opened by tapping the key. +If you set this to nil, the right \"Windows\" key is processed by Emacs +according to the value of `w32-rwindow-modifier', which see. + +Note that some combinations of the right \"Windows\" key with other keys are +caught by Windows at low level, and so binding them in Emacs will have no +effect. For example, <rwindow>-r always pops up the Windows Run dialog, +<rwindow>-<Pause> pops up the "System Properties" dialog, etc. However, see +the doc string of `w32-phantom-key-code'. */); Vw32_pass_rwindow_to_system = Qt; DEFVAR_LISP ("w32-phantom-key-code", @@ -8649,29 +8673,29 @@ DEFVAR_LISP ("w32-enable-num-lock", &Vw32_enable_num_lock, - doc: /* Non-nil if Num Lock should act normally. -Set to nil to see Num Lock as the key `kp-numlock'. */); + doc: /* If non-nil, the Num Lock key acts normally. +Set to nil to handle Num Lock as the `kp-numlock' key. */); Vw32_enable_num_lock = Qt; DEFVAR_LISP ("w32-enable-caps-lock", &Vw32_enable_caps_lock, - doc: /* Non-nil if Caps Lock should act normally. -Set to nil to see Caps Lock as the key `capslock'. */); + doc: /* If non-nil, the Caps Lock key acts normally. +Set to nil to handle Caps Lock as the `capslock' key. */); Vw32_enable_caps_lock = Qt; DEFVAR_LISP ("w32-scroll-lock-modifier", &Vw32_scroll_lock_modifier, - doc: /* Modifier to use for the Scroll Lock on state. + doc: /* Modifier to use for the Scroll Lock ON state. The value can be hyper, super, meta, alt, control or shift for the -respective modifier, or nil to see Scroll Lock as the key `scroll'. -Any other value will cause the key to be ignored. */); +respective modifier, or nil to handle Scroll Lock as the `scroll' key. +Any other value will cause the Scroll Lock key to be ignored. */); Vw32_scroll_lock_modifier = Qt; DEFVAR_LISP ("w32-lwindow-modifier", &Vw32_lwindow_modifier, doc: /* Modifier to use for the left \"Windows\" key. The value can be hyper, super, meta, alt, control or shift for the -respective modifier, or nil to appear as the key `lwindow'. +respective modifier, or nil to appear as the `lwindow' key. Any other value will cause the key to be ignored. */); Vw32_lwindow_modifier = Qnil; @@ -8679,7 +8703,7 @@ &Vw32_rwindow_modifier, doc: /* Modifier to use for the right \"Windows\" key. The value can be hyper, super, meta, alt, control or shift for the -respective modifier, or nil to appear as the key `rwindow'. +respective modifier, or nil to appear as the `rwindow' key. Any other value will cause the key to be ignored. */); Vw32_rwindow_modifier = Qnil; @@ -8687,7 +8711,7 @@ &Vw32_apps_modifier, doc: /* Modifier to use for the \"Apps\" key. The value can be hyper, super, meta, alt, control or shift for the -respective modifier, or nil to appear as the key `apps'. +respective modifier, or nil to appear as the `apps' key. Any other value will cause the key to be ignored. */); Vw32_apps_modifier = Qnil; @@ -8703,7 +8727,7 @@ &w32_mouse_button_tolerance, doc: /* Analogue of double click interval for faking middle mouse events. The value is the minimum time in milliseconds that must elapse between -left/right button down events before they are considered distinct events. +left and right button down events before they are considered distinct events. If both mouse buttons are depressed within this interval, a middle mouse button down event is generated instead. */); w32_mouse_button_tolerance = GetDoubleClickTime () / 2; @@ -8718,7 +8742,7 @@ DEFVAR_BOOL ("w32-pass-extra-mouse-buttons-to-system", &w32_pass_extra_mouse_buttons_to_system, - doc: /* Non-nil if the fourth and fifth mouse buttons are passed to Windows. + doc: /* If non-nil, the fourth and fifth mouse buttons are passed to Windows. Recent versions of Windows support mice with up to five buttons. Since most applications don't support these extra buttons, most mouse drivers will allow you to map them to functions at the system level.
--- a/src/w32menu.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/w32menu.c Sat Oct 14 17:36:28 2006 +0000 @@ -149,9 +149,9 @@ SetMenuItemInfoA_Proc set_menu_item_info = NULL; AppendMenuW_Proc unicode_append_menu = NULL; -Lisp_Object Vmenu_updating_frame; +Lisp_Object Qdebug_on_next_call; -Lisp_Object Qdebug_on_next_call; +extern Lisp_Object Vmenu_updating_frame; extern Lisp_Object Qmenu_bar; @@ -2548,11 +2548,6 @@ Qdebug_on_next_call = intern ("debug-on-next-call"); staticpro (&Qdebug_on_next_call); - DEFVAR_LISP ("menu-updating-frame", &Vmenu_updating_frame, - doc: /* Frame for which we are updating a menu. -The enable predicate for a menu command should check this variable. */); - Vmenu_updating_frame = Qnil; - defsubr (&Sx_popup_menu); #ifdef HAVE_MENUS defsubr (&Sx_popup_dialog);
--- a/src/w32proc.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/w32proc.c Sat Oct 14 17:36:28 2006 +0000 @@ -49,6 +49,11 @@ extern BOOL WINAPI IsValidLocale(LCID, DWORD); #endif +#ifdef HAVE_LANGINFO_CODESET +#include <nl_types.h> +#include <langinfo.h> +#endif + #include "lisp.h" #include "w32.h" #include "w32heap.h" @@ -1817,6 +1822,69 @@ return result; } +#ifdef HAVE_LANGINFO_CODESET +/* Emulation of nl_langinfo. Used in fns.c:Flocale_info. */ +char *nl_langinfo (nl_item item) +{ + /* Conversion of Posix item numbers to their Windows equivalents. */ + static const LCTYPE w32item[] = { + LOCALE_IDEFAULTANSICODEPAGE, + LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3, + LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6, LOCALE_SDAYNAME7, + LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3, + LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6, + LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9, + LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12 + }; + + static char *nl_langinfo_buf = NULL; + static int nl_langinfo_len = 0; + + if (nl_langinfo_len <= 0) + nl_langinfo_buf = xmalloc (nl_langinfo_len = 1); + + if (item < 0 || item >= _NL_NUM) + nl_langinfo_buf[0] = 0; + else + { + LCID cloc = GetThreadLocale (); + int need_len = GetLocaleInfo (cloc, w32item[item] | LOCALE_USE_CP_ACP, + NULL, 0); + + if (need_len <= 0) + nl_langinfo_buf[0] = 0; + else + { + if (item == CODESET) + { + need_len += 2; /* for the "cp" prefix */ + if (need_len < 8) /* for the case we call GetACP */ + need_len = 8; + } + if (nl_langinfo_len <= need_len) + nl_langinfo_buf = xrealloc (nl_langinfo_buf, + nl_langinfo_len = need_len); + if (!GetLocaleInfo (cloc, w32item[item] | LOCALE_USE_CP_ACP, + nl_langinfo_buf, nl_langinfo_len)) + nl_langinfo_buf[0] = 0; + else if (item == CODESET) + { + if (strcmp (nl_langinfo_buf, "0") == 0 /* CP_ACP */ + || strcmp (nl_langinfo_buf, "1") == 0) /* CP_OEMCP */ + sprintf (nl_langinfo_buf, "cp%u", GetACP ()); + else + { + memmove (nl_langinfo_buf + 2, nl_langinfo_buf, + strlen (nl_langinfo_buf) + 1); + nl_langinfo_buf[0] = 'c'; + nl_langinfo_buf[1] = 'p'; + } + } + } + } + return nl_langinfo_buf; +} +#endif /* HAVE_LANGINFO_CODESET */ DEFUN ("w32-get-locale-info", Fw32_get_locale_info, Sw32_get_locale_info, 1, 2, 0,
--- a/src/w32term.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/w32term.c Sat Oct 14 17:36:28 2006 +0000 @@ -4298,7 +4298,7 @@ if (f) { /* Generate SELECT_WINDOW_EVENTs when needed. */ - if (mouse_autoselect_window) + if (!NILP (Vmouse_autoselect_window)) { Lisp_Object window; int x = LOWORD (msg.msg.lParam);
--- a/src/window.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/window.c Sat Oct 14 17:36:28 2006 +0000 @@ -335,13 +335,16 @@ If a character is only partially visible, nil is returned, unless the optional argument PARTIALLY is non-nil. If POS is only out of view because of horizontal scrolling, return non-nil. +If POS is t, it specifies the position of the last visible glyph in WINDOW. POS defaults to point in WINDOW; WINDOW defaults to the selected window. If POS is visible, return t if PARTIALLY is nil; if PARTIALLY is non-nil, -return value is a list (X Y PARTIAL) where X and Y are the pixel coordinates -relative to the top left corner of the window. PARTIAL is nil if the character -after POS is fully visible; otherwise it is a cons (RTOP . RBOT) where RTOP -and RBOT are the number of pixels invisible at the top and bottom of the row. */) +return value is a list of 2 or 6 elements (X Y [RTOP RBOT ROWH VPOS]), +where X and Y are the pixel coordinates relative to the top left corner +of the window. The remaining elements are omitted if the character after +POS is fully visible; otherwise, RTOP and RBOT are the number of pixels +off-window at the top and bottom of the row, ROWH is the height of the +display row, and VPOS is the row number (0-based) containing POS. */) (pos, window, partially) Lisp_Object pos, window, partially; { @@ -350,14 +353,16 @@ register struct buffer *buf; struct text_pos top; Lisp_Object in_window = Qnil; - int rtop, rbot, fully_p = 1; + int rtop, rbot, rowh, vpos, fully_p = 1; int x, y; w = decode_window (window); buf = XBUFFER (w->buffer); SET_TEXT_POS_FROM_MARKER (top, w->start); - if (!NILP (pos)) + if (EQ (pos, Qt)) + posint = -1; + else if (!NILP (pos)) { CHECK_NUMBER_COERCE_MARKER (pos); posint = XINT (pos); @@ -369,24 +374,138 @@ /* If position is above window start or outside buffer boundaries, or if window start is out of range, position is not visible. */ - if (posint >= CHARPOS (top) - && posint <= BUF_ZV (buf) + if ((EQ (pos, Qt) + || (posint >= CHARPOS (top) && posint <= BUF_ZV (buf))) && CHARPOS (top) >= BUF_BEGV (buf) && CHARPOS (top) <= BUF_ZV (buf) - && pos_visible_p (w, posint, &x, &y, &rtop, &rbot, NILP (partially)) + && pos_visible_p (w, posint, &x, &y, &rtop, &rbot, &rowh, &vpos) && (fully_p = !rtop && !rbot, (!NILP (partially) || fully_p))) in_window = Qt; if (!NILP (in_window) && !NILP (partially)) - in_window = Fcons (make_number (x), - Fcons (make_number (y), - Fcons ((fully_p ? Qnil - : Fcons (make_number (rtop), - make_number (rbot))), - Qnil))); + { + Lisp_Object part = Qnil; + if (!fully_p) + part = list4 (make_number (rtop), make_number (rbot), + make_number (rowh), make_number (vpos)); + in_window = Fcons (make_number (x), + Fcons (make_number (y), part)); + } + return in_window; } +DEFUN ("window-line-height", Fwindow_line_height, + Swindow_line_height, 0, 2, 0, + doc: /* Return height in pixels of text line LINE in window WINDOW. +If WINDOW is nil or omitted, use selected window. + +Return height of current line if LINE is omitted or nil. Return height of +header or mode line if LINE is `header-line' and `mode-line'. +Otherwise, LINE is a text line number starting from 0. A negative number +counts from the end of the window. + +Value is a list (HEIGHT VPOS YPOS OFFBOT), where HEIGHT is the height +in pixels of the visible part of the line, VPOS and YPOS are the +vertical position in lines and pixels of the line, relative to the top +of the first text line, and OFFBOT is the number of off-window pixels at +the bottom of the text line. If there are off-window pixels at the top +of the (first) text line, YPOS is negative. + +Return nil if window display is not up-to-date. In that case, use +`pos-visible-in-window-p' to obtain the information. */) + (line, window) + Lisp_Object line, window; +{ + register struct window *w; + register struct buffer *b; + struct glyph_row *row, *end_row; + int max_y, crop, i, n; + + w = decode_window (window); + + if (noninteractive + || w->pseudo_window_p) + return Qnil; + + CHECK_BUFFER (w->buffer); + b = XBUFFER (w->buffer); + + /* Fail if current matrix is not up-to-date. */ + if (NILP (w->window_end_valid) + || current_buffer->clip_changed + || current_buffer->prevent_redisplay_optimizations_p + || XFASTINT (w->last_modified) < BUF_MODIFF (b) + || XFASTINT (w->last_overlay_modified) < BUF_OVERLAY_MODIFF (b)) + return Qnil; + + if (NILP (line)) + { + i = w->cursor.vpos; + if (i < 0 || i >= w->current_matrix->nrows + || (row = MATRIX_ROW (w->current_matrix, i), !row->enabled_p)) + return Qnil; + max_y = window_text_bottom_y (w); + goto found_row; + } + + if (EQ (line, Qheader_line)) + { + if (!WINDOW_WANTS_HEADER_LINE_P (w)) + return Qnil; + row = MATRIX_HEADER_LINE_ROW (w->current_matrix); + if (!row->enabled_p) + return Qnil; + return list4 (make_number (row->height), + make_number (0), make_number (0), + make_number (0)); + } + + if (EQ (line, Qmode_line)) + { + row = MATRIX_MODE_LINE_ROW (w->current_matrix); + if (!row->enabled_p) + return Qnil; + return list4 (make_number (row->height), + make_number (0), /* not accurate */ + make_number (WINDOW_HEADER_LINE_HEIGHT (w) + + window_text_bottom_y (w)), + make_number (0)); + } + + CHECK_NUMBER (line); + n = XINT (line); + + row = MATRIX_FIRST_TEXT_ROW (w->current_matrix); + end_row = MATRIX_BOTTOM_TEXT_ROW (w->current_matrix, w); + max_y = window_text_bottom_y (w); + i = 0; + + while ((n < 0 || i < n) + && row <= end_row && row->enabled_p + && row->y + row->height < max_y) + row++, i++; + + if (row > end_row || !row->enabled_p) + return Qnil; + + if (++n < 0) + { + if (-n > i) + return Qnil; + row += n; + i += n; + } + + found_row: + crop = max (0, (row->y + row->height) - max_y); + return list4 (make_number (row->height + min (0, row->y) - crop), + make_number (i), + make_number (row->y), + make_number (crop)); +} + + static struct window * decode_window (window) @@ -451,7 +570,7 @@ Return NCOL. NCOL should be zero or positive. Note that if `automatic-hscrolling' is non-nil, you cannot scroll the -window so that the location of point becomes invisible. */) +window so that the location of point moves off-window. */) (window, ncol) Lisp_Object window, ncol; { @@ -1048,9 +1167,11 @@ Lisp_Object value; struct window *w = decode_window (window); Lisp_Object buf; + struct buffer *b; buf = w->buffer; CHECK_BUFFER (buf); + b = XBUFFER (buf); #if 0 /* This change broke some things. We should make it later. */ /* If we don't know the end position, return nil. @@ -1063,12 +1184,20 @@ if (! NILP (update) && ! (! NILP (w->window_end_valid) - && XFASTINT (w->last_modified) >= MODIFF) + && XFASTINT (w->last_modified) >= BUF_MODIFF (b)) && !noninteractive) { struct text_pos startp; struct it it; - struct buffer *old_buffer = NULL, *b = XBUFFER (buf); + struct buffer *old_buffer = NULL; + + /* Cannot use Fvertical_motion because that function doesn't + cope with variable-height lines. */ + if (b != current_buffer) + { + old_buffer = current_buffer; + set_buffer_internal (b); + } /* In case W->start is out of the range, use something reasonable. This situation occurred when loading a file with @@ -1082,14 +1211,6 @@ else SET_TEXT_POS_FROM_MARKER (startp, w->start); - /* Cannot use Fvertical_motion because that function doesn't - cope with variable-height lines. */ - if (b != current_buffer) - { - old_buffer = current_buffer; - set_buffer_internal (b); - } - start_display (&it, w, startp); move_it_vertically (&it, window_box_height (w)); if (it.current_y < it.last_visible_y) @@ -1100,7 +1221,7 @@ set_buffer_internal (old_buffer); } else - XSETINT (value, BUF_Z (XBUFFER (buf)) - XFASTINT (w->window_end_pos)); + XSETINT (value, BUF_Z (b) - XFASTINT (w->window_end_pos)); return value; } @@ -4820,10 +4941,10 @@ struct it it; struct window *w = XWINDOW (window); struct text_pos start; - Lisp_Object tem; int this_scroll_margin; /* True if we fiddled the window vscroll field without really scrolling. */ int vscrolled = 0; + int x, y, rtop, rbot, rowh, vpos; SET_TEXT_POS_FROM_MARKER (start, w->start); @@ -4831,8 +4952,8 @@ the screen. Allow PT to be partially visible, otherwise something like (scroll-down 1) with PT in the line before the partially visible one would recenter. */ - tem = Fpos_visible_in_window_p (make_number (PT), window, Qt); - if (NILP (tem)) + + if (!pos_visible_p (w, PT, &x, &y, &rtop, &rbot, &rowh, &vpos)) { /* Move backward half the height of the window. Performance note: vmotion used here is about 10% faster, but would give wrong @@ -4857,7 +4978,7 @@ } else if (auto_window_vscroll_p) { - if (tem = XCAR (XCDR (XCDR (tem))), CONSP (tem)) + if (rtop || rbot) /* partially visible */ { int px; int dy = WINDOW_FRAME_LINE_HEIGHT (w); @@ -4867,19 +4988,52 @@ dy); dy *= n; - if (n < 0 && (px = XINT (XCAR (tem))) > 0) + if (n < 0) { - px = max (0, -w->vscroll - min (px, -dy)); - Fset_window_vscroll (window, make_number (px), Qt); - return; + /* Only vscroll backwards if already vscrolled forwards. */ + if (w->vscroll < 0 && rtop > 0) + { + px = max (0, -w->vscroll - min (rtop, -dy)); + Fset_window_vscroll (window, make_number (px), Qt); + return; + } } - if (n > 0 && (px = XINT (XCDR (tem))) > 0) + if (n > 0) { - px = max (0, -w->vscroll + min (px, dy)); - Fset_window_vscroll (window, make_number (px), Qt); - return; + /* Do vscroll if already vscrolled or only display line. */ + if (rbot > 0 && (w->vscroll < 0 || vpos == 0)) + { + px = max (0, -w->vscroll + min (rbot, dy)); + Fset_window_vscroll (window, make_number (px), Qt); + return; + } + + /* Maybe modify window start instead of scrolling. */ + if (rbot > 0 || w->vscroll < 0) + { + int spos; + + Fset_window_vscroll (window, make_number (0), Qt); + /* If there are other text lines above the current row, + move window start to current row. Else to next row. */ + if (rbot > 0) + spos = XINT (Fline_beginning_position (Qnil)); + else + spos = min (XINT (Fline_end_position (Qnil)) + 1, ZV); + set_marker_restricted (w->start, make_number (spos), + w->buffer); + w->start_at_line_beg = Qt; + w->update_mode_line = Qt; + XSETFASTINT (w->last_modified, 0); + XSETFASTINT (w->last_overlay_modified, 0); + /* Set force_start so that redisplay_window will run the + window-scroll-functions. */ + w->force_start = Qt; + return; + } } } + /* Cancel previous vscroll. */ Fset_window_vscroll (window, make_number (0), Qt); } @@ -4920,7 +5074,7 @@ if (dy <= 0) { move_it_vertically_backward (&it, -dy); - /* Ensure we actually does move, e.g. in case we are currently + /* Ensure we actually do move, e.g. in case we are currently looking at an image that is taller that the window height. */ while (start_pos == IT_CHARPOS (it) && start_pos > BEGV) @@ -4930,7 +5084,7 @@ { move_it_to (&it, ZV, -1, it.current_y + dy, -1, MOVE_TO_POS | MOVE_TO_Y); - /* Ensure we actually does move, e.g. in case we are currently + /* Ensure we actually do move, e.g. in case we are currently looking at an image that is taller that the window height. */ while (start_pos == IT_CHARPOS (it) && start_pos < ZV) @@ -6658,7 +6812,7 @@ CHECK_NATNUM (left_width); if (!NILP (right_width)) CHECK_NATNUM (right_width); - + /* Do nothing on a tty. */ if (FRAME_WINDOW_P (WINDOW_XFRAME (w)) && (!EQ (w->left_fringe_width, left_width) @@ -7292,16 +7446,18 @@ next_screen_context_lines = 2; DEFVAR_INT ("split-height-threshold", &split_height_threshold, - doc: /* *A window must be at least this tall to be eligible for splitting by `display-buffer'. + doc: /* *A window must be at least this tall to be eligible for splitting +by `display-buffer'. The value is in line units. If there is only one window, it is split regardless of this value. */); split_height_threshold = 500; DEFVAR_INT ("window-min-height", &window_min_height, - doc: /* *Delete any window less than this tall (including its mode line). */); + doc: /* *Delete any window less than this tall (including its mode line). +The value is in line units. */); window_min_height = 4; DEFVAR_INT ("window-min-width", &window_min_width, - doc: /* *Delete any window less than this wide. */); + doc: /* *Delete any window less than this wide (measured in characters). */); window_min_width = 10; DEFVAR_LISP ("scroll-preserve-screen-position", @@ -7327,6 +7483,7 @@ defsubr (&Swindowp); defsubr (&Swindow_live_p); defsubr (&Spos_visible_in_window_p); + defsubr (&Swindow_line_height); defsubr (&Swindow_buffer); defsubr (&Swindow_height); defsubr (&Swindow_width);
--- a/src/xdisp.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/xdisp.c Sat Oct 14 17:36:28 2006 +0000 @@ -256,9 +256,9 @@ Lisp_Object Vfontification_functions; Lisp_Object Qfontification_functions; -/* Non-zero means automatically select any window when the mouse +/* Non-nil means automatically select any window when the mouse cursor moves into it. */ -int mouse_autoselect_window; +Lisp_Object Vmouse_autoselect_window; /* Non-zero means draw tool bar buttons raised when the mouse moves over them. */ @@ -606,6 +606,11 @@ Lisp_Object Qinhibit_menubar_update; int inhibit_menubar_update; +/* When evaluating expressions from menu bar items (enable conditions, + for instance), this is the frame they are being processed for. */ + +Lisp_Object Vmenu_updating_frame; + /* Maximum height for resizing mini-windows. Either a float specifying a fraction of the available height, or an integer specifying a number of lines. */ @@ -1257,15 +1262,15 @@ /* Return 1 if position CHARPOS is visible in window W. + CHARPOS < 0 means return info about WINDOW_END position. If visible, set *X and *Y to pixel coordinates of top left corner. Set *RTOP and *RBOT to pixel height of an invisible area of glyph at POS. - EXACT_MODE_LINE_HEIGHTS_P non-zero means compute exact mode-line - and header-lines heights. */ + Set *ROWH and *VPOS to row's visible height and VPOS (row number). */ int -pos_visible_p (w, charpos, x, y, rtop, rbot, exact_mode_line_heights_p) - struct window *w; - int charpos, *x, *y, *rtop, *rbot, exact_mode_line_heights_p; +pos_visible_p (w, charpos, x, y, rtop, rbot, rowh, vpos) + struct window *w; + int charpos, *x, *y, *rtop, *rbot, *rowh, *vpos; { struct it it; struct text_pos top; @@ -1283,26 +1288,23 @@ SET_TEXT_POS_FROM_MARKER (top, w->start); - /* Compute exact mode line heights, if requested. */ - if (exact_mode_line_heights_p) - { - if (WINDOW_WANTS_MODELINE_P (w)) - current_mode_line_height - = display_mode_line (w, CURRENT_MODE_LINE_FACE_ID (w), - current_buffer->mode_line_format); - - if (WINDOW_WANTS_HEADER_LINE_P (w)) - current_header_line_height - = display_mode_line (w, HEADER_LINE_FACE_ID, + /* Compute exact mode line heights. */ + if (WINDOW_WANTS_MODELINE_P (w)) + current_mode_line_height + = display_mode_line (w, CURRENT_MODE_LINE_FACE_ID (w), + current_buffer->mode_line_format); + + if (WINDOW_WANTS_HEADER_LINE_P (w)) + current_header_line_height + = display_mode_line (w, HEADER_LINE_FACE_ID, current_buffer->header_line_format); - } start_display (&it, w, top); - move_it_to (&it, charpos, -1, it.last_visible_y, -1, - MOVE_TO_POS | MOVE_TO_Y); + move_it_to (&it, charpos, -1, it.last_visible_y-1, -1, + (charpos >= 0 ? MOVE_TO_POS : 0) | MOVE_TO_Y); /* Note that we may overshoot because of invisible text. */ - if (IT_CHARPOS (it) >= charpos) + if (charpos >= 0 && IT_CHARPOS (it) >= charpos) { int top_x = it.current_x; int top_y = it.current_y; @@ -1319,6 +1321,9 @@ *y = max (top_y + max (0, it.max_ascent - it.ascent), window_top_y); *rtop = max (0, window_top_y - top_y); *rbot = max (0, bottom_y - it.last_visible_y); + *rowh = max (0, (min (bottom_y, it.last_visible_y) + - max (top_y, window_top_y))); + *vpos = it.vpos; } } else @@ -1328,7 +1333,8 @@ it2 = it; if (IT_CHARPOS (it) < ZV && FETCH_BYTE (IT_BYTEPOS (it)) != '\n') move_it_by_lines (&it, 1, 0); - if (charpos < IT_CHARPOS (it)) + if (charpos < IT_CHARPOS (it) + || (it.what == IT_EOB && charpos == IT_CHARPOS (it))) { visible_p = 1; move_it_to (&it2, charpos, -1, -1, -1, MOVE_TO_POS); @@ -1337,6 +1343,11 @@ *rtop = max (0, -it2.current_y); *rbot = max (0, ((it2.current_y + it2.max_ascent + it2.max_descent) - it.last_visible_y)); + *rowh = max (0, (min (it2.current_y + it2.max_ascent + it2.max_descent, + it.last_visible_y) + - max (it2.current_y, + WINDOW_HEADER_LINE_HEIGHT (w)))); + *vpos = it2.vpos; } } @@ -1348,6 +1359,15 @@ if (visible_p && XFASTINT (w->hscroll) > 0) *x -= XFASTINT (w->hscroll) * WINDOW_FRAME_COLUMN_WIDTH (w); +#if 0 + /* Debugging code. */ + if (visible_p) + fprintf (stderr, "+pv pt=%d vs=%d --> x=%d y=%d rt=%d rb=%d rh=%d vp=%d\n", + charpos, w->vscroll, *x, *y, *rtop, *rbot, *rowh, *vpos); + else + fprintf (stderr, "-pv pt=%d vs=%d\n", charpos, w->vscroll); +#endif + return visible_p; } @@ -3214,7 +3234,9 @@ && !NILP (Vrun_hooks) && (pos = make_number (IT_CHARPOS (*it)), prop = Fget_char_property (pos, Qfontified, Qnil), - NILP (prop))) + /* Ignore the special cased nil value always present at EOB since + no amount of fontifying will be able to change it. */ + NILP (prop) && IT_CHARPOS (*it) < Z)) { int count = SPECPDL_INDEX (); Lisp_Object val; @@ -9132,7 +9154,7 @@ happen when, for instance, an activate-menubar-hook causes a redisplay. */ if (inhibit_menubar_update) - return; + return hooks_run; window = FRAME_SELECTED_WINDOW (f); w = XWINDOW (window); @@ -9203,6 +9225,7 @@ hooks_run = 1; } + XSETFRAME (Vmenu_updating_frame, f); FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f)); /* Redisplay the menu bar in case we changed it. */ @@ -10786,13 +10809,13 @@ int preserve_echo_area; { struct window *w = XWINDOW (selected_window); - struct frame *f = XFRAME (w->frame); + struct frame *f; int pause; int must_finish = 0; struct text_pos tlbufpos, tlendpos; int number_of_visible_frames; int count; - struct frame *sf = SELECTED_FRAME (); + struct frame *sf; int polling_stopped_here = 0; /* Non-zero means redisplay has to consider all windows on all @@ -10805,8 +10828,16 @@ initialized, or redisplay is explicitly turned off by setting Vinhibit_redisplay. */ if (noninteractive - || !NILP (Vinhibit_redisplay) - || !f->glyphs_initialized_p) + || !NILP (Vinhibit_redisplay)) + return; + + /* Don't examine these until after testing Vinhibit_redisplay. + When Emacs is shutting down, perhaps because its connection to + X has dropped, we should not look at them at all. */ + f = XFRAME (w->frame); + sf = SELECTED_FRAME (); + + if (!f->glyphs_initialized_p) return; /* The flag redisplay_performed_directly_p is set by @@ -12030,7 +12061,8 @@ window_height = window_box_height (w); if (row->height >= window_height) { - if (!force_p || MINI_WINDOW_P (w) || w->vscroll) + if (!force_p || MINI_WINDOW_P (w) + || w->vscroll || w->cursor.vpos == 0) return 1; } return 0; @@ -13519,7 +13551,8 @@ this_scroll_margin = min (this_scroll_margin, WINDOW_TOTAL_LINES (w) / 4); this_scroll_margin *= FRAME_LINE_HEIGHT (it.f); - if ((w->cursor.y < this_scroll_margin + if ((w->cursor.y >= 0 /* not vscrolled */ + && w->cursor.y < this_scroll_margin && CHARPOS (pos) > BEGV && IT_CHARPOS (it) < ZV) /* rms: considering make_cursor_line_fully_visible_p here @@ -17659,12 +17692,20 @@ break; case 'c': - { - int col = (int) current_column (); /* iftc */ - w->column_number_displayed = make_number (col); - pint2str (decode_mode_spec_buf, field_width, col); - return decode_mode_spec_buf; - } + /* %c and %l are ignored in `frame-title-format'. + (In redisplay_internal, the frame title is drawn _before_ the + windows are updated, so the stuff which depends on actual + window contents (such as %l) may fail to render properly, or + even crash emacs.) */ + if (mode_line_target == MODE_LINE_TITLE) + return ""; + else + { + int col = (int) current_column (); /* iftc */ + w->column_number_displayed = make_number (col); + pint2str (decode_mode_spec_buf, field_width, col); + return decode_mode_spec_buf; + } case 'e': #ifndef SYSTEM_MALLOC @@ -17706,11 +17747,16 @@ case 'l': { - int startpos = XMARKER (w->start)->charpos; - int startpos_byte = marker_byte_position (w->start); - int line, linepos, linepos_byte, topline; - int nlines, junk; - int height = WINDOW_TOTAL_LINES (w); + int startpos, startpos_byte, line, linepos, linepos_byte; + int topline, nlines, junk, height; + + /* %c and %l are ignored in `frame-title-format'. */ + if (mode_line_target == MODE_LINE_TITLE) + return ""; + + startpos = XMARKER (w->start)->charpos; + startpos_byte = marker_byte_position (w->start); + height = WINDOW_TOTAL_LINES (w); /* If we decided that this buffer isn't suitable for line numbers, don't forget that too fast. */ @@ -19772,7 +19818,7 @@ { struct image *img; struct face *face; - int glyph_ascent; + int glyph_ascent, crop; struct glyph_slice slice; xassert (it->what == IT_IMAGE); @@ -19880,6 +19926,15 @@ take_vertical_position_into_account (it); + /* Automatically crop wide image glyphs at right edge so we can + draw the cursor on same display row. */ + if ((crop = it->pixel_width - (it->last_visible_x - it->current_x), crop > 0) + && (it->hpos == 0 || it->pixel_width > it->last_visible_x / 4)) + { + it->pixel_width -= crop; + slice.width -= crop; + } + if (it->glyph_row) { struct glyph *glyph; @@ -21228,10 +21283,35 @@ /* Use normal cursor if not blinked off. */ if (!w->cursor_off_p) { - if (glyph != NULL && glyph->type == IMAGE_GLYPH) { - if (cursor_type == FILLED_BOX_CURSOR) - cursor_type = HOLLOW_BOX_CURSOR; +#ifdef HAVE_WINDOW_SYSTEM + if (glyph != NULL && glyph->type == IMAGE_GLYPH) + { + if (cursor_type == FILLED_BOX_CURSOR) + { + /* Using a block cursor on large images can be very annoying. + So use a hollow cursor for "large" images. + If image is not transparent (no mask), also use hollow cursor. */ + struct image *img = IMAGE_FROM_ID (f, glyph->u.img_id); + if (img != NULL && IMAGEP (img->spec)) + { + /* Arbitrarily, interpret "Large" as >32x32 and >NxN + where N = size of default frame font size. + This should cover most of the "tiny" icons people may use. */ + if (!img->mask + || img->width > max (32, WINDOW_FRAME_COLUMN_WIDTH (w)) + || img->height > max (32, WINDOW_FRAME_LINE_HEIGHT (w))) + cursor_type = HOLLOW_BOX_CURSOR; + } + } + else if (cursor_type != NO_CURSOR) + { + /* Display current only supports BOX and HOLLOW cursors for images. + So for now, unconditionally use a HOLLOW cursor when cursor is + not a solid box cursor. */ + cursor_type = HOLLOW_BOX_CURSOR; + } } +#endif return cursor_type; } @@ -23935,9 +24015,10 @@ DEFVAR_LISP ("frame-title-format", &Vframe_title_format, doc: /* Template for displaying the title bar of visible frames. \(Assuming the window manager supports this feature.) -This variable has the same structure as `mode-line-format' (which see), -and is used only on frames for which no explicit name has been set -\(see `modify-frame-parameters'). */); + +This variable has the same structure as `mode-line-format', except that +the %c and %l constructs are ignored. It is used only on frames for +which no explicit name has been set \(see `modify-frame-parameters'). */); DEFVAR_LISP ("icon-title-format", &Vicon_title_format, doc: /* Template for displaying the title bar of an iconified frame. @@ -23983,9 +24064,22 @@ See `set-window-redisplay-end-trigger'. */); Vredisplay_end_trigger_functions = Qnil; - DEFVAR_BOOL ("mouse-autoselect-window", &mouse_autoselect_window, - doc: /* *Non-nil means autoselect window with mouse pointer. */); - mouse_autoselect_window = 0; + DEFVAR_LISP ("mouse-autoselect-window", &Vmouse_autoselect_window, + doc: /* *Non-nil means autoselect window with mouse pointer. +If nil, do not autoselect windows. +A positive number means delay autoselection by that many seconds: a +window is autoselected only after the mouse has remained in that +window for the duration of the delay. +A negative number has a similar effect, but causes windows to be +autoselected only after the mouse has stopped moving. \(Because of +the way Emacs compares mouse events, you will occasionally wait twice +that time before the window gets selected.\) +Any other value means to autoselect window instantaneously when the +mouse pointer enters it. + +Autoselection selects the minibuffer only if it is active, and never +unselects the minibuffer if it is active. */); + Vmouse_autoselect_window = Qnil; DEFVAR_BOOL ("auto-resize-tool-bars", &auto_resize_tool_bars_p, doc: /* *Non-nil means automatically resize tool-bars. @@ -24105,6 +24199,11 @@ whose contents depend on various data. */); Vmenu_bar_update_hook = Qnil; + DEFVAR_LISP ("menu-updating-frame", &Vmenu_updating_frame, + doc: /* Frame for which we are updating a menu. +The enable predicate for a menu binding should check this variable. */); + Vmenu_updating_frame = Qnil; + DEFVAR_BOOL ("inhibit-menubar-update", &inhibit_menubar_update, doc: /* Non-nil means don't update menu bars. Internal use only. */); inhibit_menubar_update = 0;
--- a/src/xfns.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/xfns.c Sat Oct 14 17:36:28 2006 +0000 @@ -153,12 +153,16 @@ /* Non-zero means prompt with the old GTK file selection dialog. */ -int x_use_old_gtk_file_dialog; +int x_gtk_use_old_file_dialog; /* If non-zero, by default show hidden files in the GTK file chooser. */ int x_gtk_show_hidden_files; +/* If non-zero, don't show additional help text in the GTK file chooser. */ + +int x_gtk_file_dialog_help_text; + /* If non-zero, don't collapse to tool bar when it is detached. */ int x_gtk_whole_detached_tool_bar; @@ -5338,6 +5342,8 @@ int count = SPECPDL_INDEX (); struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6; + check_x (); + GCPRO6 (prompt, dir, default_filename, mustmatch, only_dir_p, file); if (popup_activated ()) @@ -5505,6 +5511,8 @@ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6; char *cdef_file; + check_x (); + GCPRO6 (prompt, dir, default_filename, mustmatch, only_dir_p, file); if (popup_activated ()) @@ -5803,12 +5811,12 @@ Vx_pixel_size_width_font_regexp = Qnil; /* This is not ifdef:ed, so other builds than GTK can customize it. */ - DEFVAR_BOOL ("x-use-old-gtk-file-dialog", &x_use_old_gtk_file_dialog, + DEFVAR_BOOL ("x-gtk-use-old-file-dialog", &x_gtk_use_old_file_dialog, doc: /* *Non-nil means prompt with the old GTK file selection dialog. If nil or if the file selection dialog is not available, the new GTK file chooser is used instead. To turn off all file dialogs set the variable `use-file-dialog'. */); - x_use_old_gtk_file_dialog = 0; + x_gtk_use_old_file_dialog = 0; DEFVAR_BOOL ("x-gtk-show-hidden-files", &x_gtk_show_hidden_files, doc: /* *If non-nil, the GTK file chooser will by default show hidden files. @@ -5816,6 +5824,12 @@ chooser to show or not show hidden files on a case by case basis. */); x_gtk_show_hidden_files = 0; + DEFVAR_BOOL ("x-gtk-file-dialog-help-text", &x_gtk_file_dialog_help_text, + doc: /* *If non-nil, the GTK file chooser will show additional help text. +If more space for files in the file chooser dialog is wanted, set this to nil +to turn the additional text off. */); + x_gtk_file_dialog_help_text = 1; + DEFVAR_BOOL ("x-gtk-whole-detached-tool-bar", &x_gtk_whole_detached_tool_bar, doc: /* *If non-nil, a detached tool bar is shown in full. The default is to just show an arrow and pressing on that arrow shows
--- a/src/xmenu.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/xmenu.c Sat Oct 14 17:36:28 2006 +0000 @@ -97,10 +97,10 @@ #define FALSE 0 #endif /* no TRUE */ -Lisp_Object Vmenu_updating_frame; - Lisp_Object Qdebug_on_next_call; +extern Lisp_Object Vmenu_updating_frame; + extern Lisp_Object Qmenu_bar; extern Lisp_Object QCtoggle, QCradio; @@ -1191,6 +1191,10 @@ { menu_items_inuse = in_use ? Qt : Qnil; popup_activated_flag = in_use; +#ifdef USE_X_TOOLKIT + if (popup_activated_flag) + x_activate_timeout_atimer (); +#endif } /* Wait for an X event to arrive or for a timer to expire. */ @@ -1310,7 +1314,7 @@ } } -DEFUN ("x-menu-bar-open", Fx_menu_bar_open, Sx_menu_bar_open, 0, 1, "i", +DEFUN ("x-menu-bar-open-internal", Fx_menu_bar_open_internal, Sx_menu_bar_open_internal, 0, 1, "i", doc: /* Start key navigation of the menu bar in FRAME. This initially opens the first menu bar item and you can then navigate with the arrow keys, select a menu entry with the return key or cancel with the @@ -1389,7 +1393,7 @@ #ifdef USE_GTK -DEFUN ("x-menu-bar-open", Fx_menu_bar_open, Sx_menu_bar_open, 0, 1, "i", +DEFUN ("x-menu-bar-open-internal", Fx_menu_bar_open_internal, Sx_menu_bar_open_internal, 0, 1, "i", doc: /* Start key navigation of the menu bar in FRAME. This initially opens the first menu bar item and you can then navigate with the arrow keys, select a menu entry with the return key or cancel with the @@ -1510,6 +1514,9 @@ XtPointer client_data; { popup_activated_flag = 1; +#ifdef USE_X_TOOLKIT + x_activate_timeout_atimer (); +#endif } #endif @@ -2828,6 +2835,7 @@ /* Display the menu. */ lw_popup_menu (menu, (XEvent *) &dummy); popup_activated_flag = 1; + x_activate_timeout_atimer (); { int fact = 4 * sizeof (LWLIB_ID); @@ -3214,6 +3222,7 @@ /* Display the dialog box. */ lw_pop_up_all_widgets (dialog_id); popup_activated_flag = 1; + x_activate_timeout_atimer (); /* Process events that apply to the dialog box. Also handle timers. */ @@ -3803,11 +3812,6 @@ Qdebug_on_next_call = intern ("debug-on-next-call"); staticpro (&Qdebug_on_next_call); - DEFVAR_LISP ("menu-updating-frame", &Vmenu_updating_frame, - doc: /* Frame for which we are updating a menu. -The enable predicate for a menu command should check this variable. */); - Vmenu_updating_frame = Qnil; - #ifdef USE_X_TOOLKIT widget_id_tick = (1<<16); next_menubar_widget_id = 1; @@ -3816,10 +3820,9 @@ defsubr (&Sx_popup_menu); #if defined (USE_GTK) || defined (USE_X_TOOLKIT) - defsubr (&Sx_menu_bar_open); - Fdefalias (intern ("accelerate-menu"), - intern (Sx_menu_bar_open.symbol_name), - Qnil); + defsubr (&Sx_menu_bar_open_internal); + Ffset (intern ("accelerate-menu"), + intern (Sx_menu_bar_open_internal.symbol_name)); #endif #ifdef HAVE_MENUS
--- a/src/xterm.c Sat Oct 14 16:56:21 2006 +0000 +++ b/src/xterm.c Sat Oct 14 17:36:28 2006 +0000 @@ -2701,9 +2701,8 @@ if (!XGetFontProperty (s->font, XA_UNDERLINE_THICKNESS, &h)) h = 1; - if (x_underline_at_descent_line) - y = s->y + s->height - h; - else + y = s->y + s->height - h; + if (!x_underline_at_descent_line) { /* Get the underline position. This is the recommended vertical offset in pixels from the baseline to the top of @@ -4105,6 +4104,9 @@ /* Make Xt timeouts work while the scroll bar is active. */ toolkit_scroll_bar_interaction = 1; +#ifdef USE_X_TOOLKIT + x_activate_timeout_atimer (); +#endif /* Setting the event mask to zero means that the message will be sent to the client that created the window, and if that @@ -6597,7 +6599,7 @@ { /* Generate SELECT_WINDOW_EVENTs when needed. */ - if (mouse_autoselect_window) + if (!NILP (Vmouse_autoselect_window)) { Lisp_Object window; @@ -7517,7 +7519,7 @@ static struct x_error_message_stack *x_error_message; /* An X error handler which stores the error message in - x_error_message_string. This is called from x_error_handler if + *x_error_message. This is called from x_error_handler if x_catch_errors is in effect. */ static void @@ -7536,7 +7538,7 @@ After calling this function, X protocol errors no longer cause Emacs to exit; instead, they are recorded in the string - stored in x_error_message_string. + stored in *x_error_message. Calling x_check_errors signals an Emacs error if an X error has occurred since the last call to x_catch_errors or x_check_errors. @@ -7819,7 +7821,7 @@ /* We specifically use it before defining it, so that gcc doesn't inline it, otherwise gdb doesn't know how to properly put a breakpoint on it. */ -static void x_error_quitter P_ ((Display *, XErrorEvent *)) NO_RETURN; +static void x_error_quitter P_ ((Display *, XErrorEvent *)); /* This is the first-level handler for X protocol errors. It calls x_error_quitter or x_error_catcher. */ @@ -7864,6 +7866,12 @@ { char buf[256], buf1[356]; + /* Ignore BadName errors. They can happen because of fonts + or colors that are not defined. */ + + if (error->error_code == BadName) + return; + /* Note that there is no real way portable across R3/R4 to get the original error handler. */ @@ -8372,7 +8380,7 @@ int expected_left; int expected_top; { - int count = 0, current_left = 0, current_top = 0; + int current_left = 0, current_top = 0; /* x_real_positions returns the left and top offsets of the outermost window manager window around the frame. */ @@ -10169,6 +10177,11 @@ {"-mc", "*pointerColor", XrmoptionSepArg, (XtPointer) NULL}, {"-cr", "*cursorColor", XrmoptionSepArg, (XtPointer) NULL} }; + +/* Whether atimer for Xt timeouts is activated or not. */ + +static int x_timeout_atimer_activated_flag; + #endif /* USE_X_TOOLKIT */ static int x_initialized; @@ -10882,13 +10895,39 @@ x_process_timeouts (timer) struct atimer *timer; { + BLOCK_INPUT; + x_timeout_atimer_activated_flag = 0; if (toolkit_scroll_bar_interaction || popup_activated ()) { - BLOCK_INPUT; while (XtAppPending (Xt_app_con) & XtIMTimer) XtAppProcessEvent (Xt_app_con, XtIMTimer); - UNBLOCK_INPUT; - } + /* Reactivate the atimer for next time. */ + x_activate_timeout_atimer (); + } + UNBLOCK_INPUT; +} + +/* Install an asynchronous timer that processes Xt timeout events + every 0.1s as long as either `toolkit_scroll_bar_interaction' or + `popup_activated_flag' (in xmenu.c) is set. Make sure to call this + function whenever these variables are set. This is necessary + because some widget sets use timeouts internally, for example the + LessTif menu bar, or the Xaw3d scroll bar. When Xt timeouts aren't + processed, these widgets don't behave normally. */ + +void +x_activate_timeout_atimer () +{ + BLOCK_INPUT; + if (!x_timeout_atimer_activated_flag) + { + EMACS_TIME interval; + + EMACS_SET_SECS_USECS (interval, 0, 100000); + start_atimer (ATIMER_RELATIVE, interval, x_process_timeouts, 0); + x_timeout_atimer_activated_flag = 1; + } + UNBLOCK_INPUT; } #endif /* USE_X_TOOLKIT */ @@ -10957,15 +10996,15 @@ x_destroy_all_bitmaps (dpyinfo); XSetCloseDownMode (dpyinfo->display, DestroyAll); +#ifdef USE_GTK + xg_display_close (dpyinfo->display); +#else #ifdef USE_X_TOOLKIT XtCloseDisplay (dpyinfo->display); #else -#ifdef USE_GTK - xg_display_close (dpyinfo->display); -#else XCloseDisplay (dpyinfo->display); #endif -#endif +#endif /* ! USE_GTK */ x_delete_display (dpyinfo); UNBLOCK_INPUT; @@ -11052,17 +11091,6 @@ XtCacheByDisplay, cvt_pixel_dtor); XtAppSetFallbackResources (Xt_app_con, Xt_default_resources); - - /* Install an asynchronous timer that processes Xt timeout events - every 0.1s. This is necessary because some widget sets use - timeouts internally, for example the LessTif menu bar, or the - Xaw3d scroll bar. When Xt timouts aren't processed, these - widgets don't behave normally. */ - { - EMACS_TIME interval; - EMACS_SET_SECS_USECS (interval, 0, 100000); - start_atimer (ATIMER_CONTINUOUS, interval, x_process_timeouts, 0); - } #endif #ifdef USE_TOOLKIT_SCROLL_BARS
--- a/src/xterm.h Sat Oct 14 16:56:21 2006 +0000 +++ b/src/xterm.h Sat Oct 14 17:36:28 2006 +0000 @@ -1003,6 +1003,7 @@ extern int x_alloc_lighter_color_for_widget __P ((Widget, Display*, Colormap, unsigned long *, double, int)); +extern void x_activate_timeout_atimer P_ ((void)); #endif extern void x_query_colors P_ ((struct frame *f, XColor *, int)); extern void x_query_color P_ ((struct frame *f, XColor *));