Mercurial > emacs
changeset 90813:e6fdae9180d4
Merge from emacs--devo--0
Patches applied:
* emacs--devo--0 (patch 698-710)
- Update from CVS
- Merge from gnus--rel--5.10
* gnus--rel--5.10 (patch 216)
- Update from CVS
Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-196
line wrap: on
line diff
--- a/AUTHORS Tue Apr 24 11:35:23 2007 +0000 +++ b/AUTHORS Tue Apr 24 21:56:25 2007 +0000 @@ -33,9 +33,9 @@ Alan Mackenzie: wrote cc-awk.el and changed cc-cmds.el cc-mode.el cc-engine.el cc-defs.el cc-vars.el - cc-langs.el cc-mode.texi cc-styles.el cc-align.el lread.c cc-fonts.el - programs.texi cc-subword.el isearch.el lisp.el search.texi subr.el - text.texi buffers.texi cc-fix.el cc-mode-19.el and 17 other files + cc-langs.el cc-mode.texi cc-styles.el cc-align.el cc-fonts.el lread.c + programs.texi cc-subword.el isearch.el lisp.el search.texi startup.el + subr.el text.texi buffers.texi cc-fix.el and 18 other files Alan Shutko: changed diary-lib.el calendar.el bindings.el cal-hebrew.el easy-mmode.el gnus-sum.el ibuf-ext.el ibuffer.el lunar.el macros.el @@ -332,11 +332,11 @@ 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 cus-edit.el simple.el custom.el files.el - display.texi longlines.el keyboard.c custom.texi info.el text.texi - compile.el files.texi image-mode.el mouse.el xdisp.c frames.texi - startup.el wid-edit.el xterm.c cus-theme.el faces.el - and 244 other files +Chong Yidong: changed cus-edit.el simple.el files.el custom.el + display.texi longlines.el xdisp.c files.texi keyboard.c compile.el + custom.texi info.el text.texi frames.texi image-mode.el mouse.el + misc.texi startup.el wid-edit.el xterm.c cus-theme.el + and 296 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 @@ -418,7 +418,7 @@ and changed term.el xterm.el hideshow.el isearch.el icon.el lisp.h cus-edit.el faces.el font-lock.el grep.el sh-script.el eterm-color.ti ibuffer.el rxvt.el vhdl-mode.el xterm.c bindings.el compile.el - dabbrev.el imenu.el outline.el and 164 other files + dabbrev.el imenu.el outline.el and 166 other files Daniel Brockman: changed cus-start.el format-spec.el ibuffer.el rcirc.el @@ -463,7 +463,7 @@ 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 fns.c vc.el rfc2047.el bindings.el cus-start.el buffer.c - byte-opt.el bytecomp.el and 729 other files + byte-opt.el bytecomp.el and 727 other files Dave Pearson: wrote 5x5.el quickurl.el @@ -492,7 +492,7 @@ cl.texinfo complete.el edmacro.el and changed info.el bytecomp.el -David Hansen: changed nnrss.el lisp.el pcomplete.el tempo.el +David Hansen: changed nnrss.el cc-cmds.el lisp.el pcomplete.el tempo.el David Hedbor: changed gnus-art.el mm-decode.el mm-view.el gnus-agent.el gnus-cite.el gnus-cus.el gnus-eform.el gnus-group.el gnus-msg.el @@ -522,8 +522,9 @@ David M. Brown: wrote array.el -David M. Koppelman: wrote hi-lock.el -and changed display.texi +David M. Koppelman: changed hi-lock.el display.texi + +David M. Koppelman, Koppel@Ece.Lsu.Edu: wrote hi-lock.el David M. Smith: wrote ielm.el and changed imenu.el @@ -649,7 +650,7 @@ Eli Zaretskii: wrote codepage.el rxvt.el tty-colors.el and changed msdos.c Makefile.in makefile.w32-in files.el info.el fileio.c startup.el mainmake.v2 config.bat menu-bar.el pc-win.el rmail.el - msdos.h simple.el internal.el xfaces.c emacs.c frame.c dosfns.c + simple.el msdos.h internal.el xfaces.c emacs.c frame.c dosfns.c faces.el frame.el and 531 other files Emanuele Giaquinta: changed rxvt.el configure.in etags.c frame.el @@ -747,7 +748,7 @@ and changed etags.c man.el delta.h undigest.el etags.1 comint.el configure.in uniquify.el latin-post.el rmail.el Makefile.in etags.el latin-alt.el maintaining.texi sgml-mode.el data.c european.el - filelock.c files.el generic-x.el gud.el and 42 other files + filelock.c files.el generic-x.el gud.el and 43 other files Francis J. Wright: wrote woman.el and changed dired.el comint.el files.el @@ -851,9 +852,9 @@ Glenn Morris: changed f90.el diary-lib.el calendar.el fortran.el calendar.texi appt.el sh-script.el Makefile.in timeclock.el cal-menu.el - startup.el abbrevs.texi cal-hebrew.el cal-islam.el complete.el - emacs.texi files.el fr-refcard.tex holidays.el orgcard.tex os.texi - and 120 other files + files.el complete.el configure.in startup.el MACHINES abbrevs.texi + cal-hebrew.el cal-islam.el emacs.texi fr-refcard.tex holidays.el + and 145 other files Glynn Clements: wrote gamegrid.el snake.el tetris.el @@ -878,7 +879,8 @@ Gregory Neil Shapiro: changed mailabbrev.el -Guanpeng Xu: changed add-log.el TUTORIAL.cn mouse.el type-break.el +Guanpeng Xu: changed add-log.el TUTORIAL.cn display.texi mouse.el + type-break.el Guillermo J. Rozas: wrote fakemail.c @@ -1175,8 +1177,8 @@ 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 simple.el align.el bytecomp.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 and 14 other files + dired-x.el display.texi erc-bbdb.el erc-button.el erc-compat.el + erc-dcc.el and 16 other files Johan Vromans: wrote forms-d2.el forms.el iso-acc.el and changed complete.el @@ -1326,11 +1328,11 @@ Kanematsu Daiji: changed nnimap.el -Karl Berry: changed info.texi emacs.texi elisp.texi emacs-xtra.texi - 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 lists.texi loading.texi macos.texi minibuf.texi - and 70 other files +Karl Berry: changed info.texi emacs.texi elisp.texi anti.texi + display.texi emacs-xtra.texi filelock.c gnu.texi mule.texi text.texi + building.texi cmdargs.texi copyright.el custom.texi customize.texi + dired.c faq.texi frames.texi help.texi lists.texi loading.texi + and 71 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 @@ -1360,9 +1362,9 @@ 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 mm-util.el gnus-msg.el gnus.el lpath.el + mm-view.el gnus-util.el gnus-msg.el mm-util.el gnus.el lpath.el gnus-group.el gnus-start.el rfc2047.el dgnushack.el mm-uu.el nntp.el - gnus-agent.el mml.el nnrss.el message.texi and 73 other files + gnus-agent.el mml.el nnrss.el message.texi and 72 other files Kaveh R. Ghazi: changed delta88k.h xterm.c @@ -1438,18 +1440,17 @@ and 5 other files Kevin Ryde: wrote info-xref.el -and changed info-look.el info.el cl.texi gnus-art.el gnus-sum.el - mailcap.el os.texi text.texi MORE.STUFF cal-dst.el calendar.texi - 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 etags.c - and 18 other files +and changed info-look.el info.el arc-mode.el cl.texi gnus-art.el + gnus-sum.el mailcap.el mule.el os.texi text.texi MORE.STUFF cal-dst.el + calendar.texi cc-align.el cmdargs.texi compile.texi display.texi + em-alias.el em-dirs.el em-hist.el em-unix.el and 19 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 process.c simple.el window.c keyboard.c xterm.c subr.el w32term.c dispnew.c lisp.h fringe.c macterm.c display.texi fns.c alloc.c xfaces.c keymap.c xfns.c xterm.h .gdbinit - and 254 other files + and 255 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 @@ -1549,6 +1550,8 @@ Leonard H. Tower Jr.: changed rnews.el rnewspost.el emacsbug.el rmailout.el +Levin Du: changed parse-time.el + Liam Healy: changed outline.el Lloyd Zusman: changed mml.el pgg-gpg.el @@ -1671,8 +1674,9 @@ mule-cmds.el rmailout.el checkdoc.el configure.in custom.el emacsbug.el gnus.el help-fns.el ls-lisp.el mwheel.el and 122 other files -Markus Triska: changed doctor.el expand.el flymake.el flymake.texi - handwrite.el internals.texi speedbar.el subr.el tumme.el widget.texi +Markus Triska: changed byte-opt.el bytecomp.el doctor.el expand.el + flymake.el flymake.texi handwrite.el internals.texi speedbar.el subr.el + tumme.el widget.texi Marshall T. Vandegrift: changed gnus-fun.el @@ -1691,11 +1695,11 @@ Martin Neitzel: changed sc.el -Martin Rudalics: changed cus-edit.el wid-edit.el files.el flyspell.el - font-lock.el complete.el cus-start.el insdel.c macmenu.c syntax.c +Martin Rudalics: changed cus-edit.el wid-edit.el cus-start.el files.el + flyspell.el font-lock.el complete.el insdel.c macmenu.c syntax.c w32menu.c wdired.el whitespace.el window.el xdisp.c xmenu.c - backups.texi buffer.c buffer.h casefiddle.c cperl-mode.el - and 31 other files + backups.texi buffer.c buffer.h casefiddle.c cc-mode.el + and 36 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 @@ -1723,7 +1727,7 @@ Masayuki Fujii: changed dnd.el w32-win.el -Mathias Dahl: wrote tumme.el +Mathias Dahl: wrote image-dired.el and changed dired.el dired.texi Mathias Megyei: changed Makefile.in @@ -1927,9 +1931,9 @@ Nick Roberts: wrote gdb-ui.el and changed gud.el building.texi tooltip.el speedbar.el bindings.el - thumbs.el xt-mouse.el .gdbinit DEBUG cc-mode.el frames.texi subr.el - t-mouse.el comint.el display.texi help-mode.el compile.el descr-text.el - dired.el gud-display.pbm speedbar.texi and 115 other files + thumbs.el xt-mouse.el .gdbinit DEBUG cc-mode.el t-mouse.el frames.texi + subr.el comint.el display.texi help-mode.el compile.el descr-text.el + dired.el gud-display.pbm speedbar.texi and 116 other files Nico Francois: changed w32fns.c w32inevt.c w32menu.c @@ -1999,6 +2003,8 @@ Pascal Rigaux: changed rfc2231.el +Paul Curry: changed cc-subword.el + Paul D. Smith: wrote snmp-mode.el and changed imenu.el make-mode.el @@ -2169,7 +2175,7 @@ gnus-group.el gnus-faq.texi gnus-util.el mml.el gnus-score.el gnus-start.el message.texi mm-util.el gnus-agent.el gnus-msg.el spam.el files.el spam-report.el mm-decode.el nnmail.el nnweb.el - and 167 other files + and 166 other files Remek Trzaska: changed gnus-ems.el @@ -2531,8 +2537,8 @@ 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 text.texi TUTORIAL.it bindat.el - dcl-mode.el display.texi files.el gnus.texi pcvs.el sysdep.c vc-rcs.el - MORE.STUFF TUTORIAL.ja and 129 other files + dcl-mode.el display.texi files.el gnus.texi pcvs.el startup.el sysdep.c + vc-rcs.el MORE.STUFF and 129 other files Thierry Emery: changed kinsoku.el timezone.el url-http.el wid-edit.el @@ -2725,8 +2731,8 @@ Yamamoto Mitsuharu: changed macterm.c macfns.c mac-win.el mac.c macterm.h macmenu.c macgui.h image.c macselect.c keyboard.c xdisp.c makefile.MPW - config.h emacs.c Makefile.in macos.texi xfaces.c INSTALL darwin.h - dispnew.c configure.in and 76 other files + config.h emacs.c Makefile.in macos.texi darwin.h xfaces.c INSTALL + dispnew.c alloc.c and 77 other files Yann Dirson: changed imenu.el
--- a/ChangeLog Tue Apr 24 11:35:23 2007 +0000 +++ b/ChangeLog Tue Apr 24 21:56:25 2007 +0000 @@ -1,3 +1,24 @@ +2007-04-24 Juanma Barranquero <lekktu@gmail.com> + + * INSTALL (DETAILED BUILDING AND INSTALLATION): Fix typo. + +2007-04-19 Glenn Morris <rgm@gnu.org> + + * configure.in: Signal error if Xaw libs are missing in a Lucid + build. + +2007-04-18 Glenn Morris <rgm@gnu.org> + + * INSTALL: Mention CPP. + +2007-04-15 Glenn Morris <rgm@gnu.org> + + * FTP: Replace with a pointer to the web version. + +2007-04-13 Glenn Morris <rgm@gnu.org> + + * INSTALL: In lib-src, timer, wakeup, yow are removed. + 2007-04-04 Glenn Morris <rgm@gnu.org> * configure.in (NON_GNU_CPP): Use associated preprocessor when @@ -8,7 +29,7 @@ * configure.in: Restore support for hp800 (removed 2007-01-27) following clarification of legal status. -2007-03-22 Joe Buehler <jbuehler@spirentcom.com> (tiny change) +2007-03-22 Joe Buehler <jbuehler@spirentcom.com> (tiny change) * configure.in: Add support for AIX4.3 on IBM RS6000.
--- a/FTP Tue Apr 24 11:35:23 2007 +0000 +++ b/FTP Tue Apr 24 21:56:25 2007 +0000 @@ -1,234 +1,6 @@ - -*- text -*- -How to get GNU Software by Internet FTP or by UUCP. Last updated 1999-01-20 - -* Please send improvements to this file to gnu@gnu.org. - -* No Warranties - -We distribute software in the hope that it will be useful, but without -any warranty. No author or distributor of this software accepts -responsibility to anyone for the consequences of using it or for -whether it serves any particular purpose or works at all, unless he -says so in writing. This is exactly the same warranty that the proprietary -software companies offer: None. If the distribution is incomplete or the -media fails, you can always download a replacement from any of the GNU -mirrors, free of charge. - -* Updates - -You can always find the most recent version of this list of GNU FTP sites at - http://www.gnu.org/order/ftp.html - -* How to FTP - -Use the ftp program on your system (ask locally if you can't find it) -to connect to the host you are ftping from. Unless indicated -otherwise, login in as user "anonymous", with password: "your e-mail -address" and set "binary" mode (to transfer all eight bits in each -byte). - -ALWAYS USE BINARY/IMAGE MODE TO TRANSFER THESE FILES! -Text mode does not work for tar files or compressed files. - -* GNU Software and How To FTP It - -GNU software is available on ftp.gnu.org under the directory /gnu. -diff files to convert between versions exist for some of these -programs. Some programs have misc support files as well. Have a look -on ftp.gnu.org to see which ones. In most cases, the tar or diff -files are compressed with the `gzip' program; this is indicated with -the .gz suffix. Binaries for gzip can be downloaded from -http://www.gzip.org. - -Descriptions of GNU software are available at - http://www.gnu.org/software/software.html - and in the Free Software Directory at - http://www.gnu.org/directory/index.html - -* Alternative Internet FTP Sources - -The canonical GNU ftp site is located at ftp.gnu.org/gnu. -You should probably use one of the many mirrors of that site - the -mirrors will be less busy, and you can find one closer to your site. - -* GNU FTP Site Mirror List - -United States: - - -California - mirrors.kernel.org/gnu, http://mirrors.kernel.org/gnu -California - gatekeeper.dec.com/pub/GNU/ -California - ftp.keystealth.org/pub/gnu/ -Illinois - uiarchive.cso.uiuc.edu/pub/ftp/ftp.gnu.org/gnu/ -Indiana - ftp.in-span.net/pub/mirrors/ftp.gnu.org/ -Kentucky - gnu.ms.uky.edu/pub/mirrors/gnu/ -Maryland - ftp.digex.net/pub/gnu/ -Massachusetts - aeneas.mit.edu/pub/gnu/ -Michigan - ftp.egr.msu.edu/pub/gnu/, http://ftp.egr.msu.edu/pub/gnu/ -Michigan - ftp.wayne.edu/gnu_mirror/ -Missouri - wuarchive.wustl.edu/systems/gnu/ -New Jersey - gnu.teleglobe.net/ftp.gnu.org/ -New York - ftp.cs.columbia.edu/archives/gnu/prep/ -New York - ftp.ece.cornell.edu/pub/mirrors/gnu/ -North Carolina - http://www.ibiblio.org/pub/gnu/ -Ohio - ftp.cis.ohio-state.edu/mirror/gnu/ -Pennsylvania - boron.club.cc.cmu.edu/gnu/ -Tennessee - sunsite.utk.edu/pub/gnu/ftp/, thales.memphis.edu/pub/gnu/ -Washington - ftp.nodomainname.net/pub/mirrors/gnu/, gnu.wwc.edu/ -Wisconsin - ftp.twtelecom.net/pub/GNU/ - -Africa: - -South Africa - ftp.sun.ac.za/mirrorsites/ftp.gnu.org/pub/gnu - -The Americas: - -Brazil - ftp.unicamp.br/pub/gnu/ -Brazil - master.softaplic.com.br/pub/gnu/ -Brazil - ftp.matrix.com.br/pub/gnu/ -Canada - ftp.cs.ubc.ca/mirror2/gnu/ -Chile - ftp.inf.utfsm.cl/pub/gnu/ -Costa Rica - sunsite.ulatina.ac.cr/Mirrors/GNU/ -Mexico - www.gnu.unam.mx/pub/gnu/software/ -Mexico - gnu.cem.itesm.mx/pub/mirrors/gnu.org/ -Mexico - ftp.azc.uam.mx/mirrors/gnu/ - -Australia: - -Australia - mirror.aarnet.edu.au/pub/gnu/ -Australia - gnu.mirror.pacific.net.au/gnu/ - -Asia: +For information about how to obtain GNU Emacs and other GNU software +by FTP, please see <http://www.gnu.org/order/ftp.html>. -China - ftp.sea9.com/pub/gnu/ -China - ftp.cs.cuhk.edu.hk/pub/gnu/gnu/ -China - sunsite.ust.hk/pub/gnu/ -China - ftp.shellhung.org/pub/gnu/ -India - ftp.kernel.org.in/gnu.org/ -India - http://kernel.org.in/mirrors/gnu.org/ -India - www.imtech.res.in/mirror/gnuftp/ -Indonesia - sapi.vlsm.org/gnu -Indonesia - http://sapi.vlsm.org/gnu/ -Israel - ftp.cs.huji.ac.il/mirror/GNU -Japan - tron.um.u-tokyo.ac.jp/pub/GNU/prep/ -Japan - core.ring.gr.jp/pub/GNU/ -Japan - ftp.ring.gr.jp/pub/GNU/ -Japan - mirrors.hbi.co.jp/gnu/ -Japan - ftp.ayamura.org/pub/gnu/ -Korea - cair-archive.kaist.ac.kr/pub/gnu/ (Internet address 143.248.186.3) -Korea - ftpmirror.hanyang.ac.kr/GNU/ -Korea - ftp.linux.sarang.net/mirror/gnu/gnu/ (also mirrors alpha.gnu.org/gnu/ at ../alpha/) -Korea - ftp.xgate.co.kr/pub/mirror/gnu/ -Saudi Arabia - ftp.isu.net.sa/pub/gnu/ -Taiwan - ftp.nctu.edu.tw/UNIX/gnu/, coda.nctu.edu.tw/UNIX/gnu/ -Taiwan - ftp1.sinica.edu.tw/pub3/GNU/gnu/ -Thailand - ftp.nectec.or.th/pub/mirrors/gnu/ - -Europe: +Information about Emacs is also available at +<http://www.gnu.org/software/emacs/>. -Austria - ftp.gnu.vbs.at/ -Austria - ftp.univie.ac.at/packages/gnu/ -Austria - gd.tuwien.ac.at/gnu/gnusrc/ -Austria - http://gd.tuwien.ac.at/gnu/gnusrc/ -Czech Republic - ftp.fi.muni.cz/pub/gnu/ -Denmark - ftp.denet.dk/mirror/ftp.gnu.org/pub/gnu -Denmark - ftp.dkuug.dk/pub/gnu/ -Denmark - sunsite.dk/mirrors/gnu, http://mirrors.sunsite.dk/gnu -Finland - ftp.funet.fi/pub/gnu/prep/ -France - ftp.irisa.fr/pub/gnu/ -France - ftp.medasys-digital-systems.fr/pub/gnu/ -France - ftp.cs.univ-paris8.fr/mirrors/ftp.gnu.org/ -Germany - ftp.cs.tu-berlin.de/pub/gnu/ -Germany - ftp.fh-worms.de/pub/mirror/ftp.gnu.org/ -Germany - ftp.leo.org/pub/comp/os/unix/gnu/ -Germany - ftp.informatik.rwth-aachen.de/pub/gnu/ -Germany - ftp.de.uu.net/pub/gnu/ -Germany - ftp.freenet.de/pub/ftp.gnu.org/gnu/ -Germany - ftp.cs.uni-bonn.de/pub/gnu/ -Germany - ftp-stud.fht-esslingen.de/pub/Mirrors/ftp.gnu.org/ -Germany - http://ftp-stud.fht-esslingen.de/pub/Mirrors/ftp.gnu.org/ -Germany - ftp.stw-bonn.de/pub/mirror/ftp.gnu.org/ -Greece - ftp.forthnet.gr/pub/gnu/ -Greece - ftp.ntua.gr/pub/gnu/ -Greece - ftp.duth.gr/pub/gnu/ -Greece - ftp.physics.auth.gr/pub/gnu/ -Ireland - ftp.esat.net/pub/gnu/ (Internet address 193.120.14.241) -Italy - ftp.oasi.gpa.it/pub/gnu/ -Italy - ftp.lugroma2.org/pub/gnu/ -Netherlands - ftp.nluug.nl/pub/gnu/ -Netherlands - ftp.mirror.nl/pub/mirror/gnu/ -Netherlands - ftp.nl.uu.net/pub/gnu/ -Netherlands - mirror.widexs.nl/pub/gnu/ -Norway - ftp.gnu.no/ -Poland - sunsite.icm.edu.pl/pub/gnu/ -Portugal - ftp.ist.utl.pt/pub/GNU/gnu/ -Romania - ftp.timisoara.roedu.net/mirrors/ftp.gnu.org/pub/gnu -Russia - ftp.chg.ru/pub/gnu/ -Slovenia - ftp.arnes.si/software/gnu/ -Spain - ftp.etsimo.uniovi.es/pub/gnu/ -Spain - ftp.rediris.es/pub/gnu/ -Sweden - ftp.isy.liu.se/pub/gnu/ -Sweden - ftp.stacken.kth.se/pub/gnu/ -Sweden - ftp.sunet.se/pub/gnu/; also mirrors /non-gnu -Sweden - ftp.chl.chalmers.se/pub/gnu/ -Switzerland - sunsite.cnlab-switch.ch/mirror/gnu/ -Ukraine - mirddin.farlep.net/pub/GNU/ -United Kingdom - ftp.mcc.ac.uk/pub/gnu/ -United Kingdom - ftp.mirror.ac.uk/sites/ftp.gnu.org/pub/gnu/ -United Kingdom - ftp.warwick.ac.uk/pub/gnu/ (Internet address 137.205.192.13) -United Kingdom - ftp.hands.com/ftp.gnu.org/ -United Kingdom - gnu.teleglobe.net/ftp.gnu.org/ - -* How to FTP GNU Emacs - -Emacs is in the directory /gnu/emacs on ftp.gnu.org. The emacs -distribution itself has a filename in the form emacs-M.N.tar.gz, where -M and N stand for the version numbers; the Emacs Lisp Reference Manual -is in a separate file, named elisp-manual-NN.tar.gz. - -* Scheme and How to FTP It - -The latest distribution version of C Scheme is available via anonymous FTP -from swiss-ftp.ai.mit.edu in /pub/scheme-X.X/ (where X.X is some version -number). - -Read the files INSTALL and README in the top level C Scheme directory. - -* TeX and How to Obtain It - -We don't distribute TeX now, but it is free software. - -TeX is a document formatter that is used, among other things, by the FSF -for all its documentation. You will need it if you want to make printed -manuals. - -TeX is freely redistributable. You can get it by ftp, tape, or CD/ROM. - -** For FTP instructions, retrieve the file -ftp.cs.umb.edu/pub/tex/unixtex.ftp. (We don't include it here because it -changes relatively frequently. Sorry.) - -** A minimal TeX collection (enough to process Texinfo files, anyway) -is included on the GNU source CD-ROM. See the file ORDERS in this -directory for more information. - -* GNU Software for VMS - - - http://www.lp.se/gnu-vms/- lots of GNU ports to VMS, -including Emacs 19, GCC, Bison, Make, RCS. - -* If You Like The Software - -If you like the software developed and distributed by the Free -Software Foundation, please express your satisfaction with a donation. -Your donations will help to support the Foundation and make our future -efforts successful. The Foundation continues to improve GNU programs -and encourage the writing of new free software to enhance GNU/Linux -and GNU/Hurd systems. For more information on GNU and the Foundation, -see our web site at http://www.gnu.org. - -Ordering a GNU Source Code CD-ROM or Source Code CD-ROM Subscription -is a good way for your organization to help support our work. You can -also purchase printed manuals, reference cards, t-shirts, and other -items. See our online ordering form at http://order.fsf.org for -details.
--- a/INSTALL Tue Apr 24 11:35:23 2007 +0000 +++ b/INSTALL Tue Apr 24 21:56:25 2007 +0000 @@ -192,7 +192,7 @@ not those you need to compile it. For example, to compile Emacs with X11 support, you may need to install the special `X11 development' package. For example, in April 2003, the package names to install -were `XFree86-devel' and `Xaw3d-devel' on RedHat. On Debian, the +were `XFree86-devel' and `Xaw3d-devel' on Red Hat. On Debian, the packages necessary to build the installed version should be sufficient; they can be installed using `apt-get build-dep emacs21' in Debian 3 and above. @@ -353,7 +353,7 @@ disable caching, for debugging `configure'. If the description of the system configuration printed by `configure' -is not right, or if it claims some of the fatures or libraries are not +is not right, or if it claims some of the features or libraries are not available when you know they are, look at the `config.log' file for the trace of the failed tests performed by `configure' to check whether these features are supported. Typically, some test fails @@ -364,11 +364,12 @@ directories for some header files, or link against optional libraries, or use special compilation options. You can force `configure' and the build process which follows it to do that by -setting the variables CPPFLAGS, CFLAGS, LDFLAGS, LIBS, and CC before -running `configure'. CPPFLAGS lists the options passed to the -preprocessor, CFLAGS are compilation options, LDFLAGS are options used -when linking, LIBS are libraries to link against, and CC is the -command which invokes the compiler. +setting the variables CPPFLAGS, CFLAGS, LDFLAGS, LIBS, CPP and CC +before running `configure'. CPP is the command which invokes the +preprocessor, CPPFLAGS lists the options passed to it, CFLAGS are +compilation options, LDFLAGS are options used when linking, LIBS are +libraries to link against, and CC is the command which invokes the +compiler. Here's an example of a `configure' invocation, assuming a Bourne-like shell such as Bash, which uses these variables: @@ -385,7 +386,7 @@ For some libraries, like Gtk+, fontconfig and ALSA, `configure' use pkg-config to find where those libraries are installed. -If you wan't pkg-config to look in special directories, you have to set +If you want pkg-config to look in special directories, you have to set the environment variable PKG_CONFIG_PATH to point to the directories where the .pc-files for those libraries are. For example: @@ -703,8 +704,8 @@ the paths to the values specified in `./Makefile'. 2) Go to directory `./lib-src' and run `make'. This creates -executables named `ctags' and `etags' and `wakeup' and `make-docfile' -and `digest-doc' and `test-distrib'. And others. +executables named `ctags' and `etags' and `make-docfile' and +`digest-doc' and `test-distrib'. And others. 3) Go to directory `./src' and Run `make'. This refers to files in the `./lisp' and `./lib-src' subdirectories using names `../lisp' and @@ -732,8 +733,8 @@ Strictly speaking, not all of the executables in `./lib-src' need be copied. - The programs `cvtmail', `fakemail', `hexl', - `movemail', `profile', `rcs2log', `timer', `vcdiff', `wakeup', - and `yow' are used by Emacs; they do need to be copied. + `movemail', `profile', `rcs2log', and `vcdiff' are used by Emacs; + they do need to be copied. - The programs `etags', `ctags', `emacsclient', `b2m', and `rcs-checkin' are intended to be run by users; they are handled below. - The programs `make-docfile' and `test-distrib' were
--- a/README Tue Apr 24 11:35:23 2007 +0000 +++ b/README Tue Apr 24 21:56:25 2007 +0000 @@ -3,7 +3,7 @@ See the end of the file for license conditions. -This directory tree holds version 22.0.97 of GNU Emacs, the extensible, +This directory tree holds version 22.0.98 of GNU Emacs, the extensible, customizable, self-documenting real-time display editor. The file INSTALL in this directory says how to build and install GNU
--- a/admin/FOR-RELEASE Tue Apr 24 11:35:23 2007 +0000 +++ b/admin/FOR-RELEASE Tue Apr 24 21:56:25 2007 +0000 @@ -5,8 +5,6 @@ ** Check for widow and orphan lines in manuals; make sure all the pages really look ok in the manual as formatted. -** Cleanup temporary +++/--- lines in etc/NEWS. - ** Regenerate the postscript files of the reference cards in etc. ** Ask maintainers of refcard translations to update them. @@ -24,9 +22,6 @@ Reminders sent out on 2006-06-08. -** Send an email to the various distributions, including the GNOME -and KDE projects, to use the new Emacs icons in etc/images/icons. - * WINDOWS SUPPORT BUGS. These don't need to be fixed before a release, but we call the @@ -41,9 +36,19 @@ * BUGS -** spurious scrolling bug +** python.el legal problem? +http://lists.gnu.org/archive/html/emacs-pretest-bug/2007-04/msg00459.html + +** rcyeske@gmail.com, April 22: Failure to build on OpenBSD macppc. +OpenBSD compilation works on i386. -** crash in gc_sweep +** bojohan+news@dd.chalmers.se, April 23: delete-overlay causes recentering +(This is now the same as the spurious scrolling bug.) + +** finish fixing locate.el + +** angeli@caeruleus.net, April 23: Excessive refontification when setting + jit-lock-context-unfontify-pos * DOCUMENTATION
--- a/admin/notes/copyright Tue Apr 24 11:35:23 2007 +0000 +++ b/admin/notes/copyright Tue Apr 24 21:56:25 2007 +0000 @@ -306,6 +306,13 @@ rms prefers that we do not do so. +man/*.texi - All manuals should be under GFDL, and should include a +copy of it, so that they can be distributed separately. faq.texi has +a different license, for some reason no-one can remember. +http://lists.gnu.org/archive/html/emacs-devel/2007-04/msg00583.html +http://lists.gnu.org/archive/html/emacs-devel/2007-04/msg00618.html + + msdos/is_exec.c, sigaction.c - these files are copyright DJ Delorie. Leave the copyrights alone. Leave the Eli Zaretskii copyright in is_exec.c alone. See the msdos/README file for the legal history of @@ -404,6 +411,17 @@ HP. So this file is public domain. +K Rodgers changes + It was pointed out that K Rodgers only had assigments for VC and + ps-print, but had changed several other files. We tried to contact + him for a general assignment, but he proved uncommunicative (despite + initially indicating to rms he would sign an assignment). As a result, his + changes were removed and/or rewritten independently. For details, see + threads: +http://lists.gnu.org/archive/html/emacs-devel/2007-04/msg00225.html +http://lists.gnu.org/archive/html/emacs-devel/2007-04/msg00257.html + + ** Issues that are "fixed" for the release of Emacs 22, but we may wish to revisit later in more detail @@ -545,8 +563,8 @@ REMOVED etc/gnu.xpm, nt/icons/emacs21.ico, nt/icons/sink.ico - Restore if find legal info. emacs21.ico is not due to Davenport. - Voelker could not immediately recall anything, but will check and - let us know if he finds anything. + Geoff Voelker checked but could not find a record of where it came + from. etc/images
--- a/configure Tue Apr 24 11:35:23 2007 +0000 +++ b/configure Tue Apr 24 21:56:25 2007 +0000 @@ -3026,6 +3026,8 @@ ;; *-sunos5* | *-solaris* ) opsys=sol2-6 +## FIXME: make this into a proper fix that checks the compiler type, +## rather than relying on path. Or is /usr/ccs/lib/cpp a bad default now? if [ "x$CC" = x/opt/SUNWspro/bin/cc ]; then ## -Xs prevents spurious whitespace. NON_GNU_CPP="/opt/SUNWspro/bin/cc -E -Xs" @@ -11723,7 +11725,7 @@ fi fi -if test x"${USE_X_TOOLKIT}" = xmaybe; then +if test x"${USE_X_TOOLKIT}" = xmaybe || test x"${USE_X_TOOLKIT}" = xLUCID; then if test x"${HAVE_X11R5}" = xyes; then { echo "$as_me:$LINENO: checking X11 version 5 with Xaw" >&5 echo $ECHO_N "checking X11 version 5 with Xaw... $ECHO_C" >&6; } @@ -11782,9 +11784,15 @@ echo "${ECHO_T}5 or newer, with Xaw; use toolkit by default" >&6; } USE_X_TOOLKIT=LUCID else - { echo "$as_me:$LINENO: result: before 5 or no Xaw; do not use toolkit by default" >&5 + if test x"${USE_X_TOOLKIT}" = xLUCID; then + { { echo "$as_me:$LINENO: error: Lucid toolkit requires X11/Xaw include files" >&5 +echo "$as_me: error: Lucid toolkit requires X11/Xaw include files" >&2;} + { (exit 1); exit 1; }; } + else + { echo "$as_me:$LINENO: result: before 5 or no Xaw; do not use toolkit by default" >&5 echo "${ECHO_T}before 5 or no Xaw; do not use toolkit by default" >&6; } - USE_X_TOOLKIT=none + USE_X_TOOLKIT=none + fi fi else USE_X_TOOLKIT=none @@ -12924,13 +12932,13 @@ { echo "$as_me:$LINENO: checking FREETYPE_CFLAGS" >&5 echo $ECHO_N "checking FREETYPE_CFLAGS... $ECHO_C" >&6; } - FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2"` + FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2"|sed -e 's,///*,/,g'` { echo "$as_me:$LINENO: result: $FREETYPE_CFLAGS" >&5 echo "${ECHO_T}$FREETYPE_CFLAGS" >&6; } { echo "$as_me:$LINENO: checking FREETYPE_LIBS" >&5 echo $ECHO_N "checking FREETYPE_LIBS... $ECHO_C" >&6; } - FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2"` + FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2"|sed -e 's,///*,/,g'` { echo "$as_me:$LINENO: result: $FREETYPE_LIBS" >&5 echo "${ECHO_T}$FREETYPE_LIBS" >&6; } else @@ -13021,13 +13029,13 @@ { echo "$as_me:$LINENO: checking FONTCONFIG_CFLAGS" >&5 echo $ECHO_N "checking FONTCONFIG_CFLAGS... $ECHO_C" >&6; } - FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "fontconfig"` + FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "fontconfig"|sed -e 's,///*,/,g'` { echo "$as_me:$LINENO: result: $FONTCONFIG_CFLAGS" >&5 echo "${ECHO_T}$FONTCONFIG_CFLAGS" >&6; } { echo "$as_me:$LINENO: checking FONTCONFIG_LIBS" >&5 echo $ECHO_N "checking FONTCONFIG_LIBS... $ECHO_C" >&6; } - FONTCONFIG_LIBS=`$PKG_CONFIG --libs "fontconfig"` + FONTCONFIG_LIBS=`$PKG_CONFIG --libs "fontconfig"|sed -e 's,///*,/,g'` { echo "$as_me:$LINENO: result: $FONTCONFIG_LIBS" >&5 echo "${ECHO_T}$FONTCONFIG_LIBS" >&6; } else
--- a/configure.in Tue Apr 24 11:35:23 2007 +0000 +++ b/configure.in Tue Apr 24 21:56:25 2007 +0000 @@ -1039,6 +1039,8 @@ ;; *-sunos5* | *-solaris* ) opsys=sol2-6 +## FIXME: make this into a proper fix that checks the compiler type, +## rather than relying on path. Or is /usr/ccs/lib/cpp a bad default now? if [ "x$CC" = x/opt/SUNWspro/bin/cc ]; then ## -Xs prevents spurious whitespace. NON_GNU_CPP="/opt/SUNWspro/bin/cc -E -Xs" @@ -2182,7 +2184,7 @@ dnl Do not put whitespace before the #include statements below. dnl Older compilers (eg sunos4 cc) choke on it. -if test x"${USE_X_TOOLKIT}" = xmaybe; then +if test x"${USE_X_TOOLKIT}" = xmaybe || test x"${USE_X_TOOLKIT}" = xLUCID; then if test x"${HAVE_X11R5}" = xyes; then AC_MSG_CHECKING(X11 version 5 with Xaw) AC_CACHE_VAL(emacs_cv_x11_version_5_with_xaw, @@ -2196,8 +2198,12 @@ AC_MSG_RESULT([5 or newer, with Xaw; use toolkit by default]) USE_X_TOOLKIT=LUCID else - AC_MSG_RESULT(before 5 or no Xaw; do not use toolkit by default) - USE_X_TOOLKIT=none + if test x"${USE_X_TOOLKIT}" = xLUCID; then + AC_MSG_ERROR([Lucid toolkit requires X11/Xaw include files]) + else + AC_MSG_RESULT(before 5 or no Xaw; do not use toolkit by default) + USE_X_TOOLKIT=none + fi fi else USE_X_TOOLKIT=none
--- a/etc/COOKIES Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/COOKIES Tue Apr 24 21:56:25 2007 +0000 @@ -26,7 +26,7 @@ Add: 4 eggs 2 tsp. vanilla -Mis together in +Mix together in separate bowl: 4 cups flour 5 cups oatmeal (put small amounts of oatmeal in blender until it turns to
--- a/etc/ChangeLog Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/ChangeLog Tue Apr 24 21:56:25 2007 +0000 @@ -1,3 +1,31 @@ +2007-04-22 Glenn Morris <rgm@gnu.org> + + * NEWS: Change to EMACS env-var was reverted, so delete this entry. + +2007-04-19 Glenn Morris <rgm@gnu.org> + + * PROBLEMS: Expand a little on Emacs not knowing fqdn. + +2007-04-17 David Kastrup <dak@gnu.org> + + * NEWS: Mention `query-replace-regexp-eval' being deprecated. + +2007-04-15 Glenn Morris <rgm@gnu.org> + + * FTP: Make it a duplicate of ../FTP. + +2007-04-14 Glenn Morris <rgm@gnu.org> + + * SERVICE: Replace with a pointer to the web version. + + * emacs.1: Update some of the more obsolete information. + +2007-04-13 Glenn Morris <rgm@gnu.org> + + * MACHINES: emacserver is removed. + + * MORE.STUFF: Update some links, remove some dead ones. + 2007-04-04 Slawomir Nowaczyk <slawomir.nowaczyk.847@student.lu.se> * emacs.py (format_exception): New function.
--- a/etc/DEBUG Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/DEBUG Tue Apr 24 21:56:25 2007 +0000 @@ -567,7 +567,7 @@ Once you discover the corrupted Lisp object or data structure, grep the sources for its uses and try to figure out what could cause the -corruption. If looking at the sources doesn;t help, you could try +corruption. If looking at the sources doesn't help, you could try setting a watchpoint on the corrupted data, and see what code modifies it in some invalid way. (Obviously, this technique is only useful for data that is modified only very rarely.) @@ -731,7 +731,7 @@ disassembly to determine exactly what code is being run--the disassembly will probably show several source lines followed by a block of assembler for those lines. The actual point where Emacs -crashes will be one of those source lines, but not neccesarily the one +crashes will be one of those source lines, but not necessarily the one that the debugger reports. Another problematic area with the MS debugger is with variables that
--- a/etc/DEVEL.HUMOR Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/DEVEL.HUMOR Tue Apr 24 21:56:25 2007 +0000 @@ -178,3 +178,9 @@ constants with anything like the universality of e and pi." "42" -- Alan Mackenzie and David Hansen + +---------------------------------------------------------------------- + + "[...] So please do not delete anything." + "Done." + -- RMS and David Kastrup
--- a/etc/FTP Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/FTP Tue Apr 24 21:56:25 2007 +0000 @@ -1,2 +1,6 @@ -Please refer to <http://www.gnu.org/software/emacs/> for information -about obtaining Emacs. +For information about how to obtain GNU Emacs and other GNU software +by FTP, please see <http://www.gnu.org/order/ftp.html>. + +Information about Emacs is also available at +<http://www.gnu.org/software/emacs/>. +
--- a/etc/MACHINES Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/MACHINES Tue Apr 24 21:56:25 2007 +0000 @@ -126,7 +126,7 @@ Emacs distribution, and remove the "#if 0" and "#endif" directives which surround the following block near the end of the file: - #if 0 /* This breaks things on PPC GNU/Linux ecept for Yellowdog, + #if 0 /* This breaks things on PPC GNU/Linux except for Yellowdog, even with identical GCC, as, ld. Let's take it out until we know what's really going on here. */ /* GCC 2.95 and newer on GNU/Linux PPC changed the load address to @@ -156,9 +156,8 @@ installations may have to edit src/Makefile manually after it is created. There are too many versions of both cc and X to automate this easily. - In `lib-src/Makefile', emacsclient and emacsserver compile and work fine - under CC 6.9. They now probably work under other versions of the compiler, - as well. + In `lib-src/Makefile', emacsclient compiles and works fine under CC 6.9. + It now probably works under other versions of the compiler, as well. The Apollo Domain CC compiler will issue quite a few warning messages, mostly complaining about incompatible pointers. In general, these are @@ -1395,7 +1394,7 @@ cannot be made to work. Whether or not the GNU relocating malloc is used, the symptom is that the first call Emacs makes to sbrk(0) returns (char *)-1. Sorry, you're stuck with character-only mode. Try - installing Xfree86 to fix this. + installing XFree86 to fix this. System V rel 4.0.3 and 4.0.4 (usg5.4) @@ -1499,11 +1498,10 @@ to make the Emacs meta key work. Local variables: -mode: indented-text +mode: text fill-prefix: " " End: - This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify
--- a/etc/MORE.STUFF Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/MORE.STUFF Tue Apr 24 21:56:25 2007 +0000 @@ -47,9 +47,6 @@ * Battery and Info Look: <URL:http://www-cdf.fnal.gov/~sthrlnd/emacs/> - * BibTeX: - <URL:http://www.ida.ing.tu-bs.de/people/dirk/bibtex/index.html> - * BS: <URL:http://www.geekware.de/software/emacs/index.html> * Calculator: <URL:http://www.barzilay.org/misc/calculator.el> @@ -85,26 +82,24 @@ * MH-E: <URL:http://mh-e.sourceforge.net/> - * PC Selection: <URL:ftp://ftp.thp.uni-duisburg.de/pub/source/elisp/> - * PS mode: <URL:http://odur.let.rug.nl/%7Ekleiweg/postscript/> - * PS-print: <URL:http://www.cpqd.com.br/~vinicius/emacs/> + * PS-print: <URL:http://www.emacswiki.org/cgi-bin/wiki/PsPrintPackage> * QuickURL: <URL:http://www.davep.org/emacs/> - * RefTeX: <URL:http://staff.science.uva.nl/~dominik/Tools/reftex/> + * RefTeX: <URL:http://www.gnu.org/software/auctex/reftex.html> * Speedbar, Checkdoc etc: <URL:http://cedet.sourceforge.net/> - * SQL: <URL:http://www.geocities.com/TimesSquare/6120/emacs.html> + * SQL: <URL:http://www.emacswiki.org/cgi-bin/wiki/sql.el> * Tramp: Remote file access via rsh/ssh <URL:http://savannah.gnu.org/projects/tramp/> * Webjump: <URL:http://www.neilvandyke.org/webjump> - * Whitespace: <URL:http://www.dsmit.com/lisp/> + * Whitespace: <URL:http://www.dsmit.com/lisp/whitespace.el> * Auxiliary files @@ -147,7 +142,7 @@ mirrors of the `CTAN' TeX archives. * Dismal: spreadsheet: - <URL:http://www.gnu.org/software/dismal/dismal.html> + <URL:http://ritter.ist.psu.edu/dismal/dismal.html> * ECB: Emacs Code Browser: <URL:http://ecb.sourceforge.net/> @@ -177,8 +172,7 @@ <URL:http://emacspeak.sourceforge.net/> * Emacs-w3m : <URL:http://emacs-w3m.namazu.org/> - A simple Emacs interface to w3m, which is a text-mode - WWW browser + A simple Emacs interface to w3m, which is a text-mode WWW browser * Emacs Wiki Mode: <URL:http://www.mwolson.org/projects/EmacsWiki.html> A wiki-like publishing tool and personal information manager @@ -198,7 +192,7 @@ HTML-specific editing. Can work with PSGML. * Hyperbole: - <URL:http://ftp.gnu.org/pub/gnu/hyperbole/> + <URL:http://directory.fsf.org/hyperbole.html> Hyperbole is an open, efficient, programmable information management and hypertext system. @@ -222,11 +216,11 @@ nXML mode is an addon for GNU Emacs, which makes GNU Emacs into a powerful XML editor. - * Planner Mode: <URL:http://www.plannerlove.com/> + * Planner Mode: <URL:http://wjsullivan.net/PlannerMode> Planner is an organizer and day planner for Emacs. * Preview LaTeX: embed preview LaTeX images in source buffer. - <URL:http://preview-latex.sourceforge.net/> + <URL:http://www.gnu.org/software/auctex/preview-latex> * PSGML: <URL:http://www.lysator.liu.se/projects/about_psgml.html> DTD-aware serious SGML/XML editing. @@ -253,7 +247,7 @@ * Tiny Tools: <URL:http://tiny-tools.sourceforge.net/> - * VM (View Mail): <URL:http://www.wonderworks.com/vm/> Alternative + * VM (View Mail): <URL:http://www.nongnu.org/viewmail/> Alternative mail reader. There is a VM newsgroup: <URL:news:gnu.emacs.vm.info> * W3: <URL:http://savannah.gnu.org/projects/w3/> @@ -269,8 +263,7 @@ shell-script daemon and some LaTeX macros. * X-Symbol: <URL:http://x-symbol.sourceforge.net/> - Quasi-WYSIWYG editing of TeX & al. (It will be improved to take - better advantage of Emacs 21 features.) + Quasi-WYSIWYG editing of TeX & al. Local Variables: mode: text
--- a/etc/NEWS Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/NEWS Tue Apr 24 21:56:25 2007 +0000 @@ -1,4 +1,4 @@ -GNU Emacs NEWS -- history of user-visible changes. 2006-06-04 +GNU Emacs NEWS -- history of user-visible changes. Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. @@ -110,7 +110,7 @@ version is used. You can use M-x list-load-path-shadows to find such older packages. -Some specific packages which are known to cause problems are: +Some specific packages that are known to cause problems are: ** Semantic (used by CEDET, ECB, JDEE): upgrade to latest version. ** cua.el, cua-mode.el: remove old versions. @@ -118,7 +118,10 @@ * Installation Changes in Emacs 22.1 ---- +** You can build Emacs with Gtk+ widgets by specifying `--with-x-toolkit=gtk' +when you run configure. This requires Gtk+ 2.4 or newer. This port +provides a way to display multilingual text in menus (with some caveats). + ** Emacs comes with a new set of icons. These icons are displayed on the taskbar and/or titlebar when Emacs runs in a graphical environment. Source files for these icons can be @@ -127,27 +130,68 @@ into the Emacs executable; see gnu.h in the source tree. On MS Windows, see nt/icons/emacs.ico.) ---- +** The Emacs Lisp Reference Manual is now part of the distribution. + +The Emacs Lisp Reference Manual in Info format is built as part of the +Emacs build procedure and installed together with the Emacs User +Manual. A menu item was added to the menu bar to make it easily +accessible (Help->More Manuals->Emacs Lisp Reference). + +** The Introduction to Programming in Emacs Lisp manual is now part of +the distribution. + +This manual is now part of the standard distribution and is installed, +together with the Emacs User Manual, into the Info directory. A menu +item was added to the menu bar to make it easily accessible +(Help->More Manuals->Introduction to Emacs Lisp). + +** Leim is now part of the Emacs distribution. +You no longer need to download a separate tarball in order to build +Emacs with Leim. + +** New translations of the Emacs Tutorial are available in the +following languages: Brasilian Portuguese, Bulgarian, Chinese (both +with simplified and traditional characters), French, Russian, and +Italian. Type `C-u C-h t' to choose one of them in case your language +setup doesn't automatically select the right one. + +** New translations of the Emacs reference card are available in the +Brasilian Portuguese and Russian. The corresponding PostScript files +are also included. + +** A French translation of the `Emacs Survival Guide' is available. + +** Emacs now includes support for loading image libraries on demand. +(Currently this feature is only used on MS Windows.) You can configure +the supported image types and their associated dynamic libraries by +setting the variable `image-library-alist'. + +** Support for GNU/Linux systems on X86-64 machines was added. + +** Support for GNU/Linux systems on S390 machines was added. + +** Support for GNU/Linux systems on Tensilica Xtensa machines was added. + +** Support for FreeBSD/Alpha has been added. + +** Support for a Cygwin build of Emacs was added. + +** Support for MacOS X was added. +See the files mac/README and mac/INSTALL for build instructions. + +** Mac OS 9 port now uses the Carbon API by default. You can also +create a non-Carbon build by specifying `NonCarbon' as a target. See +the files mac/README and mac/INSTALL for build instructions. + +** The `emacsserver' program has been removed, replaced with Lisp code. + +** The `yow' program has been removed. +Use the corresponding Emacs feature instead. + ** Emacs now supports new configure options `--program-prefix', `--program-suffix' and `--program-transform-name' that affect the names of installed programs. ---- -** Emacs can now be built without sound support. - ---- -** You can build Emacs with Gtk+ widgets by specifying `--with-x-toolkit=gtk' -when you run configure. This requires Gtk+ 2.4 or newer. This port -provides a way to display multilingual text in menus (with some caveats). - ---- -** The `emacsserver' program has been removed, replaced with Lisp code. - ---- -** The `yow' program has been removed. -Use the corresponding Emacs feature instead. - ---- ** By default, Emacs now uses a setgid helper program to update game scores. The directory ${localstatedir}/games/emacs is the normal place for game scores to be stored. You can control this with the @@ -156,123 +200,47 @@ to a game user is not available, then scores will be stored separately in each user's home directory. ---- -** Leim is now part of the Emacs distribution. -You no longer need to download a separate tarball in order to build -Emacs with Leim. - -+++ -** The Emacs Lisp Reference Manual is now part of the distribution. - -The Emacs Lisp Reference Manual in Info format is built as part of the -Emacs build procedure and installed together with the Emacs User -Manual. A menu item was added to the menu bar that makes it easy -accessible (Help->More Manuals->Emacs Lisp Reference). - ---- -** The Introduction to Programming in Emacs Lisp manual is now part of -the distribution. - -This manual is now part of the standard distribution and is installed, -together with the Emacs User Manual, into the Info directory. A menu -item was added to the menu bar that makes it easy accessible -(Help->More Manuals->Introduction to Emacs Lisp). - ---- -** New translations of the Emacs Tutorial are available in the -following languages: Brasilian Portuguese, Bulgarian, Chinese (both -with simplified and traditional characters), French, and Italian. -Type `C-u C-h t' to choose one of them in case your language setup -doesn't automatically select the right one. - ---- -** A Portuguese translation of Emacs' reference card has been added. -Its name is `pt-br-refcard.tex'. The corresponding PostScript file is -also included. - ---- -** A French translation of the `Emacs Survival Guide' is available. - ---- -** Emacs now includes support for loading image libraries on demand. -(Currently this feature is only used on MS Windows.) You can configure -the supported image types and their associated dynamic libraries by -setting the variable `image-library-alist'. - ---- -** Support for a Cygwin build of Emacs was added. - ---- -** Support for FreeBSD/Alpha has been added. - ---- -** Support for GNU/Linux systems on S390 machines was added. - ---- -** Support for GNU/Linux systems on Tensilica Xtensa machines was added. - ---- -** Support for MacOS X was added. -See the files mac/README and mac/INSTALL for build instructions. - ---- -** Support for GNU/Linux systems on X86-64 machines was added. - ---- -** Mac OS 9 port now uses the Carbon API by default. You can also -create non-Carbon build by specifying `NonCarbon' as a target. See -the files mac/README and mac/INSTALL for build instructions. - ---- +** Emacs can now be built without sound support. + ** Building with -DENABLE_CHECKING does not automatically build with union types any more. Add -DUSE_LISP_UNION_TYPE if you want union types. ---- ** When pure storage overflows while dumping, Emacs now prints how much pure storage it will approximately need. ---- ** The script etc/emacs-buffer.gdb can be used with gdb to retrieve the contents of buffers from a core dump and save them to files easily, should Emacs crash. ---- ** The Emacs terminal emulation in term.el uses a different terminfo name. The Emacs terminal emulation in term.el now uses "eterm-color" as its terminfo name, since term.el now supports color. ---- ** Emacs Lisp source files are compressed by default if `gzip' is available. ---- ** All images used in Emacs have been consolidated in etc/images and subdirs. See also the changes to `find-image', documented below. * Startup Changes in Emacs 22.1 -+++ ** New command line option -Q or --quick. This is like using -q --no-site-file, but in addition it also disables the fancy startup screen. -+++ ** New command line option -D or --basic-display. Disables the menu-bar, the tool-bar, the scroll-bars, tool tips, and the blinking cursor. -+++ ** New command line option -nbc or --no-blinking-cursor disables the blinking cursor on graphical terminals. -+++ ** The option --script FILE runs Emacs in batch mode and loads FILE. It is useful for writing Emacs Lisp shell script files, because they can start with this line: #!/usr/bin/emacs --script -+++ ** The option --directory DIR now modifies `load-path' immediately. Directories are added to the front of `load-path' in the order they appear on the command line. For example, with this command line: @@ -282,69 +250,57 @@ Emacs looks for library `foo' in the parent directory, then in /tmp, then in the other directories in `load-path'. (-L is short for --directory.) -+++ ** The command line option --no-windows has been changed to --no-window-system. The old one still works, but is deprecated. ---- ** If the environment variable DISPLAY specifies an unreachable X display, Emacs will now startup as if invoked with the --no-window-system option. -+++ ** The -f option, used from the command line to call a function, now reads arguments for the function interactively if it is an interactively callable function. -+++ ** When you specify a frame size with --geometry, the size applies to all frames you create. A position specified with --geometry only affects the initial frame. ---- ** Emacs built for MS-Windows now behaves like Emacs on X does, -wrt its frame position: if you don't specify a position (in your -.emacs init file, in the Registry, or with the --geometry command-line -option), Emacs leaves the frame position to the Windows' window -manager. - -+++ +with respect to its frame position: if you don't specify a position +(in your .emacs init file, in the Registry, or with the --geometry +command-line option), Emacs leaves the frame position to the Windows' +window manager. + ** Emacs can now be invoked in full-screen mode on a windowed display. When Emacs is invoked on a window system, the new command-line options `--fullwidth', `--fullheight', and `--fullscreen' produce a frame whose width, height, or both width and height take up the entire screen size. (For now, this does not work with some window managers.) -+++ ** Emacs now displays a splash screen by default even if command-line arguments were given. The new command-line option --no-splash disables the splash screen; see also the variable -`inhibit-startup-message' (which is also aliased as -`inhibit-splash-screen'). - -+++ -** The default is now to use a bitmap as the icon, so the command-line options ---icon-type, -i has been replaced with options --no-bitmap-icon, -nbi to turn -the bitmap icon off. - -+++ +`inhibit-splash-screen' (which is also aliased as +`inhibit-startup-message'). + +** The default is now to use a bitmap as the icon. +The command-line options --icon-type, -i have been replaced with +options --no-bitmap-icon, -nbi to turn the bitmap icon off. + ** New user option `inhibit-startup-buffer-menu'. When loading many files, for instance with `emacs *', Emacs normally displays a buffer menu. This option turns the buffer menu off. -+++ ** Init file changes If the init file ~/.emacs does not exist, Emacs will try ~/.emacs.d/init.el or ~/.emacs.d/init.elc. Likewise, if the shell init file ~/.emacs_SHELL is not found, Emacs will try ~/.emacs.d/init_SHELL.sh. -+++ ** Emacs now reads the standard abbrevs file ~/.abbrev_defs automatically at startup, if it exists. When Emacs offers to save modified buffers, it saves the abbrevs too if they have changed. It can do this either silently or asking for confirmation first, according to the value of `save-abbrevs'. -+++ ** If the environment variable EMAIL is defined, Emacs now uses its value to compute the default value of `user-mail-address', in preference to concatenation of `user-login-name' with the name of your host machine. @@ -352,52 +308,42 @@ * Incompatible Editing Changes in Emacs 22.1 -+++ +** You can now follow links by clicking Mouse-1 on the link. + +See below for more details. + ** M-g is now a prefix key. M-g g and M-g M-g run goto-line. M-g n and M-g M-n run next-error (like C-x `). M-g p and M-g M-p run previous-error. -+++ ** C-u M-g M-g switches to the most recent previous buffer, and goes to the specified line in that buffer. When goto-line starts to execute, if there's a number in the buffer at point then it acts as the default argument for the minibuffer. -+++ +** M-o now is the prefix key for setting text properties; +M-o M-o requests refontification. + ** The old bindings C-M-delete and C-M-backspace have been deleted, since there are situations where one or the other will shut down the operating system or your X server. -+++ -** line-move-ignore-invisible now defaults to t. - -+++ ** When the undo information of the current command gets really large (beyond the value of `undo-outer-limit'), Emacs discards it and warns you about it. -+++ -** `apply-macro-to-region-lines' now operates on all lines that begin -in the region, rather than on all complete lines in the region. - -+++ -** A prefix argument is no longer required to repeat a jump to a -previous mark if you set `set-mark-command-repeat-pop' to t. I.e. C-u -C-SPC C-SPC C-SPC ... cycles through the mark ring. Use C-u C-u C-SPC -to set the mark immediately after a jump. - -+++ -** The info-search bindings on C-h C-f, C-h C-k and C-h C-i -have been moved to C-h F, C-h K and C-h S. - -+++ ** In incremental search, C-w is changed. M-%, C-M-w and C-M-y are special. See below under "incremental search changes". ---- +** When Emacs prompts for file names, SPC no longer completes the file name. +This is so filenames with embedded spaces could be input without the +need to quote the space with a C-q. The underlying changes in the +keymaps that are active in the minibuffer are described below under +"New keymaps for typing file names". + ** C-x C-f RET (find-file), typing nothing in the minibuffer, is no longer a special case. @@ -408,28 +354,10 @@ You can get the old behavior by typing C-x C-f M-n RET, which fetches the actual file name into the minibuffer. -+++ ** The completion commands TAB, SPC and ? in the minibuffer apply only to the text before point. If there is text in the buffer after point, it remains unchanged. -+++ -** When Emacs prompts for file names, SPC no longer completes the file name. -This is so filenames with embedded spaces could be input without the -need to quote the space with a C-q. The underlying changes in the -keymaps that are active in the minibuffer are described below under -"New keymaps for typing file names". - -+++ -** M-o now is the prefix key for setting text properties; -M-o M-o requests refontification. - -+++ -** You can now follow links by clicking Mouse-1 on the link. - -See below for more details. - -+++ ** In Dired's ! command (dired-do-shell-command), `*' and `?' now control substitution of the file names only when they are surrounded by whitespace. This means you can now use them as shell wildcards @@ -437,11 +365,22 @@ doublequotes make no difference in the shell, but they prevent special treatment in `dired-do-shell-command'. ---- +** A prefix argument is no longer required to repeat a jump to a +previous mark if you set `set-mark-command-repeat-pop' to t. I.e. C-u +C-SPC C-SPC C-SPC ... cycles through the mark ring. Use C-u C-u C-SPC +to set the mark immediately after a jump. + +** The info-search bindings on C-h C-f, C-h C-k and C-h C-i +have been moved to C-h F, C-h K and C-h S. + +** `apply-macro-to-region-lines' now operates on all lines that begin +in the region, rather than on all complete lines in the region. + +** line-move-ignore-invisible now defaults to t. + ** Adaptive filling misfeature removed. It no longer treats `NNN.' or `(NNN)' as a prefix. ---- ** The register compatibility key bindings (deprecated since Emacs 19) have been removed: C-x / point-to-register (Use: C-x r SPC) @@ -452,7 +391,6 @@ * Editing Changes in Emacs 22.1 -+++ ** !MEM FULL! at the start of the mode line indicates that Emacs cannot get any more memory for Lisp data. This often means it could crash soon if you do things that use more memory. On most systems, @@ -460,71 +398,57 @@ not make !MEM FULL! disappear, you should save your work and start a new Emacs. -+++ ** The max size of buffers and integers has been doubled. On 32bit machines, it is now 256M (i.e. 268435455). -+++ ** You can now switch buffers in a cyclic order with C-x C-left (previous-buffer) and C-x C-right (next-buffer). C-x left and C-x right can be used as well. The functions keep a different buffer cycle for each frame, using the frame-local buffer list. -+++ ** `undo-only' does an undo which does not redo any previous undo. -+++ ** M-SPC (just-one-space) when given a numeric argument N converts whitespace around point to N spaces. ---- ** C-x 5 C-o displays a specified buffer in another frame but does not switch to that frame. It's the multi-frame analogue of C-x 4 C-o. ---- -** New commands to operate on pairs of open and close characters: -`insert-pair', `delete-pair', `raise-sexp'. - -+++ ** New command `kill-whole-line' kills an entire line at once. By default, it is bound to C-S-<backspace>. -+++ ** Yanking text now discards certain text properties that can be inconvenient when you did not expect them. The variable `yank-excluded-properties' specifies which ones. Insertion of register contents and rectangles also discards these properties. -+++ ** The default values of paragraph-start and indent-line-function have been changed to reflect those used in Text mode rather than those used in Indented-Text mode. -+++ +** New commands to operate on pairs of open and close characters: +`insert-pair', `delete-pair', `raise-sexp'. + ** M-x setenv now expands environment variable references. Substrings of the form `$foo' and `${foo}' in the specified new value now refer to the value of environment variable foo. To include a `$' in the value, use `$$'. -+++ ** `special-display-buffer-names' and `special-display-regexps' now understand two new boolean pseudo-frame-parameters `same-frame' and `same-window'. -+++ ** The default for the paper size (variable ps-paper-type) is taken from the locale. ** Mark command changes: -+++ *** A prefix argument is no longer required to repeat a jump to a previous mark, i.e. C-u C-SPC C-SPC C-SPC ... cycles through the mark ring. Use C-u C-u C-SPC to set the mark immediately after a jump. -+++ *** Marking commands extend the region when invoked multiple times. If you type C-M-SPC (mark-sexp), M-@ (mark-word), M-h @@ -537,14 +461,12 @@ in Transient Mark mode, you can deactivate the active region with C-g, or set the new mark with C-SPC. -+++ *** M-h (mark-paragraph) now accepts a prefix arg. With positive arg, M-h marks the current and the following paragraphs; if the arg is negative, it marks the current and the preceding paragraphs. -+++ *** Some commands do something special in Transient Mark mode when the mark is active--for instance, they limit their operation to the region. Even if you don't normally use Transient Mark mode, you might @@ -562,14 +484,12 @@ that alters the buffer, but you can also deactivate the mark by typing C-g. -+++ *** Movement commands `beginning-of-buffer', `end-of-buffer', `beginning-of-defun', `end-of-defun' do not set the mark if the mark is already active in Transient Mark mode. ** Help command changes: -+++ *** Changes in C-h bindings: C-h e displays the *Messages* buffer. @@ -603,17 +523,14 @@ - C-h w and C-h f new-kill-line reports: new-kill-line is on C-k ---- *** Help commands `describe-function' and `describe-key' now show function arguments in lowercase italics on displays that support it. To change the default, customize face `help-argument-name' or redefine the function `help-default-arg-highlight'. -+++ *** C-h v and C-h f commands now include a hyperlink to the C source for variables and functions defined in C (if the C source is available). -+++ *** Help mode now only makes hyperlinks for faces when the face name is preceded or followed by the word `face'. It no longer makes hyperlinks for variables without variable documentation, unless @@ -624,38 +541,32 @@ addition, it now makes hyperlinks to URLs as well if the URL is enclosed in single quotes and preceded by `URL'. -+++ *** The new command `describe-char' (C-u C-x =) pops up a buffer with description various information about a character, including its encodings and syntax, its text properties, how to input, overlays, and widgets at point. You can get more information about some of them, by clicking on mouse-sensitive areas or moving there and pressing RET. -+++ *** The command `list-text-properties-at' has been deleted because C-u C-x = gives the same information and more. -+++ *** New command `display-local-help' displays any local help at point in the echo area. It is bound to `C-h .'. It normally displays the same string that would be displayed on mouse-over using the `help-echo' property, but, in certain cases, it can display a more keyboard oriented alternative. -+++ *** New user option `help-at-pt-display-when-idle' allows to automatically show the help provided by `display-local-help' on point-over, after suitable idle time. The amount of idle time is determined by the user option `help-at-pt-timer-delay' and defaults to one second. This feature is turned off by default. -+++ *** The apropos commands now accept a list of words to match. When more than one word is specified, at least two of those words must be present for an item to match. Regular expression matching is still available. -+++ *** The new option `apropos-sort-by-scores' causes the matching items to be sorted according to their score. The score for an item is a number calculated to indicate how well the item matches the words or @@ -665,77 +576,64 @@ ** Incremental Search changes: -+++ *** Vertical scrolling is now possible within incremental search. To enable this feature, customize the new user option `isearch-allow-scroll'. User written commands which satisfy stringent constraints can be marked as "scrolling commands". See the Emacs manual for details. -+++ *** C-w in incremental search now grabs either a character or a word, making the decision in a heuristic way. This new job is done by the command `isearch-yank-word-or-char'. To restore the old behavior, bind C-w to `isearch-yank-word' in `isearch-mode-map'. -+++ *** C-y in incremental search now grabs the next line if point is already at the end of a line. -+++ *** C-M-w deletes and C-M-y grabs a character in isearch mode. Another method to grab a character is to enter the minibuffer by `M-e' and to type `C-f' at the end of the search string in the minibuffer. -+++ *** M-% typed in isearch mode invokes `query-replace' or `query-replace-regexp' (depending on search mode) with the current search string used as the string to replace. -+++ *** Isearch no longer adds `isearch-resume' commands to the command history by default. To enable this feature, customize the new user option `isearch-resume-in-command-history'. ** Replace command changes: ---- *** New user option `query-replace-skip-read-only': when non-nil, `query-replace' and related functions simply ignore a match if part of it has a read-only property. -+++ *** When used interactively, the commands `query-replace-regexp' and `replace-regexp' allow \,expr to be used in a replacement string, where expr is an arbitrary Lisp expression evaluated at replacement -time. In many cases, this will be more convenient than using -`query-replace-regexp-eval'. `\#' in a replacement string now refers -to the count of replacements already made by the replacement command. -All regular expression replacement commands now allow `\?' in the -replacement string to specify a position where the replacement string -can be edited for each replacement. - -+++ +time. `\#' in a replacement string now refers to the count of +replacements already made by the replacement command. All regular +expression replacement commands now allow `\?' in the replacement +string to specify a position where the replacement string can be +edited for each replacement. `query-replace-regexp-eval' is now +deprecated since it offers no additional functionality. + *** query-replace uses isearch lazy highlighting when the new user option `query-replace-lazy-highlight' is non-nil. ---- *** The current match in query-replace is highlighted in new face `query-replace' which by default inherits from isearch face. ** Local variables lists: -+++ *** In processing a local variables list, Emacs strips the prefix and suffix from every line before processing all the lines. -+++ *** Text properties in local variables. A file local variables list cannot specify a string with text properties--any specified text properties are discarded. -+++ *** If the local variables list contains any variable-value pairs that are not known to be safe, Emacs shows a prompt asking whether to apply the local variables list as a whole. In earlier versions, a prompt @@ -750,21 +648,18 @@ However, risky variables will not be added to `safe-local-variable-values' in this way. -+++ *** The variable `enable-local-variables' controls how local variable lists are handled. t, the default, specifies the standard querying behavior. :safe means use only safe values, and ignore the rest. :all means set all variables, whether or not they are safe. nil means ignore them all. Anything else means always query. -+++ *** The variable `safe-local-eval-forms' specifies a list of forms that are ok to evaluate when they appear in an `eval' local variables specification. Normally Emacs asks for confirmation before evaluating such a form, but if the form appears in this list, no confirmation is needed. -+++ *** If a function has a non-nil `safe-local-eval-function' property, that means it is ok to evaluate some calls to that function when it appears in an `eval' local variables specification. If the property @@ -777,42 +672,34 @@ ** File operation changes: -+++ *** Unquoted `$' in file names do not signal an error any more when the corresponding environment variable does not exist. Instead, the `$ENVVAR' text is left as is, so that `$$' quoting is only rarely needed. -+++ *** find-file-read-only visits multiple files in read-only mode, when the file name contains wildcard characters. -+++ *** find-alternate-file replaces the current file with multiple files, when the file name contains wildcard characters. It now asks if you wish save your changes and not just offer to kill the buffer. -+++ *** Auto Compression mode is now enabled by default. ---- *** C-x C-f RET, typing nothing in the minibuffer, is no longer a special case. Since the default input is the current directory, this has the effect of specifying the current directory. Normally that means to visit the directory with Dired. -+++ *** When you are root, and you visit a file whose modes specify read-only, the Emacs buffer is now read-only too. Type C-x C-q if you want to make the buffer writable. (As root, you can in fact alter the file.) -+++ *** C-x s (save-some-buffers) now offers an option `d' to diff a buffer against its file, so you can see what changes you would be saving. -+++ *** The commands copy-file, rename-file, make-symbolic-link and add-name-to-file, when given a directory as the "new name" argument, convert it to a file name by merging in the within-directory part of @@ -820,27 +707,22 @@ commands cp, mv, and ln follow.) Thus, M-x copy-file RET ~/foo RET /tmp RET copies ~/foo to /tmp/foo. ---- *** When used interactively, `format-write-file' now asks for confirmation before overwriting an existing file, unless a prefix argument is supplied. This behavior is analogous to `write-file'. ---- *** The variable `auto-save-file-name-transforms' now has a third element that controls whether or not the function `make-auto-save-file-name' will attempt to construct a unique auto-save name (e.g. for remote files). -+++ *** The new option `write-region-inhibit-fsync' disables calls to fsync in `write-region'. This can be useful on laptops to avoid spinning up the hard drive upon each file save. Enabling this variable may result in data loss, use with care. -+++ *** If the user visits a file larger than `large-file-warning-threshold', Emacs asks for confirmation. -+++ *** require-final-newline now has two new possible values: `visit' means add a newline (as an undoable change) if it's needed @@ -850,7 +732,6 @@ needed when visiting the file, and also add a newline if it's needed when saving the file. -+++ *** The new option mode-require-final-newline controls how certain major modes enable require-final-newline. Any major mode that's designed for a kind of file that should normally end in a newline @@ -860,17 +741,14 @@ ** Minibuffer changes: -+++ *** The new file-name-shadow-mode is turned ON by default, so that when entering a file name, any prefix which Emacs will ignore is dimmed. -+++ *** There's a new face `minibuffer-prompt'. Emacs adds this face to the list of text properties stored in the variable `minibuffer-prompt-properties', which is used to display the prompt string. ---- *** Enhanced visual feedback in `*Completions*' buffer. Completions lists use faces to highlight what all completions @@ -891,7 +769,6 @@ the common prefix of completions to `display-completion-list' as its second argument. -+++ *** File-name completion can now ignore specified directories. If an element of the list in `completion-ignored-extensions' ends in a slash `/', it indicates a subdirectory that should be ignored when @@ -899,19 +776,16 @@ which do not end in a slash are never considered when a completion candidate is a directory. -+++ *** The completion commands TAB, SPC and ? in the minibuffer apply only to the text before point. If there is text in the buffer after point, it remains unchanged. -+++ *** New user option `history-delete-duplicates'. If set to t when adding a new history element, all previous identical elements are deleted from the history list. ** Redisplay changes: -+++ *** Preemptive redisplay now adapts to current load and bandwidth. To avoid preempting redisplay on fast computers, networks, and displays, @@ -919,20 +793,16 @@ redisplay. The new variable `redisplay-preemption-period' specifies the period; the default is to check for input every 0.1 seconds. -+++ *** The mode line position information now comes before the major mode. When the file is maintained under version control, that information appears between the position information and the major mode. -+++ *** New face `escape-glyph' highlights control characters and escape glyphs. -+++ *** Non-breaking space and hyphens are now displayed with a special face, either nobreak-space or escape-glyph. You can turn this off or specify a different mode by setting the variable `nobreak-char-display'. -+++ *** The parameters of automatic hscrolling can now be customized. The variable `hscroll-margin' determines how many columns away from the window edge point is allowed to get before automatic hscrolling @@ -948,21 +818,17 @@ The variable `automatic-hscrolling' was renamed to `auto-hscroll-mode'. The old name is still available as an alias. ---- *** Moving or scrolling through images (and other lines) taller than the window now works sensibly, by automatically adjusting the window's vscroll property. -+++ *** New customize option `overline-margin' controls the space between overline and text. -+++ *** New variable `x-underline-at-descent-line' controls the relative position of the underline. When set, it overrides the `x-use-underline-position-properties' variables. -+++ *** The new face `mode-line-inactive' is used to display the mode line of non-selected windows. The `mode-line' face is now used to display the mode line of the currently selected window. @@ -970,14 +836,12 @@ The new variable `mode-line-in-non-selected-windows' controls whether the `mode-line-inactive' face is used. -+++ *** You can now customize the use of window fringes. To control this for all frames, use M-x fringe-mode or the Show/Hide submenu of the top-level Options menu, or customize the `fringe-mode' variable. To control this for a specific frame, use the command M-x set-fringe-style. -+++ *** Angle icons in the fringes can indicate the buffer boundaries. In addition, up and down arrow bitmaps in the fringe indicate which ways the window can be scrolled. @@ -997,7 +861,6 @@ arrow bitmaps in right fringe. To show just the angle bitmaps in the left fringe, but no arrow bitmaps, use ((top . left) (bottom . left)). -+++ *** On window systems, lines which are exactly as wide as the window (not counting the final newline character) are no longer broken into two lines on the display (with just the newline on the second line). @@ -1007,12 +870,10 @@ The new user option 'overflow-newline-into-fringe' can be set to nil to revert to the old behavior of continuing such lines. -+++ *** When a window has display margin areas, the fringes are now displayed between the margins and the buffer's text area, rather than outside those margins. -+++ *** A window can now have individual fringe and scroll-bar settings, in addition to the individual display margin settings. @@ -1020,57 +881,46 @@ 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. -+++ *** If value of `auto-resize-tool-bars' is `grow-only', the tool bar will expand as needed, but not contract automatically. To contract the tool bar, you must type C-l. ** Cursor display changes: -+++ *** On X, MS Windows, and Mac OS, the blinking cursor's "off" state is now controlled by the variable `blink-cursor-alist'. -+++ *** The X resource cursorBlink can be used to turn off cursor blinking. -+++ *** Emacs can produce an underscore-like (horizontal bar) cursor. The underscore cursor is set by putting `(cursor-type . hbar)' in default-frame-alist. It supports variable heights, like the `bar' cursor does. -+++ *** Display of hollow cursors now obeys the buffer-local value (if any) of `cursor-in-non-selected-windows' in the buffer that the cursor appears in. -+++ *** The variable `cursor-in-non-selected-windows' can now be set to any of the recognized cursor types. -+++ *** On text terminals, the variable `visible-cursor' controls whether Emacs uses the "very visible" cursor (the default) or the normal cursor. ** New faces: -+++ *** `mode-line-highlight' is the standard face indicating mouse sensitive elements on mode-line (and header-line) like `highlight' face on text areas. -+++ *** `mode-line-buffer-id' is the standard face for buffer identification parts of the mode line. -+++ *** `shadow' face defines the appearance of the "shadowed" text, i.e. the text which should be less noticeable than the surrounding text. This can be achieved by using shades of grey in contrast with either @@ -1078,29 +928,13 @@ allows customization of the appearance of shadowed text in one place, so package-specific faces can inherit from it. -+++ *** `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: - -+++ +** Font-Lock (syntax highlighting) changes: + *** M-o now is the prefix key for setting text properties; M-o M-o requests refontification. -+++ *** All modes now support using M-x font-lock-mode to toggle fontification, even those such as Occur, Info, and comint-derived modes that do their own fontification in a special way. @@ -1109,7 +943,6 @@ fontification in Info, remove `turn-on-font-lock' from `Info-mode-hook'. -+++ *** 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 @@ -1117,19 +950,15 @@ 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'. -+++ *** New standard font-lock face `font-lock-comment-delimiter-face'. -+++ *** Easy to overlook single character negation can now be font-locked. You can use the new variable `font-lock-negation-char-face' and the face of the same name to customize this. Currently the cc-modes, sh-script-mode, cperl-mode and make-mode support this. ---- *** The default settings for JIT stealth lock parameters are changed. The default value for the user option jit-lock-stealth-time is now nil instead of 3. This setting of jit-lock-stealth-time disables stealth @@ -1142,7 +971,6 @@ jit-lock-stealth-nice is now 0.5 instead of 0.125 which is supposed to cause less load than the old defaults. ---- *** jit-lock can now be delayed with `jit-lock-defer-time'. If this variable is non-nil, its value should be the amount of Emacs @@ -1150,31 +978,25 @@ example, if you set `jit-lock-defer-time' to 0.25, fontification will only happen after 0.25s of idle time. ---- *** contextual refontification is now separate from stealth fontification. jit-lock-defer-contextually is renamed jit-lock-contextually and jit-lock-context-time determines the delay after which contextual refontification takes place. ---- *** lazy-lock is considered obsolete. The `lazy-lock' package is superseded by `jit-lock' and is considered obsolete. `jit-lock' is activated by default; if you wish to continue using `lazy-lock', activate it in your ~/.emacs like this: - (setq font-lock-support-mode 'lazy-lock-mode) If you invoke `lazy-lock-mode' directly rather than through `font-lock-support-mode', it now issues a warning: - "Use font-lock-support-mode rather than calling lazy-lock-mode" - ** Menu support: ---- *** A menu item "Show/Hide" was added to the top-level menu "Options". This menu allows you to turn various display features on and off (such as the fringes, the tool bar, the speedbar, and the menu bar itself). @@ -1182,68 +1004,44 @@ it off completely. There is also a menu-item to toggle displaying of current date and time, current line and column number in the mode-line. ---- *** Speedbar has moved from the "Tools" top level menu to "Show/Hide". ---- *** You can exit dialog windows and menus by typing C-g. ---- *** The menu item "Open File..." has been split into two items, "New File..." and "Open File...". "Open File..." now opens only existing files. This is to support existing GUI file selection dialogs better. -+++ -*** The file selection dialog for Gtk+, Mac, W32 and Motif/Lesstif can be +*** The file selection dialog for Gtk+, Mac, W32 and Motif/LessTif can be disabled by customizing the variable `use-file-dialog'. ---- *** The pop up menus for Lucid now stay up if you do a fast click and can be navigated with the arrow keys (like Gtk+, Mac and W32). -+++ -*** The menu bar for Motif/Lesstif/Lucid/Gtk+ can be navigated with keys. +*** The menu bar for Motif/LessTif/Lucid/Gtk+ can be navigated with keys. Pressing F10 shows the first menu in the menu bar. Navigation is done with the arrow keys, select with the return key and cancel with the escape keys. -+++ *** The Lucid menus can display multilingual text in your locale. You have to explicitly specify a fontSet resource for this to work, for example `-xrm "Emacs*fontSet: -*-helvetica-medium-r-*--*-120-*-*-*-*-*-*,*"'. ---- -*** Dialogs for Lucid/Athena and Lesstif/Motif now pops down when pressing +*** Dialogs for Lucid/Athena and LessTif/Motif now pop down on pressing ESC, like they do for Gtk+, Mac and W32. -+++ *** For the Gtk+ version, you can make Emacs use the old file dialog by setting the variable `x-gtk-use-old-file-dialog' to t. Default is to use the new dialog. ** Mouse changes: -+++ -*** If you set the new variable `mouse-autoselect-window' to a non-nil -value, windows are automatically selected as you move the mouse from -one Emacs window to another, even within a frame. A minibuffer window -can be selected only when it is active. - -+++ -*** On X, when the window manager requires that you click on a frame to -select it (give it focus), the selected window and cursor position -normally changes according to the mouse click position. If you set -the variable x-mouse-click-focus-ignore-position to t, the selected -window and cursor position do not change when you click on a frame -to give it focus. - -+++ *** You can now follow links by clicking Mouse-1 on the link. Traditionally, Emacs uses a Mouse-1 click to set point and a Mouse-2 click to follow a link, whereas most other applications use a Mouse-1 click for both purposes, depending on whether you click outside or inside a link. Now the behavior of a Mouse-1 click has been changed -to match this context-sentitive dual behavior. (If you prefer the old +to match this context-sensitive dual behavior. (If you prefer the old behavior, set the user option `mouse-1-click-follows-link' to nil.) Depending on the current mode, a Mouse-2 click in Emacs can do much @@ -1267,23 +1065,31 @@ You can customize the new Mouse-1 behavior via the new user options `mouse-1-click-follows-link' and `mouse-1-click-in-non-selected-windows'. -+++ +*** If you set the new variable `mouse-autoselect-window' to a non-nil +value, windows are automatically selected as you move the mouse from +one Emacs window to another, even within a frame. A minibuffer window +can be selected only when it is active. + +*** On X, when the window manager requires that you click on a frame to +select it (give it focus), the selected window and cursor position +normally changes according to the mouse click position. If you set +the variable x-mouse-click-focus-ignore-position to t, the selected +window and cursor position do not change when you click on a frame +to give it focus. + *** Emacs normally highlights mouse sensitive text whenever the mouse is over the text. By setting the new variable `mouse-highlight', you can optionally enable mouse highlighting only after you move the mouse, so that highlighting disappears when you press a key. You can also disable mouse highlighting. -+++ *** You can now customize if selecting a region by dragging the mouse shall not copy the selected text to the kill-ring by setting the new variable mouse-drag-copy-region to nil. ---- *** mouse-wheels can now scroll a specific fraction of the window (rather than a fixed number of lines) and the scrolling is `progressive'. ---- *** Emacs ignores mouse-2 clicks while the mouse wheel is being moved. People tend to push the mouse wheel (which counts as a mouse-2 click) @@ -1291,12 +1097,10 @@ ignored. You can customize this with the mouse-wheel-click-event and mouse-wheel-inhibit-click-time variables. -+++ *** Under X, mouse-wheel-mode is turned on by default. ** Multilingual Environment (Mule) changes: -+++ *** You can disable character translation for a file using the -*- construct. Include `enable-character-translation: nil' inside the -*-...-*- to disable any character translation that may happen by @@ -1309,14 +1113,12 @@ without any character translation: ;; -*- coding: iso-latin-1!; -*- ---- *** Language environment and various default coding systems are setup more correctly according to the current locale name. If the locale name doesn't specify a charset, the default is what glibc defines. This change can result in using the different coding systems as default in some locale (e.g. vi_VN). -+++ *** The keyboard-coding-system is now automatically set based on your current locale settings if you are not using a window system. This can mean that the META key doesn't work but generates non-ASCII @@ -1326,33 +1128,26 @@ or if the locale doesn't describe the character set actually generated by the keyboard. See Info node `Unibyte Mode'. -+++ *** The new command `revert-buffer-with-coding-system' (C-x RET r) revisits the current file using a coding system that you specify. -+++ *** New command `recode-region' decodes the region again by a specified coding system. -+++ *** The new command `recode-file-name' changes the encoding of the name of a file. ---- *** New command `ucs-insert' inserts a character specified by its unicode. -+++ *** The new command `set-file-name-coding-system' (C-x RET F) sets coding system for encoding and decoding file names. A new menu item (Options->Mule->Set Coding Systems->For File Name) invokes this command. -+++ *** New command quail-show-key shows what key (or key sequence) to type in the current input method to input a character at point. -+++ *** Limited support for character `unification' has been added. Emacs now knows how to translate between different representations of the same characters in various Emacs charsets according to standard @@ -1372,32 +1167,24 @@ mule-unicode-0100-24ff charsets) on decoding. Note that this mode will often effectively clobber data with an iso-2022 encoding. ---- +*** New language environments (set up automatically according to the +locale): Belarusian, Bulgarian, Chinese-EUC-TW, Croatian, Esperanto, +French, Georgian, Italian, Latin-7, Latvian, Lithuanian, Malayalam, +Russian, Russian, Slovenian, Swedish, Tajik, Tamil, UTF-8,Ukrainian, +Welsh,Latin-6, Windows-1255. + +*** New input methods: latin-alt-postfix, latin-postfix, latin-prefix, +belarusian, bulgarian-bds, bulgarian-phonetic, chinese-sisheng (for +Chinese Pinyin characters), croatian, dutch, georgian, latvian-keyboard, +lithuanian-numeric, lithuanian-keyboard, malayalam-inscript, rfc1345, +russian-computer, sgml, slovenian, tamil-inscript, ukrainian-computer, +ucs, vietnamese-telex, welsh. + *** There is support for decoding Greek and Cyrillic characters into either Unicode (the mule-unicode charsets) or the iso-8859 charsets, -when possible. The latter are more space-efficient. This is -controlled by user option utf-fragment-on-decoding. - ---- -*** New language environments: French, Ukrainian, Tajik, -Bulgarian, Belarusian, Ukrainian, UTF-8, Windows-1255, Welsh, Latin-6, -Latin-7, Lithuanian, Latvian, Swedish, Slovenian, Croatian, Georgian, -Italian, Russian, Malayalam, Tamil, Russian, Chinese-EUC-TW, -Esperanto. (Set up automatically according to the locale.) - ---- -*** New input methods: latin-alt-postfix, latin-postfix, latin-prefix, -ukrainian-computer, belarusian, bulgarian-bds, russian-computer, -vietnamese-telex, lithuanian-numeric, lithuanian-keyboard, -latvian-keyboard, welsh, georgian, rfc1345, ucs, sgml, -bulgarian-phonetic, dutch, slovenian, croatian, malayalam-inscript, -tamil-inscript. - ---- -*** New input method chinese-sisheng for inputting Chinese Pinyin -characters. - ---- +when possible. The latter are more space-efficient. + This is controlled by user option utf-fragment-on-decoding. + *** Improved Thai support. A new minor mode `thai-word-mode' (which is automatically activated if you select Thai as a language environment) changes key bindings of most word-oriented commands to @@ -1409,17 +1196,11 @@ M-t (transpose-words) M-q (fill-paragraph) ---- *** Indian support has been updated. The in-is13194 coding system is now Unicode-based. CDAC fonts are -assumed. There is a framework for supporting various -Indian scripts, but currently only Devanagari, Malayalam and Tamil are -supported. - ---- -*** A UTF-7 coding system is available in the library `utf-7'. - ---- +assumed. There is a framework for supporting various Indian scripts, +but currently only Devanagari, Malayalam and Tamil are supported. + *** The utf-8/16 coding systems have been enhanced. By default, untranslatable utf-8 sequences are simply composed into single quasi-characters. User option `utf-translate-cjk-mode' (it is @@ -1433,42 +1214,37 @@ one-dimensional internal charsets, specifically the ISO-8859 ones. The utf-16 coding system is affected similarly. ---- +*** A UTF-7 coding system is available in the library `utf-7'. + *** A new coding system `euc-tw' has been added for traditional Chinese in CNS encoding; it accepts both Big 5 and CNS as input; on saving, Big 5 is then converted to CNS. ---- *** Many new coding systems are available in the `code-pages' library. These include complete versions of most of those in codepage.el, based on Unicode mappings. `codepage-setup' is now obsolete and is used only in the MS-DOS port of Emacs. All coding systems defined in `code-pages' are auto-loaded. ---- *** New variable `utf-translate-cjk-unicode-range' controls which Unicode characters to translate in `utf-translate-cjk-mode'. ---- *** iso-10646-1 (`Unicode') fonts can be used to display any range of characters encodable by the utf-8 coding system. Just specify the fontset appropriately. ** Customize changes: -+++ *** Custom themes are collections of customize options. Create a custom theme with M-x customize-create-theme. Use M-x load-theme to load and enable a theme, and M-x disable-theme to disable it. Use M-x enable-theme to enable a disabled theme. -+++ *** The commands M-x customize-face and M-x customize-face-other-window now look at the character after point. If a face or faces are specified for that character, the commands by default customize those faces. ---- *** The face-customization widget has been reworked to be less confusing. In particular, when you enable a face attribute using the corresponding check-box, there's no longer a redundant `*' option in value selection @@ -1477,7 +1253,6 @@ its check-box, then the (now ignored, but still present temporarily in case you re-select the attribute) value is hidden. -+++ *** When you set or reset a variable's value in a Customize buffer, the previous value becomes the "backup value" of the variable. You can go back to that backup value by selecting "Use Backup Value" @@ -1485,17 +1260,14 @@ ** Buffer Menu changes: -+++ *** New command `Buffer-menu-toggle-files-only' toggles display of file buffers only in the Buffer Menu. It is bound to T in Buffer Menu mode. -+++ *** `buffer-menu' and `list-buffers' now list buffers whose names begin with a space, when those buffers are visiting files. Normally buffers whose names begin with space are omitted. ---- *** The new options `buffers-menu-show-directories' and `buffers-menu-show-status' let you control how buffers are displayed in the menu dropped down when you click "Buffers" from the menu bar. @@ -1515,24 +1287,19 @@ ** Dired mode: ---- *** New faces dired-header, dired-mark, dired-marked, dired-flagged, dired-ignored, dired-directory, dired-symlink, dired-warning introduced for Dired mode instead of font-lock faces. -+++ *** New Dired command `dired-compare-directories' marks files with different file attributes in two dired buffers. -+++ *** New Dired command `dired-do-touch' (bound to T) changes timestamps of marked files with the value entered in the minibuffer. -+++ *** The Dired command `dired-goto-file' is now bound to j, not M-g. This is to avoid hiding the global key binding of M-g. -+++ *** In Dired's ! command (dired-do-shell-command), `*' and `?' now control substitution of the file names only when they are surrounded by whitespace. This means you can now use them as shell wildcards @@ -1540,11 +1307,9 @@ double quotes make no difference in the shell, but they prevent special treatment in `dired-do-shell-command'. -+++ *** In Dired, the w command now stores the current line's file name into the kill ring. With a zero prefix arg, it stores the absolute file name. -+++ *** In Dired-x, Omitting files is now a minor mode, dired-omit-mode. The mode toggling command is bound to M-o. A new command @@ -1552,7 +1317,6 @@ dired-omit-files-p is obsoleted, use the mode toggling function instead. -+++ *** The variables dired-free-space-program and dired-free-space-args have been renamed to directory-free-space-program and directory-free-space-args, and they now apply whenever Emacs puts a @@ -1560,7 +1324,6 @@ ** Comint changes: ---- *** The comint prompt can now be made read-only, using the new user option `comint-prompt-read-only'. This is not enabled by default, except in IELM buffers. The read-only status of IELM prompts can be @@ -1582,27 +1345,23 @@ `kill-region' if read-only properties are involved: it copies the text to the kill-ring, but does not delete it. -+++ *** The new command `comint-insert-previous-argument' in comint-derived modes (shell-mode, etc.) inserts arguments from previous command lines, like bash's `ESC .' binding. It is bound by default to `C-c .', but otherwise behaves quite similarly to the bash version. -+++ *** `comint-use-prompt-regexp-instead-of-fields' has been renamed `comint-use-prompt-regexp'. The old name has been kept as an alias, but declared obsolete. -+++ -*** The new INSIDE_EMACS environment variable is set to "t" in -subshells running inside Emacs. This supersedes the EMACS environment -variable, which will be removed in a future Emacs release. Programs -that need to know whether they are started inside Emacs should check -INSIDE_EMACS instead of EMACS. +*** The new INSIDE_EMACS environment variable is set to "t" in subshells +running inside Emacs. This supersedes the EMACS environment variable, +which will be removed in a future Emacs release. Programs that need +to know whether they are started inside Emacs should check INSIDE_EMACS +instead of EMACS. ** M-x Compile changes: ---- *** M-x compile has become more robust and reliable Quite a few more kinds of messages are recognized. Messages that are @@ -1622,22 +1381,18 @@ The new file etc/compilation.txt gives examples of each type of message. -+++ *** New user option `compilation-environment'. This option allows you to specify environment variables for inferior compilation processes without affecting the environment that all subprocesses inherit. -+++ *** New user option `compilation-disable-input'. If this is non-nil, send end-of-file as compilation process input. -+++ *** New options `next-error-highlight' and `next-error-highlight-no-select' specify the method of highlighting of the corresponding source line in new face `next-error'. -+++ *** A new minor mode `next-error-follow-minor-mode' can be used in compilation-mode, grep-mode, occur-mode, and diff-mode (i.e. all the modes that can use `next-error'). In this mode, cursor motion in the @@ -1645,33 +1400,24 @@ matches, compilation errors, etc. This minor mode can be toggled with C-c C-f. -+++ *** When the left fringe is displayed, an arrow points to current message in the compilation buffer. -+++ *** The new variable `compilation-context-lines' controls lines of leading context before the current message. If nil and the left fringe is displayed, it doesn't scroll the compilation output window. If there is no left fringe, 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: -+++ *** In the *Occur* buffer, `o' switches to it in another window, and C-o displays the current line's occurrence in another window without switching to it. -+++ *** You can now use next-error (C-x `) and previous-error to advance to the next/previous matching line found by M-x occur. -+++ *** The new command `multi-occur' is just like `occur', except it can search multiple buffers. There is also a new command `multi-occur-in-matching-buffers' which allows you to specify the @@ -1681,21 +1427,18 @@ ** Grep changes: -+++ *** Grep has been decoupled from compilation mode setup. There's a new separate package grep.el, with its own submenu and customization group. -+++ *** `grep-find' is now also available under the name `find-grep' where people knowing `find-grep-dired' would probably expect it. -+++ *** New commands `lgrep' (local grep) and `rgrep' (recursive grep) are more user-friendly versions of `grep' and `grep-find', which prompt separately for the regular expression to match, the files to search, -and the base directory for the search. Case sensitivitivy of the +and the base directory for the search. Case sensitivity of the search is controlled by the current value of `case-fold-search'. These commands build the shell commands based on the new variables @@ -1707,17 +1450,14 @@ typically used by various version control systems, like CVS and arch, are automatically skipped by `rgrep'. ---- *** The grep commands provide highlighting support. Hits are fontified in green, and hits in binary files in orange. Grep buffers can be saved and automatically revisited. ---- *** The new variables `grep-window-height' and `grep-scroll-output' override the corresponding compilation mode settings, for grep commands only. -+++ *** New option `grep-highlight-matches' highlights matches in *grep* buffer. It uses a special feature of some grep programs which accept --color option to output markers around matches. When going to the next @@ -1725,7 +1465,6 @@ buffer. Otherwise, if `grep-highlight-matches' is nil, the whole source line is highlighted. -+++ *** New key bindings in grep output window: SPC and DEL scrolls window up and down. C-n and C-p moves to next and previous match in the grep window. RET jumps to the source line of @@ -1734,7 +1473,6 @@ previous or next file in the grep output. TAB also jumps to the next file. -+++ *** M-x grep now tries to avoid appending `/dev/null' to the command line by using GNU grep `-H' option instead. M-x grep automatically detects whether this is possible or not the first time it is invoked. @@ -1744,12 +1482,10 @@ ** X Windows Support: -+++ *** Emacs now supports drag and drop for X. Dropping a file on a window opens it, dropping text inserts the text. Dropping a file on a dired buffer copies or moves the file to that directory. -+++ *** Under X11, it is possible to swap Alt and Meta (and Super and Hyper). The new variables `x-alt-keysym', `x-hyper-keysym', `x-meta-keysym', and `x-super-keysym' can be used to choose which keysyms Emacs should @@ -1758,31 +1494,26 @@ (setq x-alt-keysym 'meta) (setq x-meta-keysym 'alt) -+++ *** The X resource useXIM can be used to turn off use of XIM, which can speed up Emacs with slow networking to the X server. If the configure option `--without-xim' was used to turn off use of XIM by default, the X resource useXIM can be used to turn it on. ---- *** The new variable `x-select-request-type' controls how Emacs requests X selection. The default value is nil, which means that Emacs requests X selection with types COMPOUND_TEXT and UTF8_STRING, and use the more appropriately result. ---- *** The scrollbar under LessTif or Motif has a smoother drag-scrolling. On the other hand, the size of the thumb does not represent the actual amount of text shown any more (only a crude approximation of it). ** Xterm support: ---- *** If you enable Xterm Mouse mode, Emacs will respond to mouse clicks on the mode line, header line and display margin, when run in an xterm. ---- *** Improved key bindings support when running in an xterm. When Emacs is running in an xterm more key bindings are available. The following should work: @@ -1795,7 +1526,6 @@ ** Character terminal color support changes: -+++ *** The new command-line option --color=MODE lets you specify a standard mode for a tty color support. It is meant to be used on character terminals whose capabilities are not set correctly in the terminal @@ -1806,26 +1536,33 @@ in "ls --color", it will support "emacs --color" as well. See the user manual for the possible values of the MODE parameter. ---- *** Emacs now supports several character terminals which provide more than 8 colors. For example, for `xterm', 16-color, 88-color, and 256-color modes are supported. Emacs automatically notes at startup the extended number of colors, and defines the appropriate entries for all of these colors. -+++ *** Emacs now uses the full range of available colors for the default faces when running on a color terminal, including 16-, 88-, and 256-color xterms. This means that when you run "emacs -nw" on an 88-color or 256-color xterm, you will see essentially the same face colors as on X. ---- *** There's a new support for colors on `rxvt' terminal emulator. + +** 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 depends 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. * New Modes and Packages in Emacs 22.1 ---- ** ERC is now part of the Emacs distribution. ERC is a powerful, modular, and extensible IRC client for Emacs. @@ -1836,7 +1573,6 @@ To start an IRC session with ERC, type M-x erc, and follow the prompts for server, port, and nick. ---- ** Rcirc is now part of the Emacs distribution. Rcirc is an Internet relay chat (IRC) client. It supports @@ -1850,7 +1586,6 @@ If you type C-u M-x irc, it prompts you for the server, nick, port and startup channel parameters before connecting. ---- ** Newsticker is now part of the Emacs distribution. Newsticker asynchronously retrieves headlines (RSS) from a list of news @@ -1858,11 +1593,9 @@ corresponding articles in a web browser. Its documentation is in a separate manual. -+++ ** savehist saves minibuffer histories between sessions. To use this feature, turn on savehist-mode in your `.emacs' file. -+++ ** Filesets are collections of files. You can define a fileset in various ways, such as based on a directory tree or based on program files that include other program files. @@ -1871,7 +1604,6 @@ all the files in it, such as visiting them or searching and replacing in them. -+++ ** Calc is now part of the Emacs distribution. Calc is an advanced desk calculator and mathematical tool written in @@ -1881,11 +1613,9 @@ manual. A reference card is available in `etc/calccard.tex' and `etc/calccard.ps'. ---- ** The new package ibuffer provides a powerful, completely customizable replacement for buff-menu.el. ---- ** Ido mode is now part of the Emacs distribution. The ido (interactively do) package is an extension of the iswitchb @@ -1893,11 +1623,9 @@ to interactive buffer switching. Ido is a superset of iswitchb (with a few exceptions), so don't enable both packages. -+++ ** Image files are normally visited in Image mode, which lets you toggle between viewing the image and viewing the text using C-c C-c. ---- ** CUA mode is now part of the Emacs distribution. The new cua package provides CUA-like keybindings using C-x for @@ -1946,7 +1674,6 @@ must remove older versions of cua.el or cua-mode.el as well as the loading and customization of those packages from the .emacs file. -+++ ** Org mode is now part of the Emacs distribution Org mode is a mode for keeping notes, maintaining ToDo lists, and @@ -1961,11 +1688,9 @@ type "C-h i m org RET" to read that manual. A reference card is available in `etc/orgcard.tex' and `etc/orgcard.ps'. -+++ ** The new package dns-mode.el adds syntax highlighting of DNS master files. It is a modern replacement for zone-mode.el, which is now obsolete. ---- ** The new global minor mode `file-name-shadow-mode' modifies the way filenames being entered by the user in the minibuffer are displayed, so that it's clear when part of the entered filename will be ignored due to @@ -1973,11 +1698,9 @@ invisible, or otherwise less visually noticeable. The display method can be displayed by customizing the variable `file-name-shadow-properties'. -+++ ** The new package flymake.el does on-the-fly syntax checking of program source files. See the Flymake's Info manual for more details. -+++ ** The new keypad setup package provides several common bindings for the numeric keypad which is available on most keyboards. The numeric keypad typically has the digits 0 to 9, a decimal point, keys marked @@ -2002,7 +1725,6 @@ are left unspecified and can be bound individually through the global or local keymaps. -+++ ** Emacs' keyboard macro facilities have been enhanced by the new kmacro package. @@ -2036,16 +1758,13 @@ C-x C-k SPC steps through the last keyboard macro one key sequence at a time, prompting for the actions to take. ---- ** New minor mode, Visible mode, toggles invisibility in the current buffer. When enabled, it makes all invisible text visible. When disabled, it restores the previous value of `buffer-invisibility-spec'. -+++ ** The wdired.el package allows you to use normal editing commands on Dired buffers to change filenames, permissions, etc... -+++ ** The new package longlines.el provides a minor mode for editing text files composed of long lines, based on the `use-hard-newlines' mechanism. The long lines are broken up by inserting soft newlines, @@ -2056,7 +1775,6 @@ similar to Refill mode, but more reliable. To turn the word wrap feature off, set `longlines-auto-wrap' to nil. -+++ ** The printing package is now part of the Emacs distribution. If you enable the printing package by including (require 'printing) in @@ -2066,7 +1784,6 @@ printer) or send directly to printer a PostScript code generated by `ps-print' package. Use M-x pr-help for more information. ---- ** The minor mode Reveal mode makes text visible on the fly as you move your cursor into hidden regions of the buffer. It should work with any package that uses overlays to hide parts @@ -2074,23 +1791,19 @@ There is also Global Reveal mode which affects all buffers. ---- ** The ruler-mode.el library provides a minor mode for displaying an "active" ruler in the header line. You can use the mouse to visually change the `fill-column', `window-margins' and `tab-stop-list' settings. -+++ ** SES mode (ses-mode) is a new major mode for creating and editing spreadsheet files. Besides the usual Emacs features (intuitive command letters, undo, cell formulas in Lisp, plaintext files, etc.) it also offers viral immunity and import/export of tab-separated values. -+++ ** The new global minor mode `size-indication-mode' (off by default) shows the size of accessible part of the buffer on the mode line. -+++ ** The new package table.el implements editable, WYSIWYG, embedded `text tables' in Emacs buffers. It simulates the effect of putting these tables in a special major mode. The package emulates WYSIWYG @@ -2098,12 +1811,11 @@ can generate a table source in typesetting and markup languages such as latex and html from the visually laid out text table. -+++ -** The tumme.el package allows you to easily view, tag and in other ways -manipulate image files and their thumbnails, using dired as the main interface. -Tumme provides functionality to generate simple image galleries. - -+++ +** The image-dired.el package allows you to easily view, tag and in +other ways manipulate image files and their thumbnails, using dired as +the main interface. Image-Dired provides functionality to generate +simple image galleries. + ** Tramp is now part of the distribution. This package is similar to Ange-FTP: it allows you to edit remote @@ -2126,14 +1838,11 @@ Removing Tramp, and re-enabling Ange-FTP, can be achieved by M-x tramp-unload-tramp. ---- ** The URL package (which had been part of W3) is now part of Emacs. ---- ** `cfengine-mode' is a major mode for editing GNU Cfengine configuration files. -+++ ** The new package conf-mode.el handles thousands of configuration files, with varying syntaxes for comments (;, #, //, /* */ or !), assignment (var = value, var : value, var value or keyword var value) and sections ([section] or @@ -2141,24 +1850,19 @@ .config, .properties (Java), .desktop (KDE/Gnome), .ini and many others are recognized. ---- ** GDB-Script-mode is used for files like .gdbinit. -+++ ** The new python.el package is used to edit Python and Jython programs. ---- ** The TCL package tcl-mode.el was replaced by tcl.el. This was actually done in Emacs-21.1, and was not documented. ---- ** The new package scroll-lock.el provides the Scroll Lock minor mode for pager-like scrolling. Keys which normally move point by line or paragraph will scroll the buffer by the respective amount of lines instead and point will be kept vertically fixed relative to window boundaries during scrolling. -+++ ** The file t-mouse.el is now part of Emacs and provides access to mouse events from the console. It still requires gpm to work but has been updated for Emacs 22. In particular, the mode-line is now position sensitive. @@ -2167,23 +1871,20 @@ ** Changes in Shell Mode ---- *** Shell output normally scrolls so that the input line is at the bottom of the window -- thus showing the maximum possible text. (This is similar to the way sequential output to a terminal works.) ** Changes in Dired -+++ -*** Bindings for Tumme added +*** Bindings for Image-Dired added Several new keybindings, all starting with the C-t prefix, have been -added to Dired. They are all bound to commands in Tumme. As a starting -point, mark some image files in a dired buffer and do C-t d to display -thumbnails of them in a separate buffer. +added to Dired. They are all bound to commands in Image-Dired. As a +starting point, mark some image files in a dired buffer and do C-t d +to display thumbnails of them in a separate buffer. ** Changes in Hi Lock -+++ *** hi-lock-mode now only affects a single buffer, and a new function `global-hi-lock-mode' enables Hi Lock in all buffers. By default, if hi-lock-mode is used in what appears to be the initialization file, a @@ -2193,7 +1894,6 @@ buffers and no warning will be issued (for compatibility with the behavior in older versions of Emacs). ---- ** Changes in Allout *** Some previously rough topic-header format edge cases are reconciled. @@ -2202,7 +1902,7 @@ 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. +*** Many or most commonly occurring "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. @@ -2292,14 +1992,12 @@ - many, many other, more minor tweaks, fixes, and refinements. - version number incremented to 2.2 -+++ -** The variable `woman-topic-at-point' was renamed +** The variable `woman-topic-at-point' is renamed to `woman-use-topic-at-point' and behaves differently: if this variable is non-nil, the `woman' command uses the word at point automatically, without asking for a confirmation. Otherwise, the word at point is suggested as default, but not inserted at the prompt. ---- ** Changes to cmuscheme *** Emacs now offers to start Scheme if the user tries to @@ -2315,7 +2013,6 @@ subprocess are controlled by the user options `scheme-trace-command', `scheme-untrace-command' and `scheme-expand-current-form'. ---- ** Changes in Makefile mode *** Makefile mode has submodes for automake, gmake, makepp, BSD make and imake. @@ -2328,21 +2025,16 @@ to `makefile-query-one-target-method-function'. The old name is still available as alias. -+++ ** In Outline mode, `hide-body' no longer hides lines at the top of the file that precede the first header line. -+++ ** Telnet now prompts you for a port number with C-u M-x telnet. ---- ** The terminal emulation code in term.el has been improved; it can run most curses applications now. -+++ ** M-x diff uses Diff mode instead of Compilation mode. -+++ ** Diff mode key bindings changed. These are the new bindings: @@ -2357,7 +2049,6 @@ In addition, C-c C-u now operates on the region in Transient Mark mode when the mark is active. -+++ ** You can now customize `fill-nobreak-predicate' to control where filling can break lines. The value is now normally a list of functions, but it can also be a single function, for compatibility. @@ -2366,39 +2057,31 @@ `fill-french-nobreak-p', for use as the value of `fill-nobreak-predicate'. ---- ** M-x view-file and commands that use it now avoid interfering with special modes such as Tar mode. ---- ** Commands `winner-redo' and `winner-undo', from winner.el, are now bound to C-c <left> and C-c <right>, respectively. This is an incompatible change. ---- ** `global-whitespace-mode' is a new alias for `whitespace-global-mode'. -+++ ** M-x compare-windows now can automatically skip non-matching text to resync points in both windows. -+++ ** New user option `add-log-always-start-new-record'. When this option is enabled, M-x add-change-log-entry always starts a new record regardless of when the last record is. ---- ** PO translation files are decoded according to their MIME headers when Emacs visits them. ** Info mode changes: -+++ *** A numeric prefix argument of `info' selects an Info buffer with the number appended to the `*info*' buffer name (e.g. "*info*<2>"). -+++ *** isearch in Info uses Info-search and searches through multiple nodes. Before leaving the initial Info node isearch fails once with the error @@ -2409,82 +2092,65 @@ or the default isearch search function that wraps around the current Info node. ---- *** New search commands: `Info-search-case-sensitively' (bound to S), `Info-search-backward', and `Info-search-next' which repeats the last search without prompting for a new search string. -+++ *** New command `Info-history-forward' (bound to r and new toolbar icon) moves forward in history to the node you returned from after using `Info-history-back' (renamed from `Info-last'). ---- *** New command `Info-history' (bound to L) displays a menu of visited nodes. ---- *** New command `Info-toc' (bound to T) creates a node with table of contents from the tree structure of menus of the current Info file. -+++ *** New command `info-apropos' searches the indices of the known Info files on your system for a string, and builds a menu of the possible matches. ---- *** New command `Info-copy-current-node-name' (bound to w) copies the current Info node name into the kill ring. With a zero prefix arg, puts the node name inside the `info' function call. -+++ *** New face `info-xref-visited' distinguishes visited nodes from unvisited and a new option `Info-fontify-visited-nodes' to control this. ---- *** http and ftp links in Info are now operational: they look like cross references and following them calls `browse-url'. -+++ *** Info now hides node names in menus and cross references by default. If you prefer the old behavior, you can set the new user option `Info-hide-note-references' to nil. ---- *** Images in Info pages are supported. Info pages show embedded images, in Emacs frames with image support. Info documentation that includes images, processed with makeinfo version 4.7 or newer, compiles to Info pages with embedded images. -+++ *** The default value for `Info-scroll-prefer-subnodes' is now nil. ---- *** `Info-index' offers completion. ** Lisp mode changes: ---- *** Lisp mode now uses `font-lock-doc-face' for doc strings. -+++ *** C-u C-M-q in Emacs Lisp mode pretty-prints the list after point. *** New features in evaluation commands -+++ **** The function `eval-defun' (C-M-x) called on defface reinitializes the face to the value specified in the defface expression. -+++ **** Typing C-x C-e twice prints the value of the integer result in additional formats (octal, hexadecimal, character) specified by the new function `eval-expression-print-format'. The same function also defines the result format for `eval-expression' (M-:), `eval-print-last-sexp' (C-j) and some edebug evaluation functions. -+++ ** CC mode changes. *** The CC Mode manual has been extensively revised. @@ -2812,14 +2478,11 @@ The function `c-toggle-syntactic-indentation' can be used to toggle syntactic indentation. ---- ** In sh-script, a continuation line is only indented if the backslash was preceded by a SPC or a TAB. ---- ** Perl mode has a new variable `perl-indent-continued-arguments'. ---- ** The old Octave mode bindings C-c f and C-c i have been changed to C-c C-f and C-c C-i. The C-c C-i subcommands now have duplicate bindings on control characters--thus, C-c C-i C-b is the same as @@ -2827,34 +2490,27 @@ ** Fortran mode changes: ---- *** Fortran mode does more font-locking by default. Use level 3 highlighting for the old default. -+++ *** Fortran mode has a new variable `fortran-directive-re'. Adapt this to match the format of any compiler directives you use. Lines that match are never indented, and are given distinctive font-locking. -+++ *** F90 mode and Fortran mode have new navigation commands `f90-end-of-block', `f90-beginning-of-block', `f90-next-block', `f90-previous-block', `fortran-end-of-block', `fortran-beginning-of-block'. ---- *** F90 mode and Fortran mode have support for `hs-minor-mode' (hideshow). It cannot deal with every code format, but ought to handle a sizeable majority. ---- *** The new function `f90-backslash-not-special' can be used to change the syntax of backslashes in F90 buffers. ---- ** Reftex mode changes -+++ *** Changes to RefTeX's table of contents The new command keys "<" and ">" in the TOC buffer promote/demote the @@ -2879,7 +2535,6 @@ The new command `reftex-goto-label' jumps directly to a label location. -+++ *** Changes related to citations and BibTeX database files Commands that insert a citation now prompt for optional arguments when @@ -2902,13 +2557,11 @@ Support for jurabib has been added. -+++ *** Global index matched may be verified with a user function During global indexing, a user function can verify an index match. See new option `reftex-index-verify-function'. -+++ *** Parsing documents with many labels can be sped up. Operating in a document with thousands of labels can be sped up @@ -2918,7 +2571,6 @@ this feature. While the speed-up is significant, this may reduce the quality of the context offered by RefTeX to describe a label. -+++ *** Miscellaneous changes The macros which input a file in LaTeX (like \input, \include) can be @@ -2926,17 +2578,14 @@ RefTeX supports global incremental search. -+++ ** Prolog mode has a new variable `prolog-font-lock-keywords' to support use of font-lock. ** HTML/SGML changes: ---- *** Emacs now tries to set up buffer coding systems for HTML/XML files automatically. -+++ *** SGML mode has indentation and supports XML syntax. The new variable `sgml-xml-mode' tells SGML mode to use XML syntax. When this option is enabled, SGML tags are inserted in XML style, @@ -2944,33 +2593,26 @@ By default, its setting is inferred on a buffer-by-buffer basis from the file name or buffer contents. ---- *** The variable `sgml-transformation' has been renamed to `sgml-transformation-function'. The old name is still available as alias. -+++ *** `xml-mode' is now an alias for `sgml-mode', which has XML support. ** TeX modes: -+++ *** C-c C-c prompts for a command to run, and tries to offer a good default. -+++ *** The user option `tex-start-options-string' has been replaced by two new user options: `tex-start-options', which should hold command-line options to feed to TeX, and `tex-start-commands' which should hold TeX commands to use at startup. ---- *** verbatim environments are now highlighted in courier by font-lock and super/sub-scripts are made into super/sub-scripts. -+++ *** New major mode Doctex mode, for *.dtx files. ---- ** BibTeX mode: *** The new command `bibtex-url' browses a URL for the BibTeX entry at @@ -3027,27 +2669,22 @@ `bibtex-autokey-titleword-case-convert-function'. The old names are still available as aliases. -+++ ** In Artist mode the variable `artist-text-renderer' has been renamed to `artist-text-renderer-function'. The old name is still available as alias. -+++ ** In Enriched mode, `set-left-margin' and `set-right-margin' are now by default bound to `C-c [' and `C-c ]' instead of the former `C-c C-l' and `C-c C-r'. ** GUD changes: -+++ *** In GUD mode, when talking to GDB, C-x C-a C-j "jumps" the program counter to the specified source line (the one where point is). ---- *** GUD mode has its own tool bar for controlling execution of the inferior and other common debugger commands. -+++ *** The new package gdb-ui.el provides an enhanced graphical interface to GDB. You can interact with GDB through the GUD buffer in the usual way, but there are also further buffers which control the execution and describe the @@ -3059,17 +2696,14 @@ To use this package just type M-x gdb. See the Emacs manual if you want the old behaviour. ---- *** The variable tooltip-gud-tips-p has been removed. GUD tooltips can now be toggled independently of normal tooltips with the minor mode `gud-tooltip-mode'. -+++ *** In graphical mode, with a C program, GUD Tooltips have been extended to display the #define directive associated with an identifier when program is not executing. ---- ** GUD mode improvements for jdb: *** Search for source files using jdb classpath and class information. @@ -3114,7 +2748,6 @@ ** Auto-Revert changes: -+++ *** You can now use Auto Revert mode to `tail' a file. If point is at the end of a file buffer before reverting, Auto Revert @@ -3130,7 +2763,6 @@ mode Auto Revert Tail mode. The function `auto-revert-tail-mode' toggles this mode. -+++ *** Auto Revert mode is now more careful to avoid excessive reverts and other potential problems when deciding which non-file buffers to revert. This matters especially if Global Auto Revert mode is enabled @@ -3141,14 +2773,12 @@ that auto reverting works for Dired buffers (although this may not work properly on all operating systems) and for the Buffer Menu. -+++ *** If the new user option `auto-revert-check-vc-info' is non-nil, Auto Revert mode reliably updates version control info (such as the version control number in the mode line), in all version controlled buffers in which it is active. If the option is nil, the default, then this info only gets updated whenever the buffer gets reverted. ---- ** recentf changes. The recent file list is now automatically cleaned up when recentf mode is @@ -3173,27 +2803,21 @@ replaces the misnamed option `recentf-menu-append-commands-p'. The old name remains available as alias, but has been marked obsolete. -+++ ** Desktop package -+++ *** Desktop saving is now a minor mode, `desktop-save-mode'. -+++ *** The variable `desktop-enable' is obsolete. Customize `desktop-save-mode' to enable desktop saving. ---- *** Buffers are saved in the desktop file in the same order as that in the buffer list. -+++ *** The desktop package can be customized to restore only some buffers immediately, remaining buffers are restored lazily (when Emacs is idle). -+++ *** New commands: - desktop-revert reverts to the last loaded desktop. - desktop-change-dir kills current desktop and loads a new. @@ -3202,7 +2826,6 @@ - desktop-lazy-complete runs the desktop load to completion. - desktop-lazy-abort aborts lazy loading of the desktop. ---- *** New customizable variables: - desktop-save. Determines whether the desktop should be saved when it is killed. @@ -3217,15 +2840,12 @@ - desktop-lazy-verbose. Verbose reporting of lazily created buffers. - desktop-lazy-idle-delay. Idle delay before starting to create buffers. -+++ *** New command line option --no-desktop ---- *** New hooks: - desktop-after-read-hook run after a desktop is loaded. - desktop-no-desktop-file-hook run when no desktop file is found. ---- ** The saveplace.el package now filters out unreadable files. When you exit Emacs, the saved positions in visited files no longer @@ -3237,25 +2857,21 @@ ** EDiff changes. -+++ *** When comparing directories. Typing D brings up a buffer that lists the differences between the contents of directories. Now it is possible to use this buffer to copy the missing files from one directory to another. -+++ *** When comparing files or buffers. Typing the = key now offers to perform the word-by-word comparison of the currently highlighted regions in an inferior Ediff session. If you answer 'n' then it reverts to the old behavior and asks the user to select regions for comparison. -+++ *** The new command `ediff-backup' compares a file with its most recent backup using `ediff'. If you specify the name of a backup file, `ediff-backup' compares it with the file of which it is a backup. -+++ ** Etags changes. *** New regular expressions features @@ -3358,7 +2974,6 @@ ** VC Changes -+++ *** The key C-x C-q only changes the read-only state of the buffer (toggle-read-only). It no longer checks files in or out. @@ -3371,7 +2986,6 @@ The function `vc-toggle-read-only' will continue to exist. -+++ *** The new variable `vc-cvs-global-switches' specifies switches that are passed to any CVS command invoked by VC. @@ -3379,10 +2993,8 @@ are inserted before the command name. For example, this allows you to specify a compression level using the `-z#' option for CVS. -+++ *** New backends for Subversion and Meta-CVS. -+++ *** VC-Annotate mode enhancements In VC-Annotate mode, you can now use the following key bindings for @@ -3399,23 +3011,19 @@ ** pcl-cvs changes: -+++ *** In pcl-cvs mode, there is a new `d y' command to view the diffs between the local version of the file and yesterday's head revision in the repository. -+++ *** In pcl-cvs mode, there is a new `d r' command to view the changes anyone has committed to the repository since you last executed `checkout', `update' or `commit'. That means using cvs diff options -rBASE -rHEAD. -+++ ** The new variable `mail-default-directory' specifies `default-directory' for mail buffers. This directory is used for auto-save files of mail buffers. It defaults to "~/". -+++ ** The mode line can indicate new mail in a directory or file. See the documentation of the user option @@ -3423,15 +3031,12 @@ ** Rmail changes: ---- *** Rmail now displays 5-digit message ids in its summary buffer. -+++ *** The new commands rmail-end-of-message and rmail-summary end-of-message, by default bound to `/', go to the end of the current mail message in Rmail and Rmail summary buffers. -+++ *** Support for `movemail' from GNU mailutils was added to Rmail. This version of `movemail' allows to read mail from a wide range of @@ -3442,18 +3047,15 @@ ** Gnus package ---- *** Gnus now includes Sieve and PGG Sieve is a library for managing Sieve scripts. PGG is a library to handle PGP/MIME. ---- *** There are many news features, bug fixes and improvements. See the file GNUS-NEWS or the node "Oort Gnus" in the Gnus manual for details. ---- ** MH-E changes. Upgraded to MH-E version 8.0.3. There have been major changes since @@ -3461,23 +3063,18 @@ ** Calendar changes: -+++ *** The meanings of C-x < and C-x > have been interchanged. < means to scroll backward in time, and > means to scroll forward. -+++ *** You can now use < and >, instead of C-x < and C-x >, to scroll the calendar left or right. -+++ *** There is a new calendar package, icalendar.el, that can be used to convert Emacs diary entries to/from the iCalendar format. -+++ *** The new package cal-html.el writes HTML files with calendar and diary entries. -+++ *** Diary sexp entries can have custom marking in the calendar. Diary sexp functions which only apply to certain days (such as `diary-block' or `diary-cyclic') now take an optional parameter MARK, @@ -3488,45 +3085,37 @@ face. This lets you have different colors or markings for vacations, appointments, paydays or anything else using a sexp. -+++ *** The new function `calendar-goto-day-of-year' (g D) prompts for a year and day number, and moves to that date. Negative day numbers count backward from the end of the year. -+++ *** The new Calendar function `calendar-goto-iso-week' (g w) prompts for a year and a week number, and moves to the first day of that ISO week. ---- *** The new variable `calendar-minimum-window-height' affects the window generated by the function `generate-calendar-window'. ---- *** The functions `holiday-easter-etc' and `holiday-advent' now take optional arguments, in order to only report on the specified holiday rather than all. This makes customization of variables such as `christian-holidays' simpler. ---- *** The function `simple-diary-display' now by default sets a header line. This can be controlled through the variables `diary-header-line-flag' and `diary-header-line-format'. -+++ *** The procedure for activating appointment reminders has changed: use the new function `appt-activate'. The new variable `appt-display-format' controls how reminders are displayed, replacing `appt-issue-message', `appt-visible', and `appt-msg-window'. -+++ *** The new functions `diary-from-outlook', `diary-from-outlook-gnus', and `diary-from-outlook-rmail' can be used to import diary entries from Outlook-format appointments in mail messages. The variable `diary-outlook-formats' can be customized to recognize additional formats. -+++ ** Speedbar changes: *** Speedbar items can now be selected by clicking mouse-1, based on @@ -3570,7 +3159,6 @@ `speedbar-update-speed' and `speedbar-navigating-speed' are also obsolete; use `dframe-update-speed' instead. ---- ** sql changes. *** The variable `sql-product' controls the highlighting of different @@ -3644,12 +3232,10 @@ appropriate `sql-interactive-mode' wrapper for the current setting of `sql-product'. ---- *** sql.el supports the SQLite interpreter--call 'sql-sqlite'. ** FFAP changes: -+++ *** New ffap commands and keybindings: C-x C-r (`ffap-read-only'), @@ -3657,13 +3243,11 @@ C-x 4 r (`ffap-read-only-other-window'), C-x 4 d (`ffap-dired-other-window'), C-x 5 r (`ffap-read-only-other-frame'), C-x 5 d (`ffap-dired-other-frame'). ---- *** FFAP accepts wildcards in a file name by default. C-x C-f passes the file name to `find-file' with non-nil WILDCARDS argument, which visits multiple files, and C-x d passes it to `dired'. ---- ** Changes in Skeleton *** In skeleton.el, `-' marks the `skeleton-point' without interregion interaction. @@ -3680,7 +3264,6 @@ `skeleton-pair-filter-function'. The old names are still available as aliases. ---- ** Hideshow mode changes *** New variable `hs-set-up-overlay' allows customization of the overlay @@ -3692,28 +3275,23 @@ not discard the hidden state of any "internal" blocks; when the parent block is later shown, the internal blocks remain hidden. Default is nil. -+++ ** `hide-ifdef-mode' now uses overlays rather than selective-display to hide its text. This should be mostly transparent but slightly changes the behavior of motion commands like C-e and C-p. ---- ** `partial-completion-mode' now handles partial completion on directory names. ---- ** The type-break package now allows `type-break-file-name' to be nil and if so, doesn't store any data across sessions. This is handy if you don't want the `.type-break' file in your home directory or are annoyed by the need for interaction when you kill Emacs. ---- ** `ps-print' can now print characters from the mule-unicode charsets. Printing text with characters from the mule-unicode-* sets works with `ps-print', provided that you have installed the appropriate BDF fonts. See the file INSTALL for URLs where you can find these fonts. ---- ** New command `strokes-global-set-stroke-string'. This is like `strokes-global-set-stroke', but it allows you to bind the stroke directly to a string to insert. This is convenient for @@ -3721,7 +3299,6 @@ ** Emacs server changes: -+++ *** You can have several Emacs servers on the same machine. % emacs --eval '(setq server-name "foo")' -f server-start & @@ -3729,36 +3306,29 @@ % emacsclient -s foo file1 % emacsclient -s bar file2 -+++ *** The `emacsclient' command understands the options `--eval' and `--display' which tell Emacs respectively to evaluate the given Lisp expression and to use the given display when visiting files. -+++ *** User option `server-mode' can be used to start a server process. ---- ** LDAP support now defaults to ldapsearch from OpenLDAP version 2. -+++ ** You can now disable pc-selection-mode after enabling it. M-x pc-selection-mode behaves like a proper minor mode, and with no argument it toggles the mode. Turning off PC-Selection mode restores the global key bindings that were replaced by turning on the mode. ---- ** `uniquify-strip-common-suffix' tells uniquify to prefer `file|dir1' and `file|dir2' to `file|dir1/subdir' and `file|dir2/subdir'. ---- ** Support for `magic cookie' standout modes has been removed. Emacs still works on terminals that require magic cookies in order to use standout mode, but they can no longer display mode-lines in inverse-video. ---- ** The game `mpuz' is enhanced. `mpuz' now allows the 2nd factor not to have two identical digits. By @@ -3767,13 +3337,10 @@ ** battery.el changes: ---- *** display-battery-mode replaces display-battery. ---- *** battery.el now works on recent versions of OS X. ---- ** calculator.el now has radix grouping mode. To enable this, set `calculator-output-radix' non-nil. In this mode a @@ -3781,19 +3348,14 @@ byte boundaries etc. For more info, see the documentation of the variable `calculator-radix-grouping-mode'. ---- ** fast-lock.el and lazy-lock.el are obsolete. Use jit-lock.el instead. ---- ** iso-acc.el is now obsolete. Use one of the latin input methods instead. ---- ** zone-mode.el is now obsolete. Use dns-mode.el instead. ---- ** cplus-md.el has been deleted. ---- ** Ewoc changes *** The new function `ewoc-delete' deletes specified nodes. @@ -3816,7 +3378,6 @@ ** Locate changes ---- *** By default, reverting the *Locate* buffer now just runs the last `locate' command back over again without offering to update the locate database (which normally only works if you have root privileges). If @@ -3826,7 +3387,6 @@ * Changes in Emacs 22.1 on non-free operating systems -+++ ** The HOME directory defaults to Application Data under the user profile. If you used a previous version of Emacs without setting the HOME @@ -3841,7 +3401,6 @@ shared computers, and the default HOME directory is less likely to be read-only on computers that are administered by someone else. -+++ ** Passing resources on the command line now works on MS Windows. You can use --xrm to pass resource settings to Emacs, overriding any @@ -3852,7 +3411,6 @@ will start up Emacs on an initial frame of 100x20 with red background, irrespective of geometry or background setting on the Windows registry. ---- ** On MS Windows, the "system caret" now follows the cursor. This enables Emacs to work better with programs that need to track the @@ -3862,12 +3420,10 @@ some programs. The new variable w32-use-visible-system-caret allows the caret visibility to be manually toggled. ---- ** Tooltips now work on MS Windows. See the Emacs 21.1 NEWS entry for tooltips for details. ---- ** Images are now supported on MS Windows. PBM and XBM images are supported out of the box. Other image formats @@ -3877,7 +3433,6 @@ zlib, and tiff depends on the version of jpeg that it was compiled against. For additional information, see nt/INSTALL. ---- ** Sound is now supported on MS Windows. WAV format is supported on all versions of Windows, other formats such @@ -3885,19 +3440,16 @@ Windows, or when other software provides hooks into the system level sound support for those formats. ---- ** Different shaped mouse pointers are supported on MS Windows. The mouse pointer changes shape depending on what is under the pointer. ---- ** Pointing devices with more than 3 buttons are now supported on MS Windows. The new variable `w32-pass-extra-mouse-buttons-to-system' controls whether Emacs should handle the extra buttons itself (the default), or pass them to Windows to be handled with system-wide functions. ---- ** Emacs takes note of colors defined in Control Panel on MS-Windows. The Control Panel defines some default colors for applications in much @@ -3908,7 +3460,6 @@ `list-colors-display' shows the list of System color names, in case you wish to use them in other faces. ---- ** On MS Windows NT/W2K/XP, Emacs uses Unicode for clipboard operations. Those systems use Unicode internally, so this allows Emacs to share @@ -3917,7 +3468,6 @@ the clipboard should work correctly for your local language without any customizations. ---- ** Running in a console window in Windows now uses the console size. Previous versions of Emacs erred on the side of having a usable Emacs @@ -3931,46 +3481,37 @@ other than 80x25, you can still manually set w32-use-full-screen-buffer to t. ---- ** On Mac OS, `keyboard-coding-system' changes based on the keyboard script. ---- ** The variable `mac-keyboard-text-encoding' and the constants `kTextEncodingMacRoman', `kTextEncodingISOLatin1', and `kTextEncodingISOLatin2' are obsolete. -+++ ** The variable `mac-command-key-is-meta' is obsolete. Use `mac-command-modifier' and `mac-option-modifier' instead. * Incompatible Lisp Changes in Emacs 22.1 -+++ ** The `read-file-name' function now returns a null string if the user just types RET. -+++ ** The function find-operation-coding-system may be called with a cons (FILENAME . BUFFER) in the second argument if the first argument OPERATION is `insert-file-contents', and thus a function registered in `file-coding-system-alist' is also called with such an argument. ---- ** The variables post-command-idle-hook and post-command-idle-delay have been removed. Use run-with-idle-timer instead. -+++ ** `suppress-keymap' now works by remapping `self-insert-command' to the command `undefined'. (In earlier Emacs versions, it used `substitute-key-definition' to rebind self inserting characters to `undefined'.) -+++ ** Mode line display ignores text properties as well as the :propertize and :eval forms in the value of a variable whose `risky-local-variable' property is nil. ---- The function `comint-send-input' now accepts 3 optional arguments: (comint-send-input &optional no-newline artificial) @@ -3979,23 +3520,18 @@ argument `artificial' to a non-nil value, to prevent Emacs from deleting the part of subprocess output that matches the input. ---- ** Support for Mocklisp has been removed. -+++ ** The variable `memory-full' now remains t until there is no longer a shortage of memory. -+++ ** When Emacs receives a USR1 or USR2 signal, this generates input events: sigusr1 or sigusr2. Use special-event-map to handle these events. -+++ ** A hex or octal escape in a string constant forces the string to be multibyte or unibyte, respectively. -+++ ** The explicit method of creating a display table element by combining a face number and a character code into a numeric glyph code is deprecated. @@ -4009,45 +3545,36 @@ ** General Lisp changes: -+++ *** The function `expt' handles negative exponents differently. The value for `(expt A B)', if both A and B are integers and B is negative, is now a float. For example: (expt 2 -2) => 0.25. -+++ *** 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. -+++ *** `add-to-list' takes an optional third argument, APPEND. If APPEND is non-nil, the new element gets added at the end of the list instead of at the beginning. This change actually occurred in Emacs 21.1, but was not documented then. -+++ *** New function `add-to-ordered-list' is like `add-to-list' but associates a numeric ordering of each element added to the list. -+++ *** New function `copy-tree' makes a copy of a tree. It recursively copies through both CARs and CDRs. -+++ *** New function `delete-dups' deletes `equal' duplicate elements from a list. It modifies the list destructively, like `delete'. Of several `equal' occurrences of an element in the list, the one that's kept is the first one. -+++ *** New function `add-to-history' adds an element to a history list. Lisp packages should use this function to add elements to their @@ -4056,13 +3583,11 @@ If `history-delete-duplicates' is non-nil, it removes duplicates of the new element from the history list it updates. -+++ *** New function `rassq-delete-all'. (rassq-delete-all VALUE ALIST) deletes, from ALIST, each element whose CDR is `eq' to the specified value. -+++ *** The function `number-sequence' makes a list of equally-separated numbers. For instance, (number-sequence 4 9) returns (4 5 6 7 8 9). By @@ -4070,30 +3595,25 @@ separation as the third argument. (number-sequence 1.5 6 2) returns (1.5 3.5 5.5). -+++ *** New variables `most-positive-fixnum' and `most-negative-fixnum'. They hold the largest and smallest possible integer values. -+++ *** Minor change in the function `format'. Some flags that were accepted but not implemented (such as "*") are no longer accepted. -+++ *** Functions `get' and `plist-get' no longer give errors for bad plists. They return nil for a malformed property list or if the list is cyclic. -+++ *** New functions `lax-plist-get' and `lax-plist-put'. They are like `plist-get' and `plist-put', except that they compare the property name using `equal' rather than `eq'. -+++ *** New variable `print-continuous-numbering'. When this is non-nil, successive calls to print functions use a single @@ -4103,21 +3623,18 @@ When you bind `print-continuous-numbering' to t, you should also bind `print-number-table' to nil. -+++ *** New function `macroexpand-all' expands all macros in a form. It is similar to the Common-Lisp function of the same name. One difference is that it guarantees to return the original argument if no expansion is done, which can be tested using `eq'. -+++ *** The function `atan' now accepts an optional second argument. When called with 2 arguments, as in `(atan Y X)', `atan' returns the angle in radians between the vector [X, Y] and the X axis. (This is equivalent to the standard C library function `atan2'.) -+++ *** A function or macro's doc string can now specify the calling pattern. You put this info in the doc string's last line. It should be @@ -4125,7 +3642,6 @@ specify this explicitly, Emacs determines it from the actual argument names. Usually that default is right, but not always. -+++ *** New macro `with-local-quit' temporarily allows quitting. A quit inside the body of `with-local-quit' is caught by the @@ -4135,55 +3651,45 @@ This is for use around potentially blocking or long-running code inside timer functions and `post-command-hook' functions. -+++ *** New macro `define-obsolete-function-alias'. This combines `defalias' and `make-obsolete'. -+++ *** New macro `with-case-table' This executes the body with the case table temporarily set to a given case table. -+++ *** New function `unsafep' determines whether a Lisp form is safe. It returns nil if the given Lisp form can't possibly do anything dangerous; otherwise it returns a reason why the form might be unsafe (calls unknown function, alters global variable, etc.). -+++ *** New macro `eval-at-startup' specifies expressions to evaluate when Emacs starts up. If this is done after startup, it evaluates those expressions immediately. This is useful in packages that can be preloaded. -+++ *** `list-faces-display' takes an optional argument, REGEXP. If it is non-nil, the function lists only faces matching this regexp. -+++ *** New functions `string-or-null-p' and `booleanp'. `string-or-null-p' returns non-nil iff OBJECT is a string or nil. `booleanp' returns non-nil iff OBJECT is t or nil. -+++ *** New hook `command-error-function'. By setting this variable to a function, you can control how the editor command loop shows the user an error message. -+++ -*** `debug-on-entry' accepts primitive functions that are not special forms -now. +*** `debug-on-entry' accepts primitive functions that are not special forms. ** Lisp code indentation features: -+++ *** The `defmacro' form can contain indentation and edebug declarations. These declarations specify how to indent the macro calls in Lisp mode @@ -4202,12 +3708,10 @@ equivalent to writing a `def-edebug-spec' for the macro, but this is cleaner.) ---- *** cl-indent now allows customization of Indentation of backquoted forms. See the new user option `lisp-backquote-indentation'. ---- *** cl-indent now handles indentation of simple and extended `loop' forms. The new user options `lisp-loop-keyword-indentation', @@ -4215,7 +3719,6 @@ be used to customize the indentation of keywords and forms in loop forms. -+++ ** Variable aliases: *** New function: defvaralias ALIAS-VAR BASE-VAR [DOCSTRING] @@ -4237,64 +3740,52 @@ It might be noteworthy that variables aliases work for all kinds of variables, including buffer-local and frame-local variables. -+++ *** The macro `define-obsolete-variable-alias' combines `defvaralias' and `make-obsolete-variable'. ** defcustom changes: -+++ *** The package-version keyword has been added to provide `customize-changed-options' functionality to packages in the future. Developers who make use of this keyword must also update the new variable `customize-package-emacs-version-alist'. -+++ *** The new customization type `float' requires a floating point number. ** String changes: -+++ *** The escape sequence \s is now interpreted as a SPACE character. Exception: In a character constant, if it is followed by a `-' in a character constant (e.g. ?\s-A), it is still interpreted as the super modifier. In strings, \s is always interpreted as a space. -+++ *** A hex escape in a string constant forces the string to be multibyte. -+++ *** An octal escape in a string constant forces the string to be unibyte. -+++ *** `split-string' now includes null substrings in the returned list if the optional argument SEPARATORS is non-nil and there are matches for SEPARATORS at the beginning or end of the string. If SEPARATORS is nil, or if the new optional third argument OMIT-NULLS is non-nil, all empty matches are omitted from the returned list. -+++ *** New function `string-to-multibyte' converts a unibyte string to a multibyte string with the same individual character codes. -+++ *** New function `substring-no-properties' returns a substring without text properties. -+++ *** The new function `assoc-string' replaces `assoc-ignore-case' and `assoc-ignore-representation', which are still available, but have been declared obsolete. -+++ *** New syntax: \uXXXX and \UXXXXXXXX specify Unicode code points in hex. Use "\u0428" to specify a string consisting of CYRILLIC CAPITAL LETTER SHA, or "\U0001D6E2" to specify one consisting of MATHEMATICAL ITALIC CAPITAL ALPHA (the latter is greater than #xFFFF and thus needs the longer syntax). Also available for characters. -+++ ** Displaying warnings to the user. See the functions `warn' and `display-warning', or the Lisp Manual. @@ -4302,7 +3793,6 @@ facility is much better than using `message', since it displays warnings in a separate window. -+++ ** Progress reporters. These provide a simple and uniform way for commands to present @@ -4314,85 +3804,70 @@ ** Buffer positions: -+++ *** Function `compute-motion' now calculates the usable window width if the WIDTH argument is nil. If the TOPOS argument is nil, the usable window height and width is used. -+++ *** The `line-move', `scroll-up', and `scroll-down' functions will now modify the window vscroll to scroll through display rows that are taller that the height of the window, for example in the presence of large images. To disable this feature, bind the new variable `auto-window-vscroll' to nil. -+++ *** The argument to `forward-word', `backward-word' is optional. It defaults to 1. -+++ *** Argument to `forward-to-indentation' and `backward-to-indentation' is optional. It defaults to 1. -+++ *** New function `mouse-on-link-p' tests if a position is in a clickable link. This is the function used by the new `mouse-1-click-follows-link' functionality. -+++ *** New function `line-number-at-pos' returns the line number of a position. It an optional buffer position argument that defaults to point. -+++ *** `field-beginning' and `field-end' take new optional argument, LIMIT. This argument tells them not to search beyond LIMIT. Instead they give up and return LIMIT. -+++ *** Function `pos-visible-in-window-p' now returns the pixel coordinates and partial visibility state of the corresponding row, if the PARTIALLY 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. ** 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. -+++ *** The new function `insert-buffer-substring-as-yank' is like `insert-for-yank' except that it gets the text from another buffer as in `insert-buffer-substring'. -+++ *** The new function `insert-buffer-substring-no-properties' is like `insert-buffer-substring', but removes all text properties from the inserted substring. -+++ *** The new function `filter-buffer-substring' extracts a buffer substring, passes it through a set of filter functions, and returns the filtered substring. Use it instead of `buffer-substring' or @@ -4404,33 +3879,27 @@ `buffer-substring-filters' to remove soft newlines from the copied text. -+++ *** Function `translate-region' accepts also a char-table as TABLE argument. -+++ *** The new translation table `translation-table-for-input' is used for customizing self-insertion. The character to be inserted is translated through it. ---- *** Text clones. The new function `text-clone-create'. Text clones are chunks of text that are kept identical by transparently propagating changes from one clone to the other. ---- *** The function `insert-string' is now obsolete. ** Filling changes. -+++ *** In determining an adaptive fill prefix, Emacs now tries the function in `adaptive-fill-function' _before_ matching the buffer line against `adaptive-fill-regexp' rather than _after_ it. -+++ ** Atomic change groups. To perform some changes in the current buffer "atomically" so that @@ -4490,21 +3959,17 @@ ** Buffer-related changes: ---- *** `list-buffers-noselect' now takes an additional argument, BUFFER-LIST. If it is non-nil, it specifies which buffers to list. -+++ *** `kill-buffer-hook' is now a permanent local. -+++ *** The new function `buffer-local-value' returns the buffer-local binding of VARIABLE (a symbol) in buffer BUFFER. If VARIABLE does not have a buffer-local binding in buffer BUFFER, it returns the default value of VARIABLE instead. ---- *** The function `frame-or-buffer-changed-p' now lets you maintain various status records in parallel. @@ -4524,7 +3989,6 @@ for compatibility, an internal variable which exists only for this purpose. -+++ *** The function `read-buffer' follows the convention for reading from the minibuffer with a default value: if DEF is non-nil, the minibuffer prompt provided in PROMPT is edited to show the default value provided @@ -4532,12 +3996,10 @@ ** Searching and matching changes: -+++ *** New function `looking-back' checks whether a regular expression matches the text before point. Specifying the LIMIT argument bounds how far back the match can start; this is a way to keep it from taking too long. -+++ *** The new variable `search-spaces-regexp' controls how to search for spaces in a regular expression. If it is non-nil, it should be a regular expression, and any series of spaces stands for that regular @@ -4546,36 +4008,29 @@ Spaces inside of constructs such as `[..]' and inside loops such as `*', `+', and `?' are never replaced with `search-spaces-regexp'. -+++ *** New regular expression operators, `\_<' and `\_>'. These match the beginning and end of a symbol. A symbol is a non-empty sequence of either word or symbol constituent characters, as specified by the syntax table. ---- *** rx.el has new corresponding `symbol-start' and `symbol-end' elements. -+++ *** `skip-chars-forward' and `skip-chars-backward' now handle character classes such as `[:alpha:]', along with individual characters and ranges. ---- *** In `replace-match', the replacement text no longer inherits properties from surrounding text. -+++ *** The list returned by `(match-data t)' now has the buffer as a final element, if the last match was on a buffer. `set-match-data' accepts such a list for restoring the match state. -+++ *** Functions `match-data' and `set-match-data' now have an optional argument `reseat'. When non-nil, all markers in the match data list passed to these functions will be reseated to point to nowhere. -+++ *** The default value of `sentence-end' is now defined using the new variable `sentence-end-without-space', which contains such characters that end a sentence without following spaces. @@ -4588,7 +4043,6 @@ ** Undo changes: -+++ *** `buffer-undo-list' allows programmable elements. These elements have the form (apply FUNNAME . ARGS), where FUNNAME is @@ -4599,12 +4053,10 @@ which indicates that the change which took place was limited to the range BEG...END and increased the buffer size by DELTA. -+++ *** If the buffer's undo list for the current command gets longer than `undo-outer-limit', garbage collection empties it. This is to prevent it from using up the available memory and choking Emacs. -+++ ** New `yank-handler' text property can be used to control how previously killed text on the kill ring is reinserted. @@ -4649,70 +4101,56 @@ ** Syntax table changes: -+++ *** The macro `with-syntax-table' no longer copies the syntax table. -+++ *** The new function `syntax-after' returns the syntax code of the character after a specified buffer position, taking account of text properties as well as the character code. -+++ *** `syntax-class' extracts the class of a syntax code (as returned by `syntax-after'). -+++ *** The new function `syntax-ppss' provides an efficient way to find the current syntactic context at point. ** File operation changes: -+++ *** New vars `exec-suffixes' and `load-suffixes' used when searching for an executable or an Emacs Lisp file. -+++ *** The new primitive `set-file-times' sets a file's access and modification times. Magic file name handlers can handle this operation. -+++ *** The new function `file-remote-p' tests a file name and returns non-nil if it specifies a remote file (one that Emacs accesses using its own special methods and not directly through the file system). The value in that case is an identifier for the remote file system. -+++ *** `buffer-auto-save-file-format' is the new name for what was formerly called `auto-save-file-format'. It is now a permanent local. -+++ *** Functions `file-name-sans-extension' and `file-name-extension' now ignore the leading dots in file names, so that file names such as `.emacs' are treated as extensionless. -+++ *** `visited-file-modtime' and `calendar-time-from-absolute' now return a list of two integers, instead of a cons. -+++ *** `file-chase-links' now takes an optional second argument LIMIT which specifies the maximum number of links to chase through. If after that many iterations the file name obtained is still a symbolic link, `file-chase-links' returns it anyway. -+++ *** The new hook `before-save-hook' is invoked by `basic-save-buffer' before saving buffers. This allows packages to perform various final tasks. For example, it can be used by the copyright package to make sure saved files have the current year in any copyright headers. -+++ *** If `buffer-save-without-query' is non-nil in some buffer, `save-some-buffers' will always save that buffer without asking (if it's modified). -+++ *** New function `locate-file' searches for a file in a list of directories. `locate-file' accepts a name of a file to search (a string), and two lists: a list of directories to search in and a list of suffixes to @@ -4725,7 +4163,6 @@ `exec-suffixes' is OS-dependant, so this function will find executables without polluting Lisp code with OS dependencies. ---- *** The precedence of file name handlers has been changed. Instead of choosing the first handler that matches, @@ -4734,7 +4171,6 @@ handler whose (match-beginning 0) is the largest is chosen. In case of ties, the old "first matched" rule applies. -+++ *** A file name handler can declare which operations it handles. You do this by putting an `operation' property on the handler name @@ -4745,81 +4181,66 @@ This is useful for autoloaded handlers, to prevent them from being autoloaded when not really necessary. -+++ *** The function `make-auto-save-file-name' is now handled by file name handlers. This will be exploited for remote files mainly. -+++ *** The function `file-name-completion' accepts an optional argument PREDICATE, and rejects completion candidates that don't satisfy PREDICATE. ** Input changes: -+++ *** The functions `read-event', `read-char', and `read-char-exclusive' have a new optional argument SECONDS. If non-nil, this specifies a maximum time to wait for input, in seconds. If no input arrives after this time elapses, the functions stop waiting and return nil. -+++ *** An interactive specification can now use the code letter `U' to get the up-event that was discarded in case the last key sequence read for a previous `k' or `K' argument was a down-event; otherwise nil is used. -+++ *** The new interactive-specification `G' reads a file name much like `F', but if the input is a directory name (even defaulted), it returns just the directory name. ---- *** Functions `y-or-n-p', `read-char', `read-key-sequence' and the like, that display a prompt but don't use the minibuffer, now display the prompt using the text properties (esp. the face) of the prompt string. -+++ *** (while-no-input BODY...) runs BODY, but only so long as no input arrives. If the user types or clicks anything, BODY stops as if a quit had occurred. `while-no-input' returns the value of BODY, if BODY finishes. It returns nil if BODY was aborted by a quit, and t if BODY was aborted by arrival of input. -+++ *** `recent-keys' now returns the last 300 keys. ** Minibuffer changes: -+++ *** The new function `minibufferp' returns non-nil if its optional buffer argument is a minibuffer. If the argument is omitted, it defaults to the current buffer. -+++ *** New function `minibuffer-selected-window' returns the window which was selected when entering the minibuffer. -+++ *** The `read-file-name' function now takes an additional argument which specifies a predicate which the file name read must satisfy. The new variable `read-file-name-predicate' contains the predicate argument while reading the file name from the minibuffer; the predicate in this variable is used by read-file-name-internal to filter the completion list. ---- *** The new variable `read-file-name-function' can be used by Lisp code to override the built-in `read-file-name' function. -+++ *** The new variable `read-file-name-completion-ignore-case' specifies whether completion ignores case when reading a file name with the `read-file-name' function. -+++ *** The new function `read-directory-name' is for reading a directory name. It is like `read-file-name' except that the defaulting works better for directories, and completion inside it shows only directories. -+++ *** The new variable `history-add-new-input' specifies whether to add new elements in history. If set to nil, minibuffer reading functions don't add new elements to the history list, so it is possible to do this @@ -4827,19 +4248,16 @@ ** Completion changes: -+++ *** The new function `minibuffer-completion-contents' returns the contents of the minibuffer just before point. That is what completion commands operate on. -+++ *** The functions `all-completions' and `try-completion' now accept lists of strings as well as hash-tables additionally to alists, obarrays and functions. Furthermore, the function `test-completion' is now exported to Lisp. The keys in alists and hash tables can be either strings or symbols, which are automatically converted with to strings. -+++ *** The new macro `dynamic-completion-table' supports using functions as a dynamic completion table. @@ -4852,7 +4270,6 @@ minibuffer, FUN will be called in the buffer from which the minibuffer was entered. `dynamic-completion-table' then computes the completion. -+++ *** The new macro `lazy-completion-table' initializes a variable as a lazy completion table. @@ -4865,7 +4282,6 @@ from which the minibuffer was entered. The return value of `lazy-completion-table' must be used to initialize the value of VAR. -+++ ** Enhancements to keymaps. *** New keymaps for typing file names @@ -4984,12 +4400,10 @@ ** Abbrev changes: -+++ *** The new function `copy-abbrev-table' copies an abbrev table. It returns a new abbrev table that is a copy of a given abbrev table. -+++ *** `define-abbrev' now accepts an optional argument SYSTEM-FLAG. If non-nil, this marks the abbrev as a "system" abbrev, which means @@ -4997,7 +4411,6 @@ abbrevs. Major modes that predefine some abbrevs should always specify this flag. -+++ ** Enhancements to process support *** Function `list-processes' now has an optional argument; if non-nil, @@ -5064,7 +4477,6 @@ Previously, it was converted to multibyte by `string-as-multibyte', which was not compatible with the behavior of file reading. -+++ ** Enhanced networking support. *** The new `make-network-process' function makes network connections. @@ -5136,13 +4548,11 @@ ** Using window objects: -+++ *** New function `window-body-height'. This is like `window-height' but does not count the mode line or the header line. -+++ *** You can now make a window as short as one line. A window that is just one line tall does not display either a mode @@ -5151,51 +4561,41 @@ cannot display both a mode line and a header line at once; if the variables call for both, only the mode line actually appears. -+++ *** The new function `window-inside-edges' returns the edges of the actual text portion of the window, not including the scroll bar or divider line, the fringes, the display margins, the header line and the mode line. -+++ *** The new functions `window-pixel-edges' and `window-inside-pixel-edges' return window edges in units of pixels, rather than columns and lines. -+++ *** The new macro `with-selected-window' temporarily switches the selected window without impacting the order of `buffer-list'. It saves and restores the current buffer, too. -+++ *** `select-window' takes an optional second argument NORECORD. This is like `switch-to-buffer'. -+++ *** `save-selected-window' now saves and restores the selected window of every frame. This way, it restores everything that can be changed by calling `select-window'. It also saves and restores the current buffer. -+++ *** `set-window-buffer' has an optional argument KEEP-MARGINS. If non-nil, that says to preserve the window's current margin, fringe, and scroll-bar settings. -+++ *** The new function `window-tree' returns a frame's window tree. -+++ *** The functions `get-lru-window' and `get-largest-window' take an optional argument `dedicated'. If non-nil, those functions do not ignore dedicated windows. -+++ *** The new function `adjust-window-trailing-edge' moves the right or bottom edge of a window. It does not move other window edges. -+++ ** Customizable fringe bitmaps *** New buffer-local variables `fringe-indicator-alist' and @@ -5231,7 +4631,6 @@ ** Other window fringe features: -+++ *** Controlling the default left and right fringe widths. The default left and right fringe widths for all windows of a frame @@ -5251,7 +4650,6 @@ of the currently defined fringe bitmaps. The width of the built-in fringe bitmaps is 8 pixels. -+++ *** Per-window fringe and scrollbar settings **** Windows can now have their own individual fringe widths and @@ -5285,25 +4683,20 @@ ** Redisplay features: -+++ *** `sit-for' can now be called with args (SECONDS &optional NODISP). -+++ *** Iconifying or deiconifying a frame no longer makes sit-for return. -+++ *** New function `redisplay' causes an immediate redisplay if no input is available, equivalent to (sit-for 0). The call (redisplay t) forces an immediate redisplay even if input is pending. -+++ *** New function `force-window-update' can initiate a full redisplay of one or all windows. Normally, this is not needed as changes in window contents are detected automatically. However, certain implicit changes to mode lines, header lines, or display properties may require forcing an explicit window update. -+++ *** (char-displayable-p CHAR) returns non-nil if Emacs ought to be able to display CHAR. More precisely, if the selected frame's fontset has a font to display the character set that CHAR belongs to. @@ -5311,7 +4704,6 @@ Fontsets can specify a font on a per-character basis; when the fontset does that, this value cannot be accurate. -+++ *** You can define multiple overlay arrows via the new variable `overlay-arrow-variable-list'. @@ -5325,7 +4717,6 @@ If either property is not set, the default `overlay-arrow-string' or 'overlay-arrow-fringe-bitmap' will be used. -+++ *** New `line-height' and `line-spacing' properties for newline characters A newline can now have `line-height' and `line-spacing' text or overlay @@ -5366,11 +4757,9 @@ If the `line-spacing' property is a float or cons, the line spacing is calculated as specified above for the `line-height' property. -+++ *** The buffer local `line-spacing' variable can now have a float value, which is used as a height relative to the default frame line height. -+++ *** Enhancements to stretch display properties The display property stretch specification form `(space PROPS)', where @@ -5427,17 +4816,14 @@ The form `(+ EXPR ...)' adds up the value of the expressions. The form `(- EXPR ...)' negates or subtracts the value of the expressions. -+++ *** Normally, the cursor is displayed at the end of any overlay and text property string that may be present at the current window position. The cursor can now be placed on any character of such strings by giving that character a non-nil `cursor' text property. -+++ *** The display space :width and :align-to text properties are now supported on text terminals. -+++ *** Support for displaying image slices **** New display property (slice X Y WIDTH HEIGHT) can be used with @@ -5449,7 +4835,6 @@ **** New function `insert-sliced-image' inserts a given image as a specified number of evenly sized slices (rows x columns). -+++ *** Images can now have an associated image map via the :map property. An image map is an alist where each element has the format (AREA ID PLIST). @@ -5472,7 +4857,6 @@ an event is composed by combining the ID of the hot-spot with the mouse event, e.g. [area4 mouse-1] if the hot-spot's ID is `area4'. -+++ *** The function `find-image' now searches in etc/images/ and etc/. The new variable `image-load-path' is a list of locations in which to search for image files. The default is to search in etc/images, then @@ -5486,80 +4870,62 @@ Note that all images formerly located in the lisp directory have been moved to etc/images. -+++ *** New function `image-load-path-for-library' returns a suitable search path for images relative to library. This function is useful in external packages to save users from having to update `image-load-path'. -+++ *** 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) ---- (man) *** The mouse pointer shape in void text areas (i.e. after the end of a line or below the last line in the buffer) of the text window is now controlled by the new variable `void-text-area-pointer'. The default is to use the `arrow' (non-text) pointer. Other choices are `text' (or nil), `hand', `vdrag', `hdrag', `modeline', and `hourglass'. -+++ *** The mouse pointer shape over an image can now be controlled by the :pointer image property. -+++ *** The mouse pointer shape over ordinary text or images can now be controlled/overridden via the `pointer' text property. ** Mouse event enhancements: -+++ *** Mouse events for clicks on window fringes now specify `left-fringe' or `right-fringe' as the area. -+++ *** All mouse events now include a buffer position regardless of where you clicked. For mouse clicks in window margins and fringes, this is a sensible buffer position corresponding to the surrounding text. -+++ *** `posn-point' now returns buffer position for non-text area events. -+++ *** Function `mouse-set-point' now works for events outside text area. -+++ *** New function `posn-area' returns window area clicked on (nil means text area). -+++ *** Mouse events include actual glyph column and row for all event types and all areas. -+++ *** New function `posn-actual-col-row' returns the actual glyph coordinates of the mouse event position. -+++ *** Mouse events can now indicate an image object clicked on. -+++ *** Mouse events include relative X and Y pixel coordinates relative to the top left corner of the object (image or character) clicked on. -+++ *** Mouse events include the pixel width and height of the object (image or character) clicked on. -+++ *** New functions 'posn-object', 'posn-object-x-y', 'posn-object-width-height'. These return the image or string object of a mouse click, the X and Y @@ -5568,11 +4934,9 @@ ** Text property and overlay changes: -+++ *** Arguments for `remove-overlays' are now optional, so that you can remove all overlays in the buffer with just (remove-overlays). -+++ *** New variable `char-property-alias-alist'. This variable allows you to create alternative names for text @@ -5580,14 +4944,12 @@ although it applies to overlays as well. This variable was introduced to implement the `font-lock-face' property. -+++ *** New function `get-char-property-and-overlay' accepts the same arguments as `get-char-property' and returns a cons whose car is the return value of `get-char-property' called with those arguments and whose cdr is the overlay in which the property was found, or nil if it was found as a text property or not found at all. -+++ *** The new function `remove-list-of-text-properties'. It is like `remove-text-properties' except that it takes a list of @@ -5595,13 +4957,11 @@ ** Face changes -+++ *** The variable `facemenu-unlisted-faces' has been removed. Emacs has a lot more faces than in the past, and nearly all of them needed to be excluded. The new variable `facemenu-listed-faces' lists the faces to include in the face menu. -+++ *** The new face attribute condition `min-colors' can be used to tailor the face color to the number of colors supported by a display, and define the foreground and background colors accordingly so that they @@ -5609,7 +4969,6 @@ is now the preferred method for defining default faces in a way that makes a good use of the capabilities of the display. -+++ *** New function `display-supports-face-attributes-p' can be used to test whether a given set of face attributes is actually displayable. @@ -5617,43 +4976,36 @@ specification language, which can be used to do this test for faces defined with `defface'. ---- *** The special treatment of faces whose names are of the form `fg:COLOR' or `bg:COLOR' has been removed. Lisp programs should use the `defface' facility for defining faces with specific colors, or use the feature of specifying the face attributes :foreground and :background directly in the `face' property instead of using a named face. -+++ *** The first face specification element in a defface can specify `default' instead of frame classification. Then its attributes act as defaults that apply to all the subsequent cases (and can be overridden by them). -+++ *** The variable `face-font-rescale-alist' specifies how much larger (or smaller) font we should use. For instance, if the value is '((SOME-FONTNAME-PATTERN . 1.3)) and a face requests a font of 10 point, we actually use a font of 13 point if the font matches SOME-FONTNAME-PATTERN. ---- *** The function `face-differs-from-default-p' now truly checks whether the given face displays differently from the default face or not (previously it did only a very cursory check). -+++ *** `face-attribute', `face-foreground', `face-background', `face-stipple'. These now accept a new optional argument, INHERIT, which controls how face inheritance is used when determining the value of a face attribute. -+++ *** New functions `face-attribute-relative-p' and `merge-face-attribute' help with handling relative face attributes. -+++ *** The priority of faces in an :inherit attribute face list is reversed. If a face contains an :inherit attribute with a list of faces, earlier @@ -5662,20 +5014,17 @@ so that :inherit face lists operate identically to face lists in text `face' properties. ---- *** On terminals, faces with the :inverse-video attribute are displayed with swapped foreground and background colors even when one of them is not specified. In previous releases of Emacs, if either foreground or background color was unspecified, colors were not swapped. This was inconsistent with the face behavior under X. ---- *** `set-fontset-font', `fontset-info', `fontset-font' now operate on the default fontset if the argument NAME is nil.. ** Font-Lock changes: -+++ *** New special text property `font-lock-face'. This property acts like the `face' property, but it is controlled by @@ -5683,7 +5032,6 @@ property. Instead, it is implemented inside font-core.el, using the new variable `char-property-alias-alist'. -+++ *** font-lock can manage arbitrary text-properties beside `face'. **** the FACENAME returned in `font-lock-keywords' can be a list of the @@ -5693,7 +5041,6 @@ **** `font-lock-extra-managed-props' can be set to make sure those extra properties are automatically cleaned up by font-lock. ---- *** jit-lock obeys a new text-property `jit-lock-defer-multiline'. If a piece of text with that property gets contextually refontified @@ -5720,72 +5067,58 @@ ** Major mode mechanism changes: -+++ *** If new variable `auto-mode-case-fold' is set to a non-nil value, Emacs will perform a second case-insensitive search through -`auto-mode-alist' if the first case-sensitive search fails. -This means that a file FILE.TXT is opened in text-mode, and a file PROG.PY -is opened in python-mode. Note however, that independent of this -setting, *.C files are usually recognized as C++ files. -It also has no effect on systems with case-insensitive file names. - -+++ +`auto-mode-alist' if the first case-sensitive search fails. This +means that a file FILE.TXT is opened in text-mode, and a file +PROG.HTML is opened in html-mode. Note however, that independent of +this setting, *.C files are usually recognized as C++ files. It also +has no effect on systems with case-insensitive file names. + *** New variable `magic-mode-alist' determines major mode for a file by looking at the file contents. It takes precedence over `auto-mode-alist'. -+++ *** An interpreter magic line (if present) takes precedence over the file name when setting the major mode. -+++ *** XML or SGML major mode is selected when file starts with an `<?xml' or `<!DOCTYPE' declaration. -+++ *** Use the new function `run-mode-hooks' to run the major mode's mode hook. -+++ *** All major mode functions should now run the new normal hook `after-change-major-mode-hook', at their very end, after the mode hooks. `run-mode-hooks' does this automatically. ---- *** If a major mode function has a non-nil `no-clone-indirect' property, `clone-indirect-buffer' signals an error if you use it in that buffer. -+++ *** Major modes can define `eldoc-documentation-function' locally to provide Eldoc functionality by some method appropriate to the language. -+++ *** `define-derived-mode' by default creates a new empty abbrev table. It does not copy abbrevs from the parent mode's abbrev table. -+++ *** The new function `run-mode-hooks' and the new macro `delay-mode-hooks' are used by `define-derived-mode' to make sure the mode hook for the parent mode is run at the end of the child mode. ** Minor mode changes: -+++ *** `define-minor-mode' now accepts arbitrary additional keyword arguments and simply passes them to `defcustom', if applicable. -+++ *** `minor-mode-list' now holds a list of minor mode commands. -+++ -*** `define-global-minor-mode'. +*** `define-globalized-minor-mode'. This is a new name for what was formerly called `easy-mmode-define-global-mode'. The old name remains as an alias. ** Command loop changes: -+++ *** The new function `called-interactively-p' does what many people have mistakenly believed `interactive-p' to do: it returns t if the calling function was called through `call-interactively'. @@ -5793,14 +5126,12 @@ Only use this when you cannot solve the problem by adding a new INTERACTIVE argument to the command. -+++ *** The function `commandp' takes an additional optional argument. If it is non-nil, then `commandp' checks for a function that could be called with `call-interactively', and does not return t for keyboard macros. -+++ *** When a command returns, the command loop moves point out from within invisible text, in the same way it moves out from within text covered by an image or composition property. @@ -5811,51 +5142,41 @@ (including `goto-char', ...) whereas this new code is only run after `post-command-hook' and thus does not care about intermediate states. -+++ *** If a command sets `transient-mark-mode' to `only', that enables Transient Mark mode for the following command only. During that following command, the value of `transient-mark-mode' is `identity'. If it is still `identity' at the end of the command, the next return to the command loop changes to nil. -+++ *** Both the variable and the function `disabled-command-hook' have been renamed to `disabled-command-function'. The variable `disabled-command-hook' has been kept as an obsolete alias. -+++ *** `emacsserver' now runs `pre-command-hook' and `post-command-hook' when it receives a request from emacsclient. -+++ *** `current-idle-time' reports how long Emacs has been idle. ** Lisp file loading changes: -+++ *** `load-history' can now have elements of the form (t . FUNNAME), which means FUNNAME was previously defined as an autoload (before the current file redefined it). -+++ *** `load-history' now records (defun . FUNNAME) when a function is defined. For a variable, it records just the variable name. -+++ *** The function `symbol-file' can now search specifically for function, variable or face definitions. -+++ *** `provide' and `featurep' now accept an optional second argument to test/provide subfeatures. Also `provide' now checks `after-load-alist' and runs any code associated with the provided feature. ---- *** The variable `recursive-load-depth-limit' has been deleted. Emacs now signals an error if the same file is loaded with more than 3 levels of nesting. -+++ ** Byte compiler changes: *** The byte compiler now displays the actual line and character @@ -5892,36 +5213,30 @@ *** The local variable `no-byte-compile' in Lisp files is now obeyed. ---- *** When a Lisp file uses CL functions at run-time, compiling the file now issues warnings about these calls, unless the file performs (require 'cl) when loaded. ** Frame operations: -+++ *** New functions `frame-current-scroll-bars' and `window-current-scroll-bars'. These functions return the current locations of the vertical and horizontal scroll bars in a frame or window. -+++ *** The new function `modify-all-frames-parameters' modifies parameters for all (existing and future) frames. -+++ *** The new frame parameter `tty-color-mode' specifies the mode to use for color support on character terminal frames. Its value can be a number of colors to support, or a symbol. See the Emacs Lisp Reference manual for more detailed documentation. -+++ *** When using non-toolkit scroll bars with the default width, the `scroll-bar-width' frame parameter value is nil. ** Mule changes: -+++ *** Already true in Emacs 21.1, but not emphasized clearly enough: Multibyte buffers can now faithfully record all 256 character codes @@ -5937,72 +5252,58 @@ 3. For binary files where format conversion would be pointless and wasteful. ---- *** `set-buffer-file-coding-system' now takes an additional argument, NOMODIFY. If it is non-nil, it means don't mark the buffer modified. -+++ *** The new variable `auto-coding-functions' lets you specify functions to examine a file being visited and deduce the proper coding system for it. (If the coding system is detected incorrectly for a specific file, you can put a `coding:' tags to override it.) -+++ *** The new variable `ascii-case-table' stores the case table for the ascii character set. Language environments (such as Turkish) may alter the case correspondences of ASCII characters. This variable saves the original ASCII case table before any such changes. ---- *** The new function `merge-coding-systems' fills in unspecified aspects of one coding system from another coding system. ---- *** New coding system property `mime-text-unsuitable' indicates that the coding system's `mime-charset' is not suitable for MIME text parts, e.g. utf-16. -+++ *** New function `decode-coding-inserted-region' decodes a region as if it is read from a file without decoding. ---- *** New CCL functions `lookup-character' and `lookup-integer' access hash tables defined by the Lisp function `define-translation-hash-table'. ---- *** New function `quail-find-key' returns a list of keys to type in the current input method to input a character. ** Mode line changes: -+++ *** New function `format-mode-line'. This returns the mode line or header line of the selected (or a specified) window as a string with or without text properties. -+++ *** The new mode-line construct `(:propertize ELT PROPS...)' can be used to add text properties to mode-line elements. -+++ *** The new `%i' and `%I' constructs for `mode-line-format' can be used to display the size of the accessible part of the buffer on the mode line. -+++ *** Mouse-face on mode-line (and header-line) is now supported. ** Menu manipulation changes: ---- *** To manipulate the File menu using easy-menu, you must specify the proper name "file". In previous Emacs versions, you had to specify "files", even though the menu item itself was changed to say "File" several versions ago. ---- *** The dummy function keys made by easy-menu are now always lower case. If you specify the menu item name "Ada", for instance, it uses `ada' as the "key" bound by that key binding. @@ -6010,7 +5311,6 @@ This is relevant only if Lisp code looks for the bindings that were made with easy-menu. ---- *** `easy-menu-define' now allows you to use nil for the symbol name if you don't need to give the menu a name. If you install the menu into other keymaps right away (MAPS is non-nil), it usually doesn't @@ -6018,30 +5318,24 @@ ** Operating system access: -+++ *** The new primitive `get-internal-run-time' returns the processor run time used by Emacs since start-up. -+++ *** Functions `user-uid' and `user-real-uid' now return floats if the user UID doesn't fit in a Lisp integer. Function `user-full-name' accepts a float as UID parameter. -+++ *** New function `locale-info' accesses locale information. ---- *** On MS Windows, locale-coding-system is used to interact with the OS. The Windows specific variable w32-system-coding-system, which was formerly used for that purpose is now an alias for locale-coding-system. ---- *** New function `redirect-debugging-output' can be used to redirect debugging output on the stderr file handle to a file. ** Miscellaneous: -+++ *** A number of hooks have been renamed to better follow the conventions: `find-file-hooks' to `find-file-hook', @@ -6054,50 +5348,41 @@ In each case the old name remains as an alias for the moment. -+++ *** Variable `local-write-file-hooks' is marked obsolete. Use the LOCAL arg of `add-hook'. ---- *** New function `x-send-client-message' sends a client message when running under X. ** GC changes: -+++ *** New variable `gc-cons-percentage' automatically grows the GC cons threshold as the heap size increases. -+++ *** New variables `gc-elapsed' and `gcs-done' provide extra information on garbage collection. -+++ *** The normal hook `post-gc-hook' is run at the end of garbage collection. The hook is run with GC inhibited, so use it with care. * New Packages for Lisp Programming in Emacs 22.1 -+++ ** The new library button.el implements simple and fast `clickable buttons' in Emacs buffers. Buttons are much lighter-weight than the `widgets' implemented by widget.el, and can be used by lisp code that doesn't require the full power of widgets. Emacs uses buttons for such things as help and apropos buffers. ---- ** The new library tree-widget.el provides a widget to display a set of hierarchical data as an outline. For example, the tree-widget is well suited to display a hierarchy of directories and files. -+++ ** The new library bindat.el provides functions to unpack and pack binary data structures, such as network packets, to and from Lisp data structures. ---- ** master-mode.el implements a minor mode for scrolling a slave buffer without leaving your current buffer, the master buffer. @@ -6118,12 +5403,10 @@ (function (lambda () (master-set-slave sql-buffer)))) -+++ ** The new library benchmark.el does timing measurements on Lisp code. This includes measuring garbage collection time. -+++ ** The new library testcover.el does test coverage checking. This is so you can tell whether you've tested all paths in your Lisp
--- a/etc/ORDERS Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/ORDERS Tue Apr 24 21:56:25 2007 +0000 @@ -8,6 +8,6 @@ Your purchases will help support further development of Emacs and other free software programs. -You can also make tax-deductable donations to the Free Software +You can also make tax-deductible donations to the Free Software Foundation, a not-for-profit organization (assuming you pay US taxes) - see <http://www.gnu.org/help/donate.html>.
--- a/etc/PROBLEMS Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/PROBLEMS Tue Apr 24 21:56:25 2007 +0000 @@ -217,15 +217,15 @@ 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. -** Emacs compiled with Gtk+ crashes on startup on cygwin. +** Emacs compiled with Gtk+ crashes on startup on Cygwin. A typical error message is ***MEMORY-ERROR***: emacs[5172]: GSlice: failed to allocate 504 bytes (alignment: 512): Function not implemented Emacs supplies its own malloc, but glib (part of Gtk+) calls memalign and on -cygwin that becomes the cygwin supplied memalign. As malloc is not the -cygwin malloc, the cygwin memalign always returns ENOSYS. A fix for this +Cygwin, that becomes the Cygwin supplied memalign. As malloc is not the +Cygwin malloc, the Cygwin memalign always returns ENOSYS. A fix for this problem would be welcome. * General runtime problems @@ -390,9 +390,13 @@ *** Emacs does not know your host's fully-qualified domain name. +For example, (system-name) returns some variation on +"localhost.localdomain", rather the name you were expecting. + You need to configure your machine with a fully qualified domain name, -either in /etc/hosts, /etc/hostname, the NIS, or wherever your system -calls for specifying this. +(i.e. a name with at least one ".") either in /etc/hosts, +/etc/hostname, the NIS, or wherever your system calls for specifying +this. If you cannot fix the configuration, you can set the Lisp variable mail-host-address to the value you want. @@ -1202,7 +1206,7 @@ emulation for which it is set up. Only the Motif 1.2 emulation seems to be stable enough in LessTif. -Lesstif 0.92-17's Motif 1.2 emulation seems to work okay on FreeBSD. +LessTif 0.92-17's Motif 1.2 emulation seems to work okay on FreeBSD. On GNU/Linux systems, lesstif-0.92.6 configured with "./configure --enable-build-12 --enable-default-12" is reported to be the most successful. The binary GNU/Linux package @@ -1299,7 +1303,7 @@ improves performance dramatically, at the slight expense of correctness of the X protocol. lbxproxy acheives the performance gain by grouping several X requests in one TCP packet and sending them off together, - instead of requiring a round-trip for each X request in a seperate + instead of requiring a round-trip for each X request in a separate packet. The switches that seem to work best for emacs are: -noatomsfile -nowinattr -cheaterrors -cheatevents Note that the -nograbcmap option is known to cause problems. @@ -1405,7 +1409,7 @@ in your site-init.el file. -* Runtime problems on character termunals +* Runtime problems on character terminals ** Emacs spontaneously displays "I-search: " at the bottom of the screen. @@ -2356,7 +2360,7 @@ *** Building Emacs over NFS fails with ``Text file busy''. This was reported to happen when building Emacs on a GNU/Linux system -(RedHat Linux 6.2) using a build directory automounted from Solaris +(Red Hat Linux 6.2) using a build directory automounted from Solaris (SunOS 5.6) file server, but it might not be limited to that configuration alone. Presumably, the NFS server doesn't commit the files' data to disk quickly enough, and the Emacs executable file is @@ -2443,17 +2447,17 @@ (using the location of the 32-bit X libraries on your system). -*** Building the Cygwin port for MS-Windows can fail with some GCC version +*** Building the Cygwin port for MS-Windows can fail with some GCC versions Building Emacs 22 with Cygwin builds of GCC 3.4.4-1 and 3.4.4-2 is reported to either fail or cause Emacs to segfault at run time. In addition, the Cygwin GCC 3.4.4-2 has problems with generating debug info. Cygwin users are advised not to use these versions of GCC for -compiling Emacs. GCC versions 4.0.3, 4.1.1, and 4.1.2 reportedly -build a working Cygwin binary of Emacs, so we recommend these GCC -versions. Note that these three versions of GCC, 4.0.3, 4.1.1, and -4.1.2, are currently the _only_ versions known to succeed in building -Emacs (as of v22.1). +compiling Emacs. GCC versions 4.0.3, 4.0.4, 4.1.1, and 4.1.2 +reportedly build a working Cygwin binary of Emacs, so we recommend +these GCC versions. Note that these versions of GCC, 4.0.3, 4.0.4, +4.1.1, and 4.1.2, are currently the _only_ versions known to succeed +in building Emacs (as of v22.1). *** Building the native MS-Windows port with Cygwin GCC can fail. @@ -2604,7 +2608,7 @@ *** Linux: Segfault during `make bootstrap' under certain recent versions of the Linux kernel. -With certain recent Linux kernels (like the one of Redhat Fedora Core +With certain recent Linux kernels (like the one of Red Hat Fedora Core 1 and newer), the new "Exec-shield" functionality is enabled by default, which creates a different memory layout that breaks the emacs dumper. Emacs tries to handle this at build time, but if the workaround used fails, these
--- a/etc/SERVICE Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/SERVICE Tue Apr 24 21:56:25 2007 +0000 @@ -1,1378 +1,10 @@ --*- text -*- GNU Service Directory --------------------- -See the end of file for copyright information. - -This is a list of people who have asked to be listed as offering -support services for GNU software, including GNU Emacs, for a fee -or in some cases at no charge. - -The information comes from the people who asked to be listed; -we do not include any information we know to be false, but we -cannot check out any of the information; we are transmitting it to -you as it was given to us and do not promise it is correct. -Also, this is not an endorsement of the people listed here. -We have no opinions and usually no information about the abilities of -any specific person. We provide this list to enable you to contact -service providers and decide for yourself whether to hire one. - -Before FSF will list your name in the GNU Service Directory, we ask -that you agree informally to the following terms: - -1. You will not restrict (except by copyleft) the use or distribution -of any software, documentation, or other technical information you -supply anyone in the course of modifying, extending, or supporting GNU -software. This includes any information specifically designed to -ameliorate the use of GNU software. - -2. You will not take advantage of contact made through the Service -Directory to advertise an unrelated business (e.g., sales of -non-GNU-related proprietary information). You may spontaneously -mention your availability for general consulting, but you should not -promote a specific unrelated business unless the client asks. - -Please include some indication of your rates, because otherwise users -have nothing to go by. Please put each e-mail address inside "<>". -Please put nothing else inside "<>". Thanks! - -For a current copy of this directory, or to have yourself listed, ask: - service@gnu.org - -** Please keep the entries in this file alphabetical ** -^_ -Aaronsen Group, Ltd. <gnu@aaronsen.com> -600 Grant St. -Suite 5345 -Pittsburgh, PA 15219 US -+1 412 391 6000 voice -+1 412 361 5991 fax -http://www.aaronsen.com/gnu - -The Aaronsen Group provides several levels of service in the free software -arena, from simple configuration and installation to large extensions and -new development. We specialize in unique applications, but have the -experience to handle all manner of prospects, from database-backed -web-sites to high-end multiprocessor clusters. - -Our service area covers the US, with key offices in Pittsburgh, PA; San -Jose, CA; and New York, NY. - -We are available for both hourly work (at $300 per hour, some qualified -discounts are available) and fixed-price projects. Work is done on the -client site, at our offices, or remote via Internet or telephone -connection - -Updated: 2001-05-08 -^_ -Alcôve ------- - -Alcôve, Centre Paris Pleyel, 153 bld Anatole France -93200 Saint-Denis France - -Email: <infos@alcove.fr> - -Web: http://www.alcove.com -Tél.: +33 1 49 22 68 00 -Fax: +33 1 49 22 68 01 - -Founded in 1996, Alcôve's main purpose is to promote and support the -use of GNU/Linux and OSS on the European market. -Expertise in OSS innovation is the foundation of all Alcôve's -activities. -We provide key accounts and leading businesses in the field of IT with : - - Consultancy - Engineering - Training - Support - Technical watching brief - OSS Certification - Validation - Guarantee - Drivers for the linux kernel - Company directory and unified messaging - Linux Firewall Security Package - -Keys: support services, consulting, open source software, GNU/Linux, -Apache, Perl, GNU, Samba, Zope, Imp, OpenLDAP - -Average daily rate, depending on the job : 1000 euros. - -Updated: 2001-06-26 -^_ -Allegro Consultants, Inc. <info@gccsupport.com> -1072 De Anza Blvd., Suite B101 -San Jose, CA 95129-3532 -USA -+1 408 252-2330 voice -+1 408 252-2334 fax -http://www.gccsupport.com - -Allegro Consultants, Inc, in association with DIS International, is -now offering annual support contracts covering the GNU Compiler -Collection and related tools, including the GCC C and C++ compilers -for MPE/iX. - -The free GCC C and C++ compilers have been available on MPE/iX for -several years now, and are used for mission-critical applications by -many organizations including Hewlett-Packard. Until now, assistance -was available only from Mark Klein of DIS on a limited, voluntary -basis. Mark is the person who originally ported GCC to the HP e3000, -and he continues to maintain the software and port new versions. - -Support contracts start at $1,995.00/year for an organization -(unlimited number of HP e3000 computer systems) with two designated -callers. Additional options are available for large organizations who -need to designate more than two authorized callers, or who want the -additional security of 24x7 coverage. - -Updated: 2001-06-12 -^_ -Amazonia Computing - -<rick@viclink.com> -http://www.viclink.com/~rick - -1981 NW Thomsen Lane -McMinnville, OR 97128 -503-474-0572 - -I provide development and technical support for free software -and open source systems including embedded programming, GNU/Linux, the -GNU development suite.. - -I have over 10 years experience building and maintaining systems ranging -from medical patient monitoring systems to Linux device drivers for -custom PCI plug in cards. - -Rates range from $75.00/hr to $90/hr USD. Will work for a lower rate -if in involves working in either Brazil, Vietnam, Indonesia, or Cuba. -I am also willing to work on fixed price contracts. - -Updated: 2001-05-08 -^_ -Dipl.-Inform. Gerd Aschemann <gerd@aschemann.net> -Osannstr. 49 -D-64285 Darmstadt -Tel.: +49 173 3264070 -http://www.aschemann.net/ - -- Consultant - + Unix Network and System Administration - + Distributed Systems and Middleware Infrastructures -- former System Administrator (UNIX and NT) at CS Department, TU Darmstadt, Germany -- 20 years working in the CS field, System administration on different platforms -- 13 years with UNIX/Networking/FreeWare/GNU/X11 -- 10 years courses on Operating Systems and Distributed Systems -- Lectures on System and Network Administration -- Platforms: Solaris, GNU/Linux, SunOS, Ultrix, HP-UX, Digital Unix, AIX, SCO, FreeBSDs -- Distributed Platforms and Information Systems (CORBA, WWW, Java, SOAP) - -Rates are at 180,-- DM (~85 US$) per hour minimum, depending on the job. -I am willing to travel for sufficiently large jobs. - -Updated: 2001-05-09 -^_ -Baker Research, Ltd. -P. O. Box 10036, Alexandria, VA 22310 -Phone: (703) 960-9500 (Voice) - (703) 960-8700 (Fax) -Web: http://www.baker-research.com -email: <solutions@baker-research.com> -Rate: $75.00/hr to $150.00/hr, or fixed-price projects. - -Services: - - --Customization of systems for user needs - --Software product evaluation and recommendation - --Full-lifecycle software development - --Programming (C/C++, tcl/tk, bash, perl) - --Custom backup and archival systems - --GNU/Linux system installation, configuration, and management - --Cluster systems support - -Installation, configuration, and management - -MPI and Myrinet support - --Data acquisition, management, visualization, and archival - -Updated: 2001-05-11 -^_ -Don Barry, Ph.D. <don@astro.cornell.edu> -Ithaca, NY - -Astrophysicist with extensive and varied hacker background. Substantial -expertise in mathematical modeling, instrument interface, low-level and -high-level hardware control, statistical analysis, automated/mathematical -typesetting. Also fluent in opto/electro/mechanical design. I try to find -solutions using free software when possible and specialize in GNU/Linux -platforms. Degrees also in chemistry and mathematics. - -Speak: C, APL, Fortran, J, Perl, Emacs Lisp, IDL, variety of machine -languages from CDC CYBER (!) to x86 families, TeX/LaTeX, sendmail, and -quite a few others. Experience on platforms from PDP to present. - -Rates: $75--$150 per hour + travel (if required) depending on the needs of -the project, the level of support and availability required, and its -interest to me. - -Services: consulting, design, porting, lecturing, support, project definition, -system implementation. - -Updated: 2001-05-09 -^_ -James Craig Burley -97 Arrowhead Circle -Ashland, MA 01721 -Email: <craig@jcb-sc.com> -Web: http://world.std.com/~burley/ - -Expertise (mainly Development and Maintenance): - Compilers for Imperative Languages (author of GNU Fortran, aka g77) - Operating System Kernels - Tools/Utilities - Microcode (mainly VLIW) and Assembler - Software-Development-System Architecture (including APIs, IDEs) - Debugging - Technical Writing (Manager of Documentation) - -Experience: - Programming Languages C, PL/I, Fortran, PostScript - Operating Systems Unix, GNU/Linux, Solaris, HP-UX, VAX/VMS, PRIMOS, - MIT ITS, TOPS-10, TSS/8, IBM MVS - Assembler/Microcode Languages for Sun SPARC, HP-PA RISC, Numerix VLIWs, - VAX, Pr1me, IBM 360, PDP-10, PDP-8 - Scripting Languages (many) - APIs (many) - -Rate: $180/hour - -Updated: 2001-05-08 -^_ - C2V Michel Delval <mfd@c2v.com> - 82 bd Haussmann Jean-Alain Le Borgne <jalb@c2v.com> - 75008 Paris - France - Tel (33 1) 40.08.07.07 - Fax (33 1) 43.87.35.99 - http://www.c2v.com/freesoft.htm - e-mail: <consult@c2v.com> - - Services: we offer source or source+binary distribution, - installation, training, maintenance, technical support, - consulting, specific development and followup on the GNU software - development environment: Emacs, gcc/g++, binutils, gas, gdb. - - Porting on new platforms, and professionally developing software - with the GNU tools in the Unix/X11 environment since they were - first available. - - Experience: GNU C Compilation toolchain for the SGS-Thomson D950 - and ST20 DSP chips. - - GNU C compilation toolchain (cross-compiler, compiler, linker, - assembler, debugger) for SparcV7 ERC32 based space systems - (Sextant Avionique / Alcatel Espace). - - Feasability study, analysis and prototyping of a complete - compilation toolchain based on the GNU programming tools for the - CSEM RISC microprocessor family. - - Rates: from 5000 FF/day to 750 000 FF/year, 40% discount for - educational institutions, add taxes and expenses. Ask for list. - -Updated: 2001-05-09 -^_ -Cendio Systems AB <info@cendio.com> -Teknikringen 3 -SE-583 30 Linkoping -SWEDEN -+46 13 21 46 00 voice -+46 13 21 47 00 fax -http://www.cendio.com/ <international site> - -Cendio Systems develops, implements and integrates solutions based on -Open Source Software. We also develop and market the Fuego -Firewall(TM), an award winning and easy-to-use firewall, based on -GNU/Linux. - -We offer professional services, including support, maintenance, -integration and development in the following areas: - -* Embedded Linux -* Client/Server Solutions GNU/Linux/BSD -* Professional Training GNU/Linux, certifications from SAIR Linux/GNU -* Open Source Strategy -* Development/Adaptation of free software - -Cendio Systems have deep roots in Linkoping University, and was -founded 1992 as Signum Support. Our headquarters resides in Mjardevi -Science Park in Linkoping and we have an office in Stockholm. We are -currently about fifty employees at both locations. - -Cendio Systems won the Lotus 'Tux Award' at LotusSphere 2000 for "the -partner who best exemplifies a unique dedication to Lotus and Linux -technologies and has successfully executed their vision in the -marketplace." - -Cendio Systems have the following certifications and memberships: - -Association of Computing Machinery, Professional Membership -COMPAQ System Specialist (Intel and Alpha Systems) -Embedded Linux Consortium, Founding Member -IBM Value Added Reseller (Netfinity) -IBM Solution Provider (RS/6000) -SAIR GNU/Linux, Accredited Center for education -SGI Systems Integrator - -Rates: Please request our price list. - -Updated: 2001-05-09 -^_ -Alex Cherepanov -111 McDade Blvd, Apt. A-205, Folsom, PA 19033 -Phone: 610 529 3475 -email: <alexcher@erols.com> -Web: http://users.erols.com/alexcher/ - -Services: Support and maintenance of free PostScript and PDF -software including Ghostscript, ps2pdf, a2ps, tiff2ps, pdfopt. -General imaging, font, and PDL consulting. - -Experience: 12 years experience in software engineering, 5 years -in PostScript and digital color printing. - -Rates: $50-75/hour, depending on contract length. - -Updated: 2001-05-22 -^_ -CodeSourcery, LLC <info@codesourcery.com> -9978 Granite Point Ct -Granite Bay, CA 95746 -(650) 364-5360 -http://www.codesourcery.com - -CodeSourcery specializes in customization of, enhancements to, and -support for all GNU software. We have particular experience in the -field of programming tools, and have been responsible for many -features in the GNU C and C++ compilers including the implementation -of member templates and type-based alias analysis. Mark Mitchell, one -of our co-founders, is a co-maintainer of the GNU Compiler Collection. - -We also have experience with GNU tools ranging from emacs to binutils -to gdb to autoconf, and are willing to work on any and all free -software projects. - -Please see our web page at www.codesourcery.com for more information -about our products, services, and prices. - -Updated: 2001-05-16 -^_ -Stuart Cracraft <cracraft@gnu.org> -P.O. Box 6061 -Laguna Niguel, CA, 92607, USA -Phone: 714-347-8106 (prefer email) -Rate: negotiable - -Consultation topics: -Entire GNU suite - porting, compilation, installation, -user-training, administrator-training. - -Method: via any combination of telephone, dialup, Internet, in-person, email. - -Experience: supporting GNU since project inception, original port of -GNU Emacs to Sun Solaris, original author of GNU Emacs online tutorial. -Expertise in C, Emacs Lisp, Perl, Expect, Oracle, Informix, SunOS, Solaris, -NIS, NFS, system-monitoring via paging. Unix System and Database -administration or development. - -Updated: 2000-12-13 -^_ -Bruce Dawson - <jbd@codemeta.com> -CodeMeta, Inc. -Manchester, NH USA -800-354-2209 - -Specializing in GNU tools such as CVS, gnats, bash, gawk, fileutils... - -Services: - - o 800 phone support. - - o Modification and development. - - o Training. - -Rate: Fixed rate deliverables or $110/hour for hourly work. - -http://www.codemeta.com - -Updated: 2001-05-09 -^_ -Martin Deen Consulting -<sunra@mail.hypermart.net> -426 Marietta St. #503 -Atlanta, GA 30313 -(V) 404-931-5392 -http://sunra.hypermart.net - -Consultant with many years supporting the GNU/Linux environment and -working with Open Source solutions. Available for hourly and per -project work. Hourly rates start at $100/hr. Work can be done on -client site, offsite, or remotely via Internet. Can take engagements -in Atlanta with little notice, call for arangements elsewhere. - -Updated: 2001-04-20 -^_ -DSS Distributed Systems Software, Inc. -3253 Georgia St. <dss@dss.bc.ca> -Richmond, British Columbia V7E 2R4 http://www.dss.bc.ca -CANADA (604) 270-9559 - -GNU-related services: - We specialize in support for GCC (mainly C and C++), including porting, - retargeting, and customizing. - Also, GNU and other free software that falls within our areas of expertise. - -Expertise: - DSS provides software design, implementation, and consulting services. - - Distributed systems: - o Client/Server architectures, computer networking, communication -protocols - o Directory systems, including X.500 and LDAP - o High-performance and special-purpose distributed systems and databases: - scalability, reliability, availability, transactions - o Computer systems performance analysis - - Compilers, translators, and interpreters, including "small" and - special-purpose languages - -Rates: - Consulting rates are $65-$200 USD per hour, plus - applicable taxes. Fixed-cost projects are also possible. - -Updated: 2001-05-10 -^_ -John W. Eaton -<jwe@gnu.org>, <jwe@net66.com> - -Experience: Original author and current maintainer of GNU Octave - (http://www.octave.org). - - Derivatives of the Unix man utility that I wrote in 1990 - are currently distributed with several GNU/Linux systems. - - Improved GNU Make's support for VPATH and object - libraries on VMS systems. - - Various other enhancements and bug fixes for other free - software tools. - - I have more than 18 years experience programming various - languages and systems, more than 13 years as a user and - system mangler of Unix systems, including Ultrix, SunOS, - AIX, HP/UX, BSD, IRIX, Digital Unix, and GNU/Linux. - Long-time user of GNU tools on all these platforms. - -Programming: Octave, Matlab, C++, C, Fortran, Emacs Lisp, TeX/LaTeX, - AWK, M4, Autoconf, Make, Lex & YACC, Unix shell - programming, etc. - -Services: Anything related to programming and extending Octave. - Porting, installation, and customization of GNU/Linux and - GNU tools. Unix system administration. - -Rates: $100/hour + travel and expenses (if required). Will - consider travel for short periods and/or sufficiently - interesting jobs, but prefer to work via the net or email. - Lower rates for non-profits. - -Updated: 2001-05-14 -^_ - Echo Labs <echo@iinet.net.au> - 29 Weld St, http://www.iinet.net.au/~echo/ - Nedlands, WA 6009 - Perth, Australia - +61 (0) 41 356 0008 - - Echo Labs is a software consultancy that also provides support and - development skills. Specialising in GNU software, particularly Tcl/Tk - and Linux. We can deliver systems at a fraction of the cost of those - based on more traditional technologies. Internet/intranet, telephony - and data communications solutions, for all platforms are undertaken. - GUI front-ends done quickly in rapid development process. - - While typically involved in engineering and technical areas, any - GNU/Open Source software will be supported. - - For further details see: http://www.iinet.net.au/~echo/ - - Experience: 15+ years C/Unix, Sun, SCO, GNU/Linux, Win/NT. - Secure WWW servers (Apache SSL), Ecommerce solutions. - Systems programming, device drivers, hardware interfacing. - GNU tools/utilities, telephony and Embedded & realtime - systems. Communications protocols and implementation. - - Degrees: BAppSc (CS) (Distinction), Curtin University, Perth - - Rates: AUS $50-75/hr neg. - -Updated: 2001-05-09 -^_ -Noah Friedman <friedman@splode.com> -6114 La Salle Ave. #739 -Oakland, CA 94611-2802 - -Author of several Emacs Lisp packages and parts of Emacs, as well as -numerous network and unix system utilities. Co-maintained GNU Texinfo and -Autoconf for a couple of years. Experienced unix systems engineer. -FSF employee Feb 1991--Sep 1994. - -I can perform installation, porting, and enhancement of all GNU software -and any other free software, especially for Linux/GNU systems; design -high-capacity hardware-redundant servers for production environments; -provide consulting on the use of version control management with CVS; and I -am willing to provide handholding for shell programming and Emacs Lisp -development. - -Fees negotiable, averaging $100-$150/hour. I can work in the California -bay area or anywhere accessible on the Internet. For larger jobs I may be -willing to travel. - -Updated: 2001-05-08 -^_ -Brian Gough <bjg@network-theory.co.uk> -Network Theory Limited http://www.network-theory.co.uk/ -Bristol, United Kingdom - -Tel: 0117 3179309 (in UK), +44 117 3179309 (outside UK) - -I provide support and development of free software on a contract -basis. I can work at your site, over the internet, or by phone/email. -I have extensive experience with many free software packages, -particularly for web development. - -I can also provide specialized consulting in numerical software -development for scientific and quantitative applications. - -Rate: 40-60 pounds/hour, depending on location. - -Updated: 2001-09-05 -^_ -Ronald F. Guilmette <rfg@monkeys.com> -RG Consulting -1751 East Roseville Pkwy. #1828 -Roseville, CA 95661 -Tel: +1 916 786 7945 -FAX: +1 916 786 5311 - -Services: Development & porting of GNU software development tools. - -GNU Contributions: - Invented, designed, and implemented the protoize and - unprotoize tools supplied with GCC2. - - Designed and developed all code to support the generation - of Dwarf symbolic debugging information for System V Release - 4 in GCC2. - - Performed original port of GNU compilers to SVr4 system. - - Finished port of GNU compilers to Intel i860 RISC - processor. - -Experience: 13+ years UNIX systems experience, all working on compilers - and related tools. - - 7+ years working professionally on GCC, G++, and GDB under - contract to various firms including the Microelectronics - and Computer Technology Corporation (MCC), Data General (DG), - Network Computing Devices (NCD), and Intel Corp. - -Other qualifications: - Developer of the RoadTest (tm) C and C++ commercial - compiler test suites. - - Former vice-chairman of UNIX International Programming - Languages Special Interest Group (UI/PLSIG). - - Bachelor's and a Master's degrees, both in Computer Science. - -Rates: Variable depending upon contract duration. Call for quote. - -Updated: 2000-12-13 -^_ -IDEALX -15-17 avenue de ségur -75007 Paris -France - -Tel - +33144420000 Fax - +33144420001 -http://www.IDEALX.com, http://www.IDEALX.org - -IDEALX is involved in the development of Open Source solutions,and -ensures their deployment and maintenance. -Development -Technical support -Technology watch -Consulting -Engineering -Training - -Rates - Variable - -Updated: 2000-12-13 -^_ -Ehud Karni <kehud@iname.com> -Israel - -Support of Emacs & Emacs lisp, GNU/Linux, Cygwin. - -Fee: $75/hour. - -Updated: 2001-05-09 -^_ -Bradley M. Kuhn -<bkuhn@ebb.org> -http://www.ebb.org/bkuhn - -I am available for part-time system administration, software development -and training. I have extensive experience with system administration of -GNU/Linux systems, and Free Software development. I have also taught -courses in C++ and Perl. As an employee of the FSF, I have a unique -perspective on the free software community. - -Please visit my homepage for more information on my background and skills. -My resume is also available there. - -I am available for both 1099 and W2 on-site contracting in the Boston, MA, -USA metropolitan area, as well as remote consulting via dialup or Internet -connection anywhere in the USA. I am not interested in relocation. -However, temporary (two week maximum) jobs with paid expenses at other -locations will be considered. - -My rate varies greatly (between $25-$60/hour) depending on the -circumstances. Rates for non-profit organizations will be on the lower end -of the spectrum, if I support your cause. - -Updated: 2001-06-14 -^_ -Paul Gillingwater, CEO -CSO Lanifex Unternehmensberatungs & Softwareentwicklung GmbH -Praterstrasse 60 -A-1020 Vienna, Austria -http://www.lanifex.com -Phone.: +43/1/2699293-21 -Fax.: +43/1/2699293-13 -Mobile.: +43/699/19223085 - - CSO Lanifex is an effective team of software developers who are -actively implementing Web-based database systems, using a variety of -Open Source technologies, including GNU/Linux, PHP, MySQL, Perl and -especially the Midgard Project. - - Our speciality is Web development with content management, especially -for larger Web portals and e-Commerce systems. We're very much -in-favour of Free (as in speech) software, and have used it for almost -all of our customers. - - We have eight staff, with a variety of skills, including RHCE, PHP, -Perl, C, Java, SQL, network design, security consulting, Internet -routing, UMS etc. The CEO personally has over 20 years of experience -with UNIX, and more than 10 years experience with a variety of -Internet technologies. For a more complete list, please refer to our -Web site listed below. - -For further details see: http://www.lanifex.com - -Rates: ATS 1.500/hr neg. - -Updated: 2000-12-19 -^_ -Greg Lehey -LEMIS -PO Box 460 -Echunga SA 5153 -Australia - -Phone: +61-8-8388-8286 -Fax: +61-8-8388-8725 -Mobile: +61-418-838-708 -Mail <grog@lemis.com> - -Services: Supply, porting, installation, consultation on all GNU -products. - -Experience: 25 years OS and compiler experience, ports of most GNU -products. Author of ported software CD-ROM for UNIX System V.4.2, -"Porting UNIX Software" (O'Reilly), "Installing and Running FreeBSD" -and "The Complete FreeBSD" (both Walnut Creek). - -Rates: Choice of AUD 300 per hour or hotline rates AUD 6 per minute. -Outside Australia, $US 180 per hour or $US 3.50 per minute. Quick, -well prepared questions by mail may be free. - -Updated: 2001-05-09 -^_ -Alan Lehotsky <apl@alum.mit.edu> -Quality Software Management -634 West St -Carlisle, MA 01741 - -Phone: (978)287-0435 -Fax: (978)287-0436 - -Services: - - Support for GNU compilers, including rehost/retarget - - GNU Binutils rehost/retarget. - - cgen/sim - - Perl internals hacking - - General system software work (SW tools, O/S, device drivers) - - runtime library (especially floating point) - - project management - - software process improvement - -Experience: 20+ years of design and implementation of optimizing - compilers. "Mr. Bliss" at Digital in the 70's and early - 80's. Experience with Motorola 68k, PowerPC, SPARC, Intel - x86 and IA64 (Merced), MIPS, NS32K, ADI SHARC DSP, VAX, PDP-11, - PDP-10. Wrote or maintained compilers for Ada, BLISS, C, C++, - FORTRAN, Pascal, Modula/2, O/S experience includes Unix (OSF/1, - SunOS, Solaris, AIX, HP/UX), VAX/VMS, Windows/NT, MacOS. - - 8 years experience with GCC internals, including major changes to - support 8 bit bytes on word-address Analog Devices SHARC DSP and - general support of PowerPC code generation. Retargetted gcc/binutils - cross-tools to ASIC used in optical switch. Retargeted gcc to 8 bit "internet toaster" - micro-computer. - -References available - -Rates: $110/hr. - fixed price possible for well-defined deliverables. - -Updated: 2001-05-08 -^_ -Reuven M. Lerner -Lerner Communications Consulting Ltd. -PO Box 518 -105 Nahar Ha-Yarden Street -Modi'in 71700 -Israel <reuven@lerner.co.il> - -Phone: 08-973-2225 (within Israel) - +972-8-973-2225 (outside of Israel) - -Fax: 08-973-0477 (within Israel) - +972-8-973-0477 (outside of Israel) - -WWW: http://www.lerner.co.il - -We specialize in writing custom Web and Internet applications. In -particular: - -- We create database-backed Web sites using Perl, Tcl, Python, Java, - Apache, mod_perl, MySQL, PostgreSQL, and (when free software doesn't - suffice) Oracle. - -- We offer support and service for system administrators who need help - with their GNU/Linux systems. - -- We offer training in a variety of programming languages (Perl, Tcl, - Python, and Java) and in GNU/Linux administration. - -Consulting rates: $150/hour, or $100/hour for non-profits - -Updated: 2001-05-09 -^_ -Richard Levitte (in TeX: Richard Levitte -Levitte Programming Levitte Programming -Spannvagen 38, I Spannv\"agen 28, I -S-168 35 Bromma S-168 35 Bromma -Sweden Sweden) -Tel.nr.: +46 (8) 26 52 47 (there is an answering machine) -Cellular: +46 (708) 26 53 44 -e-mail: <levitte@lp.se> - -What I do: - Primarily I work on GNU software for VMS, both VAX and AXP. I've - been porting GNU Emacs to VMS since spring 1991. I've ported a - bunch of other GNU programs as well. I maintain GNU vmslib. - For further info, see http://www.lp.se/~levitte/prof/resume.html - -Programs supported: - To a varying degree (ranging from extension and porting to - installation and simple questions) at the time of updating this - entry: - - GNU vmslib, emacs, autoconf, zip, diffutils, m4, patch, texinfo, - C/C++; on both VMS and Unix. - - Other GNU programs to a small degree; on Unix. - For further info, look at http://www.lp.se/products/gnu.html - -Experience: - Fluent in TeX/LaTeX and many programming languages. - Modified key elements in Emacs (e.g., memory and process management) - to work transparently on VMS. I have very good knowledge in the VMS - operating system. I'm also knowledged in the a few Unix flavors. - For further info, see http://www.lp.se/~levitte/prof/resume.html - -Your Rate: - $70-$100/hour (500-800 SEK in sweden), plus expenses. My rates - are negotiable, depending on how interesting the project is to me. - -Updated: 2000-05-28 -^_ -Gordon Matzigkeit <gord@gnu.org> -Box 325 http://fig.org/~gord/ -Lumsden, Saskatchewan S0G 3C0 Voice: (306) 731-3011 -CANADA - -I will gladly help novice and intermediate computer users to install, -understand, and use free software, whether or not I have prior -experience with that software. I know my limitations well, and will -freely give other contacts if I cannot solve your problem myself. - -I have over 5 years of experience with several of the major free OSes: -GNU/Linux (Debian, Red Hat), NetBSD, FreeBSD, and GNU/Hurd. Some of -my specialties are networking, Emacs, Automake, Autoconf, C, Perl, and -shell script programming. - -My rates are negotiable depending on the task: usually $40-$60 -(Canadian) per hour. Flat rates preferred. - -Updated: 2000-12-19 -^_ - NetGuide Scandinavia AB <info@netg.se> - Tankeg=E5ngen 4 - S-417 56 G=F6teborg, Sweden - +46 31 50 79 00 voice - +46 31 50 79 39 fax - http://www.netg.se - -NetGuide Scandinavia AB is a company that does consultant jobs and holds -courses in the fields of Unix software, TCP/IP networking and Internet -applications. The people behind NetGuide Scandinavia AB have many years of -general Unix experience, both as system administrators and as -programmers, and also extensive experience in maintaining the GNU -programs; in administration as well as finding and fixing bugs. - -Services offered: - - - Installation and customizing GNU and other free software. We will - make free software as easy to install and use as shrink wrapped - programs. - - Service and support subscriptions. - - Warranty protection. - - Customization and porting. - - Subscriptions to new versions which we will send monthly or with - any other interval. - - Finding, recommending and investigating free software in any - area of the customers choice. - - Regular consulting. - - Support on Internet service software, especially the free - - Support on GNU/Linux. - - Freeware based courses in Unix usage, C, C++, or any GNU tools - - Rates: For courses, contact us for a quote, - For consulting, $60-120/hour, depending on contract length. - -Updated: 2000-12-13 -^_ -Thien-Thi Nguyen -ttn@glug.org -San Diego, CA, USA - - - scheme, common lisp, elisp, c, perl, verilog, sh, etc - - software architecture / implementation / testing - - hardware design / verification - - tools flow / environment tweaking / scripting - - simulators / transactors / stimulus generators - - glue code / integration - -Resume: http://www.glug.org/people/ttn/resume.html - -Rate: $100/hr, possibly less - -Updated: 2001-05-08 -^_ -David Nicol -Post office box 45163 -Kansas City, Missouri 64171 -<david@tipjar.com> -http://www.tipjar.com/dnconsult - -Unix, GNU/Linux, Perl installation, C, C++, Lisp, Perl programming. - -CGI programming. - -Installation, porting. - -Specification development, design, implementation, documentation. - -Rate: $60/hour, or fixed contract. On-site support available in -greater Kansas City area. - -Updated: 2001-05-08 -^_ -Jonas Oberg (TeX: Jonas \"Oberg -Skalangsgatan 11B Sk\"al\"angsgatan 11B -S-723 36 Vasteras S-723 36 V\"aster\.as -Sweden Sweden) - -Phone: +46-21-144831 -E-mail: <jonas@gnu.org> - -I offer support for most GNU software including the GNU -Hurd and also do system administration on GNU systems. -I can do free software development and have a good -understanding of automake, autoconf, flex, bison, guile, -texinfo and much more. Rates around USD$100. - -Updated: 2001-05-09 -^_ - Peter Olsen - P.O. Box 410 - Simpsonville, MD 21150 - - <p@sigmaxi.org> - - What I do: Mathematical modeling and model building using Gnu - and other Free Software. Scientific and engineering - analysis, modeling, and programming in FORTRAN, C, LISP, - and Java. Statistical analysis. Emacs customization. - - Examples of my previous work: - 1. I built the model used predict the - amount of work required to clean up the Exxon Valdez oil - spill. Model was completed in ten days, used to allocate - resources for $2 billion summer cleanup, predictions were - accurate. - 2. I built a model applying commercial capital - investment standards to a Federal Agency budget, helped - support $250 Million budget increase. - - Credo: Engineering is the art of applying a professional - knowledge of mathematics and the physical sciences to - improve the quality of life. - - Rates: $135/hour (+ travel and expenses) on site, - $95/hour remote access. - - Notes: 1. Visiting Lecturer for Society for Industrial and Applied - Mathematics: Will speak without fee about Valdez model - (or other work) to Educational and not-for-profit - organizations (plus most-economical travel and living - expenses or travel or living arrangements in kind). - - 2. I do not accept offers which pose the danger - of conflict of interest with any present or former client - or employer. +Please see <http://www.fsf.org/resources/service/> for a list of +people who have asked to be listed as offering support services for +GNU software, including GNU Emacs, for a fee or in some cases at no +charge. -Updated: 2000-12-13 -^_ - Open Systems Computing AS Open Systems Computing AS - Kongensgate 9 Rogaland Kunnskapspark, PB 8034 - N-0153 Oslo Prof. Olav Hanssensvei 11 - Norway N-4068 Stavanger - Norway - -Phone: Fax: - +47 22 20 40 50 +47 22 20 02 85 - -Web: E-mail: - http://www.osc.no <gnu-support@osc.no> - -Open Systems Computing AS can provide programming support for all -GNU software -- extending or adopting it to meet customer needs. -Prices vary with software and project. Hourly fees are in the $80-120 -range. Fixed-priced projects are also available. Phone support is -available only for customers with support contracts. - -Updated: 2001-05-09 -^_ -Francesco Potortì <pot@gnu.org> -Via S.Stefano, 8 -56123 Pisa, Italy -Tel. (050)560671 - -Emacs: installation and maintenance, training and tutorials, - customisation, extensions, troubleshooting. Author of some of - the packages in the emacs distribution, has made the porting - of emacs to the Motorola Delta architecture. - -Other: installation and maintenance of GNU software. Experience with - hylafax, RCS, gperf, etags, smail, indent, diff, gawk, gcc, - screen. Is the current maintainer of etags. - -Rates: 100 E/hour. - Prefer e-mail communication to telephone. - -Qualifications: Electronic Engineering degree, Pisa. Full time - researcher in CNUCE-CNR. - Familiar with elisp programming, porting of C programs, - low-level TCP/IP programming for embedded systems. - -Updated: 2001-05-09 -^_ -Quoll Systems Pty Ltd, see http://quoll.com.au -8 Brown St, Fannie Bay, Darwin, NT, Australia. -Phone: +61 8 8941 7150 Fax: +61 8 8941 7151 Mobile: 0409 691 399 -e-mail: <pjm@gnu.org> or <info@quoll.com.au> - -QS is a small (4 full-time staff + 15 part-timers) which does a variety -of things in the *IX, technical computing area including: - - o Systems development/maintainence (in most programming languages) - o Training (GNU/Linux, FreeBSD, OpenBSD, Apache, Perl, ...) - o Consulting in areas such as security, reliability, - -Recent projects have included wind turbine generator control, water -quality databases, remote area satelliate communications, Apache Web -serving, ISP configurations, *nix training. Staff have provided some -small contributions to the GNU and BSD projects over the years. We -also have a bit of expertise in the embedded(inside people) systems -area in addition to the standard building work. - -We can provide local (i.e. southern hemisphere/south east asia) support -for most of the vast range of free software systems including: GNU/Linux, -FreeBSD, OpenBSD , OpenSSH, Sendmail, various compilers and networking -tools. Remote support can also be arranged. - -Rates: vary depending on the work, period and staff provided but let - us pick 100$US/hr as a starting point for senior staff. - -Updated: 2000-12-13 -^_ -Red Hat, Inc. -<embedded-info@redhat.com> -1325 Chesapeake Terrace -Sunnyvale, CA 94089 USA -Toll free: 866-2REDHAT ext. 3005 -+1 408 542 9600 voice -+1 408 542 9699 fax - -GNUPro Tools -Red Hat provides supported and maintained versions of gcc, g++, gdb -with GUI, GNU linker and GNU macro assembler. In addition, Red Hat -provides these GNU software development tools for well over many -popular host-target configurations. Support includes bug fixes and -semi-annual releases of the toolset. Each release is regression -tested and includes substantial improvements and additions to the -current release. Support is available through Incident support -packages, or Unlimited support for specific user groups. GNUPro is -available with standard, custom, and vintage toolchains for both -native and embedded application development. New target processors -are being added regularly. Rates for support for standard products -start at $12,500. - -Embedded Linux -Red Hat offers Red Hat Embedded Linux to companies looking for an open -source and royalty-free runtime solution. Red Hat Embedded Linux -currently supports certain ARM, StrongARM, and MIPS families of -processors. Embedded Linux supports multiple graphics APIs, is -compliant with POSIX APIs and thread support, can be configured as low -as 512k memory footprint including TCP/IP and NFS built into the -kernel, and supports journaling and transparent compression in -filesystems. Support for new processors is available via Red Hat -Professional Services. - -Updated: 2001-05-16 -^_ -Relogic AB -Pipersgatan 26 -Box 868 -SE-112 28 Stockholm -SWEDEN - -web http://www.relogic.se -e-mail info@relogic.se -phone +46 708 800 000 -fax +46 708 800 580 - -Relogic provides experienced unix developers that know and love GNU -products. We can take on anything from single contractor support to -full scale projects. We know all programming languages and all Unix -dialects. - -Updated: 2000-12-14 -^_ -Phillip Rulon -122 Blossom Rd. -Westport, MA 02790 -USA -508.672.3007 -<pjr@gnu.org> - -15 years experience with GNU systems and tools. Available for any free -software project. Most useful for network design and construction or -dynamic web development. Very good Debian, Perl, and Apache. - -Boston, travel OK. -$100/hr, flat rate possible. - -Updated: 2000-12-18 -^_ -Stanislav Shalunov <shalunov@mccme.ru> - -Customizing GNU Emacs (new modes OK). Installing and troubleshooting -free software. Rate: $60-100/hour. NYC area, telecommuting preferred. -References available. - -Updated: 2000-12-12 -^_ -SRA (Software Research Associates, Inc., Japan) <info-wingnut@sra.co.jp> -1-1-1, Hirakawa-cho, Chiyoda-ku -Tokyo 102-8605 Japan - -+81-3-3234-5610 voice -+81-3-3234-5556 fax - -http://www.sra.co.jp/wingnut/ -http://www.sra.co.jp/wingnut/chirashi-e.html -http://www.sra.co.jp/wingnut/service.html -http://osb.sra.co.jp/WingnutSupport/ - -We provide GNU software support at a reasonable charge, -aiming to promote the sound growth of free software and to -create a new culture in the software world. - -News: - - We have just started "GCC and CVS membership support service". - We provide various support menus. Please refer to - http://osb.sra.co.jp/WingnutSupport/ for details. - -What we provide is: - - 1. Research and development of GNU software. - 2. Development, porting, and customization of GNU software itself. - 3. Helping people who are willing to port and provide GNU software - to their customers, but are unable to do so due to a lack of resources. - 4. Providing a variety of educational and training services including - how to port or to customize. - 5. The result of the work will become free software covered under the - GNU licenses (GPL or LGPL), so it will be possible not only to share - the results with others but to eliminate unnecessary investment also. - 6. Passing the result to the program package maintainers (if needed). - 7. Also, making contributions to FSF (Free Software Foundation, Inc.) - which is the organization that develops and distributes GNU software - worldwide. - - Furthermore, we provide services *native to Japan*, that is, - services for Japanese-speaking people --- receiving inquiries and - answering in Japanese. - -Rates: - Determined by estimation. - -Updated: 2001-05-21 -^_ -Andre Spiegel <spiegel@gnu.org> -Dipl.-Inform. -Berlin, Germany - -Maintainer of the GNU Emacs version control package (VC). - -I can provide consulting and practical help for the installation and -administration of GNU/Linux systems, in particular Debian. Also -knowledgeable on many other Unix derivates, and network technology. -Installation, porting and customization of GNU software is possible; I -have programming experience in C, C++, Java, and Emacs Lisp, among -others. Expertise in version control using RCS or CVS. I also give -seminars on the above subjects. - -Rates: 150 DM/hr (US$ 85) - -Updated: 2001-05-09 -^_ -Name: Julian Stacey <jhs@freebsd.org> <jhs@bim.bsn.com> <jhs@muc.de> -Location: Muenchen, Deutschland (Munich, Germany). -Qualifications: University Degree, BSc Hons Computers & Cybernetics, 1980. -Phone: +49.89.268616 Fax: +49.89.2608126 Data: +49.89.26023276 -Resume: http://bim.bsn.com/~jhs/ Older: http://www.freebsd.org/~jhs/ -Time Zone: +01:00 -Rate: DM 200 - DM 160 / Hour. -Specialisation: Unix (Pref. BSD or Linux), C, X-Windows, FSF tools, firewalls, - systems engineering, hardware interfacing, real time/embedded, - custom design & porting. No { Emacs, Cobol, Microsoft }. -Free Sources: All BSD sources (updated daily), X-Windows, XFree86, FSF. - Personal sources are here: http://bim.bsn.com/~jhs/src/ - Copy Charge dependent on time+postage+media -Free GCC-1.40: For Symmetric Computer Systems Model 375 (native cc is broken). -Languages: I am English. Ich verstehe Deutsch. Je comprend Francais, - (mais je ecris une response en Anglais). Avoid dialect, - (use Hoch Deutsch, not Bayerisch); Spell slowly & clearly, - (umlauts are not recognised); Use single digits: avoid - inverted German pairs (EG "eight hundred, two and thirty", - & convoluted French ("four twenties and fifteen"). -Contact: State aprox. days/weeks/months you want professional - consultancy at full commercial rates, .. OR .. -Note I am NOT a free help desk ! - Post your questions to an Internet newsgroup, & let those with - most time, best knowledge, & inclination answer. If you must - phone me (& I'd much prefer you did Not), Rules apply: First - ask for a few minutes advice "Free Of Charge". (Do not swamp - me with your problem & leave me to deduce you are not a paying - customer). Use some English. Give an email address for - forwarding later info. Volunteer to phone back later to hear - subsequent info/solutions I/friends/net come up with. I do not - pay phone charges to call strangers. - -Updated: 2001-05-09 -^_ -Richard M. Stallman <rms@gnu.org> -545 Tech Sq, Rm 430 -Cambridge, MA 02139 - -Emacs: anything whatever -Is anyone interested in courses in using or extending GNU Emacs? - -Original inventor of Emacs and main author of GNU Emacs and GCC. - -Rates: $6/min or $250/hr. - -Updated: 2000-12-13 -^_ -Static Free Software -4119 Alpine Road -Portola Valley, Ca 94028 -(650) 851-2927 -http://www.staticfreesoft.com - -Static Free Software developed and supports the "Electric VLSI Design -System". Steven Rubin, the founder of the company and author of -Electric, is available for enhancements, support, and training. - -Please see our web page at www.staticfreesoft.com for more information -about our products, services, and prices. - -Updated: 2000-12-12 -^_ -Swing Digital Ltd. <hello@swingdigital.com> -15-17 Middle Street -Brighton -BN1 1AL -United Kingdom -Tel +44 (0) 1273 20 11 66 -Fax +44 (0) 1273 20 11 68 -http://www.swingdigital.com - -Swing Digital actively supports the development of the GNU.FREE -Internet Voting system. Through this support we have gained the -unique expertise to support, install and run GUN.FREE-based Internet -votes. We are also available in a consultancy basis to offer advice -for organisations wishing to run GNU.FREE themselves. - -Our consultancy fees start at 900 Euro (550 UK pounds) per day. We -are also able to securely host Internet Votes, prices on application. - -Updated: 2001-07-23 -^_ -Kayvan A. Sylvan <kayvan@sylvan.com> -Sylvan Associates, Inc. -879 Lewiston Drive -San Jose, CA 95136-1517 -Phone: (408) 978-1407 -Fax: (408) 978-0472 - -I will help you port, install and customize GNU Emacs, GCC, G++, GNUmake, -bison, and other GNU tools on almost any architecture and operating -system. Questions answered. GNU C/C++, Java and lisp hacking available. - -I will also do ongoing support and periodic upgrades if you get on my GNU -software subscription list. - -Rates: $100-$125/hour, depending on type and quantity of work. -Substantial discounts for long-term contracts and also for educational or -non-profit institutions. - -Experience: Many different Unix systems (2.9BSD to 4.4BSD, Xenix, SVR3 and -SVR4, Solaris, Linux, FreeBSD). Systems programming and system -administration on all brands of Unix. - -Kernel hacking experience. Lots of porting experience. - -Updated: 2001-05-08 -^_ -Alfredo Tomasini -<alto555@earthlink.net>, <alfredo.tomasini@c-cube.com> - -GNU/Linux Intel desktop/laptop installation, setup, and networking. -Installation of GNU tools on SunOS and GNU/Linux. -Sed and Gawk script development. - -Languages: English and Italian. - -Fee: $50/hour. - -Updated: 2000-12-13 -^_ -Leonard H. Tower Jr. <tower@ai.mit.edu> <tower@art.net> -36 Porter Street -Somerville, MA 02143-2313 -USA -+1-617-623-7739 - -Will work on most GNU, GPLed, and Open Source software. -Installation, handholding, trouble shooting, extensions, teaching, etc. - -Rates: $ 225.00/hour + travel expenses. Fixed fee quotes available. - Negotiable for non-profits. - -Experience: Have hacked on over a dozen architectures in many languages. Have -system mothered too many varieties of Unixes. Assisted rms with the front end -of GCC and its back-end support. Installed and worked with many GNU -programs including GNU Emacs. Resume available on request. - -Updated: 2001-05-10 -^_ -Jody Winston -xprt Computer Consulting, Inc. -731 Voyager -Houston, TX, 77062 -(281) 480-UNIX, <josephwinston@mac.com> - -We have supported, installed, and used the entire GNU software suite -for over 10 years on many different Unix platforms. We have written -character device drivers and proc file systems for custom hardware -running on GNU/Linux. We have developed extensions for tcl and Python. -In addition, we have developed a custom X11 server and X input -extensions. Our consulting rate is $150.00 US dollars per hour, -negotiable, plus a per diem for out of town work. - -Updated: 2001-05-08 -^_ -The Written Word -Web: http://thewrittenword.com -Email: info@thewrittenword.com -Tel: (800) 372-7476 - -The Written Word provides CDs of pre-compiled Open Source applications -on popular UNIX variants. Clients can purchase a one-time CD set -($149/set), or a subscription, which provides four quarterly releases. -Two types of subscription are available: "media only" ($550/year), or -"media and updates" ($1459/year). The "media and updates" -subscription entitles the subscriber, via a web site, to patches, -security fixes, new releases to existing packages, new packages, -online documentation, and changelog information, between releases, and -a central bug tracking system for all packages. - -Updated: 2000-11-27 -^_ - -For a current copy of this directory, or to have yourself listed, ask: - fsforder@gnu.org - -A current version should be available on our web site at http://www.gnu.org. - -** Please keep the entries in this file alphabetical ** - - -Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 -Free Software Foundation, Inc. - - Verbatim copying and distribution of this document are permitted - worldwide, without royalty, in any medium, provided this notice is - preserved. - arch-tag: 1253ce32-1cbd-428a-ac36-70ed9e3999fc
--- a/etc/TODO Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/TODO Tue Apr 24 21:56:25 2007 +0000 @@ -14,6 +14,16 @@ * Small but important fixes needed in existing features: +** Fix compilation when Xaw3d libraries are present but libxaw is not. +In new X11 versions, xaw3dg-dev does not depend on libxaw-dev, so the +latter need not be installed. As a result, all the source files that +look for include files in X11/Xaw should look in X11/Xaw3d if we are +using Xaw3d. + +** Compute the list of active keymaps *after* reading the first event. + +** Avoid using "iff" in doc strings. + ** mouse-autoselect-window should wait to select the window until the mouse is put to rest or after a delay or both, so that moving over a window doesn't select it. @@ -82,8 +92,6 @@ ** Add function to redraw the tool bar. -** Modify allout.el to use overlays, like outline.el. - ** M-! M-n should fetch the buffer-file-name as the default. ** Redesign the load-history data structure so it can cope better @@ -92,6 +100,15 @@ ** make back_comment use syntax-ppss or equivalent. +** Improve configure's treatment of NON_GNU_CPP on Solaris. +(patch available for after Emacs 22) + +** Consider improving src/sysdep.c's search for a fqdn. +http://lists.gnu.org/archive/html/emacs-devel/2007-04/msg00782.html + +** Find a proper fix for rcirc multiline nick adding. +http://lists.gnu.org/archive/html/emacs-devel/2007-04/msg00684.html + * Important features: ** Provide user-friendly ways to list all available font families, @@ -509,9 +526,6 @@ ** Let LEIM handle the Mode_switch key like XIM does (i.e. a toggle like C-\ but which can also be used as a modifier). -** Provide the toolbar on ttys. This could map a bit like tmm-menubar - for the menubar and buttons could look a bit like those used by customize. - ** Improve Help buffers: Change the face of previously visited links (like Info, but also with regard to namespace), add a forward button to make the Help buffer more browser like and gives the value of lisp expressions @@ -529,7 +543,7 @@ * Internal changes -** Cleanup all the GC_ mark bit stuff -- there is no longer any distiction +** Cleanup all the GC_ mark bit stuff -- there is no longer any distinction since the mark bit is no longer stored in the Lisp_Object itself. ** Merge ibuffer.el and buff-menu.el. @@ -545,7 +559,7 @@ a derived mode of sendmail.el. Or arrange for messages.el to be split into a small core and "the rest" so that we use less resources as long as we stick to the features provided in sendmail.el. - + ** Replace gmalloc.c with the modified Doug Lea code from the current GNU libc so that the special mmapping of buffers can be removed -- that apparently loses under Solaris, at least. [fx has mostly done
--- a/etc/emacs.1 Tue Apr 24 11:35:23 2007 +0000 +++ b/etc/emacs.1 Tue Apr 24 21:56:25 2007 +0000 @@ -19,8 +19,7 @@ .\" Boston, MA 02110-1301, USA. .\" '\" t -.TH EMACS 1 "2001 November 23" -.UC 4 +.TH EMACS 1 "2007 April 13" "GNU Emacs 22.1" .SH NAME emacs \- GNU project Emacs .SH SYNOPSIS @@ -40,11 +39,11 @@ Richard Stallman. .br The primary documentation of GNU Emacs is in the GNU Emacs Manual, -which you can read on line using Info, a subsystem of Emacs. Please -look there for complete and up-to-date documentation. This man page -is updated only when someone volunteers to do so; the Emacs -maintainers' priority goal is to minimize the amount of time this man -page takes away from other more useful projects. +which you can read using Info, either from Emacs or as a standalone +program. Please look there for complete and up-to-date documentation. +This man page is updated only when someone volunteers to do so; the +Emacs maintainers' priority goal is to minimize the amount of time +this man page takes away from other more useful projects. .br The user functionality of GNU Emacs encompasses everything other @@ -58,7 +57,7 @@ .I Emacs windows and buffers. CTRL-h or F1 enters the Help facility. Help Tutorial (CTRL-h t) -requests an interactive tutorial which can teach beginners the fundamentals +starts an interactive tutorial which can teach beginners the fundamentals of .I Emacs in a few minutes. @@ -77,7 +76,7 @@ within .I Emacs windows (Shell), running a Lisp read-eval-print loop -(Lisp-Interaction-Mode), and automated psychotherapy (Doctor). +(Lisp-Interaction-Mode), automated psychotherapy (Doctor), and much more. .PP There is an extensive reference manual, but users of other Emacses @@ -201,11 +200,6 @@ .I Emacs window in reverse video. .TP -.B \-i -Use the "kitchen sink" bitmap icon when iconifying the -.I Emacs -window. -.TP .BI \-font " font, " \-fn " font" Set the .I Emacs @@ -262,8 +256,8 @@ .BI \-fg " color" On color displays, sets the color of the text. -See the file -.I /usr/lib/X11/rgb.txt +Use the command +.I M-x list-colors-display for a list of valid color names. .TP @@ -299,7 +293,6 @@ from an .IR xterm (1) window, display is done in that window. -This must be the first option specified in the command line. .PP You can set .I X @@ -431,43 +424,31 @@ manual is also included in the Emacs source distribution. .PP .SH FILES -/usr/local/share/info - files for the Info documentation browser -(a subsystem of Emacs) to refer to. Currently not much of Unix -is documented here, but the complete text of the Emacs reference -manual is included in a convenient tree structured form. - -/usr/local/share/emacs/$VERSION/src - C source files and object files +/usr/local/share/info - files for the Info documentation browser. +The complete text of the Emacs reference manual is included in a +convenient tree structured form. Also includes the Emacs Lisp +Reference Manual, useful to anyone wishing to write programs in the +Emacs Lisp extension language. /usr/local/share/emacs/$VERSION/lisp - Lisp source files and compiled files that define most editing commands. Some are preloaded; others are autoloaded from this directory when used. -/usr/local/share/emacs/$VERSION/etc - various programs that are used with -GNU Emacs, and some files of information. +/usr/local/libexec/emacs/$VERSION/$ARCH - various programs that are +used with GNU Emacs. + +/usr/local/share/emacs/$VERSION/etc - various files of information. /usr/local/share/emacs/$VERSION/etc/DOC.* - contains the documentation strings for the Lisp primitives and preloaded Lisp functions of GNU Emacs. They are stored here to reduce the size of Emacs proper. -/usr/local/share/emacs/$VERSION/etc/OTHER.EMACSES discusses GNU Emacs -vs. other versions of Emacs. .br /usr/local/share/emacs/$VERSION/etc/SERVICE lists people offering various services to assist users of GNU Emacs, including education, troubleshooting, porting and customization. -.br -These files also have information useful to anyone wishing to write -programs in the Emacs Lisp extension language, which has not yet been fully -documented. -/usr/local/com/emacs/lock - holds lock files that are made for all -files being modified in Emacs, to prevent simultaneous modification -of one file by two users. - -.\" START DELETING HERE IF YOU'RE NOT USING X -/usr/lib/X11/rgb.txt - list of valid X color names. -.\" STOP DELETING HERE IF YOU'RE NOT USING X .PP .SH BUGS There is a mailing list, bug-gnu-emacs@gnu.org, for reporting Emacs @@ -488,9 +469,6 @@ file /usr/local/emacs/etc/MAILINGLISTS. Bugs tend actually to be fixed if they can be isolated, so it is in your interest to report them in such a way that they can be easily reproduced. -.PP -Bugs that I know about are: shell will not work with programs -running in Raw mode on some Unix versions. .SH UNRESTRICTIONS .PP .I Emacs @@ -519,11 +497,10 @@ .I Emacs, and urges that you contribute your extensions to the GNU library. Eventually GNU -(Gnu's Not Unix) will be a complete replacement for Berkeley -Unix. +(Gnu's Not Unix) will be a complete replacement for Unix. Everyone will be free to use, copy, study and change the GNU system. .SH SEE ALSO -X(1), xlsfonts(1), xterm(1), xrdb(1) +emacsclient(1), etags(1), X(1), xlsfonts(1), xterm(1), xrdb(1) .SH AUTHORS .PP .I Emacs @@ -532,7 +509,7 @@ .SH COPYING Copyright .if t \(co -.if n (c) +.if n (C) 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. .PP
--- a/lib-src/makefile.w32-in Tue Apr 24 11:35:23 2007 +0000 +++ b/lib-src/makefile.w32-in Tue Apr 24 21:56:25 2007 +0000 @@ -24,7 +24,7 @@ .PHONY: $(ALL) -VERSION = 22.0.97 +VERSION = 22.0.98 LOCAL_FLAGS = -DWINDOWSNT -DDOS_NT -DSTDC_HEADERS=1 -DNO_LDAV=1 \ -DNO_ARCHIVES=1 -DHAVE_CONFIG_H=1 -I../nt/inc \
--- a/lisp/ChangeLog Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/ChangeLog Tue Apr 24 21:56:25 2007 +0000 @@ -1,6 +1,367 @@ +2007-04-24 J.D. Smith <jdsmith@as.arizona.edu> + + * progmodes/idlw-shell.el (idlwave-shell-clear-all-bp): Don't + re-query for each cleared BP. + (idlwave-shell-clear-bp): Optionally skip BP query. + (idlwave-shell-update-bp-overlays): Use set-window-margins + instead of set-window-buffer, which incorrectly moves displayed + region. + +2007-04-23 Jay Belanger <jay.p.belanger@gmail.com> + + * calc/calc.el (calc-bug-address): Update maintainer's address. + * calc/*: Update maintainer's address. + +2007-04-23 Richard Stallman <rms@gnu.org> + + * simple.el (set-mark-command-repeat-pop): Doc fix. + Put in `editing-basics' group. + +2007-04-23 Chong Yidong <cyd@stupidchicken.com> + + * info.el (Info-mouse-scroll-up, Info-mouse-scroll-down): New + functions. + (Info-mode-line-node-keymap): Bind mouse commands to + Info-mouse-scroll-up/down instead of Info-scroll-up/down. + +2007-04-23 Luc Teirlinck <teirllm@auburn.edu> + + * locate.el (locate-local-prompt): New var. + (locate-prompt-for-command): Doc fix. + (locate-prompt-for-search-string): New function. + (locate): New optional arg. Make locate-local-prompt + buffer-local. Use locate-prompt-for-search-string. + (locate-with-filter): New optional arg. Use + locate-prompt-for-search-string. + (locate-update): Bind locate-prompt-for-command. + +2007-04-23 Glenn Morris <rgm@gnu.org> + + * files.el (magic-mode-alist): `<!DOCTYPE HTML' in html-mode. + +2007-04-23 Nick Roberts <nickrob@snap.net.nz> + + * button.el (button): Inherit from link face on a tty. + +2007-04-23 Glenn Morris <rgm@gnu.org> + + * button.el (button): Use color for this face on a tty. + + * files.el (magic-mode-alist): Allow for carriage-returns in + html-mode and sgml-mode entries. + +2007-04-22 Richard Stallman <rms@gnu.org> + + * emacs-lisp/easy-mmode.el (define-globalized-minor-mode): + Improve doc string of generated command. + + * subr.el (read-number): Catch errors. + + * hi-lock.el (hi-lock-file-patterns-policy): Doc fix. + +2007-04-22 Chong Yidong <cyd@stupidchicken.com> + + * image-dired.el: Rename from thumbnails.el. All instances of + "thumbnails" replaced with "image-dired". + + * dired.el (dired-mode-map): Rename "thumbnails" again, to + "image-dired". + +2007-04-22 Kim F. Storm <storm@cua.dk> + + * ido.el (ido-kill-buffer-at-head, ido-delete-file-at-head): + Don't use kill-line. + +2007-04-22 Nick Roberts <nickrob@snap.net.nz> + + * t-mouse.el (t-mouse-make-event): Pass on mev's more informative + error message. + +2007-04-22 Chong Yidong <cyd@stupidchicken.com> + + * dired.el: Rename "tumme" to "thumbnails". + + * thumbnails.el: Rename from tumme.el. All instances of "tumme" + replaced with "thumbnails". + +2007-04-22 Glenn Morris <rgm@gnu.org> + + * hi-lock.el (hi-lock-file-patterns-policy): Make it a defcustom, + and give it the risky-local-variable property. + + * textmodes/flyspell.el (flyspell-define-abbrev): Downcase abbrev + before defining it. + +2007-04-21 Martin Rudalics <rudalics@gmx.at> + + * progmodes/cc-mode.el (c-remove-any-local-eval-or-mode-variables): + Use delete-region instead of kill-line. + +2007-04-21 Alan Mackenzie <acm@muc.de> + + * progmodes/cc-cmds.el (c-electric-slash): Replace wrong use of + `kill-region' by `delete-region'. + +2007-04-21 Chong Yidong <cyd@stupidchicken.com> + + * progmodes/perl-mode.el (perl-indent-command): Use delete-region + instead of kill-region. + + * progmodes/mantemp.el (mantemp-make-mantemps-region) + (mantemp-insert-cxx-syntax, mantemp-sort-and-unique-lines) + (mantemp-remove-memfuncs): Use delete-region instead of kill-word + and kill-line. + + * progmodes/vhdl-mode.el (vhdl-template-type) + (vhdl-template-record, vhdl-template-nature) + (vhdl-template-configuration-spec, vhdl-template-component-inst) + (vhdl-template-break, vhdl-regress-line, vhdl-electric-tab): Use + delete-region instead of kill-word and kill-line. + +2007-04-21 Johan Bockg,Ae(Brd <bojohan@dd.chalmers.se> + + * dired-x.el (dired-virtual-mode): Doc fix. + +2007-04-21 Richard Stallman <rms@gnu.org> + + * font-lock.el (font-lock-keywords-alist): Mark as risky. + + * subr.el (read-number): Doc fix. + + * simple.el (pop-to-mark-command): Display message "mark popped" + if point does not move. + (set-mark-command): Doc fix. + +2007-04-21 Luc Teirlinck <teirllm@auburn.edu> + + * locate.el: Revert 2006-09-09 and 2007-04-20 changes. + (locate-local-filter, locate-local-search): New vars. + (locate): Make variables local. + (locate-update): Bind locate-buffer-name. Call locate using + locate-local-filter and locate-local-search. + +2007-04-20 David Koppelman <koppel@ece.lsu.edu> + + * hi-lock.el (hi-lock-file-patterns-policy): New var. + (hi-lock-find-patterns): Use hi-lock-file-patterns-policy. + (hi-lock-mode): Update docstring. + +2007-04-20 Stefan Monnier <monnier@iro.umontreal.ca> + + * textmodes/fill.el (fill-move-to-break-point): Don't inhibit + fill-nobreak-predicate when the break is past fill-column. + +2007-04-20 Francesco Potort,Al(B <pot@gnu.org> + + * locate.el (locate): Output from shell-command should go in the + current buffer rather than *Shell Command Output*. + +2007-04-20 Chong Yidong <cyd@stupidchicken.com> + + * paren.el (show-paren-function): Fix last fix. + +2007-04-19 Kevin Ryde <user42@zip.com.au> + + * arc-mode.el (archive-find-type): lzh-exe for lzh self-extracting exe. + (archive-lzh-summarize): Add optional start arg for where to start + looking at the archive. + (archive-lzh-exe-summarize, archive-lzh-exe-extract): New functions. + + * international/mule.el (auto-coding-alist): no-conversion for .exe + and .EXE. + +2007-04-19 Alan Mackenzie <acm@muc.de> + + * progmodes/cc-cmds.el (c-in-function-trailer-p): Fix this: when a + function return type contains "struct", "union", etc. + c-end-of-defun goes too far forward. + +2007-04-19 Chong Yidong <cyd@stupidchicken.com> + + * paren.el (show-paren-function): Reset window-start to avoid + recentering. + +2007-04-19 Glenn Morris <rgm@gnu.org> + + * calendar/todo-mode.el: Fix typo: "threshhold" -> "threshold". + +2007-04-18 Glenn Morris <rgm@gnu.org> + + * calendar/diary-lib.el (diary-header-line-format): Add a custom + :set function. + (diary-list-entries): Only switch to diary-mode from + default-major-mode (reverts 2007-03-21 change). Otherwise, if in + diary-mode set header-line-format, in case of any customization. + +2007-04-18 Levin Du <zslevin@gmail.com> (tiny change) + + * calendar/parse-time.el (parse-time-string-chars): Check if CHAR + is less than the length of parse-time-syntax. + +2007-04-17 David Kastrup <dak@gnu.org> + + * replace.el (query-replace-regexp-eval): Deprecate. + +2007-04-17 Alan Mackenzie <acm@muc.de> + + * progmodes/cc-cmds.el (c-beginning-of-defun): With -ve arg and + point too close to EOB, leave point at EOB rather than last `}'. + +2007-04-17 Roland Winkler <Roland.Winkler@physik.uni-erlangen.de> + + * textmodes/bibtex.el (bibtex-include-OPTkey) + (bibtex-user-optional-fields, bibtex-entry-field-alist): + Fix defcustom. + +2007-04-17 Glenn Morris <rgm@gnu.org> + + * calendar/cal-dst.el (calendar-dst-find-startend): If YEAR cannot + be encoded, fall back to current year. + +2007-04-14 Kevin Ryde <user42@zip.com.au> + + * arc-mode.el (archive-lzh-summarize): Only apply the "downcase if + all upcase" rule to OS-ID 0 "generic". Always downcase for OS-ID + M "MSDOS". + +2007-04-16 Chong Yidong <cyd@stupidchicken.com> + + * progmodes/python.el (python-end-of-block): Avoid looping forever + if python-next-statement fails. + +2007-04-16 Roland Winkler <Roland.Winkler@physik.uni-erlangen.de> + + * textmodes/bibtex.el (bibtex-entry-field-alist): Use defcustom. + +2007-04-16 Dan Nicolaescu <dann@ics.uci.edu> + + * progmodes/perl-mode.el (perl-indent-level): Mark as safe local var. + * progmodes/cperl-mode.el (cperl-indent-level): Likewise. + +2007-04-15 Jay Belanger <belanger@truman.edu> + + * calc/calc.el (calc-version): New function. + (calc-trail-mode): Shorten the title. + +2007-04-15 Chong Yidong <cyd@stupidchicken.com> + + * mail/footnote.el (footnote-style): Clarify docstring to state + that customizing this only applies to future footnotes. + +2007-04-15 Roland Winkler <Roland.Winkler@physik.uni-erlangen.de> + + * textmodes/bibtex.el (bibtex-field-list): Use functionp. + (bibtex-make-field): Check that INIT is a string. Use functionp. + +2007-04-14 Glenn Morris <rgm@gnu.org> + + * complete.el (PC-goto-end): New buffer-local variable. + (PC-do-completion-end): Make buffer-local. + (partial-completion-mode) <choose-completion-string-functions>: + Do not go to the end of the minibuffer if PC-goto-end is non-nil. + (PC-do-completion): New optional fourth argument GOTO-END. Add a + doc string. Set PC-goto-end for choose-completion. + (PC-lisp-complete-symbol): Pass non-nil GOTO-END arg to + PC-do-completion. + + * textmodes/bibtex.el (bibtex-insert-kill): Pass non-nil NODELIM + arg to bibtex-make-field. + (bibtex-make-field): Add optional fourth arg NODELIM. + Insert delimiters around INIT unless this arg is non-nil. + +2007-04-14 Nick Roberts <nickrob@snap.net.nz> + + * tmm.el (tmm-get-keybind): Use copy-sequence to ensure that the + global map isn't modified + +2007-04-14 Glenn Morris <rgm@gnu.org> + + * calendar/appt.el (appt-disp-window): Do not split small windows. + Suggested by Jeff Miller <jmiller@cablespeed.com>. + +2007-04-13 Chong Yidong <cyd@stupidchicken.com> + + * progmodes/compile.el (compilation-start): Revert 2007-03-25 change. + + * files.el: Ditto. + +2007-04-13 Juanma Barranquero <lekktu@gmail.com> + + * cus-edit.el (minibuffer, auto-save): Fix typos in docstrings. + + * term.el (term-buffer-maximum-size, term-exec, term-escape-char) + (term-set-escape-char, term-termcap-format, term-get-old-input-default) + (term-skip-prompt, term-send-string, term-send-region, term-pager-page) + (term-pager-help): Fix typos in docstrings. + + * wid-edit.el (widget-documentation): Fix typo in docstring. + + * progmodes/ebnf2ps.el (ebnf-insert-style, ebnf-merge-style): + Fix typos in error messages. + +2007-04-13 Martin Rudalics <rudalics@gmx.at> + + * emacs-lisp/edebug.el (edebug-pop-to-buffer): Don't select + window marked as dedicated. + + * mail/footnote.el (footnote-latin-string): New variable. + (footnote-latin-regexp): Redefine as regexp alternative. + (Footnote-latin): Use footnote-latin-string instead of + footnote-latin-regexp. + +2007-04-13 Glenn Morris <rgm@gnu.org> + + * tmm.el (tmm-get-keybind): Use car-safe to avoid errors with + inherited keymaps. + +2007-04-12 Chong Yidong <cyd@stupidchicken.com> + + * outline.el (outline-get-next-sibling): Clarify docstring. + (outline-get-last-sibling): Handle case where we are at the first + heading. Clarify docstring. + +2007-04-12 Nick Roberts <nickrob@snap.net.nz> + + * progmodes/gud.el (gud-minor-mode-map): Make go button same + length as stop button to lessen flicker. + (jdb): Add gud-print. + (gud-find-expr): Jdb prints the expression with the value, so + don't insert it in the output. + +2007-04-11 Jason Rumney <jasonr@gnu.org> + + * dnd.el (dnd-get-local-file-name): Decode both upper and lower + case hex. Do not try to decode non-hex letters. + +2007-04-11 Markus Triska <markus.triska@gmx.at> + + * emacs-lisp/byte-opt.el (byte-optimize-backward-char) + (byte-optimize-backward-word): Remove (move to bytecomp.el). + (byte-optimize-form-code-walker): Evaluate pure function calls if + possible. + (byte-optimize-all-constp): New function. + + * emacs-lisp/bytecomp.el (byte-compile-char-before): + Improve numeric argument case. + (byte-compile-backward-char, byte-compile-backward-word): + New functions, performing rewriting previously done in byte-opt.el. + Fix their "Fixme" item (restriction to numeric arguments). + +2007-04-11 Stefan Monnier <monnier@iro.umontreal.ca> + + * desktop.el (desktop-save, desktop-create-buffer): Replace mapcar + with dolist. + (after-init-hook): Don't quote lambda. + (desktop-first-buffer): Don't wrap it in eval-when-compile. + (desktop-internal-v2s): Remove unused var `el'. + (desktop-buffer-major-mode, desktop-buffer-locals): Move out of + desktop-restore-file-buffer. + (desktop-buffer-ok-count, desktop-buffer-fail-count): Move out of + desktop-create-buffer. + 2007-04-10 Chong Yidong <cyd@stupidchicken.com> - * woman.el (woman-decode-buffer): Postphone macro-set check... + * woman.el (woman-decode-buffer): Postpone macro-set check... (woman-decode-region): ...to here. 2007-04-10 Thien-Thi Nguyen <ttn@gnu.org> @@ -25,8 +386,8 @@ * emacs-lisp/byte-opt.el (byte-optimize-char-before): Remove (move to bytecomp.el as byte-compile-char-before). - * emacs-lisp/bytecomp.el (byte-compile-char-before): New - function (modified replacement for byte-optimize-char-before in + * emacs-lisp/bytecomp.el (byte-compile-char-before): + New function (modified replacement for byte-optimize-char-before in byte-opt.el). 2007-04-09 Alan Mackenzie <acm@muc.de> @@ -74,10 +435,10 @@ * cus-start.el <scroll-preserve-screen-position>: Add choices. -2007-04-08 Johan Bockg,Ae(Brd <bojohan+news@dd.chalmers.se> - - * term/xterm.el (terminal-init-xterm): Fix key definitions. Add - binding for C-M-SPC. +2007-04-08 Johan Bockg,Ae(Brd <bojohan@dd.chalmers.se> + + * term/xterm.el (terminal-init-xterm): Fix key definitions. + Add binding for C-M-SPC. 2007-04-08 Richard Stallman <rms@gnu.org> @@ -142,8 +503,8 @@ * menu-bar.el (menu-bar-tools-menu): Revert 2003-07-25 change. - * desktop.el (desktop-create-buffer, desktop-save): Revert - 2004-11-12 change. + * desktop.el (desktop-create-buffer, desktop-save): + Revert 2004-11-12 change for lack of copyright papers. * dired-x.el (dired-guess-shell-case-fold-search): Delete var. (dired-guess-default): Respect case. @@ -432,7 +793,7 @@ * textmodes/flyspell.el (flyspell-large-region): Use ispell-call-process-region. -2007-03-26 Johan Bockg,Ae(Brd <bojohan+sf@dd.chalmers.se> +2007-03-26 Johan Bockg,Ae(Brd <bojohan@dd.chalmers.se> * emacs-lisp/bytecomp.el (byte-compile-file-form-defmumble): Use prin1 instead of princ. @@ -568,6 +929,13 @@ (number-of-diary-entries): Change :set to use diary-set-maybe-redraw. (diary-list-entries): Always run diary-mode. +2007-03-20 Kenichi Handa <handa@m17n.org> + + * international/quail.el (quail-setup-completion-buf): Make the + completion buffer read-only. + (quail-completion): Adjusted for the above change. Leave the + modified flag nil. + 2007-03-20 David Kastrup <dak@gnu.org> * files.el (magic-mode-alist): Require literal "%!PS" string for @@ -5385,7 +5753,7 @@ * dired.el (dired-build-subdir-alist): Fix previous change. -2006-10-01 Johan Bockg,Ae(Brd <bojohan+mail@dd.chalmers.se> +2006-10-01 Johan Bockg,Ae(Brd <bojohan@dd.chalmers.se> * simple.el (undo-elt-crosses-region): Fix the inequalities. @@ -21085,7 +21453,7 @@ * net/newsticker.el: Get rid of CVS keyword. -2005-09-19 Johan Bockg,Ae(Brd <bojohan+sf@dd.chalmers.se> +2005-09-19 Johan Bockg,Ae(Brd <bojohan@dd.chalmers.se> * dired-aux.el (dired-handle-overwrite): Don't use `format' here. The prompt is formatted later. @@ -30153,7 +30521,7 @@ (mail-directory-process defvar): Doc fix. (mail-names): Doc fix. -2005-03-25 Johan Bockg,Ae(Brd <bojohan+mail@dd.chalmers.se> (tiny change) +2005-03-25 Johan Bockg,Ae(Brd <bojohan@dd.chalmers.se> (tiny change) * textmodes/flyspell.el (mail-mode-flyspell-verify): Fix regexp syntax.
--- a/lisp/arc-mode.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/arc-mode.el Tue Apr 24 21:56:25 2007 +0000 @@ -723,6 +723,10 @@ (string-match "\\.[aA][rR][cC]$" (or buffer-file-name (buffer-name)))) 'arc) + ;; This pattern modelled on the BSD/GNU+Linux `file' command. + ;; Have seen capital "LHA's", and file has lower case "LHa's" too. + ;; Note this regexp is also in archive-exe-p. + ((looking-at "MZ\\(.\\|\n\\)\\{34\\}LH[aA]'s SFX ") 'lzh-exe) (t (error "Buffer format not recognized"))))) ;; ------------------------------------------------------------------------- (defun archive-summarize (&optional shut-up) @@ -1421,8 +1425,8 @@ ;; ------------------------------------------------------------------------- ;; Section: Lzh Archives -(defun archive-lzh-summarize () - (let ((p 1) +(defun archive-lzh-summarize (&optional start) + (let ((p (or start 1)) ;; 1 for .lzh, something further on for .exe (totalsize 0) (maxlen 8) files @@ -1438,7 +1442,7 @@ (time2 (archive-l-e (+ p 17) 2)) ;and UNIX format in level 2 header.) (hdrlvl (byte-after (+ p 20))) ;header level thsize ;total header size (base + extensions) - fnlen efnname fiddle ifnname width p2 + fnlen efnname osid fiddle ifnname width p2 neh ;beginning of next extension header (level 1 and 2) mode modestr uid gid text dir prname gname uname modtime moddate) @@ -1496,7 +1500,22 @@ (setq thsize (- neh p)))) (if (= hdrlvl 0) ;total header size (setq thsize hsize)) - (setq fiddle (if efnname (string= efnname (upcase efnname)))) + ;; OS ID field not present in level 0 header, use code 0 "generic" + ;; in that case as per lha program header.c get_header() + (setq osid (cond ((= hdrlvl 0) 0) + ((= hdrlvl 1) (char-after (+ p 22 fnlen 2))) + ((= hdrlvl 2) (char-after (+ p 23))))) + ;; Filename fiddling must follow the lha program, otherwise the name + ;; passed to "lha pq" etc won't match (which for an extract silently + ;; results in no output). As of version 1.14i it goes from the OS ID, + ;; - For 'M' MSDOS: msdos_to_unix_filename() downcases always, and + ;; converts "\" to "/". + ;; - For 0 generic: generic_to_unix_filename() downcases if there's + ;; no lower case already present, and converts "\" to "/". + ;; - For 'm' MacOS: macos_to_unix_filename() changes "/" to ":" and + ;; ":" to "/" + (setq fiddle (cond ((= ?M osid) t) + ((= 0 osid) (string= efnname (upcase efnname))))) (setq ifnname (if fiddle (downcase efnname) efnname)) (setq prname (if dir (concat dir ifnname) ifnname)) (setq width (if prname (string-width prname) 0)) @@ -1625,6 +1644,34 @@ ;; This should work even though newmode will be dynamically accessed. (lambda (old) (archive-calc-mode old newmode t)) files "a unix-style mode" 8)) + +;; ------------------------------------------------------------------------- +;; Section: Lzh Self-Extracting .exe Archives +;; +;; No support for modifying these files. It looks like the lha for unix +;; program (as of version 1.14i) can't create or retain the DOS exe part. +;; If you do an "lha a" on a .exe for instance it renames and writes to a +;; plain .lzh. + +(defun archive-lzh-exe-summarize () + "Summarize the contents of an LZH self-extracting exe, for `archive-mode'." + + ;; Skip the initial executable code part and apply archive-lzh-summarize + ;; to the archive part proper. The "-lh5-" etc regexp here for the start + ;; is the same as in archive-find-type. + ;; + ;; The lha program (version 1.14i) does this in skip_msdos_sfx1_code() by + ;; a similar scan. It looks for "..-l..-" plus for level 0 or 1 a test of + ;; the header checksum, or level 2 a test of the "attribute" and size. + ;; + (re-search-forward "..-l[hz][0-9ds]-" nil) + (archive-lzh-summarize (match-beginning 0))) + +;; `archive-lzh-extract' runs "lha pq", and that works for .exe as well as +;; .lzh files +(defalias 'archive-lzh-exe-extract 'archive-lzh-extract + "Extract a member from an LZH self-extracting exe, for `archive-mode'.") + ;; ------------------------------------------------------------------------- ;; Section: Zip Archives
--- a/lisp/button.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/button.el Tue Apr 24 21:56:25 2007 +0000 @@ -52,8 +52,10 @@ ;; Globals ;; Use color for the MS-DOS port because it doesn't support underline. +;; Also for the linux console. (defface button '((((type pc) (class color)) (:foreground "lightblue")) + (((type tty)) (:inherit link)) (t :underline t)) "Default face used for buttons." :group 'basic-faces)
--- a/lisp/calc/README Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/README Tue Apr 24 21:56:25 2007 +0000 @@ -17,7 +17,7 @@ daveg@synaptics.com, uunet!synaptx!daveg Currently maintained by: - Jay Belanger <belanger@truman.edu> + Jay Belanger <jay.p.belanger@gmail.com> From the introduction to the manual: @@ -59,7 +59,7 @@ Calc is written entirely in Emacs Lisp, for maximum portability. I am anxious to hear about your experiences using Calc. Send mail to -"belanger@truman.edu". A bug report is most useful if you include the +"jay.p.belanger@gmail.com". A bug report is most useful if you include the exact input and output that occurred, any modes in effect (such as the current precision), and so on. If you find Calc is difficult to operate in any way, or if you have other suggestions, don't hesitate to let me
--- a/lisp/calc/calc-aent.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-aent.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: Dave Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-alg.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-alg.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-arith.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-arith.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-bin.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-bin.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-comb.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-comb.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-cplx.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-cplx.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-embed.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-embed.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-ext.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-ext.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-fin.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-fin.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-forms.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-forms.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-frac.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-frac.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-funcs.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-funcs.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-graph.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-graph.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-help.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-help.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-incom.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-incom.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-keypd.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-keypd.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-lang.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-lang.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-macs.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-macs.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-map.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-map.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-math.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-math.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-misc.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-misc.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-mode.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-mode.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-mtx.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-mtx.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-poly.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-poly.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-prog.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-prog.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-rewr.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-rewr.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-rules.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-rules.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-sel.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-sel.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-stat.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-stat.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-store.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-store.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-stuff.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-stuff.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-trail.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-trail.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-undo.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-undo.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-units.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-units.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-vec.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-vec.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc-yank.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc-yank.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calc.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calc.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; Keywords: convenience, extensions ;; Version: 2.1 @@ -401,7 +401,7 @@ :group 'calc :type '(choice (string) (sexp))) -(defvar calc-bug-address "belanger@truman.edu" +(defvar calc-bug-address "jay.p.belanger@gmail.com" "Address of the maintainer of Calc, for use by `report-calc-bug'.") (defvar calc-scan-for-dels t @@ -1148,6 +1148,11 @@ (defvar calc-alg-map) ; Defined in calc-ext.el +(defun calc-version () + "Return version of this version of Calc." + (interactive) + (message (concat "Calc version " calc-version))) + (defun calc-mode () "Calculator major mode. @@ -1258,8 +1263,7 @@ (set (make-local-variable 'calc-main-buffer) buf)) (when (= (buffer-size) 0) (let ((buffer-read-only nil)) - (insert (propertize (concat "Emacs Calculator v" calc-version - " by Dave Gillespie\n") + (insert (propertize (concat "Emacs Calculator Trail\n") 'font-lock-face 'italic)))) (run-mode-hooks 'calc-trail-mode-hook))
--- a/lisp/calc/calcalg2.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calcalg2.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calcalg3.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calcalg3.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calccomp.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calccomp.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calc/calcsel2.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calc/calcsel2.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: David Gillespie <daveg@synaptics.com> -;; Maintainer: Jay Belanger <belanger@truman.edu> +;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com> ;; This file is part of GNU Emacs.
--- a/lisp/calendar/appt.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/appt.el Tue Apr 24 21:56:25 2007 +0000 @@ -233,8 +233,8 @@ ;; vars appt-msg-window and appt-visible are dropped. (let ((appt-display-format (if (eq appt-display-format 'ignore) - (cond (appt-msg-window 'window) - (appt-visible 'echo)) + (cond (appt-msg-window 'window) + (appt-visible 'echo)) appt-display-format))) (cond ((eq appt-display-format 'window) (funcall appt-disp-window-function @@ -457,7 +457,9 @@ (same-window-p (buffer-name appt-disp-buf))) ;; By default, split the bottom window and use the lower part. (appt-select-lowest-window) - (select-window (split-window))) + ;; Split the window, unless it's too small to do so. + (when (>= (window-height) (* 2 window-min-height)) + (select-window (split-window)))) (switch-to-buffer appt-disp-buf)) (calendar-set-mode-line (format " Appointment in %s minutes. %s " min-to-app new-time))
--- a/lisp/calendar/cal-china.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-china.el Tue Apr 24 21:56:25 2007 +0000 @@ -43,12 +43,6 @@ ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold ;; and Nachum Dershowitz, Cambridge University Press (2001). -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar date)
--- a/lisp/calendar/cal-coptic.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-coptic.el Tue Apr 24 21:56:25 2007 +0000 @@ -34,12 +34,6 @@ ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold ;; and Nachum Dershowitz, Cambridge University Press (2001). -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar date)
--- a/lisp/calendar/cal-dst.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-dst.el Tue Apr 24 21:56:25 2007 +0000 @@ -31,12 +31,6 @@ ;; This collection of functions implements the features of calendar.el and ;; holiday.el that deal with daylight saving time. -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (require 'calendar) @@ -266,12 +260,20 @@ expressions that when evaluated return the start and end dates, respectively. This function first attempts to use pre-calculated data from `calendar-dst-transition-cache', otherwise it calls -`calendar-dst-find-data' (and adds the results to the cache)." +`calendar-dst-find-data' (and adds the results to the cache). +If dates in YEAR cannot be handled by `encode-time' (e.g. if they +are too large to be represented as a lisp integer), then rather +than an error this function returns the result appropriate for +the current year." (let ((e (assoc year calendar-dst-transition-cache)) f) (or e (progn - (setq e (calendar-dst-find-data (encode-time 1 0 0 1 1 year)) + (setq e (calendar-dst-find-data + (condition-case nil + (encode-time 1 0 0 1 1 year) + (error + (encode-time 1 0 0 1 1 (nth 5 (decode-time)))))) f (nth 4 e) e (list year f (nth 5 e)) calendar-dst-transition-cache
--- a/lisp/calendar/cal-french.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-french.el Tue Apr 24 21:56:25 2007 +0000 @@ -37,12 +37,6 @@ ;; E. M. Reingold, N. Dershowitz, and S. M. Clamen, Software--Practice and ;; Experience, Volume 23, Number 4 (April, 1993), pages 383-404. -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar date)
--- a/lisp/calendar/cal-hebrew.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-hebrew.el Tue Apr 24 21:56:25 2007 +0000 @@ -35,12 +35,6 @@ ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold ;; and Nachum Dershowitz, Cambridge University Press (2001). -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar date)
--- a/lisp/calendar/cal-islam.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-islam.el Tue Apr 24 21:56:25 2007 +0000 @@ -34,12 +34,6 @@ ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold ;; and Nachum Dershowitz, Cambridge University Press (2001). -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar date)
--- a/lisp/calendar/cal-iso.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-iso.el Tue Apr 24 21:56:25 2007 +0000 @@ -34,12 +34,6 @@ ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold ;; and Nachum Dershowitz, Cambridge University Press (2001). -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar date)
--- a/lisp/calendar/cal-julian.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-julian.el Tue Apr 24 21:56:25 2007 +0000 @@ -34,12 +34,6 @@ ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold ;; and Nachum Dershowitz, Cambridge University Press (2001). -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar date)
--- a/lisp/calendar/cal-mayan.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-mayan.el Tue Apr 24 21:56:25 2007 +0000 @@ -43,8 +43,6 @@ ;; reingold@cs.uiuc.edu 1304 West Springfield Avenue ;; Urbana, Illinois 61801 -;; Comments, improvements, and bug reports should be sent to Reingold. - ;; Technical details of the Mayan calendrical calculations can be found in ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold ;; and Nachum Dershowitz, Cambridge University Press (2001), and in
--- a/lisp/calendar/cal-menu.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-menu.el Tue Apr 24 21:56:25 2007 +0000 @@ -31,12 +31,6 @@ ;; This collection of functions implements menu bar and popup menu support for ;; calendar.el. -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar displayed-month)
--- a/lisp/calendar/cal-move.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-move.el Tue Apr 24 21:56:25 2007 +0000 @@ -30,12 +30,6 @@ ;; This collection of functions implements movement in the calendar for ;; calendar.el. -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar displayed-month)
--- a/lisp/calendar/cal-persia.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-persia.el Tue Apr 24 21:56:25 2007 +0000 @@ -30,16 +30,6 @@ ;; This collection of functions implements the features of calendar.el and ;; diary.el that deal with the Persian calendar. -;; Technical details of all the calendrical calculations can be found in -;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold -;; and Nachum Dershowitz, Cambridge University Press (2001). - -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar date)
--- a/lisp/calendar/cal-x.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/cal-x.el Tue Apr 24 21:56:25 2007 +0000 @@ -31,12 +31,6 @@ ;; This collection of functions implements dedicated frames in X for ;; calendar.el. -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (require 'calendar)
--- a/lisp/calendar/calendar.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/calendar.el Tue Apr 24 21:56:25 2007 +0000 @@ -90,12 +90,6 @@ ;; reingold@cs.uiuc.edu with the SUBJECT "send-paper-cal" (no quotes) and ;; the message BODY containing your mailing address (snail). -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar displayed-month)
--- a/lisp/calendar/diary-lib.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/diary-lib.el Tue Apr 24 21:56:25 2007 +0000 @@ -29,12 +29,6 @@ ;; This collection of functions implements the diary features as described ;; in calendar.el. -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (require 'calendar) @@ -282,6 +276,7 @@ :group 'diary :type 'boolean :initialize 'custom-initialize-default + ;; FIXME overkill. :set 'diary-set-maybe-redraw :version "22.1") @@ -298,6 +293,9 @@ Only used if `diary-header-line-flag' is non-nil." :group 'diary :type 'sexp + :initialize 'custom-initialize-default + ;; FIXME overkill. + :set 'diary-set-maybe-redraw :version "22.1") (defvar diary-saved-point) ; internal @@ -440,10 +438,17 @@ (or (verify-visited-file-modtime diary-buffer) (revert-buffer t t)))) ;; Setup things like the header-line-format and invisibility-spec. - ;; This used to only run if the major-mode was default-major-mode, - ;; but that meant eg changes to header-line-format did not - ;; take effect from one diary invocation to the next. - (diary-mode) + (if (eq major-mode default-major-mode) + (diary-mode) + ;; This kludge is to make customizations to + ;; diary-header-line-flag after diary has been displayed + ;; take effect. Unconditionally calling (diary-mode) + ;; clobbers file local variables. + ;; http://lists.gnu.org/archive/html/emacs-pretest-bug/2007-03/msg00363.html + ;; http://lists.gnu.org/archive/html/emacs-pretest-bug/2007-04/msg00404.html + (if (eq major-mode 'diary-mode) + (setq header-line-format (and diary-header-line-flag + diary-header-line-format)))) ;; d-s-p is passed to the diary display function. (let ((diary-saved-point (point))) (save-excursion
--- a/lisp/calendar/holidays.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/holidays.el Tue Apr 24 21:56:25 2007 +0000 @@ -45,12 +45,6 @@ ;; reingold@cs.uiuc.edu with the SUBJECT "send-paper-cal" (no quotes) and ;; the message BODY containing your mailing address (snail). -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar displayed-month)
--- a/lisp/calendar/lunar.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/lunar.el Tue Apr 24 21:56:25 2007 +0000 @@ -43,12 +43,6 @@ ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold ;; and Nachum Dershowitz, Cambridge University Press (2001). -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar date)
--- a/lisp/calendar/parse-time.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/parse-time.el Tue Apr 24 21:56:25 2007 +0000 @@ -66,7 +66,8 @@ (aref parse-time-digits char)) (defsubst parse-time-string-chars (char) - (aref parse-time-syntax char)) + (and (< char (length parse-time-syntax)) + (aref parse-time-syntax char))) (put 'parse-error 'error-conditions '(parse-error error)) (put 'parse-error 'error-message "Parsing error")
--- a/lisp/calendar/solar.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/solar.el Tue Apr 24 21:56:25 2007 +0000 @@ -53,12 +53,6 @@ ;; ``Calendrical Calculations: The Millennium Edition'' by Edward M. Reingold ;; and Nachum Dershowitz, Cambridge University Press (2001). -;; Comments, corrections, and improvements should be sent to -;; Edward M. Reingold Department of Computer Science -;; (217) 333-6733 University of Illinois at Urbana-Champaign -;; reingold@cs.uiuc.edu 1304 West Springfield Avenue -;; Urbana, Illinois 61801 - ;;; Code: (defvar date)
--- a/lisp/calendar/todo-mode.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/calendar/todo-mode.el Tue Apr 24 21:56:25 2007 +0000 @@ -205,11 +205,11 @@ ;; by the binary insertion algorithm. However, you may not ;; really have a need for such accurate priorities amongst your ;; TODO items. If you now think about the binary insertion -;; halfing the size of the window each time, then the threshhold +;; halving the size of the window each time, then the threshold ;; is the window size at which it will stop. If you set the -;; threshhold to zero, the upper and lower bound will coincide at +;; threshold to zero, the upper and lower bound will coincide at ;; the end of the loop and you will insert your item just before -;; that point. If you set the threshhold to, e.g. 8, it will stop +;; that point. If you set the threshold to, e.g. 8, it will stop ;; as soon as the window size drops below that amount and will ;; insert the item in the approximate centre of that window. I ;; got the idea for this feature after reading a very helpful @@ -231,7 +231,7 @@ ;; an event (unless marked by &) ;; o The optional COUNT variable of todo-forward-item should be ;; applied to the other functions performing similar tasks -;; o Modularization could be done for repeaded elements of +;; o Modularization could be done for repeated elements of ;; the code, like the completing-read lines of code. ;; o license / version function ;; o export to diary file @@ -241,7 +241,7 @@ ;; outline mode) ;; o rewrite complete package to store data as lisp objects ;; and have display modes for display, for diary export, -;; etc. (Richard Stallman pointed out this is a bad idea) +;; etc. (Richard Stallman pointed out this is a bad idea) ;; o so base todo-mode.el on generic-mode.el instead ;; ;; History and Gossip @@ -254,7 +254,7 @@ ;; things to my parents' address! ;; ;; Oliver Seidel -;; (Lessingstr. 8, 65760 Eschborn, Federal Republic of Germany) +;; (Lessingstr. 8, 65760 Eschborn, Federal Republic of Germany) ;;; Code: @@ -280,7 +280,7 @@ diary. With the default value \"*/*\" the diary displays each entry every day and it may also be marked on every day of the calendar. Using \"&%%(equal (calendar-current-date) date)\" instead will only -show and mark todo entreis for today, but may slow down processing of +show and mark todo entries for today, but may slow down processing of the diary file somewhat." :type 'string :group 'todo) @@ -306,11 +306,11 @@ If you have 8 items in your TODO list, then you may get asked 4 questions by the binary insertion algorithm. However, you may not really have a need for such accurate priorities amongst your TODO -items. If you now think about the binary insertion halfing the size -of the window each time, then the threshhold is the window size at -which it will stop. If you set the threshhold to zero, the upper and +items. If you now think about the binary insertion halving the size +of the window each time, then the threshold is the window size at +which it will stop. If you set the threshold to zero, the upper and lower bound will coincide at the end of the loop and you will insert -your item just before that point. If you set the threshhold to, +your item just before that point. If you set the threshold to, e.g. 8, it will stop as soon as the window size drops below that amount and will insert the item in the approximate center of that window."
--- a/lisp/complete.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/complete.el Tue Apr 24 21:56:25 2007 +0000 @@ -190,6 +190,14 @@ (defvar PC-do-completion-end nil "Internal variable used by `PC-do-completion'.") +(make-variable-buffer-local 'PC-do-completion-end) + +(defvar PC-goto-end nil + "Internal variable set in `PC-do-completion', used in +`choose-completion-string-functions'.") + +(make-variable-buffer-local 'PC-goto-end) + ;;;###autoload (define-minor-mode partial-completion-mode "Toggle Partial Completion mode. @@ -242,11 +250,16 @@ (if partial-completion-mode 'add-hook 'remove-hook) 'choose-completion-string-functions (lambda (choice buffer mini-p base-size) - (if mini-p (goto-char (point-max)) + ;; When completing M-: (lisp- ) with point before the ), it is + ;; not appropriate to go to point-max (unlike the filename case). + (if (and (not PC-goto-end) + mini-p) + (goto-char (point-max)) ;; Need a similar hack for the non-minibuffer-case -- gm. (when PC-do-completion-end (goto-char PC-do-completion-end) (setq PC-do-completion-end nil))) + (setq PC-goto-end nil) nil)) ;; Build the env-completion and mapping table. (when (and partial-completion-mode (null PC-env-vars-alist)) @@ -417,7 +430,13 @@ (let ((result (try-completion string alist predicate))) (if (eq result t) string result))) -(defun PC-do-completion (&optional mode beg end) +;; TODO document MODE magic... +(defun PC-do-completion (&optional mode beg end goto-end) + "Internal function to do the work of partial completion. +Text to be completed lies between BEG and END. Normally when +replacing text in the minibuffer, this function replaces up to +point-max (as is appropriate for completing a file name). If +GOTO-END is non-nil, however, it instead replaces up to END." (or beg (setq beg (minibuffer-prompt-end))) (or end (setq end (point-max))) (let* ((table minibuffer-completion-table) @@ -753,6 +772,8 @@ (let ((prompt-end (minibuffer-prompt-end))) (with-output-to-temp-buffer "*Completions*" (display-completion-list (sort helpposs 'string-lessp)) + (setq PC-do-completion-end end + PC-goto-end goto-end) (with-current-buffer standard-output ;; Record which part of the buffer we are completing ;; so that choosing a completion from the list @@ -771,8 +792,7 @@ ;; plays around with point. (setq completion-base-size (if dirname dirlength - (- beg prompt-end)) - PC-do-completion-end end)))) + (- beg prompt-end)))))) (PC-temp-minibuffer-message " [Next char not unique]")) nil))))) @@ -886,11 +906,11 @@ ;; Alternatively alternatively, maybe end should be computed in ;; the same way as beg. That would change the behaviour though. (if (equal last-command 'PC-lisp-complete-symbol) - (PC-do-completion nil beg PC-lisp-complete-end) + (PC-do-completion nil beg PC-lisp-complete-end t) (if PC-lisp-complete-end (move-marker PC-lisp-complete-end end) (setq PC-lisp-complete-end (copy-marker end t))) - (PC-do-completion nil beg end)))) + (PC-do-completion nil beg end t)))) (defun PC-complete-as-file-name () "Perform completion on file names preceding point.
--- a/lisp/cus-edit.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/cus-edit.el Tue Apr 24 21:56:25 2007 +0000 @@ -422,7 +422,7 @@ :group 'development) (defgroup minibuffer nil - "Controling the behavior of the minibuffer." + "Controlling the behavior of the minibuffer." :link '(custom-manual "(emacs)Minibuffer") :group 'environment) @@ -443,7 +443,7 @@ :group 'environment) (defgroup auto-save nil - "Preventing accidential loss of data." + "Preventing accidental loss of data." :group 'files) (defgroup processes-basics nil
--- a/lisp/desktop.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/desktop.el Tue Apr 24 21:56:25 2007 +0000 @@ -45,9 +45,9 @@ ;; "Saving Emacs Sessions" in the GNU Emacs Manual. ;; When the desktop module is loaded, the function `desktop-kill' is -;; added to the `kill-emacs-hook'. This function is responsible for +;; added to the `kill-emacs-hook'. This function is responsible for ;; saving the desktop when Emacs is killed. Furthermore an anonymous -;; function is added to the `after-init-hook'. This function is +;; function is added to the `after-init-hook'. This function is ;; responsible for loading the desktop when Emacs is started. ;; Special handling. @@ -55,12 +55,12 @@ ;; Variables `desktop-buffer-mode-handlers' and `desktop-minor-mode-handlers' ;; are supplied to handle special major and minor modes respectively. ;; `desktop-buffer-mode-handlers' is an alist of major mode specific functions -;; to restore a desktop buffer. Elements must have the form +;; to restore a desktop buffer. Elements must have the form ;; ;; (MAJOR-MODE . RESTORE-BUFFER-FUNCTION). ;; ;; Functions listed are called by `desktop-create-buffer' when `desktop-read' -;; evaluates the desktop file. Buffers with a major mode not specified here, +;; evaluates the desktop file. Buffers with a major mode not specified here, ;; are restored by the default handler `desktop-restore-file-buffer'. ;; `desktop-minor-mode-handlers' is an alist of functions to restore ;; non-standard minor modes. Elements must have the form @@ -85,7 +85,7 @@ ;; '(bar-mode . bar-desktop-restore)) ;; in the module itself, and make shure that the mode function is -;; autoloaded. See the docstrings of `desktop-buffer-mode-handlers' and +;; autoloaded. See the docstrings of `desktop-buffer-mode-handlers' and ;; `desktop-minor-mode-handlers' for more info. ;; Minor modes. @@ -100,7 +100,7 @@ ;; The variables `desktop-minor-mode-table' and `desktop-minor-mode-handlers' ;; are used to handle non-conventional minor modes. `desktop-save' uses ;; `desktop-minor-mode-table' to map minor mode variables to minor mode -;; functions before writing `desktop-minor-modes'. If a minor mode has a +;; functions before writing `desktop-minor-modes'. If a minor mode has a ;; variable name that is different form its function name, an entry ;; (NAME RESTORE-FUNCTION) @@ -619,8 +619,7 @@ (setq newlist (cons q.txt newlist))) (setq p (cdr p))) (if p - (let ((last (desktop-internal-v2s p)) - (el (car newlist))) + (let ((last (desktop-internal-v2s p))) (or anynil (setq anynil (null (car last)))) (or anynil (setq newlist (cons '(must . ".") newlist))) @@ -782,7 +781,8 @@ ";; Desktop file format version " desktop-file-version "\n" ";; Emacs version " emacs-version "\n\n" ";; Global section:\n") - (mapcar (function desktop-outvar) desktop-globals-to-save) + (dolist (varspec desktop-globals-to-save) + (desktop-outvar varspec)) (if (memq 'kill-ring desktop-globals-to-save) (insert "(setq kill-ring-yank-pointer (nthcdr " @@ -790,22 +790,20 @@ " kill-ring))\n")) (insert "\n;; Buffer section -- buffers listed in same order as in buffer list:\n") - (mapcar #'(lambda (l) - (when (apply 'desktop-save-buffer-p l) - (insert "(" - (if (or (not (integerp eager)) - (unless (zerop eager) - (setq eager (1- eager)) - t)) - "desktop-create-buffer" - "desktop-append-buffer-args") - " " - desktop-file-version) - (mapcar #'(lambda (e) - (insert "\n " (desktop-value-to-string e))) - l) - (insert ")\n\n"))) - info) + (dolist (l info) + (when (apply 'desktop-save-buffer-p l) + (insert "(" + (if (or (not (integerp eager)) + (unless (zerop eager) + (setq eager (1- eager)) + t)) + "desktop-create-buffer" + "desktop-append-buffer-args") + " " + desktop-file-version) + (dolist (e l) + (insert "\n " (desktop-value-to-string e))) + (insert ")\n\n"))) (setq default-directory dirname) (let ((coding-system-for-write 'utf-8-emacs)) (write-region (point-min) (point-max) filename nil 'nomessage))))) @@ -941,14 +939,13 @@ (desktop-clear) (desktop-read desktop-dirname)) +(defvar desktop-buffer-major-mode) +(defvar desktop-buffer-locals) ;; ---------------------------------------------------------------------------- (defun desktop-restore-file-buffer (desktop-buffer-file-name desktop-buffer-name desktop-buffer-misc) "Restore a file buffer." - (eval-when-compile ; Just to silence the byte compiler - (defvar desktop-buffer-major-mode) - (defvar desktop-buffer-locals)) (if desktop-buffer-file-name (if (or (file-exists-p desktop-buffer-file-name) (let ((msg (format "Desktop: File \"%s\" no longer exists." @@ -985,8 +982,12 @@ ;; called from Desktop file only. ;; Just to silence the byte compiler. -(eval-when-compile - (defvar desktop-first-buffer)) ; Dynamically bound in `desktop-read' + +(defvar desktop-first-buffer) ; Dynamically bound in `desktop-read' + +;; Bound locally in `desktop-read'. +(defvar desktop-buffer-ok-count) +(defvar desktop-buffer-fail-count) (defun desktop-create-buffer (desktop-file-version @@ -1000,10 +1001,6 @@ desktop-buffer-misc &optional desktop-buffer-locals) - ;; Just to silence the byte compiler. Bound locally in `desktop-read'. - (eval-when-compile - (defvar desktop-buffer-ok-count) - (defvar desktop-buffer-fail-count)) ;; To make desktop files with relative file names possible, we cannot ;; allow `default-directory' to change. Therefore we save current buffer. (save-current-buffer @@ -1045,21 +1042,22 @@ ((equal '(nil) desktop-buffer-minor-modes) ; backwards compatible (auto-fill-mode 0)) (t - (mapcar #'(lambda (minor-mode) - ;; Give minor mode module a chance to add a handler. - (desktop-load-file minor-mode) - (let ((handler (cdr (assq minor-mode desktop-minor-mode-handlers)))) - (if handler - (funcall handler desktop-buffer-locals) - (when (functionp minor-mode) - (funcall minor-mode 1))))) - desktop-buffer-minor-modes))) - ;; Even though point and mark are non-nil when written by `desktop-save', - ;; they may be modified by handlers wanting to set point or mark themselves. + (dolist (minor-mode desktop-buffer-minor-modes) + ;; Give minor mode module a chance to add a handler. + (desktop-load-file minor-mode) + (let ((handler (cdr (assq minor-mode desktop-minor-mode-handlers)))) + (if handler + (funcall handler desktop-buffer-locals) + (when (functionp minor-mode) + (funcall minor-mode 1))))))) + ;; Even though point and mark are non-nil when written by + ;; `desktop-save', they may be modified by handlers wanting to set + ;; point or mark themselves. (when desktop-buffer-point (goto-char (condition-case err - ;; Evaluate point. Thus point can be something like '(search-forward ... + ;; Evaluate point. Thus point can be something like + ;; '(search-forward ... (eval desktop-buffer-point) (error (message "%s" (error-message-string err)) 1)))) (when desktop-buffer-mark @@ -1167,7 +1165,7 @@ ;; functions are processed after `after-init-hook'. (add-hook 'after-init-hook - '(lambda () + (lambda () (let ((key "--no-desktop")) (when (member key command-line-args) (setq command-line-args (delete key command-line-args)) @@ -1176,5 +1174,5 @@ (provide 'desktop) -;;; arch-tag: 221907c3-1771-4fd3-9c2e-c6f700c6ede9 +;; arch-tag: 221907c3-1771-4fd3-9c2e-c6f700c6ede9 ;;; desktop.el ends here
--- a/lisp/dired-x.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/dired-x.el Tue Apr 24 21:56:25 2007 +0000 @@ -790,21 +790,18 @@ (revert-buffer))) ;; A zero-arg version of dired-virtual. -;; You need my modified version of set-auto-mode for the -;; `buffer-contents-mode-alist'. -;; Or you use infer-mode.el and infer-mode-alist, same syntax. (defun dired-virtual-mode () "Put current buffer into Virtual Dired mode (see `dired-virtual'). -Useful on `buffer-contents-mode-alist' (which see) with the regexp +Useful on `magic-mode-alist' with the regexp - \"^ \\(/[^ /]+\\)/?+:$\" + \"^ \\\\(/[^ /]+\\\\)+/?:$\" to put saved dired buffers automatically into Virtual Dired mode. -Also useful for `auto-mode-alist' (which see) like this: +Also useful for `auto-mode-alist' like this: - \(setq auto-mode-alist (cons '(\"[^/]\\.dired\\'\" . dired-virtual-mode) - auto-mode-alist)\)" + (add-to-list 'auto-mode-alist + '(\"[^/]\\\\.dired\\\\'\" . dired-virtual-mode))" (interactive) (dired-virtual (dired-virtual-guess-dir)))
--- a/lisp/dired.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/dired.el Tue Apr 24 21:56:25 2007 +0000 @@ -1251,19 +1251,19 @@ (define-key map "\177" 'dired-unmark-backward) (define-key map [remap undo] 'dired-undo) (define-key map [remap advertised-undo] 'dired-undo) - ;; thumbnail manipulation (tumme) - (define-key map "\C-td" 'tumme-display-thumbs) - (define-key map "\C-tt" 'tumme-tag-files) - (define-key map "\C-tr" 'tumme-delete-tag) - (define-key map "\C-tj" 'tumme-jump-thumbnail-buffer) - (define-key map "\C-ti" 'tumme-dired-display-image) - (define-key map "\C-tx" 'tumme-dired-display-external) - (define-key map "\C-ta" 'tumme-display-thumbs-append) - (define-key map "\C-t." 'tumme-display-thumb) - (define-key map "\C-tc" 'tumme-dired-comment-files) - (define-key map "\C-tf" 'tumme-mark-tagged-files) - (define-key map "\C-t\C-t" 'tumme-dired-insert-marked-thumbs) - (define-key map "\C-te" 'tumme-dired-edit-comment-and-tags) + ;; thumbnail manipulation (image-dired) + (define-key map "\C-td" 'image-dired-display-thumbs) + (define-key map "\C-tt" 'image-dired-tag-files) + (define-key map "\C-tr" 'image-dired-delete-tag) + (define-key map "\C-tj" 'image-dired-jump-thumbnail-buffer) + (define-key map "\C-ti" 'image-dired-dired-display-image) + (define-key map "\C-tx" 'image-dired-dired-display-external) + (define-key map "\C-ta" 'image-dired-display-thumbs-append) + (define-key map "\C-t." 'image-dired-display-thumb) + (define-key map "\C-tc" 'image-dired-dired-comment-files) + (define-key map "\C-tf" 'image-dired-mark-tagged-files) + (define-key map "\C-t\C-t" 'image-dired-dired-insert-marked-thumbs) + (define-key map "\C-te" 'image-dired-dired-edit-comment-and-tags) ;; Make menu bar items. @@ -1310,12 +1310,12 @@ (cons "Immediate" (make-sparse-keymap "Immediate"))) (define-key map - [menu-bar immediate tumme-dired-display-external] - '(menu-item "Display Image Externally" tumme-dired-display-external + [menu-bar immediate image-dired-dired-display-external] + '(menu-item "Display Image Externally" image-dired-dired-display-external :help "Display image in external viewer")) (define-key map - [menu-bar immediate tumme-dired-display-image] - '(menu-item "Display Image" tumme-dired-display-image + [menu-bar immediate image-dired-dired-display-image] + '(menu-item "Display Image" image-dired-dired-display-image :help "Display sized image in a separate window")) (define-key map [menu-bar immediate dashes-4] @@ -1358,8 +1358,8 @@ (cons "Regexp" (make-sparse-keymap "Regexp"))) (define-key map - [menu-bar regexp tumme-mark-tagged-files] - '(menu-item "Mark From Image Tag..." tumme-mark-tagged-files + [menu-bar regexp image-dired-mark-tagged-files] + '(menu-item "Mark From Image Tag..." image-dired-mark-tagged-files :help "Mark files whose image tags matches regexp")) (define-key map [menu-bar regexp dashes-1] @@ -1456,21 +1456,21 @@ '("--")) (define-key map - [menu-bar operate tumme-delete-tag] - '(menu-item "Delete Image Tag..." tumme-delete-tag + [menu-bar operate image-dired-delete-tag] + '(menu-item "Delete Image Tag..." image-dired-delete-tag :help "Delete image tag from current or marked files")) (define-key map - [menu-bar operate tumme-tag-files] - '(menu-item "Add Image Tags..." tumme-tag-files + [menu-bar operate image-dired-tag-files] + '(menu-item "Add Image Tags..." image-dired-tag-files :help "Add image tags to current or marked files")) (define-key map - [menu-bar operate tumme-dired-comment-files] - '(menu-item "Add Image Comment..." tumme-dired-comment-files + [menu-bar operate image-dired-dired-comment-files] + '(menu-item "Add Image Comment..." image-dired-dired-comment-files :help "Add image comment to current or marked files")) (define-key map - [menu-bar operate tumme-display-thumbs] - '(menu-item "Display Thumbnails" tumme-display-thumbs - :help "Display thumbnails for current or marked image files")) + [menu-bar operate image-dired-display-thumbs] + '(menu-item "Display Image-Dired" image-dired-display-thumbs + :help "Display image-dired for current or marked image files")) (define-key map [menu-bar operate dashes-3] '("--"))
--- a/lisp/dnd.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/dnd.el Tue Apr 24 21:56:25 2007 +0000 @@ -146,7 +146,7 @@ (substring uri (match-end 0)))))) (when (and f must-exist) (setq f (replace-regexp-in-string - "%[A-Z0-9][A-Z0-9]" + "%[A-Fa-f0-9][A-Fa-f0-9]" (lambda (arg) (let ((str (make-string 1 0))) (aset str 0 (string-to-number (substring arg 1) 16))
--- a/lisp/emacs-lisp/byte-opt.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/emacs-lisp/byte-opt.el Tue Apr 24 21:56:25 2007 +0000 @@ -557,8 +557,20 @@ ;; Otherwise, no args can be considered to be for-effect, ;; even if the called function is for-effect, because we ;; don't know anything about that function. - (cons fn (mapcar 'byte-optimize-form (cdr form))))))) + (let ((args (mapcar #'byte-optimize-form (cdr form)))) + (if (and (get fn 'pure) + (byte-optimize-all-constp args)) + (list 'quote (apply fn (mapcar #'eval args))) + (cons fn args))))))) +(defun byte-optimize-all-constp (list) + "Non-nil iff all elements of LIST satisfy `byte-compile-constp'." + (let ((constant t)) + (while (and list constant) + (unless (byte-compile-constp (car list)) + (setq constant nil)) + (setq list (cdr list))) + constant)) (defun byte-optimize-form (form &optional for-effect) "The source-level pass of the optimizer." @@ -1117,26 +1129,6 @@ (byte-optimize-predicate form)) form)) -;; Avoid having to write forward-... with a negative arg for speed. -;; Fixme: don't be limited to constant args. -(put 'backward-char 'byte-optimizer 'byte-optimize-backward-char) -(defun byte-optimize-backward-char (form) - (cond ((and (= 2 (safe-length form)) - (numberp (nth 1 form))) - (list 'forward-char (eval (- (nth 1 form))))) - ((= 1 (safe-length form)) - '(forward-char -1)) - (t form))) - -(put 'backward-word 'byte-optimizer 'byte-optimize-backward-word) -(defun byte-optimize-backward-word (form) - (cond ((and (= 2 (safe-length form)) - (numberp (nth 1 form))) - (list 'forward-word (eval (- (nth 1 form))))) - ((= 1 (safe-length form)) - '(forward-word -1)) - (t form))) - ;; Fixme: delete-char -> delete-region (byte-coded) ;; optimize string-as-unibyte, string-as-multibyte, string-make-unibyte, ;; string-make-multibyte for constant args. @@ -1266,6 +1258,18 @@ (setq side-effect-and-error-free-fns (cdr side-effect-and-error-free-fns))) nil) + +;; pure functions are side-effect free functions whose values depend +;; only on their arguments. For these functions, calls with constant +;; arguments can be evaluated at compile time. This may shift run time +;; errors to compile time. + +(let ((pure-fns + '(concat symbol-name regexp-opt regexp-quote string-to-syntax))) + (while pure-fns + (put (car pure-fns) 'pure t) + (setq pure-fns (cdr pure-fns))) + nil) (defun byte-compile-splice-in-already-compiled-code (form) ;; form is (byte-code "..." [...] n)
--- a/lisp/emacs-lisp/bytecomp.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/emacs-lisp/bytecomp.el Tue Apr 24 21:56:25 2007 +0000 @@ -3149,6 +3149,8 @@ ;; more complicated compiler macros (byte-defop-compiler char-before) +(byte-defop-compiler backward-char) +(byte-defop-compiler backward-word) (byte-defop-compiler list) (byte-defop-compiler concat) (byte-defop-compiler fset) @@ -3162,10 +3164,31 @@ (defun byte-compile-char-before (form) (cond ((= 2 (length form)) - (byte-compile-form `(char-after (1- ,(nth 1 form))))) - ((= 1 (length form)) - (byte-compile-form '(char-after (1- (point))))) - (t (byte-compile-subr-wrong-args form "0-1")))) + (byte-compile-form (list 'char-after (if (numberp (nth 1 form)) + (1- (nth 1 form)) + `(1- ,(nth 1 form)))))) + ((= 1 (length form)) + (byte-compile-form '(char-after (1- (point))))) + (t (byte-compile-subr-wrong-args form "0-1")))) + +;; backward-... ==> forward-... with negated argument. +(defun byte-compile-backward-char (form) + (cond ((= 2 (length form)) + (byte-compile-form (list 'forward-char (if (numberp (nth 1 form)) + (- (nth 1 form)) + `(- ,(nth 1 form)))))) + ((= 1 (length form)) + (byte-compile-form '(forward-char -1))) + (t (byte-compile-subr-wrong-args form "0-1")))) + +(defun byte-compile-backward-word (form) + (cond ((= 2 (length form)) + (byte-compile-form (list 'forward-word (if (numberp (nth 1 form)) + (- (nth 1 form)) + `(- ,(nth 1 form)))))) + ((= 1 (length form)) + (byte-compile-form '(forward-word -1))) + (t (byte-compile-subr-wrong-args form "0-1")))) (defun byte-compile-list (form) (let ((count (length (cdr form))))
--- a/lisp/emacs-lisp/easy-mmode.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/emacs-lisp/easy-mmode.el Tue Apr 24 21:56:25 2007 +0000 @@ -327,11 +327,12 @@ (make-variable-buffer-local ',MODE-major-mode) ;; The actual global minor-mode (define-minor-mode ,global-mode - ,(format "Toggle %s in every buffer. + ,(format "Toggle %s in every possible buffer. With prefix ARG, turn %s on if and only if ARG is positive. -%s is actually not turned on in every buffer but only in those -in which `%s' turns it on." - pretty-name pretty-global-name pretty-name turn-on) +%s is enabled in all buffers where `%s' would do it. +See `%s' for more information on %s." + pretty-name pretty-global-name pretty-name turn-on + mode pretty-name) :global t ,@group ,@(nreverse extra-keywords) ;; Setup hook to handle future mode changes and new buffers.
--- a/lisp/emacs-lisp/edebug.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/emacs-lisp/edebug.el Tue Apr 24 21:56:25 2007 +0000 @@ -364,31 +364,39 @@ (defun edebug-pop-to-buffer (buffer &optional window) ;; Like pop-to-buffer, but select window where BUFFER was last shown. - ;; Select WINDOW if it provided and it still exists. Otherwise, + ;; Select WINDOW if it is provided and still exists. Otherwise, ;; if buffer is currently shown in several windows, choose one. ;; Otherwise, find a new window, possibly splitting one. - (setq window (if (and (windowp window) (edebug-window-live-p window) - (eq (window-buffer window) buffer)) - window - (if (eq (window-buffer (selected-window)) buffer) - (selected-window) - (edebug-get-buffer-window buffer)))) - (if window - (select-window window) - (if (one-window-p) - (split-window)) - ;; (message "next window: %s" (next-window)) (sit-for 1) - (if (eq (get-buffer-window edebug-trace-buffer) (next-window)) - ;; Don't select trace window - nil - (select-window (next-window)))) - (set-window-buffer (selected-window) buffer) - (set-window-hscroll (selected-window) 0);; should this be?? + (setq window + (cond + ((and (windowp window) (edebug-window-live-p window) + (eq (window-buffer window) buffer)) + window) + ((eq (window-buffer (selected-window)) buffer) + ;; Selected window already displays BUFFER. + (selected-window)) + ((edebug-get-buffer-window buffer)) + ((one-window-p 'nomini) + ;; When there's one window only, split it. + (split-window)) + ((let ((trace-window (get-buffer-window edebug-trace-buffer))) + (catch 'found + (dolist (elt (window-list nil 'nomini)) + (unless (or (eq elt (selected-window)) (eq elt trace-window) + (window-dedicated-p elt)) + ;; Found a non-dedicated window not showing + ;; `edebug-trace-buffer', use it. + (throw 'found elt)))))) + ;; All windows are dedicated or show `edebug-trace-buffer', split + ;; selected one. + (t (split-window)))) + (select-window window) + (set-window-buffer window buffer) + (set-window-hscroll window 0);; should this be?? ;; Selecting the window does not set the buffer until command loop. ;;(set-buffer buffer) ) - (defun edebug-get-displayed-buffer-points () ;; Return a list of buffer point pairs, for all displayed buffers. (let (list)
--- a/lisp/files.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/files.el Tue Apr 24 21:56:25 2007 +0000 @@ -2123,19 +2123,20 @@ `((image-type-auto-detected-p . image-mode) ;; The < comes before the groups (but the first) to reduce backtracking. ;; TODO: UTF-16 <?xml may be preceded by a BOM 0xff 0xfe or 0xfe 0xff. - ;; We use [ \t\n] instead of `\\s ' to make regex overflow less likely. + ;; We use [ \t\r\n] instead of `\\s ' to make regex overflow less likely. (,(let* ((incomment-re "\\(?:[^-]\\|-[^-]\\)") - (comment-re (concat "\\(?:!--" incomment-re "*-->[ \t\n]*<\\)"))) - (concat "\\(?:<\\?xml[ \t\n]+[^>]*>\\)?[ \t\n]*<" + (comment-re (concat "\\(?:!--" incomment-re "*-->[ \t\r\n]*<\\)"))) + (concat "\\(?:<\\?xml[ \t\r\n]+[^>]*>\\)?[ \t\r\n]*<" comment-re "*" - "\\(?:!DOCTYPE[ \t\n]+[^>]*>[ \t\n]*<[ \t\n]*" comment-re "*\\)?" + "\\(?:!DOCTYPE[ \t\r\n]+[^>]*>[ \t\r\n]*<[ \t\r\n]*" comment-re "*\\)?" "[Hh][Tt][Mm][Ll]")) . html-mode) + ("<!DOCTYPE[ \t\r\n]+[Hh][Tt][Mm][Ll]" . html-mode) ;; These two must come after html, because they are more general: ("<\\?xml " . xml-mode) (,(let* ((incomment-re "\\(?:[^-]\\|-[^-]\\)") - (comment-re (concat "\\(?:!--" incomment-re "*-->[ \t\n]*<\\)"))) - (concat "[ \t\n]*<" comment-re "*!DOCTYPE ")) + (comment-re (concat "\\(?:!--" incomment-re "*-->[ \t\r\n]*<\\)"))) + (concat "[ \t\r\n]*<" comment-re "*!DOCTYPE ")) . sgml-mode) ("%!PS" . ps-mode) ("# xmcd " . conf-unix-mode)) @@ -2434,13 +2435,14 @@ (mapc (lambda (pair) (put (car pair) 'safe-local-variable (cdr pair))) - '((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) - (tab-width . integerp) ;; C source code - (truncate-lines . booleanp))) ;; C source code + '((buffer-read-only . booleanp) ;; C source code + (default-directory . stringp) ;; 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) + (tab-width . integerp) ;; C source code + (truncate-lines . booleanp))) ;; C source code (put 'c-set-style 'safe-local-eval-function t)
--- a/lisp/font-lock.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/font-lock.el Tue Apr 24 21:56:25 2007 +0000 @@ -468,6 +468,7 @@ This is normally set via `font-lock-add-keywords' and `font-lock-remove-keywords'.") +(put 'font-lock-keywords-alist 'risky-local-variable t) (defvar font-lock-removed-keywords-alist nil "Alist of `font-lock-keywords' elements to be removed for major modes.
--- a/lisp/gnus/ChangeLog Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/gnus/ChangeLog Tue Apr 24 21:56:25 2007 +0000 @@ -1,3 +1,15 @@ +2007-04-19 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-art.el (gnus-mime-strip-charset-parameters): New function. + (gnus-mime-view-part-as-charset): Use it; redisplay subpart currently + displayed of multipart/alternative part if it is invoked from summary + buffer. + (gnus-article-part-wrapper): Select article window. + + * mm-view.el (mm-inline-text-html-render-with-w3m) + (mm-inline-text-html-render-with-w3m-standalone) + (mm-inline-render-with-function): Use mail-parse-charset by default. + 2007-04-10 Katsumi Yamaoka <yamaoka@jpl.org> * gnus-msg.el (gnus-inews-yank-articles): Use
--- a/lisp/gnus/gnus-art.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/gnus/gnus-art.el Tue Apr 24 21:56:25 2007 +0000 @@ -4606,6 +4606,21 @@ (mm-string-to-multibyte contents))) (goto-char b))))) +(defun gnus-mime-strip-charset-parameters (handle) + "Strip charset parameters from HANDLE." + (if (stringp (car handle)) + (mapc #'gnus-mime-strip-charset-parameters (cdr handle)) + (let* ((type (mm-handle-type (if (equal (mm-handle-media-type handle) + "message/external-body") + (progn + (unless (mm-handle-cache handle) + (mm-extern-cache-contents handle)) + (mm-handle-cache handle)) + handle))) + (charset (assq 'charset (cdr type)))) + (when charset + (delq charset type))))) + (defun gnus-mime-view-part-as-charset (&optional handle arg) "Insert the MIME part under point into the current buffer using the specified charset." @@ -4614,7 +4629,7 @@ (let ((handle (or handle (get-text-property (point) 'gnus-data))) (fun (get-text-property (point) 'gnus-callback)) (gnus-newsgroup-ignored-charsets 'gnus-all) - gnus-newsgroup-charset type charset) + gnus-newsgroup-charset form preferred parts) (when handle (if (mm-handle-undisplayer handle) (mm-remove-part handle)) @@ -4622,17 +4637,24 @@ (setq gnus-newsgroup-charset (or (cdr (assq arg gnus-summary-show-article-charset-alist)) (mm-read-coding-system "Charset: "))) - ;; Strip the charset parameter from `handle'. - (setq type (mm-handle-type - (if (equal (mm-handle-media-type handle) - "message/external-body") - (progn - (unless (mm-handle-cache handle) - (mm-extern-cache-contents handle)) - (mm-handle-cache handle)) - handle)) - charset (assq 'charset (cdr type))) - (delq charset type) + (gnus-mime-strip-charset-parameters handle) + (when (and (consp (setq form (cdr-safe fun))) + (setq form (ignore-errors + (assq 'gnus-mime-display-alternative form))) + (setq preferred (caddr form)) + (progn + (when (eq (car preferred) 'quote) + (setq preferred (cadr preferred))) + (not (equal preferred + (get-text-property (point) 'gnus-data)))) + (setq parts (get-text-property (point) 'gnus-part)) + (setq parts (cdr (assq parts + gnus-article-mime-handle-alist))) + (equal (mm-handle-media-type parts) "multipart/alternative") + (setq parts (reverse (cdr parts)))) + (setcar (cddr form) + (list 'quote (or (cadr (member preferred parts)) + (car parts))))) (funcall fun handle))))) (defun gnus-mime-view-part-externally (&optional handle) @@ -4688,13 +4710,22 @@ (funcall (cdr action-pair))))) (defun gnus-article-part-wrapper (n function) - (save-current-buffer - (set-buffer gnus-article-buffer) - (when (> n (length gnus-article-mime-handle-alist)) - (error "No such part")) - (gnus-article-goto-part n) - (let ((handle (cdr (assq n gnus-article-mime-handle-alist)))) - (funcall function handle)))) + (let ((window (get-buffer-window gnus-article-buffer 'visible)) + frame) + (when window + ;; It is necessary to select the article window so that + ;; `gnus-article-goto-part' may really move the point. + (setq frame (selected-frame)) + (gnus-select-frame-set-input-focus (window-frame window)) + (unwind-protect + (save-window-excursion + (select-window window) + (when (> n (length gnus-article-mime-handle-alist)) + (error "No such part")) + (gnus-article-goto-part n) + (let ((handle (cdr (assq n gnus-article-mime-handle-alist)))) + (funcall function handle))) + (gnus-select-frame-set-input-focus frame))))) (defun gnus-article-pipe-part (n) "Pipe MIME part N, which is the numerical prefix."
--- a/lisp/gnus/mm-view.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/gnus/mm-view.el Tue Apr 24 21:56:25 2007 +0000 @@ -238,7 +238,8 @@ (mm-setup-w3m) (let ((text (mm-get-part handle)) (b (point)) - (charset (mail-content-type-get (mm-handle-type handle) 'charset))) + (charset (or (mail-content-type-get (mm-handle-type handle) 'charset) + mail-parse-charset))) (save-excursion (insert (if charset (mm-decode-string text charset) text)) (save-restriction @@ -302,7 +303,9 @@ "Render a text/html part using w3m." (if (mm-w3m-standalone-supports-m17n-p) (let ((source (mm-get-part handle)) - (charset (mail-content-type-get (mm-handle-type handle) 'charset)) + (charset (or (mail-content-type-get (mm-handle-type handle) + 'charset) + (symbol-name mail-parse-charset))) cs) (unless (and charset (setq cs (mm-charset-to-coding-system charset)) @@ -368,7 +371,8 @@ (defun mm-inline-render-with-function (handle func &rest args) (let ((source (mm-get-part handle)) - (charset (mail-content-type-get (mm-handle-type handle) 'charset))) + (charset (or (mail-content-type-get (mm-handle-type handle) 'charset) + mail-parse-charset))) (mm-insert-inline handle (mm-with-multibyte-buffer
--- a/lisp/hi-lock.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/hi-lock.el Tue Apr 24 21:56:25 2007 +0000 @@ -3,7 +3,7 @@ ;; Copyright (C) 2000, 2001, 2002, 2003, 2004, ;; 2005, 2006, 2007 Free Software Foundation, Inc. -;; Author: David M. Koppelman, koppel@ee.lsu.edu +;; Author: David M. Koppelman, koppel@ece.lsu.edu ;; Keywords: faces, minor-mode, matching, display ;; This file is part of GNU Emacs. @@ -33,7 +33,8 @@ ;; will remove the highlighting. Any existing face can be used for ;; highlighting and a set of appropriate faces is provided. The ;; regexps can be written into the current buffer in a form that will -;; be recognized the next time the corresponding file is read. +;; be recognized the next time the corresponding file is read (when +;; file patterns is turned on). ;; ;; Applications: ;; @@ -60,6 +61,14 @@ ;; ;; (global-hi-lock-mode 1) ;; +;; To enable the use of patterns found in files (presumably placed +;; there by hi-lock) include the following in your .emacs file: +;; +;; (setq hi-lock-file-patterns-policy 'ask) +;; +;; If you get tired of being asked each time a file is loaded replace +;; `ask' with a function that returns t if patterns should be read. +;; ;; You might also want to bind the hi-lock commands to more ;; finger-friendly sequences: @@ -115,6 +124,20 @@ :type '(repeat symbol) :group 'hi-lock) +(defcustom hi-lock-file-patterns-policy 'never + "Specify when hi-lock should use patterns found in file. +If `ask', prompt when patterns found in buffer; if bound to a function, +use patterns when function returns t (function is called with patterns +as first argument); if nil or `never' or anything else, don't use file +patterns." + :type '(choice (const :tag "Do not use file patterns" never) + (const :tag "Ask about file patterns" ask) + (function :tag "Function to check file patterns")) + :group 'hi-lock + :version "22.1") + +;; It can have a function value. +(put 'hi-lock-file-patterns-policy 'risky-local-variable t) (defgroup hi-lock-faces nil "Faces for hi-lock." @@ -196,7 +219,7 @@ "History of regexps used for interactive fontification.") (defvar hi-lock-file-patterns-prefix "Hi-lock" - "Regexp for finding hi-lock patterns at top of file.") + "Search target for finding hi-lock patterns at top of file.") (defvar hi-lock-archaic-interface-message-used nil "True if user alerted that `global-hi-lock-mode' is now the global switch. @@ -283,17 +306,22 @@ Remove highlighting on matches of REGEXP in current buffer. \\[hi-lock-write-interactive-patterns] - Write active REGEXPs into buffer as comments (if possible). They will + Write active REGEXPs into buffer as comments (if possible). They may be read the next time file is loaded or when the \\[hi-lock-find-patterns] command is issued. The inserted regexps are in the form of font lock keywords. - (See `font-lock-keywords'.) They may be edited and re-loaded with \\[hi-lock-find-patterns], - any valid `font-lock-keywords' form is acceptable. + (See `font-lock-keywords'.) They may be edited and re-loaded with \\[hi-lock-find-patterns], + any valid `font-lock-keywords' form is acceptable. When a file is + loaded the patterns are read if `hi-lock-file-patterns-policy is + 'ask and the user responds y to the prompt, or if + `hi-lock-file-patterns-policy' is bound to a function and that + function returns t. \\[hi-lock-find-patterns] Re-read patterns stored in buffer (in the format produced by \\[hi-lock-write-interactive-patterns]). -When hi-lock is started and if the mode is not excluded, the -beginning of the buffer is searched for lines of the form: +When hi-lock is started and if the mode is not excluded or patterns +rejected, the beginning of the buffer is searched for lines of the +form: Hi-lock: FOO where FOO is a list of patterns. These are added to the font lock keywords already present. The patterns must start before position @@ -590,9 +618,18 @@ (setq all-patterns (append (read (current-buffer)) all-patterns)) (error (message "Invalid pattern list expression at %d" (line-number-at-pos))))))) - (when hi-lock-mode (hi-lock-set-file-patterns all-patterns)) - (if (interactive-p) - (message "Hi-lock added %d patterns." (length all-patterns)))))) + (when (and all-patterns + hi-lock-mode + (cond + ((eq this-command 'hi-lock-find-patterns) t) + ((functionp hi-lock-file-patterns-policy) + (funcall hi-lock-file-patterns-policy all-patterns)) + ((eq hi-lock-file-patterns-policy 'ask) + (y-or-n-p "Add patterns from this buffer to hi-lock? ")) + (t nil))) + (hi-lock-set-file-patterns all-patterns) + (if (interactive-p) + (message "Hi-lock added %d patterns." (length all-patterns))))))) (defun hi-lock-font-lock-hook () "Add hi-lock patterns to font-lock's."
--- a/lisp/ido.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/ido.el Tue Apr 24 21:56:25 2007 +0000 @@ -3817,7 +3817,7 @@ If cursor is not at the end of the user input, delete to end of input." (interactive) (if (not (eobp)) - (kill-line) + (delete-region (point) (line-end-position)) (let ((enable-recursive-minibuffers t) (buf (ido-name (car ido-matches)))) (when buf @@ -3835,7 +3835,7 @@ If cursor is not at the end of the user input, delete to end of input." (interactive) (if (not (eobp)) - (kill-line) + (delete-region (point) (line-end-position)) (let ((enable-recursive-minibuffers t) (file (ido-name (car ido-matches)))) (if file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/image-dired.el Tue Apr 24 21:56:25 2007 +0000 @@ -0,0 +1,2597 @@ +;;; image-dired.el --- use dired to browse and manipulate your images +;; +;; Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. +;; +;; Version: 0.4.11 +;; Keywords: multimedia +;; Author: Mathias Dahl <mathias.rem0veth1s.dahl@gmail.com> + +;; 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: +;; +;; BACKGROUND +;; ========== +;; +;; I needed a program to browse, organize and tag my pictures. I got +;; tired of the old gallery program I used as it did not allow +;; multi-file operations easily. Also, it put things out of my +;; control. Image viewing programs I tested did not allow multi-file +;; operations or did not do what I wanted it to. +;; +;; So, I got the idea to use the wonderful functionality of Emacs and +;; `dired' to do it. It would allow me to do almost anything I wanted, +;; which is basically just to browse all my pictures in an easy way, +;; letting me manipulate and tag them in various ways. `dired' already +;; provide all the file handling and navigation facilities; I only +;; needed to add some functions to display the images. +;; +;; I briefly tried out thumbs.el, and although it seemed more +;; powerful than this package, it did not work the way I wanted to. It +;; was too slow to created thumbnails of all files in a directory (I +;; currently keep all my 2000+ images in the same directory) and +;; browsing the thumbnail buffer was slow too. image-dired.el will not +;; create thumbnails until they are needed and the browsing is done +;; quickly and easily in dired. I copied a great deal of ideas and +;; code from there though... :) +;; +;; `image-dired' stores the thumbnail files in `image-dired-dir' +;; using the file name format ORIGNAME.thumb.ORIGEXT. For example +;; ~/.emacs.d/image-dired/myimage01.thumb.jpg. The "database" is for +;; now just a plain text file with the following format: +;; +;; file-name-non-directory;comment:comment-text;tag1;tag2;tag3;...;tagN +;; +;; +;; PREREQUISITES +;; ============= +;; +;; * The ImageMagick package. Currently, `convert' and `mogrify' are +;; used. Find it here: http://www.imagemagick.org. +;; +;; * For non-lossy rotation of JPEG images, the JpegTRAN program is +;; needed. +;; +;; * For `image-dired-get-exif-data' and `image-dired-write-exif-data' to work, +;; the command line tool `exiftool' is needed. It can be found here: +;; http://www.sno.phy.queensu.ca/~phil/exiftool/. These two functions +;; are, among other things, used for writing comments to image files +;; using `image-dired-thumbnail-set-image-description' and to create +;; "unique" file names using `image-dired-get-exif-file-name' (used by +;; `image-dired-copy-with-exif-file-name'). +;; +;; +;; USAGE +;; ===== +;; +;; This information has been moved to the manual. Type `C-h r' to open +;; the Emacs manual and go to the node Thumbnails by typing `g +;; Thumbnails RET'. +;; +;; Quickstart: M-x image-dired RET DIRNAME RET +;; +;; where DIRNAME is a directory containing image files. +;; +;; LIMITATIONS +;; =========== +;; +;; * Supports all image formats that Emacs and convert supports, but +;; the thumbnails are hard-coded to JPEG format. +;; +;; * WARNING: The "database" format used might be changed so keep a +;; backup of `image-dired-db-file' when testing new versions. +;; +;; +;; TODO +;; ==== +;; +;; * Support gallery creation when using per-directory thumbnail +;; storage. +;; +;; * Some sort of auto-rotate function based on rotate info in the +;; EXIF data. +;; +;; * Check if exiftool exist before trying to call it to give a better +;; error message. +;; +;; * Investigate if it is possible to also write the tags to the image +;; files. +;; +;; * From thumbs.el: Add an option for clean-up/max-size functionality +;; for thumbnail directory. +;; +;; * From thumbs.el: Add setroot function. +;; +;; * From thumbs.el: Add image resizing, if useful (image-dired's automatic +;; "image fit" might be enough) +;; +;; * From thumbs.el: Add the "modify" commands (emboss, negate, +;; monochrome etc). +;; +;; * Asynchronous creation of thumbnails. +;; +;; * Add `image-dired-display-thumbs-ring' and functions to cycle that. Find +;; out which is best, saving old batch just before inserting new, or +;; saving the current batch in the ring when inserting it. Adding it +;; probably needs rewriting `image-dired-display-thumbs' to be more general. +;; +;; * Find some way of toggling on and off really nice keybindings in +;; dired (for example, using C-n or <down> instead of C-S-n). Richard +;; suggested that we could keep C-t as prefix for image-dired commands +;; as it is currently not used in dired. He also suggested that +;; `dired-next-line' and `dired-previous-line' figure out if +;; image-dired is enabled in the current buffer and, if it is, call +;; `image-dired-dired-next-line' and +;; `image-dired-dired-previous-line', respectively. Update: This is +;; partly done; some bindings have now been added to dired. +;; +;; * Enhanced gallery creation with basic CSS-support and pagination +;; of tag pages with many pictures. +;; +;; * Rewrite `image-dired-modify-mark-on-thumb-original-file' to be +;; less ugly. +;; +;; * In some way keep track of buffers and windows and stuff so that +;; it works as the user expects. +;; +;; * More/better documentation +;; +;; +;;; Code: + +(require 'dired) +(require 'format-spec) +(require 'widget) + +(eval-when-compile + (require 'wid-edit)) + +(defgroup image-dired nil + "Use dired to browse your images as thumbnails, and more." + :prefix "image-dired-" + :group 'multimedia) + +(defcustom image-dired-dir "~/.emacs.d/image-dired/" + "Directory where thumbnail images are stored." + :type 'string + :group 'image-dired) + +(defcustom image-dired-thumbnail-storage 'use-image-dired-dir + "How to store image-dired's thumbnail files. +Image-Dired can store thumbnail files in one of two ways and this is +controlled by this variable. \"Use image-dired dir\" means that the +thumbnails are stored in a central directory. \"Per directory\" +means that each thumbnail is stored in a subdirectory called +\".image-dired\" in the same directory where the image file is. +\"Thumbnail Managing Standard\" means that the thumbnails are +stored and generated according to the Thumbnail Managing Standard +that allows sharing of thumbnails across different programs." + :type '(choice :tag "How to store thumbnail files" + (const :tag "Thumbnail Managing Standard" standard) + (const :tag "Use image-dired-dir" use-image-dired-dir) + (const :tag "Per-directory" per-directory)) + :group 'image-dired) + +(defcustom image-dired-db-file "~/.emacs.d/image-dired/.image-dired_db" + "Database file where file names and their associated tags are stored." + :type 'string + :group 'image-dired) + +(defcustom image-dired-temp-image-file "~/.emacs.d/image-dired/.image-dired_temp" + "Name of temporary image file used by various commands." + :type 'string + :group 'image-dired) + +(defcustom image-dired-gallery-dir "~/.emacs.d/image-dired/.image-dired_gallery" + "Directory to store generated gallery html pages. +This path needs to be \"shared\" to the public so that it can access +the index.html page that image-dired creates." + :type 'string + :group 'image-dired) + +(defcustom image-dired-gallery-image-root-url +"http://your.own.server/image-diredpics" + "URL where the full size images are to be found. +Note that this path has to be configured in your web server. Image-Dired +expects to find pictures in this directory." + :type 'string + :group 'image-dired) + +(defcustom image-dired-gallery-thumb-image-root-url +"http://your.own.server/image-diredthumbs" + "URL where the thumbnail images are to be found. +Note that this path has to be configured in your web server. Image-Dired +expects to find pictures in this directory." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-create-thumbnail-program + "convert" + "Executable used to create thumbnail. +Used together with `image-dired-cmd-create-thumbnail-options'." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-create-thumbnail-options + "%p -size %wx%h \"%f\" -resize %wx%h +profile \"*\" jpeg:\"%t\"" + "Format of command used to create thumbnail image. +Available options are %p which is replaced by +`image-dired-cmd-create-thumbnail-program', %w which is replaced by +`image-dired-thumb-width', %h which is replaced by `image-dired-thumb-height', +%f which is replaced by the file name of the original image and %t +which is replaced by the file name of the thumbnail file." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-create-temp-image-program + "convert" + "Executable used to create temporary image. +Used together with `image-dired-cmd-create-temp-image-options'." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-create-temp-image-options + "%p -size %wx%h \"%f\" -resize %wx%h +profile \"*\" jpeg:\"%t\"" + "Format of command used to create temporary image for display window. +Available options are %p which is replaced by +`image-dired-cmd-create-temp-image-program', %w and %h which is replaced by +the calculated max size for width and height in the image display window, +%f which is replaced by the file name of the original image and %t which +is replaced by the file name of the temporary file." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-pngnq-program (executable-find "pngnq") + "The file name of the `pngnq' program. +It quantizes colors of PNG images down to 256 colors." + :type '(choice (const :tag "Not Set" nil) string) + :group 'image-dired) + +(defcustom image-dired-cmd-pngcrush-program (executable-find "pngcrush") + "The file name of the `pngcrush' program. +It optimizes the compression of PNG images. Also it adds PNG textual chunks +with the information required by the Thumbnail Managing Standard." + :type '(choice (const :tag "Not Set" nil) string) + :group 'image-dired) + +(defcustom image-dired-cmd-create-standard-thumbnail-command + (concat + image-dired-cmd-create-thumbnail-program " " + "-size %wx%h \"%f\" " + (unless (or image-dired-cmd-pngcrush-program image-dired-cmd-pngnq-program) + (concat + "-set \"Thumb::MTime\" \"%m\" " + "-set \"Thumb::URI\" \"file://%f\" " + "-set \"Description\" \"Thumbnail of file://%f\" " + "-set \"Software\" \"" (emacs-version) "\" ")) + "-thumbnail %wx%h png:\"%t\"" + (if image-dired-cmd-pngnq-program + (concat + " ; " image-dired-cmd-pngnq-program " -f \"%t\"" + (unless image-dired-cmd-pngcrush-program + " ; mv %q %t"))) + (if image-dired-cmd-pngcrush-program + (concat + (unless image-dired-cmd-pngcrush-program + " ; cp %t %q") + " ; " image-dired-cmd-pngcrush-program " -q " + "-text b \"Description\" \"Thumbnail of file://%f\" " + "-text b \"Software\" \"" (emacs-version) "\" " + ;; "-text b \"Thumb::Image::Height\" \"%oh\" " + ;; "-text b \"Thumb::Image::Mimetype\" \"%mime\" " + ;; "-text b \"Thumb::Image::Width\" \"%ow\" " + "-text b \"Thumb::MTime\" \"%m\" " + ;; "-text b \"Thumb::Size\" \"%b\" " + "-text b \"Thumb::URI\" \"file://%f\" " + "%q %t" + " ; rm %q"))) + "Command to create thumbnails according to the Thumbnail Managing Standard." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-rotate-thumbnail-program + "mogrify" + "Executable used to rotate thumbnail. +Used together with `image-dired-cmd-rotate-thumbnail-options'." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-rotate-thumbnail-options + "%p -rotate %d \"%t\"" + "Format of command used to rotate thumbnail image. +Available options are %p which is replaced by +`image-dired-cmd-rotate-thumbnail-program', %d which is replaced by the +number of (positive) degrees to rotate the image, normally 90 or 270 +\(for 90 degrees right and left), %t which is replaced by the file name +of the thumbnail file." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-rotate-original-program + "jpegtran" + "Executable used to rotate original image. +Used together with `image-dired-cmd-rotate-original-options'." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-rotate-original-options + "%p -rotate %d -copy all -outfile %t \"%o\"" + "Format of command used to rotate original image. +Available options are %p which is replaced by +`image-dired-cmd-rotate-original-program', %d which is replaced by the +number of (positive) degrees to rotate the image, normally 90 or +270 \(for 90 degrees right and left), %o which is replaced by the +original image file name and %t which is replaced by +`image-dired-temp-image-file'." + :type 'string + :group 'image-dired) + +(defcustom image-dired-temp-rotate-image-file + "~/.emacs.d/image-dired/.image-dired_rotate_temp" + "Temporary file for rotate operations." + :type 'string + :group 'image-dired) + +(defcustom image-dired-rotate-original-ask-before-overwrite t + "Confirm overwrite of original file after rotate operation. +If non-nil, ask user for confirmation before overwriting the +original file with `image-dired-temp-rotate-image-file'." + :type 'boolean + :group 'image-dired) + +(defcustom image-dired-cmd-write-exif-data-program + "exiftool" + "Program used to write EXIF data to image. +Used together with `image-dired-cmd-write-exif-data-options'." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-write-exif-data-options + "%p -%t=\"%v\" \"%f\"" + "Format of command used to write EXIF data. +Available options are %p which is replaced by +`image-dired-cmd-write-exif-data-program', %f which is replaced by the +image file name, %t which is replaced by the tag name and %v +which is replaced by the tag value." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-read-exif-data-program + "exiftool" + "Program used to read EXIF data to image. +Used together with `image-dired-cmd-read-exif-data-program-options'." + :type 'string + :group 'image-dired) + +(defcustom image-dired-cmd-read-exif-data-options + "%p -s -s -s -%t \"%f\"" + "Format of command used to read EXIF data. +Available options are %p which is replaced by +`image-dired-cmd-write-exif-data-options', %f which is replaced +by the image file name and %t which is replaced by the tag name." + :type 'string + :group 'image-dired) + +(defcustom image-dired-gallery-hidden-tags + (list "private" "hidden" "pending") + "List of \"hidden\" tags. +Used by `image-dired-gallery-generate' to leave out \"hidden\" images." + :type '(repeat string) + :group 'image-dired) + +(defcustom image-dired-thumb-size (if (eq 'standard image-dired-thumbnail-storage) 128 100) + "Size of thumbnails, in pixels. +This is the default size for both `image-dired-thumb-width' and `image-dired-thumb-height'." + :type 'integer + :group 'image-dired) + +(defcustom image-dired-thumb-width image-dired-thumb-size + "Width of thumbnails, in pixels." + :type 'integer + :group 'image-dired) + +(defcustom image-dired-thumb-height image-dired-thumb-size + "Height of thumbnails, in pixels." + :type 'integer + :group 'image-dired) + +(defcustom image-dired-thumb-relief 2 + "Size of button-like border around thumbnails." + :type 'integer + :group 'image-dired) + +(defcustom image-dired-thumb-margin 2 + "Size of the margin around thumbnails. +This is where you see the cursor." + :type 'integer + :group 'image-dired) + +(defcustom image-dired-line-up-method 'dynamic + "Default method for line-up of thumbnails in thumbnail buffer. +Used by `image-dired-display-thumbs' and other functions that needs to +line-up thumbnails. Dynamic means to use the available width of the +window containing the thumbnail buffer, Fixed means to use +`image-dired-thumbs-per-row', Interactive is for asking the user, and No +line-up means that no automatic line-up will be done." + :type '(choice :tag "Default line-up method" + (const :tag "Dynamic" dynamic) + (const :tag "Fixed" fixed) + (const :tag "Interactive" interactive) + (const :tag "No line-up" none)) + :group 'image-dired) + +(defcustom image-dired-thumbs-per-row 3 + "Number of thumbnails to display per row in thumb buffer." + :type 'integer + :group 'image-dired) + +(defcustom image-dired-display-window-width-correction 1 + "Number to be used to correct image display window width. +Change if the default (1) does not work (i.e. if the image does not +completely fit)." + :type 'integer + :group 'image-dired) + +(defcustom image-dired-display-window-height-correction 0 + "Number to be used to correct image display window height. +Change if the default (0) does not work (i.e. if the image does not +completely fit)." + :type 'integer + :group 'image-dired) + +(defcustom image-dired-track-movement t + "The current state of the tracking and mirroring. +For more information, see the documentation for +`image-dired-toggle-movement-tracking'." + :type 'boolean + :group 'image-dired) + +(defcustom image-dired-append-when-browsing nil + "Append thumbnails in thumbnail buffer when browsing. +If non-nil, using `image-dired-next-line-and-display' and +`image-dired-previous-line-and-display' will leave a trail of thumbnail +images in the thumbnail buffer. If you enable this and want to clean +the thumbnail buffer because it is filled with too many thumbmnails, +just call `image-dired-display-thumb' to display only the image at point. +This value can be toggled using `image-dired-toggle-append-browsing'." + :type 'boolean + :group 'image-dired) + +(defcustom image-dired-dired-disp-props t + "If non-nil, display properties for dired file when browsing. +Used by `image-dired-next-line-and-display', +`image-dired-previous-line-and-display' and `image-dired-mark-and-display-next'. +If the database file is large, this can slow down image browsing in +dired and you might want to turn it off." + :type 'boolean + :group 'image-dired) + +(defcustom image-dired-display-properties-format "%b: %f (%t): %c" + "Display format for thumbnail properties. +%b is replaced with associated dired buffer name, %f with file name +\(without path) of original image file, %t with the list of tags and %c +with the comment." + :type 'string + :group 'image-dired) + +(defcustom image-dired-external-viewer + ;; TODO: Use mailcap, dired-guess-shell-alist-default, + ;; dired-view-command-alist. + (cond ((executable-find "display")) + ((executable-find "xli")) + ((executable-find "qiv") "qiv -t")) + "Name of external viewer. +Including parameters. Used when displaying original image from +`image-dired-thumbnail-mode'." + :type 'string + :group 'image-dired) + +(defcustom image-dired-main-image-directory "~/pics/" + "Name of main image directory, if any. +Used by `image-dired-copy-with-exif-file-name'." + :type 'string + :group 'image-dired) + +(defcustom image-dired-show-all-from-dir-max-files 50 + "Maximum number of files to show using `image-dired-show-all-from-dir'. +before warning the user." + :type 'integer + :group 'image-dired) + +(defun image-dired-dir () + "Return the current thumbnails directory (from variable `image-dired-dir'). +Create the thumbnails directory if it does not exist." + (let ((image-dired-dir (file-name-as-directory + (expand-file-name image-dired-dir)))) + (unless (file-directory-p image-dired-dir) + (make-directory image-dired-dir t) + (message "Creating thumbnails directory")) + image-dired-dir)) + +(defun image-dired-insert-image (file type relief margin) + "Insert image FILE of image TYPE, using RELIEF and MARGIN, at point." + + (let ((i `(image :type ,type + :file ,file + :relief ,relief + :margin ,margin))) + (insert-image i))) + +(defun image-dired-get-thumbnail-image (file) + "Return the image descriptor for a thumbnail of image file FILE." + (unless (string-match (image-file-name-regexp) file) + (error "%s is not a valid image file" file)) + (let ((thumb-file (image-dired-thumb-name file))) + (unless (and (file-exists-p thumb-file) + (<= (float-time (nth 5 (file-attributes file))) + (float-time (nth 5 (file-attributes thumb-file))))) + (image-dired-create-thumb file thumb-file)) + (create-image thumb-file) +;; (list 'image :type 'jpeg +;; :file thumb-file +;; :relief image-dired-thumb-relief :margin image-dired-thumb-margin) + )) + +(defun image-dired-insert-thumbnail (file original-file-name + associated-dired-buffer) + "Insert thumbnail image FILE. +Add text properties ORIGINAL-FILE-NAME and ASSOCIATED-DIRED-BUFFER." + (let (beg end) + (setq beg (point)) + (image-dired-insert-image file + ;; TODO: this should depend on the real file type + (if (eq 'standard image-dired-thumbnail-storage) + 'png 'jpeg) + image-dired-thumb-relief + image-dired-thumb-margin) + (setq end (point)) + (add-text-properties + beg end + (list 'image-dired-thumbnail t + 'original-file-name original-file-name + 'associated-dired-buffer associated-dired-buffer + 'tags (image-dired-list-tags original-file-name) + 'mouse-face 'highlight + 'comment (image-dired-get-comment original-file-name))))) + +(defun image-dired-thumb-name (file) + "Return thumbnail file name for FILE. +Depending on the value of `image-dired-thumbnail-storage', the file +name will vary. For central thumbnail file storage, make a +MD5-hash of the image file's directory name and add that to make +the thumbnail file name unique. For per-directory storage, just +add a subdirectory. For standard storage, produce the file name +according to the Thumbnail Managing Standard." + (cond ((eq 'standard image-dired-thumbnail-storage) + (expand-file-name + (concat "~/.thumbnails/normal/" + (md5 (concat "file://" (expand-file-name file))) ".png"))) + ((eq 'use-image-dired-dir image-dired-thumbnail-storage) + (let* ((f (expand-file-name file)) + (md5-hash + ;; Is MD5 hashes fast enough? The checksum of a + ;; thumbnail file name need not be that + ;; "cryptographically" good so a faster one could + ;; be used here. + (md5 (file-name-as-directory (file-name-directory f))))) + (format "%s%s%s.thumb.%s" + (file-name-as-directory (expand-file-name (image-dired-dir))) + (file-name-sans-extension (file-name-nondirectory f)) + (if md5-hash (concat "_" md5-hash) "") + (file-name-extension f)))) + ((eq 'per-directory image-dired-thumbnail-storage) + (let ((f (expand-file-name file))) + (format "%s.image-dired/%s.thumb.%s" + (file-name-directory f) + (file-name-sans-extension (file-name-nondirectory f)) + (file-name-extension f)))))) + +(defun image-dired-create-thumb (original-file thumbnail-file) + "For ORIGINAL-FILE, create thumbnail image named THUMBNAIL-FILE." + (let* ((width (int-to-string image-dired-thumb-width)) + (height (int-to-string image-dired-thumb-height)) + (modif-time (format "%.0f" (float-time (nth 5 (file-attributes + original-file))))) + (thumbnail-nq8-file (replace-regexp-in-string ".png\\'" "-nq8.png" + thumbnail-file)) + (command + (format-spec + (if (eq 'standard image-dired-thumbnail-storage) + image-dired-cmd-create-standard-thumbnail-command + image-dired-cmd-create-thumbnail-options) + (list + (cons ?p image-dired-cmd-create-thumbnail-program) + (cons ?w width) + (cons ?h height) + (cons ?m modif-time) + (cons ?f original-file) + (cons ?q thumbnail-nq8-file) + (cons ?t thumbnail-file)))) + thumbnail-dir) + (when (not (file-exists-p + (setq thumbnail-dir (file-name-directory thumbnail-file)))) + (message "Creating thumbnail directory.") + (make-directory thumbnail-dir)) + (call-process shell-file-name nil nil nil shell-command-switch command))) + +;;;###autoload +(defun image-dired-dired-insert-marked-thumbs () + "Insert thumbnails before file names of marked files in the dired buffer." + (interactive) + (dired-map-over-marks + (let* ((image-pos (dired-move-to-filename)) + (image-file (dired-get-filename)) + (thumb-file (image-dired-get-thumbnail-image image-file)) + overlay) + ;; If image is not already added, then add it. + (unless (delq nil (mapcar (lambda (o) (overlay-get o 'put-image)) + ;; Can't use (overlays-at (point)), BUG? + (overlays-in (point) (1+ (point))))) + (put-image thumb-file image-pos) + (setq + overlay + (car (delq nil (mapcar (lambda (o) (and (overlay-get o 'put-image) o)) + (overlays-in (point) (1+ (point))))))) + (overlay-put overlay 'image-file image-file) + (overlay-put overlay 'thumb-file thumb-file))) + nil) + (add-hook 'dired-after-readin-hook 'image-dired-dired-after-readin-hook nil t)) + +(defun image-dired-dired-after-readin-hook () + "Relocate existing thumbnail overlays in dired buffer after reverting. +Move them to their corresponding files if they are still exist. +Otherwise, delete overlays." + (mapc (lambda (overlay) + (when (overlay-get overlay 'put-image) + (let* ((image-file (overlay-get overlay 'image-file)) + (image-pos (dired-goto-file image-file))) + (if image-pos + (move-overlay overlay image-pos image-pos) + (delete-overlay overlay))))) + (overlays-in (point-min) (point-max)))) + +(defun image-dired-next-line-and-display () + "Move to next dired line and display thumbnail image." + (interactive) + (dired-next-line 1) + (image-dired-display-thumbs + t (or image-dired-append-when-browsing nil) t) + (if image-dired-dired-disp-props + (image-dired-dired-display-properties))) + +(defun image-dired-previous-line-and-display () + "Move to previous dired line and display thumbnail image." + (interactive) + (dired-previous-line 1) + (image-dired-display-thumbs + t (or image-dired-append-when-browsing nil) t) + (if image-dired-dired-disp-props + (image-dired-dired-display-properties))) + +(defun image-dired-toggle-append-browsing () + "Toggle `image-dired-append-when-browsing'." + (interactive) + (setq image-dired-append-when-browsing + (not image-dired-append-when-browsing)) + (message "Append browsing %s." + (if image-dired-append-when-browsing + "on" + "off"))) + +(defun image-dired-mark-and-display-next () + "Mark current file in dired and display next thumbnail image." + (interactive) + (dired-mark 1) + (image-dired-display-thumbs + t (or image-dired-append-when-browsing nil) t) + (if image-dired-dired-disp-props + (image-dired-dired-display-properties))) + +(defun image-dired-toggle-dired-display-properties () + "Toggle `image-dired-dired-disp-props'." + (interactive) + (setq image-dired-dired-disp-props + (not image-dired-dired-disp-props)) + (message "Dired display properties %s." + (if image-dired-dired-disp-props + "on" + "off"))) + +(defvar image-dired-thumbnail-buffer "*image-dired*" + "Image-Dired's thumbnail buffer.") + +(defun image-dired-create-thumbnail-buffer () + "Create thumb buffer and set `image-dired-thumbnail-mode'." + (let ((buf (get-buffer-create image-dired-thumbnail-buffer))) + (with-current-buffer buf + (setq buffer-read-only t) + (if (not (eq major-mode 'image-dired-thumbnail-mode)) + (image-dired-thumbnail-mode))) + buf)) + +(defvar image-dired-display-image-buffer "*image-dired-display-image*" + "Where larger versions of the images are display.") + +(defun image-dired-create-display-image-buffer () + "Create image display buffer and set `image-dired-display-image-mode'." + (let ((buf (get-buffer-create image-dired-display-image-buffer))) + (with-current-buffer buf + (setq buffer-read-only t) + (if (not (eq major-mode 'image-dired-display-image-mode)) + (image-dired-display-image-mode))) + buf)) + +(defvar image-dired-saved-window-configuration nil + "Saved window configuration.") + +;;;###autoload +(defun image-dired-dired-with-window-configuration (dir &optional arg) + "Open directory DIR and create a default window configuration. + +Convenience command that: + + - Opens dired in folder DIR + - Splits windows in most useful (?) way + - Set `truncate-lines' to t + +After the command has finished, you would typically mark some +image files in dired and type +\\[image-dired-display-thumbs] (`image-dired-display-thumbs'). + +If called with prefix argument ARG, skip splitting of windows. + +The current window configuration is saved and can be restored by +calling `image-dired-restore-window-configuration'." + (interactive "DDirectory: \nP") + (let ((buf (image-dired-create-thumbnail-buffer)) + (buf2 (image-dired-create-display-image-buffer))) + (setq image-dired-saved-window-configuration + (current-window-configuration)) + (dired dir) + (delete-other-windows) + (when (not arg) + (split-window-horizontally) + (setq truncate-lines t) + (save-excursion + (other-window 1) + (switch-to-buffer buf) + (split-window-vertically) + (other-window 1) + (switch-to-buffer buf2) + (other-window -2))))) + +(defun image-dired-restore-window-configuration () + "Restore window configuration. +Restore any changes to the window configuration made by calling +`image-dired-dired-with-window-configuration'." + (interactive) + (if image-dired-saved-window-configuration + (set-window-configuration image-dired-saved-window-configuration) + (message "No saved window configuration"))) + +;;;###autoload +(defun image-dired-display-thumbs (&optional arg append do-not-pop) + "Display thumbnails of all marked files, in `image-dired-thumbnail-buffer'. +If a thumbnail image does not exist for a file, it is created on the +fly. With prefix argument ARG, display only thumbnail for file at +point (this is useful if you have marked some files but want to show +another one). + +Recommended usage is to split the current frame horizontally so that +you have the dired buffer in the left window and the +`image-dired-thumbnail-buffer' buffer in the right window. + +With optional argument APPEND, append thumbnail to thumbnail buffer +instead of erasing it first. + +Option argument DO-NOT-POP controls if `pop-to-buffer' should be +used or not. If non-nil, use `display-buffer' instead of +`pop-to-buffer'. This is used from functions like +`image-dired-next-line-and-display' and +`image-dired-previous-line-and-display' where we do not want the +thumbnail buffer to be selected." + (interactive "P") + (let ((buf (image-dired-create-thumbnail-buffer)) + curr-file thumb-name files count dired-buf beg) + (if arg + (setq files (list (dired-get-filename))) + (setq files (dired-get-marked-files))) + (setq dired-buf (current-buffer)) + (with-current-buffer buf + (let ((inhibit-read-only t)) + (if (not append) + (erase-buffer) + (goto-char (point-max))) + (mapcar + (lambda (curr-file) + (setq thumb-name (image-dired-thumb-name curr-file)) + (if (and (not (file-exists-p thumb-name)) + (not (= 0 (image-dired-create-thumb curr-file thumb-name)))) + (message "Thumb could not be created for file %s" curr-file) + (image-dired-insert-thumbnail thumb-name curr-file dired-buf))) + files)) + (cond ((eq 'dynamic image-dired-line-up-method) + (image-dired-line-up-dynamic)) + ((eq 'fixed image-dired-line-up-method) + (image-dired-line-up)) + ((eq 'interactive image-dired-line-up-method) + (image-dired-line-up-interactive)) + ((eq 'none image-dired-line-up-method) + nil) + (t + (image-dired-line-up-dynamic)))) + (if do-not-pop + (display-buffer image-dired-thumbnail-buffer) + (pop-to-buffer image-dired-thumbnail-buffer)))) + +;;;###autoload +(defun image-dired-show-all-from-dir (dir) + "Make a preview buffer for all images in DIR and display it. +If the number of files in DIR matching `image-file-name-regexp' +exceeds `image-dired-show-all-from-dir-max-files', a warning will be +displayed." + (interactive "DDir: ") + (dired dir) + (dired-mark-files-regexp (image-file-name-regexp)) + (let ((files (dired-get-marked-files))) + (if (or (<= (length files) image-dired-show-all-from-dir-max-files) + (and (> (length files) image-dired-show-all-from-dir-max-files) + (y-or-n-p + (format + "Directory contains more than %d image files. Proceed? " + image-dired-show-all-from-dir-max-files)))) + (progn + (image-dired-display-thumbs) + (pop-to-buffer image-dired-thumbnail-buffer)) + (message "Cancelled.")))) + +;;;###autoload +(defalias 'image-dired 'image-dired-show-all-from-dir) + +;;;###autoload +(defalias 'tumme 'image-dired-show-all-from-dir) + +(defun image-dired-write-tags (file-tags) + "Write file tags to database. +Write each file and tag in FILE-TAGS to the database. FILE-TAGS +is an alist in the following form: + ((FILE . TAG) ... )" + (let (end file tag) + (with-temp-file image-dired-db-file + (insert-file-contents image-dired-db-file) + (dolist (elt file-tags) + (setq file (car elt) + tag (cdr elt)) + (goto-char (point-min)) + (if (search-forward-regexp (format "^%s.*$" file) nil t) + (progn + (setq end (point)) + (beginning-of-line) + (when (not (search-forward (format ";%s" tag) end t)) + (end-of-line) + (insert (format ";%s" tag)))) + (goto-char (point-max)) + (insert (format "\n%s;%s" file tag))))))) + +(defun image-dired-remove-tag (files tag) + "For all FILES, remove TAG from the image database." + (save-excursion + (let (end buf start) + (setq buf (find-file image-dired-db-file)) + (if (not (listp files)) + (if (stringp files) + (setq files (list files)) + (error "Files must be a string or a list of strings!"))) + (mapcar + (lambda (file) + (goto-char (point-min)) + (when (search-forward-regexp + (format "^%s" file) nil t) + (end-of-line) + (setq end (point)) + (beginning-of-line) + (when (search-forward-regexp (format "\\(;%s\\)" tag) end t) + (delete-region (match-beginning 1) (match-end 1)) + ;; Check if file should still be in the database. If + ;; it has no tags or comments, it will be removed. + (end-of-line) + (setq end (point)) + (beginning-of-line) + (when (not (search-forward ";" end t)) + (kill-line 1) + ;; If on empty line at end of buffer + (when (and (eobp) + (looking-at "^$")) + (delete-backward-char 1)))))) + files) + (save-buffer) + (kill-buffer buf)))) + +(defun image-dired-list-tags (file) + "Read all tags for image FILE from the image database." + (save-excursion + (let (end buf (tags "")) + (setq buf (find-file image-dired-db-file)) + (goto-char (point-min)) + (when (search-forward-regexp + (format "^%s" file) nil t) + (end-of-line) + (setq end (point)) + (beginning-of-line) + (if (search-forward ";" end t) + (if (search-forward "comment:" end t) + (if (search-forward ";" end t) + (setq tags (buffer-substring (point) end))) + (setq tags (buffer-substring (point) end))))) + (kill-buffer buf) + (split-string tags ";")))) + +;;;###autoload +(defun image-dired-tag-files (arg) + "Tag marked file(s) in dired. With prefix ARG, tag file at point." + (interactive "P") + (let ((tag (read-string "Tags to add (separate tags with a semicolon): ")) + curr-file files) + (if arg + (setq files (list (dired-get-filename))) + (setq files (dired-get-marked-files))) + (image-dired-write-tags + (mapcar + (lambda (x) + (cons x tag)) + files)))) + +(defun image-dired-tag-thumbnail () + "Tag current thumbnail." + (interactive) + (let ((tag (read-string "Tags to add (separate tags with a semicolon): "))) + (image-dired-write-tags (list (cons (image-dired-original-file-name) tag)))) + (image-dired-update-property + 'tags (image-dired-list-tags (image-dired-original-file-name)))) + +;;;###autoload +(defun image-dired-delete-tag (arg) + "Remove tag for selected file(s). +With prefix argument ARG, remove tag from file at point." + (interactive "P") + (let ((tag (read-string "Tag to remove: ")) + files) + (if arg + (setq files (list (dired-get-filename))) + (setq files (dired-get-marked-files))) + (image-dired-remove-tag files tag))) + +(defun image-dired-tag-thumbnail-remove () + "Remove tag from thumbnail." + (interactive) + (let ((tag (read-string "Tag to remove: "))) + (image-dired-remove-tag (image-dired-original-file-name) tag)) + (image-dired-update-property + 'tags (image-dired-list-tags (image-dired-original-file-name)))) + +(defun image-dired-original-file-name () + "Get original file name for thumbnail or display image at point." + (get-text-property (point) 'original-file-name)) + +(defun image-dired-associated-dired-buffer () + "Get associated dired buffer at point." + (get-text-property (point) 'associated-dired-buffer)) + +(defun image-dired-get-buffer-window (buf) + "Return window where buffer BUF is." + (get-window-with-predicate + (lambda (window) + (equal (window-buffer window) buf)) + nil t)) + +(defun image-dired-track-original-file () + "Track the original file in the associated dired buffer. +See documentation for `image-dired-toggle-movement-tracking'. Interactive +use only useful if `image-dired-track-movement' is nil." + (interactive) + (let ((old-buf (current-buffer)) + (dired-buf (image-dired-associated-dired-buffer)) + (file-name (image-dired-original-file-name))) + (when (and (buffer-live-p dired-buf) file-name) + (setq file-name (file-name-nondirectory file-name)) + (set-buffer dired-buf) + (goto-char (point-min)) + (if (not (search-forward file-name nil t)) + (message "Could not track file") + (dired-move-to-filename) + (set-window-point + (image-dired-get-buffer-window dired-buf) (point))) + (set-buffer old-buf)))) + +(defun image-dired-toggle-movement-tracking () + "Turn on and off `image-dired-track-movement'. +Tracking of the movements between thumbnail and dired buffer so that +they are \"mirrored\" in the dired buffer. When this is on, moving +around in the thumbnail or dired buffer will find the matching +position in the other buffer." + (interactive) + (setq image-dired-track-movement (not image-dired-track-movement)) + (message "Tracking %s" (if image-dired-track-movement "on" "off"))) + +(defun image-dired-track-thumbnail () + "Track current dired file's thumb in `image-dired-thumbnail-buffer'. +This is almost the same as what `image-dired-track-original-file' does, but +the other way around." + (let ((file (dired-get-filename)) + (old-buf (current-buffer)) + prop-val found) + (when (get-buffer image-dired-thumbnail-buffer) + (set-buffer image-dired-thumbnail-buffer) + (goto-char (point-min)) + (while (and (not (eobp)) + (not found)) + (if (and (setq prop-val + (get-text-property (point) 'original-file-name)) + (string= prop-val file)) + (setq found t)) + (if (not found) + (forward-char 1))) + (when found + (set-window-point + (image-dired-thumbnail-window) (point)) + (image-dired-display-thumb-properties)) + (set-buffer old-buf)))) + +(defun image-dired-dired-next-line (&optional arg) + "Call `dired-next-line', then track thumbnail. +This can safely replace `dired-next-line'. With prefix argument, move +ARG lines." + (interactive "P") + (dired-next-line (or arg 1)) + (if image-dired-track-movement + (image-dired-track-thumbnail))) + +(defun image-dired-dired-previous-line (&optional arg) + "Call `dired-previous-line', then track thumbnail. +This can safely replace `dired-previous-line'. With prefix argument, +move ARG lines." + (interactive "P") + (dired-previous-line (or arg 1)) + (if image-dired-track-movement + (image-dired-track-thumbnail))) + +(defun image-dired-forward-image (&optional arg) + "Move to next image and display properties. +Optional prefix ARG says how many images to move; default is one +image." + (interactive "p") + (let (pos (steps (or arg 1))) + (dotimes (i steps) + (if (and (not (eobp)) + (save-excursion + (forward-char) + (while (and (not (eobp)) + (not (image-dired-image-at-point-p))) + (forward-char)) + (setq pos (point)) + (image-dired-image-at-point-p))) + (goto-char pos) + (error "At last image")))) + (when image-dired-track-movement + (image-dired-track-original-file)) + (image-dired-display-thumb-properties)) + +(defun image-dired-backward-image (&optional arg) + "Move to previous image and display properties. +Optional prefix ARG says how many images to move; default is one +image." + (interactive "p") + (let (pos (steps (or arg 1))) + (dotimes (i steps) + (if (and (not (bobp)) + (save-excursion + (backward-char) + (while (and (not (bobp)) + (not (image-dired-image-at-point-p))) + (backward-char)) + (setq pos (point)) + (image-dired-image-at-point-p))) + (goto-char pos) + (error "At first image")))) + (when image-dired-track-movement + (image-dired-track-original-file)) + (image-dired-display-thumb-properties)) + +(defun image-dired-next-line () + "Move to next line and display properties." + (interactive) + (next-line 1) + ;; If we end up in an empty spot, back up to the next thumbnail. + (if (not (image-dired-image-at-point-p)) + (image-dired-backward-image)) + (if image-dired-track-movement + (image-dired-track-original-file)) + (image-dired-display-thumb-properties)) + + +(defun image-dired-previous-line () + "Move to previous line and display properties." + (interactive) + (previous-line 1) + ;; If we end up in an empty spot, back up to the next + ;; thumbnail. This should only happen if the user deleted a + ;; thumbnail and did not refresh, so it is not very common. But we + ;; can handle it in a good manner, so why not? + (if (not (image-dired-image-at-point-p)) + (image-dired-backward-image)) + (if image-dired-track-movement + (image-dired-track-original-file)) + (image-dired-display-thumb-properties)) + +(defun image-dired-format-properties-string (buf file props comment) + "Format display properties. +BUF is the associated dired buffer, FILE is the original image file +name, PROPS is a list of tags and COMMENT is the image files's +comment." + (format-spec + image-dired-display-properties-format + (list + (cons ?b (or buf "")) + (cons ?f file) + (cons ?t (or (princ props) "")) + (cons ?c (or comment ""))))) + +(defun image-dired-display-thumb-properties () + "Display thumbnail properties in the echo area." + (if (not (eobp)) + (let ((file-name (file-name-nondirectory (image-dired-original-file-name))) + (dired-buf (buffer-name (image-dired-associated-dired-buffer))) + (props (mapconcat + 'princ + (get-text-property (point) 'tags) + ", ")) + (comment (get-text-property (point) 'comment))) + (if file-name + (message + (image-dired-format-properties-string + dired-buf + file-name + props + comment)))))) + +(defun image-dired-dired-file-marked-p () + "Check whether file on current line is marked or not." + (save-excursion + (beginning-of-line) + (not (looking-at "^ .*$")))) + +(defun image-dired-modify-mark-on-thumb-original-file (command) + "Modify mark in dired buffer. +This is quite ugly but I don't know how to implemented in a better +way. COMMAND is one of 'mark for marking file in dired, 'unmark for +unmarking file in dired or 'flag for flagging file for delete in +dired." + (let ((file-name (image-dired-original-file-name)) + (dired-buf (image-dired-associated-dired-buffer))) + (if (not (and dired-buf file-name)) + (message "No image, or image with correct properties, at point.") + (with-current-buffer dired-buf + (message file-name) + (setq file-name (file-name-nondirectory file-name)) + (goto-char (point-min)) + (if (search-forward file-name nil t) + (cond ((eq command 'mark) (dired-mark 1)) + ((eq command 'unmark) (dired-unmark 1)) + ((eq command 'toggle) + (if (image-dired-dired-file-marked-p) + (dired-unmark 1) + (dired-mark 1))) + ((eq command 'flag) (dired-flag-file-deletion 1)))))))) + +(defun image-dired-mark-thumb-original-file () + "Mark original image file in associated dired buffer." + (interactive) + (image-dired-modify-mark-on-thumb-original-file 'mark) + (image-dired-forward-image)) + +(defun image-dired-unmark-thumb-original-file () + "Unmark original image file in associated dired buffer." + (interactive) + (image-dired-modify-mark-on-thumb-original-file 'unmark) + (image-dired-forward-image)) + +(defun image-dired-flag-thumb-original-file () + "Flag original image file for deletion in associated dired buffer." + (interactive) + (image-dired-modify-mark-on-thumb-original-file 'flag) + (image-dired-forward-image)) + +(defun image-dired-toggle-mark-thumb-original-file () + "Toggle mark on original image file in associated dired buffer." + (interactive) + (image-dired-modify-mark-on-thumb-original-file 'toggle)) + +(defun image-dired-jump-original-dired-buffer () + "Jump to the dired buffer associated with the current image file. +You probably want to use this together with +`image-dired-track-original-file'." + (interactive) + (let ((buf (image-dired-associated-dired-buffer)) + window frame) + (setq window (image-dired-get-buffer-window buf)) + (if window + (progn + (if (not (equal (selected-frame) (setq frame (window-frame window)))) + (select-frame-set-input-focus frame)) + (select-window window)) + (message "Associated dired buffer not visible")))) + +;;;###autoload +(defun image-dired-jump-thumbnail-buffer () + "Jump to thumbnail buffer." + (interactive) + (let ((window (image-dired-thumbnail-window)) + frame) + (if window + (progn + (if (not (equal (selected-frame) (setq frame (window-frame window)))) + (select-frame-set-input-focus frame)) + (select-window window)) + (message "Thumbnail buffer not visible")))) + +(defvar image-dired-thumbnail-mode-map (make-sparse-keymap) + "Keymap for `image-dired-thumbnail-mode'.") + +(defvar image-dired-thumbnail-mode-line-up-map (make-sparse-keymap) + "Keymap for line-up commands in `image-dired-thumbnail-mode'.") + +(defvar image-dired-thumbnail-mode-tag-map (make-sparse-keymap) + "Keymap for tag commands in `image-dired-thumbnail-mode'.") + +(defun image-dired-define-thumbnail-mode-keymap () + "Define keymap for `image-dired-thumbnail-mode'." + + ;; Keys + (define-key image-dired-thumbnail-mode-map [right] 'image-dired-forward-image) + (define-key image-dired-thumbnail-mode-map [left] 'image-dired-backward-image) + (define-key image-dired-thumbnail-mode-map [up] 'image-dired-previous-line) + (define-key image-dired-thumbnail-mode-map [down] 'image-dired-next-line) + (define-key image-dired-thumbnail-mode-map "\C-f" 'image-dired-forward-image) + (define-key image-dired-thumbnail-mode-map "\C-b" 'image-dired-backward-image) + (define-key image-dired-thumbnail-mode-map "\C-p" 'image-dired-previous-line) + (define-key image-dired-thumbnail-mode-map "\C-n" 'image-dired-next-line) + + (define-key image-dired-thumbnail-mode-map "d" 'image-dired-flag-thumb-original-file) + (define-key image-dired-thumbnail-mode-map [delete] + 'image-dired-flag-thumb-original-file) + (define-key image-dired-thumbnail-mode-map "m" 'image-dired-mark-thumb-original-file) + (define-key image-dired-thumbnail-mode-map "u" 'image-dired-unmark-thumb-original-file) + (define-key image-dired-thumbnail-mode-map "." 'image-dired-track-original-file) + (define-key image-dired-thumbnail-mode-map [tab] 'image-dired-jump-original-dired-buffer) + + ;; add line-up map + (define-key image-dired-thumbnail-mode-map "g" image-dired-thumbnail-mode-line-up-map) + + ;; map it to "g" so that the user can press it more quickly + (define-key image-dired-thumbnail-mode-line-up-map "g" 'image-dired-line-up-dynamic) + ;; "f" for "fixed" number of thumbs per row + (define-key image-dired-thumbnail-mode-line-up-map "f" 'image-dired-line-up) + ;; "i" for "interactive" + (define-key image-dired-thumbnail-mode-line-up-map "i" 'image-dired-line-up-interactive) + + ;; add tag map + (define-key image-dired-thumbnail-mode-map "t" image-dired-thumbnail-mode-tag-map) + + ;; map it to "t" so that the user can press it more quickly + (define-key image-dired-thumbnail-mode-tag-map "t" 'image-dired-tag-thumbnail) + ;; "r" for "remove" + (define-key image-dired-thumbnail-mode-tag-map "r" 'image-dired-tag-thumbnail-remove) + + (define-key image-dired-thumbnail-mode-map "\C-m" + 'image-dired-display-thumbnail-original-image) + (define-key image-dired-thumbnail-mode-map [C-return] + 'image-dired-thumbnail-display-external) + + (define-key image-dired-thumbnail-mode-map "l" 'image-dired-rotate-thumbnail-left) + (define-key image-dired-thumbnail-mode-map "r" 'image-dired-rotate-thumbnail-right) + + (define-key image-dired-thumbnail-mode-map "L" 'image-dired-rotate-original-left) + (define-key image-dired-thumbnail-mode-map "R" 'image-dired-rotate-original-right) + + (define-key image-dired-thumbnail-mode-map "D" + 'image-dired-thumbnail-set-image-description) + + (define-key image-dired-thumbnail-mode-map "\C-d" 'image-dired-delete-char) + (define-key image-dired-thumbnail-mode-map " " + 'image-dired-display-next-thumbnail-original) + (define-key image-dired-thumbnail-mode-map + (kbd "DEL") 'image-dired-display-previous-thumbnail-original) + (define-key image-dired-thumbnail-mode-map "c" 'image-dired-comment-thumbnail) + (define-key image-dired-thumbnail-mode-map "q" 'image-dired-kill-buffer-and-window) + + ;; Mouse + (define-key image-dired-thumbnail-mode-map [mouse-2] 'image-dired-mouse-display-image) + (define-key image-dired-thumbnail-mode-map [mouse-1] 'image-dired-mouse-select-thumbnail) + + ;; Seems I must first set C-down-mouse-1 to undefined, or else it + ;; will trigger the buffer menu. If I try to instead bind + ;; C-down-mouse-1 to `image-dired-mouse-toggle-mark', I get a message + ;; about C-mouse-1 not being defined afterwards. Annoying, but I + ;; probably do not completely understand mouse events. + + (define-key image-dired-thumbnail-mode-map [C-down-mouse-1] 'undefined) + (define-key image-dired-thumbnail-mode-map [C-mouse-1] 'image-dired-mouse-toggle-mark) + + ;; Menu + (define-key image-dired-thumbnail-mode-map [menu-bar image-dired] + (cons "Image-Dired" (make-sparse-keymap "Image-Dired"))) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-kill-buffer-and-window] + '("Quit" . image-dired-kill-buffer-and-window)) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-delete-char] + '("Delete thumbnail from buffer" . image-dired-delete-char)) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-tag-thumbnail-remove] + '("Remove tag from thumbnail" . image-dired-tag-thumbnail-remove)) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-tag-thumbnail] + '("Tag thumbnail" . image-dired-tag-thumbnail)) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-comment-thumbnail] + '("Comment thumbnail" . image-dired-comment-thumbnail)) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-refresh-thumb] + '("Refresh thumb" . image-dired-refresh-thumb)) + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-line-up-dynamic] + '("Dynamic line up" . image-dired-line-up-dynamic)) + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-line-up] + '("Line up thumbnails" . image-dired-line-up)) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-rotate-thumbnail-left] + '("Rotate thumbnail left" . image-dired-rotate-thumbnail-left)) + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-rotate-thumbnail-right] + '("Rotate thumbnail right" . image-dired-rotate-thumbnail-right)) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-rotate-original-left] + '("Rotate original left" . image-dired-rotate-original-left)) + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-rotate-original-right] + '("Rotate original right" . image-dired-rotate-original-right)) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-toggle-movement-tracking] + '("Toggle movement tracking on/off" . image-dired-toggle-movement-tracking)) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-jump-original-dired-buffer] + '("Jump to dired buffer" . image-dired-jump-original-dired-buffer)) + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-track-original-file] + '("Track original" . image-dired-track-original-file)) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-flag-thumb-original-file] + '("Flag original for deletion" . image-dired-flag-thumb-original-file)) + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-unmark-thumb-original-file] + '("Unmark original" . image-dired-unmark-thumb-original-file)) + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-mark-thumb-original-file] + '("Mark original" . image-dired-mark-thumb-original-file)) + + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-thumbnail-display-external] + '("Display in external viewer" . image-dired-thumbnail-display-external)) + (define-key image-dired-thumbnail-mode-map + [menu-bar image-dired image-dired-display-thumbnail-original-image] + '("Display image" . image-dired-display-thumbnail-original-image))) + +(defvar image-dired-display-image-mode-map (make-sparse-keymap) + "Keymap for `image-dired-display-image-mode'.") + +(defun image-dired-define-display-image-mode-keymap () + "Define keymap for `image-dired-display-image-mode'." + + ;; Keys + (define-key image-dired-display-image-mode-map "q" 'image-dired-kill-buffer-and-window) + + (define-key image-dired-display-image-mode-map "f" + 'image-dired-display-current-image-full) + + (define-key image-dired-display-image-mode-map "s" + 'image-dired-display-current-image-sized) + + ;; Menu + (define-key image-dired-display-image-mode-map [menu-bar image-dired] + (cons "Image-Dired" (make-sparse-keymap "Image-Dired"))) + + (define-key image-dired-display-image-mode-map + [menu-bar image-dired image-dired-kill-buffer-and-window] + '("Quit" . image-dired-kill-buffer-and-window)) + + (define-key image-dired-display-image-mode-map + [menu-bar image-dired image-dired-display-current-image-sized] + '("Display original, sized to fit" . image-dired-display-current-image-sized)) + + (define-key image-dired-display-image-mode-map + [menu-bar image-dired image-dired-display-current-image-full] + '("Display original, full size" . image-dired-display-current-image-full)) + + ) + +(defun image-dired-display-current-image-full () + "Display current image in full size." + (interactive) + (let ((file (image-dired-original-file-name))) + (if file + (progn + (image-dired-display-image file t) + (message "Full size image displayed")) + (error "No original file name at point")))) + +(defun image-dired-display-current-image-sized () + "Display current image in sized to fit window dimensions." + (interactive) + (let ((file (image-dired-original-file-name))) + (if file + (progn + (image-dired-display-image file) + (message "Full size image displayed")) + (error "No original file name at point")))) + +(define-derived-mode image-dired-thumbnail-mode + fundamental-mode "image-dired-thumbnail" + "Browse and manipulate thumbnail images using dired. +Use `image-dired-dired' and `image-dired-setup-dired-keybindings' to get a +nice setup to start with." + (image-dired-define-thumbnail-mode-keymap) + (message "image-dired-thumbnail-mode enabled")) + +(define-derived-mode image-dired-display-image-mode + fundamental-mode "image-dired-image-display" + "Mode for displaying and manipulating original image. +Resized or in full-size." + (image-dired-define-display-image-mode-keymap) + (message "image-dired-display-image-mode enabled")) + +;;;###autoload +(defun image-dired-setup-dired-keybindings () + "Setup easy-to-use keybindings for the commands to be used in dired mode. +Note that n, p and <down> and <up> will be hijacked and bound to +`image-dired-dired-x-line'." + (interactive) + + ;; Hijack previous and next line movement. Let C-p and C-b be + ;; though... + + (define-key dired-mode-map "p" 'image-dired-dired-previous-line) + (define-key dired-mode-map "n" 'image-dired-dired-next-line) + (define-key dired-mode-map [up] 'image-dired-dired-previous-line) + (define-key dired-mode-map [down] 'image-dired-dired-next-line) + + (define-key dired-mode-map (kbd "C-S-n") 'image-dired-next-line-and-display) + (define-key dired-mode-map (kbd "C-S-p") 'image-dired-previous-line-and-display) + (define-key dired-mode-map (kbd "C-S-m") 'image-dired-mark-and-display-next) + + (define-key dired-mode-map "\C-td" 'image-dired-display-thumbs) + (define-key dired-mode-map "\C-tt" 'image-dired-tag-files) + (define-key dired-mode-map "\C-tr" 'image-dired-delete-tag) + (define-key dired-mode-map [tab] 'image-dired-jump-thumbnail-buffer) + (define-key dired-mode-map "\C-ti" 'image-dired-dired-display-image) + (define-key dired-mode-map "\C-tx" 'image-dired-dired-display-external) + (define-key dired-mode-map "\C-ta" 'image-dired-display-thumbs-append) + (define-key dired-mode-map "\C-t." 'image-dired-display-thumb) + (define-key dired-mode-map "\C-tc" 'image-dired-dired-comment-files) + (define-key dired-mode-map "\C-tf" 'image-dired-mark-tagged-files) + + ;; Menu for dired + (define-key dired-mode-map [menu-bar image-dired] + (cons "Image-Dired" (make-sparse-keymap "Image-Dired"))) + + (define-key dired-mode-map [menu-bar image-dired image-dired-copy-with-exif-file-name] + '("Copy with EXIF file name" . image-dired-copy-with-exif-file-name)) + + (define-key dired-mode-map [menu-bar image-dired image-dired-dired-comment-files] + '("Comment files" . image-dired-dired-comment-files)) + + (define-key dired-mode-map [menu-bar image-dired image-dired-mark-tagged-files] + '("Mark tagged files" . image-dired-mark-tagged-files)) + + (define-key dired-mode-map [menu-bar image-dired image-dired-delete-tag] + '("Remove tag from files" . image-dired-delete-tag)) + + (define-key dired-mode-map [menu-bar image-dired image-dired-tag-files] + '("Tag files" . image-dired-tag-files)) + + (define-key dired-mode-map [menu-bar image-dired image-dired-jump-thumbnail-buffer] + '("Jump to thumbnail buffer" . image-dired-jump-thumbnail-buffer)) + + (define-key dired-mode-map [menu-bar image-dired image-dired-toggle-movement-tracking] + '("Toggle movement tracking" . image-dired-toggle-movement-tracking)) + + (define-key dired-mode-map + [menu-bar image-dired image-dired-toggle-append-browsing] + '("Toggle append browsing" . image-dired-toggle-append-browsing)) + + (define-key dired-mode-map + [menu-bar image-dired image-dired-toggle-disp-props] + '("Toggle display properties" . image-dired-toggle-dired-display-properties)) + + (define-key dired-mode-map + [menu-bar image-dired image-dired-dired-display-external] + '("Display in external viewer" . image-dired-dired-display-external)) + (define-key dired-mode-map + [menu-bar image-dired image-dired-dired-display-image] + '("Display image" . image-dired-dired-display-image)) + (define-key dired-mode-map + [menu-bar image-dired image-dired-display-thumb] + '("Display this thumbnail" . image-dired-display-thumb)) + (define-key dired-mode-map + [menu-bar image-dired image-dired-display-thumbs-append] + '("Display thumbnails append" . image-dired-display-thumbs-append)) + (define-key dired-mode-map + [menu-bar image-dired image-dired-display-thumbs] + '("Display thumbnails" . image-dired-display-thumbs)) + + (define-key dired-mode-map + [menu-bar image-dired image-dired-create-thumbs] + '("Create thumbnails for marked files" . image-dired-create-thumbs)) + + (define-key dired-mode-map + [menu-bar image-dired image-dired-mark-and-display-next] + '("Mark and display next" . image-dired-mark-and-display-next)) + (define-key dired-mode-map + [menu-bar image-dired image-dired-previous-line-and-display] + '("Display thumb for previous file" . image-dired-previous-line-and-display)) + (define-key dired-mode-map + [menu-bar image-dired image-dired-next-line-and-display] + '("Display thumb for next file" . image-dired-next-line-and-display))) + +(defun image-dired-create-thumbs (&optional arg) + "Create thumbnail images for all marked files in dired. +With prefix argument ARG, create thumbnails even if they already exist +\(i.e. use this to refresh your thumbnails)." + (interactive "P") + (let (curr-file thumb-name files count) + (setq files (dired-get-marked-files)) + (mapcar + (lambda (curr-file) + (setq thumb-name (image-dired-thumb-name curr-file)) + ;; If the user overrides the exist check, we must clear the + ;; image cache so that if the user wants to display the + ;; thumnail, it is not fetched from cache. + (if arg + (clear-image-cache)) + (if (or (not (file-exists-p thumb-name)) + arg) + (if (not (= 0 (image-dired-create-thumb curr-file + (image-dired-thumb-name curr-file)))) + (error "Thumb could not be created")))) + files))) + +(defvar image-dired-slideshow-timer nil + "Slideshow timer.") + +(defvar image-dired-slideshow-count 0 + "Keeping track on number of images in slideshow.") + +(defvar image-dired-slideshow-times 0 + "Number of pictures to display in slideshow.") + +(defun image-dired-slideshow-step () + "Step to next file, if `image-dired-slideshow-times' has not been reached." + (if (< image-dired-slideshow-count image-dired-slideshow-times) + (progn + (message "%s" (1+ image-dired-slideshow-count)) + (setq image-dired-slideshow-count (1+ image-dired-slideshow-count)) + (image-dired-next-line-and-display)) + (image-dired-slideshow-stop))) + +(defun image-dired-slideshow-start () + "Start slideshow. +Ask user for number of images to show and the delay in between." + (interactive) + (setq image-dired-slideshow-count 0) + (setq image-dired-slideshow-times (string-to-number (read-string "How many: "))) + (let ((repeat (string-to-number + (read-string + "Delay, in seconds. Decimals are accepted : " "1")))) + (setq image-dired-slideshow-timer + (run-with-timer + 0 repeat + 'image-dired-slideshow-step)))) + +(defun image-dired-slideshow-stop () + "Cancel slideshow." + (interactive) + (cancel-timer image-dired-slideshow-timer)) + +(defun image-dired-delete-char () + "Remove current thumbnail from thumbnail buffer and line up." + (interactive) + (let ((inhibit-read-only t)) + (delete-char 1) + (if (looking-at " ") + (delete-char 1)))) + +;;;###autoload +(defun image-dired-display-thumbs-append () + "Append thumbnails to `image-dired-thumbnail-buffer'." + (interactive) + (image-dired-display-thumbs nil t t)) + +;;;###autoload +(defun image-dired-display-thumb () + "Shorthand for `image-dired-display-thumbs' with prefix argument." + (interactive) + (image-dired-display-thumbs t nil t)) + +(defun image-dired-line-up () + "Line up thumbnails according to `image-dired-thumbs-per-row'. +See also `image-dired-line-up-dynamic'." + (interactive) + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (while (and (not (image-dired-image-at-point-p)) + (not (eobp))) + (delete-char 1)) + (while (not (eobp)) + (forward-char) + (while (and (not (image-dired-image-at-point-p)) + (not (eobp))) + (delete-char 1))) + (goto-char (point-min)) + (let ((count 0)) + (while (not (eobp)) + (forward-char) + (if (= image-dired-thumbs-per-row 1) + (insert "\n") + (insert " ") + (setq count (1+ count)) + (when (and (= count (- image-dired-thumbs-per-row 1)) + (not (eobp))) + (forward-char) + (insert "\n") + (setq count 0))))) + (goto-char (point-min)))) + +(defun image-dired-line-up-dynamic () + "Line up thumbnails images dynamically. +Calculate how many thumbnails fit." + (interactive) + (let* ((char-width (frame-char-width)) + (width (image-dired-window-width-pixels (image-dired-thumbnail-window))) + (image-dired-thumbs-per-row + (/ width + (+ (* 2 image-dired-thumb-relief) + (* 2 image-dired-thumb-margin) + image-dired-thumb-width char-width)))) + (image-dired-line-up))) + +(defun image-dired-line-up-interactive () + "Line up thumbnails interactively. +Ask user how many thumbnails should be displayed per row." + (interactive) + (let ((image-dired-thumbs-per-row + (string-to-number (read-string "How many thumbs per row: ")))) + (if (not (> image-dired-thumbs-per-row 0)) + (message "Number must be greater than 0") + (image-dired-line-up)))) + +(defun image-dired-thumbnail-display-external () + "Display original image for thumbnail at point using external viewer." + (interactive) + (let ((file (image-dired-original-file-name))) + (if (not (image-dired-image-at-point-p)) + (message "No thumbnail at point") + (if (not file) + (message "No original file name found") + (call-process shell-file-name nil nil nil shell-command-switch + (format "%s \"%s\"" image-dired-external-viewer file)))))) + +;;;###autoload +(defun image-dired-dired-display-external () + "Display file at point using an external viewer." + (interactive) + (let ((file (dired-get-filename))) + (call-process shell-file-name nil nil nil shell-command-switch + (format "%s \"%s\"" image-dired-external-viewer file)))) + +(defun image-dired-window-width-pixels (window) + "Calculate WINDOW width in pixels." + (* (window-width window) (frame-char-width))) + +(defun image-dired-window-height-pixels (window) + "Calculate WINDOW height in pixels." + ;; Note: The mode-line consumes one line + (* (- (window-height window) 1) (frame-char-height))) + +(defun image-dired-display-window () + "Return window where `image-dired-display-image-buffer' is visible." + (get-window-with-predicate + (lambda (window) + (equal (buffer-name (window-buffer window)) image-dired-display-image-buffer)) + nil t)) + +(defun image-dired-thumbnail-window () + "Return window where `image-dired-thumbnail-buffer' is visible." + (get-window-with-predicate + (lambda (window) + (equal (buffer-name (window-buffer window)) image-dired-thumbnail-buffer)) + nil t)) + +(defun image-dired-associated-dired-buffer-window () + "Return window where associated dired buffer is visible." + (let (buf) + (if (image-dired-image-at-point-p) + (progn + (setq buf (image-dired-associated-dired-buffer)) + (get-window-with-predicate + (lambda (window) + (equal (window-buffer window) buf)))) + (error "No thumbnail image at point")))) + +(defun image-dired-display-window-width () + "Return width, in pixels, of image-dired's image display window." + (- (image-dired-window-width-pixels (image-dired-display-window)) + image-dired-display-window-width-correction)) + +(defun image-dired-display-window-height () + "Return height, in pixels, of image-dired's image display window." + (- (image-dired-window-height-pixels (image-dired-display-window)) + image-dired-display-window-height-correction)) + +(defun image-dired-display-image (file &optional original-size) + "Display image FILE in image buffer. +Use this when you want to display the image, semi sized, in a new +window. The image is sized to fit the display window (using a +temporary file, don't worry). Because of this, it will not be as +quick as opening it directly, but on most modern systems it +should feel snappy enough. + +If optional argument ORIGINAL-SIZE is non-nil, display image in its +original size." + (let ((new-file (expand-file-name image-dired-temp-image-file)) + width height command ret) + (setq file (expand-file-name file)) + (if (not original-size) + (progn + (setq width (image-dired-display-window-width)) + (setq height (image-dired-display-window-height)) + (setq command + (format-spec + image-dired-cmd-create-temp-image-options + (list + (cons ?p image-dired-cmd-create-temp-image-program) + (cons ?w width) + (cons ?h height) + (cons ?f file) + (cons ?t new-file)))) + (setq ret (call-process shell-file-name nil nil nil + shell-command-switch command)) + (if (not (= 0 ret)) + (error "Could not resize image"))) + (copy-file file new-file t)) + (with-current-buffer (image-dired-create-display-image-buffer) + (let ((inhibit-read-only t)) + (erase-buffer) + (clear-image-cache) + (image-dired-insert-image image-dired-temp-image-file 'jpeg 0 0) + (goto-char (point-min)) + (image-dired-update-property 'original-file-name file))))) + +(defun image-dired-display-thumbnail-original-image (&optional arg) + "Display current thumbnail's original image in display buffer. +See documentation for `image-dired-display-image' for more information. +With prefix argument ARG, display image in its original size." + (interactive "P") + (let ((file (image-dired-original-file-name))) + (if (not (string-equal major-mode "image-dired-thumbnail-mode")) + (message "Not in image-dired-thumbnail-mode") + (if (not (image-dired-image-at-point-p)) + (message "No thumbnail at point") + (if (not file) + (message "No original file name found") + (image-dired-create-display-image-buffer) + (display-buffer image-dired-display-image-buffer) + (image-dired-display-image file arg)))))) + + +;;;###autoload +(defun image-dired-dired-display-image (&optional arg) + "Display current image file. +See documentation for `image-dired-display-image' for more information. +With prefix argument ARG, display image in its original size." + (interactive "P") + (image-dired-create-display-image-buffer) + (display-buffer image-dired-display-image-buffer) + (image-dired-display-image (dired-get-filename) arg)) + +(defun image-dired-image-at-point-p () + "Return true if there is a image-dired thumbnail at point." + (get-text-property (point) 'image-dired-thumbnail)) + +(defun image-dired-rotate-thumbnail (degrees) + "Rotate thumbnail DEGREES degrees." + (if (not (image-dired-image-at-point-p)) + (message "No thumbnail at point") + (let ((file (image-dired-thumb-name (image-dired-original-file-name))) + command) + (setq command (format-spec + image-dired-cmd-rotate-thumbnail-options + (list + (cons ?p image-dired-cmd-rotate-thumbnail-program) + (cons ?d degrees) + (cons ?t (expand-file-name file))))) + (call-process shell-file-name nil nil nil shell-command-switch command) + ;; Clear the cache to refresh image. I wish I could just refresh + ;; the current file but I do not know how to do that. Yet... + (clear-image-cache)))) + +(defun image-dired-rotate-thumbnail-left () + "Rotate thumbnail left (counter clockwise) 90 degrees. +The result of the rotation is displayed in the image display area +and a confirmation is needed before the original image files is +overwritten. This confirmation can be turned off using +`image-dired-rotate-original-ask-before-overwrite'." + (interactive) + (image-dired-rotate-thumbnail "270")) + +(defun image-dired-rotate-thumbnail-right () + "Rotate thumbnail counter right (clockwise) 90 degrees. +The result of the rotation is displayed in the image display area +and a confirmation is needed before the original image files is +overwritten. This confirmation can be turned off using +`image-dired-rotate-original-ask-before-overwrite'." + (interactive) + (image-dired-rotate-thumbnail "90")) + +(defun image-dired-refresh-thumb () + "Force creation of new image for current thumbnail." + (interactive) + (let ((file (image-dired-original-file-name))) + (clear-image-cache) + (image-dired-create-thumb file (image-dired-thumb-name file)))) + +(defun image-dired-rotate-original (degrees) + "Rotate original image DEGREES degrees." + (if (not (image-dired-image-at-point-p)) + (message "No image at point") + (let ((file (image-dired-original-file-name)) + command temp-file) + (if (not (string-match "\.[jJ][pP[eE]?[gG]$" file)) + (error "Only JPEG images can be rotated!")) + (setq command (format-spec + image-dired-cmd-rotate-original-options + (list + (cons ?p image-dired-cmd-rotate-original-program) + (cons ?d degrees) + (cons ?o (expand-file-name file)) + (cons ?t image-dired-temp-rotate-image-file)))) + (if (not (= 0 (call-process shell-file-name nil nil nil + shell-command-switch command))) + (error "Could not rotate image") + (image-dired-display-image image-dired-temp-rotate-image-file) + (if (or (and image-dired-rotate-original-ask-before-overwrite + (y-or-n-p + "Rotate to temp file OK. Overwrite original image? ")) + (not image-dired-rotate-original-ask-before-overwrite)) + (progn + (copy-file image-dired-temp-rotate-image-file file t) + (image-dired-refresh-thumb)) + (image-dired-display-image file)))))) + +(defun image-dired-rotate-original-left () + "Rotate original image left (counter clockwise) 90 degrees." + (interactive) + (image-dired-rotate-original "270")) + +(defun image-dired-rotate-original-right () + "Rotate original image right (clockwise) 90 degrees." + (interactive) + (image-dired-rotate-original "90")) + +(defun image-dired-get-exif-file-name (file) + "Use the image's EXIF information to return a unique file name. +The file name should be unique as long as you do not take more than +one picture per second. The original file name is suffixed at the end +for traceability. The format of the returned file name is +YYYY_MM_DD_HH_MM_DD_ORIG_FILE_NAME.jpg. Used from +`image-dired-copy-with-exif-file-name'." + (let (data no-exif-data-found) + (if (not (string-match "\.[Jj][Pp][Ee]?[Gg]$" (expand-file-name file))) + (progn + (setq no-exif-data-found t) + (setq data + (format-time-string + "%Y:%m:%d %H:%M:%S" + (nth 5 (file-attributes (expand-file-name file)))))) + (setq data (image-dired-get-exif-data (expand-file-name file) + "DateTimeOriginal"))) + (while (string-match "[ :]" data) + (setq data (replace-match "_" nil nil data))) + (format "%s%s%s" data + (if no-exif-data-found + "_noexif_" + "_") + (file-name-nondirectory file)))) + +(defun image-dired-thumbnail-set-image-description () + "Set the ImageDescription EXIF tag for the original image. +If the image already has a value for this tag, it is used as the +default value at the prompt." + (interactive) + (if (not (image-dired-image-at-point-p)) + (message "No thumbnail at point") + (let* ((file (image-dired-original-file-name)) + (old-value (image-dired-get-exif-data file "ImageDescription"))) + (if (eq 0 + (image-dired-set-exif-data file "ImageDescription" + (read-string "Value of ImageDescription: " + old-value))) + (message "Successfully wrote ImageDescription tag.") + (error "Could not write ImageDescription tag"))))) + +(defun image-dired-set-exif-data (file tag-name tag-value) + "In FILE, set EXIF tag TAG-NAME to value TAG-VALUE." + (let (command) + (setq command (format-spec + image-dired-cmd-write-exif-data-options + (list + (cons ?p image-dired-cmd-write-exif-data-program) + (cons ?f (expand-file-name file)) + (cons ?t tag-name) + (cons ?v tag-value)))) + (call-process shell-file-name nil nil nil shell-command-switch command))) + +(defun image-dired-get-exif-data (file tag-name) + "From FILE, return EXIF tag TAG-NAME." + (let ((buf (get-buffer-create "*image-dired-get-exif-data*")) + command tag-value) + (setq command (format-spec + image-dired-cmd-read-exif-data-options + (list + (cons ?p image-dired-cmd-read-exif-data-program) + (cons ?f file) + (cons ?t tag-name)))) + (with-current-buffer buf + (delete-region (point-min) (point-max)) + (if (not (eq (call-process shell-file-name nil t nil + shell-command-switch command) 0)) + (error "Could not get EXIF tag") + (goto-char (point-min)) + ;; Clean buffer from newlines and carriage returns before + ;; getting final info + (while (search-forward-regexp "[\n\r]" nil t) + (replace-match "" nil t)) + (setq tag-value (buffer-substring (point-min) (point-max))))) + tag-value)) + +(defun image-dired-copy-with-exif-file-name () + "Copy file with unique name to main image directory. +Copy current or all marked files in dired to a new file in your +main image directory, using a file name generated by +`image-dired-get-exif-file-name'. A typical usage for this if when +copying images from a digital camera into the image directory. + + Typically, you would open up the folder with the incoming +digital images, mark the files to be copied, and execute this +function. The result is a couple of new files in +`image-dired-main-image-directory' called +2005_05_08_12_52_00_dscn0319.jpg, +2005_05_08_14_27_45_dscn0320.jpg etc." + (interactive) + (let (new-name + (files (dired-get-marked-files))) + (mapcar + (lambda (curr-file) + (setq new-name + (format "%s/%s" + (file-name-as-directory + (expand-file-name image-dired-main-image-directory)) + (image-dired-get-exif-file-name curr-file))) + (message "Copying %s to %s" curr-file new-name) + (copy-file curr-file new-name)) + files))) + +(defun image-dired-display-next-thumbnail-original () + "In thubnail buffer, move to next thumbnail and display the image." + (interactive) + (image-dired-forward-image) + (image-dired-display-thumbnail-original-image)) + +(defun image-dired-display-previous-thumbnail-original () + "Move to previous thumbnail and display image." + (interactive) + (image-dired-backward-image) + (image-dired-display-thumbnail-original-image)) + +(defun image-dired-write-comments (file-comments) + "Write file comments to database. +Write file comments to one or more files. FILE-COMMENTS is an alist on +the following form: + ((FILE . COMMENT) ... )" + (let (end comment-beg-pos comment-end-pos file comment) + (with-temp-file image-dired-db-file + (insert-file-contents image-dired-db-file) + (dolist (elt file-comments) + (setq file (car elt) + comment (cdr elt)) + (goto-char (point-min)) + (if (search-forward-regexp (format "^%s.*$" file) nil t) + (progn + (setq end (point)) + (beginning-of-line) + ;; Delete old comment, if any + (when (search-forward ";comment:" end t) + (setq comment-beg-pos (match-beginning 0)) + ;; Any tags after the comment? + (if (search-forward ";" end t) + (setq comment-end-pos (- (point) 1)) + (setq comment-end-pos end)) + ;; Delete comment tag and comment + (delete-region comment-beg-pos comment-end-pos)) + ;; Insert new comment + (beginning-of-line) + (unless (search-forward ";" end t) + (end-of-line) + (insert ";")) + (insert (format "comment:%s;" comment))) + ;; File does not exist in database - add it. + (goto-char (point-max)) + (insert (format "\n%s;comment:%s" file comment))))))) + +(defun image-dired-update-property (prop value) + "Update text property PROP with value VALUE at point." + (let ((inhibit-read-only t)) + (put-text-property + (point) (1+ (point)) + prop + value))) + +;;;###autoload +(defun image-dired-dired-comment-files () + "Add comment to current or marked files in dired." + (interactive) + (let ((comment (image-dired-read-comment))) + (image-dired-write-comments + (mapcar + (lambda (curr-file) + (cons curr-file comment)) + (dired-get-marked-files))))) + +(defun image-dired-comment-thumbnail () + "Add comment to current thumbnail in thumbnail buffer." + (interactive) + (let* ((file (image-dired-original-file-name)) + (comment (image-dired-read-comment file))) + (image-dired-write-comments (list (cons file comment))) + (image-dired-update-property 'comment comment)) + (image-dired-display-thumb-properties)) + +(defun image-dired-read-comment (&optional file) + "Read comment for an image. +Read comment for an image, optionally using old comment from FILE +as initial value." + (let ((comment + (read-string + "Comment: " + (if file (image-dired-get-comment file))))) + comment)) + +(defun image-dired-get-comment (file) + "Get comment for file FILE." + (save-excursion + (let (end buf comment-beg-pos comment-end-pos comment) + (setq buf (find-file image-dired-db-file)) + (goto-char (point-min)) + (when (search-forward-regexp + (format "^%s" file) nil t) + (end-of-line) + (setq end (point)) + (beginning-of-line) + (cond ((search-forward ";comment:" end t) + (setq comment-beg-pos (point)) + (if (search-forward ";" end t) + (setq comment-end-pos (- (point) 1)) + (setq comment-end-pos end)) + (setq comment (buffer-substring + comment-beg-pos comment-end-pos))))) + (kill-buffer buf) + comment))) + +;;;###autoload +(defun image-dired-mark-tagged-files () + "Use regexp to mark files with matching tag. +A `tag' is a keyword, a piece of meta data, associated with an +image file and stored in image-dired's database file. This command +lets you input a regexp and this will be matched against all tags +on all image files in the database file. The files that have a +matching tags will be marked in the dired buffer." + (interactive) + (let ((tag (read-string "Mark tagged files (regexp): ")) + (hits 0) + files buf) + (save-excursion + (setq buf (find-file image-dired-db-file)) + (goto-char (point-min)) + ;; Collect matches + (while (search-forward-regexp + (concat "\\(^[^;\n]+\\);.*" tag ".*$") nil t) + (setq files (append (list (match-string 1)) files))) + (kill-buffer buf) + ;; Mark files + (mapcar + ;; I tried using `dired-mark-files-regexp' but it was + ;; waaaay to slow. + (lambda (curr-file) + ;; Don't bother about hits found in other directories than + ;; the current one. + (when (string= (file-name-as-directory + (expand-file-name default-directory)) + (file-name-as-directory + (file-name-directory curr-file))) + (setq curr-file (file-name-nondirectory curr-file)) + (goto-char (point-min)) + (when (search-forward-regexp (format "\\s %s$" curr-file) nil t) + (setq hits (+ hits 1)) + (dired-mark 1)))) + files)) + (message "%d files with matching tag marked." hits))) + +(defun image-dired-mouse-display-image (event) + "Use mouse EVENT, call `image-dired-display-image' to display image. +Track this in associated dired buffer if `image-dired-track-movement' is +non-nil." + (interactive "e") + (let (file) + (mouse-set-point event) + (goto-char (posn-point (event-end event))) + (setq file (image-dired-original-file-name)) + (if image-dired-track-movement + (image-dired-track-original-file)) + (image-dired-create-display-image-buffer) + (display-buffer image-dired-display-image-buffer) + (image-dired-display-image file))) + +(defun image-dired-mouse-select-thumbnail (event) + "Use mouse EVENT to select thumbnail image. +Track this in associated dired buffer if `image-dired-track-movement' is +non-nil." + (interactive "e") + (let (file) + (mouse-set-point event) + (goto-char (posn-point (event-end event))) + (if image-dired-track-movement + (image-dired-track-original-file))) + (image-dired-display-thumb-properties)) + +(defun image-dired-mouse-toggle-mark (event) + "Use mouse EVENT to toggle dired mark for thumbnail. +Track this in associated dired buffer if `image-dired-track-movement' is +non-nil." + (interactive "e") + (let (file) + (mouse-set-point event) + (goto-char (posn-point (event-end event))) + (if image-dired-track-movement + (image-dired-track-original-file))) + (image-dired-toggle-mark-thumb-original-file)) + +(defun image-dired-dired-display-properties () + "Display properties for dired file in the echo area." + (interactive) + (let* ((file (dired-get-filename)) + (file-name (file-name-nondirectory file)) + (dired-buf (buffer-name (current-buffer))) + (props (mapconcat + 'princ + (image-dired-list-tags file) + ", ")) + (comment (image-dired-get-comment file))) + (if file-name + (message + (image-dired-format-properties-string + dired-buf + file-name + props + comment))))) + +(defvar image-dired-tag-file-list nil + "List to store tag-file structure.") + +(defvar image-dired-file-tag-list nil + "List to store file-tag structure.") + +(defvar image-dired-file-comment-list nil + "List to store file comments.") + +(defun image-dired-add-to-tag-file-list (tag file) + "Add relation between TAG and FILE." + (let (curr) + (if image-dired-tag-file-list + (if (setq curr (assoc tag image-dired-tag-file-list)) + (if (not (member file curr)) + (setcdr curr (cons file (cdr curr)))) + (setcdr image-dired-tag-file-list + (cons (list tag file) (cdr image-dired-tag-file-list)))) + (setq image-dired-tag-file-list (list (list tag file)))))) + +(defun image-dired-add-to-tag-file-lists (tag file) + "Helper function used from `image-dired-create-gallery-lists'. + +Add TAG to FILE in one list and FILE to TAG in the other. + +Lisp structures look like the following: + +image-dired-file-tag-list: + + ((\"filename1\" \"tag1\" \"tag2\" \"tag3\" ...) + (\"filename2\" \"tag1\" \"tag2\" \"tag3\" ...) + ...) + +image-dired-tag-file-list: + + ((\"tag1\" \"filename1\" \"filename2\" \"filename3\" ...) + (\"tag2\" \"filename1\" \"filename2\" \"filename3\" ...) + ...)" + ;; Add tag to file list + (let (curr) + (if image-dired-file-tag-list + (if (setq curr (assoc file image-dired-file-tag-list)) + (setcdr curr (cons tag (cdr curr))) + (setcdr image-dired-file-tag-list + (cons (list file tag) (cdr image-dired-file-tag-list)))) + (setq image-dired-file-tag-list (list (list file tag)))) + ;; Add file to tag list + (if image-dired-tag-file-list + (if (setq curr (assoc tag image-dired-tag-file-list)) + (if (not (member file curr)) + (setcdr curr (cons file (cdr curr)))) + (setcdr image-dired-tag-file-list + (cons (list tag file) (cdr image-dired-tag-file-list)))) + (setq image-dired-tag-file-list (list (list tag file)))))) + +(defun image-dired-add-to-file-comment-list (file comment) + "Helper function used from `image-dired-create-gallery-lists'. + +For FILE, add COMMENT to list. + +Lisp structure looks like the following: + +image-dired-file-comment-list: + + ((\"filename1\" . \"comment1\") + (\"filename2\" . \"comment2\") + ...)" + (if image-dired-file-comment-list + (if (not (assoc file image-dired-file-comment-list)) + (setcdr image-dired-file-comment-list + (cons (cons file comment) + (cdr image-dired-file-comment-list)))) + (setq image-dired-file-comment-list (list (cons file comment))))) + +(defun image-dired-create-gallery-lists () + "Create temporary lists used by `image-dired-gallery-generate'." + (let ((buf (find-file image-dired-db-file)) + end beg file row-tags) + (setq image-dired-tag-file-list nil) + (setq image-dired-file-tag-list nil) + (setq image-dired-file-comment-list nil) + (goto-char (point-min)) + (while (search-forward-regexp "^." nil t) + (end-of-line) + (setq end (point)) + (beginning-of-line) + (setq beg (point)) + (if (not (search-forward ";" end nil)) + (error "Something is really wrong, check format of database")) + (setq row-tags (split-string + (buffer-substring beg end) ";")) + (setq file (car row-tags)) + (mapc + (lambda (x) + (if (not (string-match "^comment:\\(.*\\)" x)) + (image-dired-add-to-tag-file-lists x file) + (image-dired-add-to-file-comment-list file (match-string 1 x)))) + (cdr row-tags))) + (kill-buffer buf)) + ;; Sort tag-file list + (setq image-dired-tag-file-list + (sort image-dired-tag-file-list + (lambda (x y) + (string< (car x) (car y)))))) + +(defun image-dired-hidden-p (file) + "Return t if image FILE has a \"hidden\" tag." + (let (hidden) + (mapc + (lambda (tag) + (if (member tag image-dired-gallery-hidden-tags) + (setq hidden t))) + (cdr (assoc file image-dired-file-tag-list))) + hidden)) + +(defun image-dired-gallery-generate () + "Generate gallery pages. +First we create a couple of Lisp structures from the database to make +it easier to generate, then HTML-files are created in +`image-dired-gallery-dir'" + (interactive) + (if (eq 'per-directory image-dired-thumbnail-storage) + (error "Currently, gallery generation is not supported \ +when using per-directory thumbnail file storage")) + (image-dired-create-gallery-lists) + (let ((tags image-dired-tag-file-list) + count curr tag index-buf tag-buf + comment file-tags tag-link tag-link-list) + ;; Make sure gallery root exist + (if (file-exists-p image-dired-gallery-dir) + (if (not (file-directory-p image-dired-gallery-dir)) + (error "Variable image-dired-gallery-dir is not a directory")) + (make-directory image-dired-gallery-dir)) + ;; Open index file + (setq index-buf (find-file + (format "%s/index.html" image-dired-gallery-dir))) + (erase-buffer) + (insert "<html>\n") + (insert " <body>\n") + (insert " <h2>Image-Dired Gallery</h2>\n") + (insert (format "<p>\n Gallery generated %s\n <p>\n" + (current-time-string))) + (insert " <h3>Tag index</h3>\n") + (setq count 1) + ;; Pre-generate list of all tag links + (mapc + (lambda (curr) + (setq tag (car curr)) + (when (not (member tag image-dired-gallery-hidden-tags)) + (setq tag-link (format "<a href=\"%d.html\">%s</a>" count tag)) + (if tag-link-list + (setq tag-link-list + (append tag-link-list (list (cons tag tag-link)))) + (setq tag-link-list (list (cons tag tag-link)))) + (setq count (1+ count)))) + tags) + (setq count 1) + ;; Main loop where we generated thumbnail pages per tag + (mapc + (lambda (curr) + (setq tag (car curr)) + ;; Don't display hidden tags + (when (not (member tag image-dired-gallery-hidden-tags)) + ;; Insert link to tag page in index + (insert (format " %s<br>\n" (cdr (assoc tag tag-link-list)))) + ;; Open per-tag file + (setq tag-buf (find-file + (format "%s/%s.html" image-dired-gallery-dir count))) + (erase-buffer) + (insert "<html>\n") + (insert " <body>\n") + (insert " <p><a href=\"index.html\">Index</a></p>\n") + (insert (format " <h2>Images with tag "%s"</h2>" tag)) + ;; Main loop for files per tag page + (mapc + (lambda (file) + (when (not (image-dired-hidden-p file)) + ;; Insert thumbnail with link to full image + (insert + (format "<a href=\"%s/%s\"><img src=\"%s/%s\"%s></a>\n" + image-dired-gallery-image-root-url + (file-name-nondirectory file) + image-dired-gallery-thumb-image-root-url + (file-name-nondirectory (image-dired-thumb-name file)) file)) + ;; Insert comment, if any + (if (setq comment (cdr (assoc file image-dired-file-comment-list))) + (insert (format "<br>\n%s<br>\n" comment)) + (insert "<br>\n")) + ;; Insert links to other tags, if any + (when (> (length + (setq file-tags (assoc file image-dired-file-tag-list))) 2) + (insert "[ ") + (mapc + (lambda (extra-tag) + ;; Only insert if not file name or the main tag + (if (and (not (equal extra-tag tag)) + (not (equal extra-tag file))) + (insert + (format "%s " (cdr (assoc extra-tag tag-link-list)))))) + file-tags) + (insert "]<br>\n")))) + (cdr curr)) + (insert " <p><a href=\"index.html\">Index</a></p>\n") + (insert " </body>\n") + (insert "</html>\n") + (save-buffer) + (kill-buffer tag-buf) + (setq count (1+ count)))) + tags) + (insert " </body>\n") + (insert "</html>") + (save-buffer) + (kill-buffer index-buf))) + +(defun image-dired-kill-buffer-and-window () + "Kill the current buffer and, if possible, also the window." + (interactive) + (let ((buffer (current-buffer))) + (condition-case nil + (delete-window (selected-window)) + (error nil)) + (kill-buffer buffer))) + +(defvar image-dired-widget-list nil + "List to keep track of meta data in edit buffer.") + +;;;###autoload +(defun image-dired-dired-edit-comment-and-tags () + "Edit comment and tags of current or marked image files. +Edit comment and tags for all marked image files in an +easy-to-use form." + (interactive) + (setq image-dired-widget-list nil) + ;; Setup buffer. + (let ((files (dired-get-marked-files))) + (switch-to-buffer "*Image-Dired Edit Meta Data*") + (kill-all-local-variables) + (make-local-variable 'widget-example-repeat) + (let ((inhibit-read-only t)) + (erase-buffer)) + (remove-overlays) + ;; Some help for the user. + (widget-insert +"\nEdit comments and tags for each image. Separate multiple tags +with a comma. Move forward between fields using TAB or RET. +Move to the previous field using backtab (S-TAB). Save by +activating the Save button at the bottom of the form or cancel +the operation by activating the Cancel button.\n\n") + ;; Here comes all images and a comment and tag field for each + ;; image. + (let (thumb-file img comment-widget tag-widget) + + (dolist (file files) + + (setq thumb-file (image-dired-thumb-name file) + img (create-image thumb-file)) + + (insert-image img) + (widget-insert "\n\nComment: ") + (setq comment-widget + (widget-create 'editable-field + :size 60 + :format "%v " + :value (or (image-dired-get-comment file) ""))) + (widget-insert "\nTags: ") + (setq tag-widget + (widget-create 'editable-field + :size 60 + :format "%v " + :value (or (mapconcat + (lambda (tag) + tag) + (image-dired-list-tags file) + ",") ""))) + ;; Save information in all widgets so that we can use it when + ;; the user saves the form. + (setq image-dired-widget-list + (append image-dired-widget-list + (list (list file comment-widget tag-widget)))) + (widget-insert "\n\n"))) + + ;; Footer with Save and Cancel button. + (widget-insert "\n") + (widget-create 'push-button + :notify + (lambda (&rest ignore) + (image-dired-save-information-from-widgets) + (bury-buffer) + (message "Done.")) + "Save") + (widget-insert " ") + (widget-create 'push-button + :notify + (lambda (&rest ignore) + (bury-buffer) + (message "Operation canceled.")) + "Cancel") + (widget-insert "\n") + (use-local-map widget-keymap) + (widget-setup) + ;; Jump to the first widget. + (widget-forward 1))) + +(defun image-dired-save-information-from-widgets () + "Save information found in `image-dired-widget-list'. +Use the information in `image-dired-widget-list' to save comments and +tags to their respective image file. Internal function used by +`image-dired-dired-edit-comment-and-tags'." + (let (file comment tag-string tag-list lst) + (image-dired-write-comments + (mapcar + (lambda (widget) + (setq file (car widget) + comment (widget-value (cadr widget))) + (cons file comment)) + image-dired-widget-list)) + (image-dired-write-tags + (dolist (widget image-dired-widget-list lst) + (setq file (car widget) + tag-string (widget-value (car (cddr widget))) + tag-list (split-string tag-string ",")) + (dolist (tag tag-list) + (push (cons file tag) lst)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;; TEST-SECTION ;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; (defvar image-dired-dir-max-size 12300000) + +;; (defun image-dired-test-clean-old-files () +;; "Clean `image-dired-dir' from old thumbnail files. +;; \"Oldness\" measured using last access time. If the total size of all +;; thumbnail files in `image-dired-dir' is larger than 'image-dired-dir-max-size', +;; old files are deleted until the max size is reached." +;; (let* ((files +;; (sort +;; (mapcar +;; (lambda (f) +;; (let ((fattribs (file-attributes f))) +;; ;; Get last access time and file size +;; `(,(nth 4 fattribs) ,(nth 7 fattribs) ,f))) +;; (directory-files (image-dired-dir) t ".+\.thumb\..+$")) +;; ;; Sort function. Compare time between two files. +;; '(lambda (l1 l2) +;; (time-less-p (car l1) (car l2))))) +;; (dirsize (apply '+ (mapcar (lambda (x) (cadr x)) files)))) +;; (while (> dirsize image-dired-dir-max-size) +;; (y-or-n-p +;; (format "Size of thumbnail directory: %d, delete old file %s? " +;; dirsize (cadr (cdar files)))) +;; (delete-file (cadr (cdar files))) +;; (setq dirsize (- dirsize (car (cdar files)))) +;; (setq files (cdr files))))) + +;;;;;;;;;;;;;;;;;;;;;;, + +;; (defun dired-speedbar-buttons (dired-buffer) +;; (when (and (boundp 'image-dired-use-speedbar) +;; image-dired-use-speedbar) +;; (let ((filename (with-current-buffer dired-buffer +;; (dired-get-filename)))) +;; (when (and (not (string-equal filename (buffer-string))) +;; (string-match (image-file-name-regexp) filename)) +;; (erase-buffer) +;; (insert (propertize +;; filename +;; 'display +;; (image-dired-get-thumbnail-image filename))))))) + +;; (setq image-dired-use-speedbar t) + +(provide 'image-dired) + +;; arch-tag: 9d11411d-331f-4380-8b44-8adfe3a0343e +;;; image-dired.el ends here
--- a/lisp/info.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/info.el Tue Apr 24 21:56:25 2007 +0000 @@ -1400,8 +1400,8 @@ (defvar Info-mode-line-node-keymap (let ((map (make-sparse-keymap))) - (define-key map [mode-line mouse-1] 'Info-scroll-up) - (define-key map [mode-line mouse-3] 'Info-scroll-down) + (define-key map [mode-line mouse-1] 'Info-mouse-scroll-up) + (define-key map [mode-line mouse-3] 'Info-mouse-scroll-down) map) "Keymap to put on the Info node name in the mode line.") @@ -2620,6 +2620,15 @@ (t (Info-next-preorder))) (scroll-up)))) +(defun Info-mouse-scroll-up (e) + "Scroll one screenful forward in Info, using the mouse. +See `Info-scroll-up'." + (interactive "e") + (save-selected-window + (if (eventp e) + (select-window (posn-window (event-start e)))) + (Info-scroll-up))) + (defun Info-scroll-down () "Scroll one screenful back in Info, considering all nodes as one sequence. If point is within the menu of a node, and `Info-scroll-prefer-subnodes' @@ -2646,6 +2655,15 @@ (Info-last-preorder) (scroll-down)))) +(defun Info-mouse-scroll-down (e) + "Scroll one screenful backward in Info, using the mouse. +See `Info-scroll-down'." + (interactive "e") + (save-selected-window + (if (eventp e) + (select-window (posn-window (event-start e)))) + (Info-scroll-down))) + (defun Info-next-reference (&optional recur) "Move cursor to the next cross-reference or menu item in the node." (interactive)
--- a/lisp/international/mule.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/international/mule.el Tue Apr 24 21:56:25 2007 +0000 @@ -1567,8 +1567,10 @@ ;;; FILE I/O (defcustom auto-coding-alist - '(("\\.\\(arc\\|zip\\|lzh\\|lha\\|zoo\\|[jew]ar\\|xpi\\)\\'" . no-conversion) - ("\\.\\(ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\)\\'" . no-conversion) + ;; .exe and .EXE are added to support archive-mode looking at DOS + ;; self-extracting exe archives. + '(("\\.\\(arc\\|zip\\|lzh\\|lha\\|zoo\\|[jew]ar\\|xpi\\|exe\\)\\'" . no-conversion) + ("\\.\\(ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\|EXE\\)\\'" . no-conversion) ("\\.\\(sx[dmicw]\\|odt\\|tar\\|tgz\\)\\'" . no-conversion) ("\\.\\(gz\\|Z\\|bz\\|bz2\\|gpg\\)\\'" . no-conversion) ("\\.\\(jpe?g\\|png\\|gif\\|tiff?\\|p[bpgn]m\\)\\'" . no-conversion)
--- a/lisp/ldefs-boot.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/ldefs-boot.el Tue Apr 24 21:56:25 2007 +0000 @@ -4,7 +4,7 @@ ;;;### (autoloads (5x5-crack 5x5-crack-xor-mutate 5x5-crack-mutating-best ;;;;;; 5x5-crack-mutating-current 5x5-crack-randomly 5x5) "5x5" -;;;;;; "play/5x5.el" (17876 15555)) +;;;;;; "play/5x5.el" (17941 38806)) ;;; Generated autoloads from play/5x5.el (autoload (quote 5x5) "5x5" "\ @@ -852,7 +852,7 @@ ;;;*** ;;;### (autoloads (animate-birthday-present animate-sequence animate-string) -;;;;;; "animate" "play/animate.el" (17842 55395)) +;;;;;; "animate" "play/animate.el" (17941 38806)) ;;; Generated autoloads from play/animate.el (autoload (quote animate-string) "animate" "\ @@ -945,7 +945,7 @@ ;;;### (autoloads (appt-activate appt-make-list appt-delete appt-add ;;;;;; appt-display-diary appt-display-duration appt-display-mode-line ;;;;;; appt-msg-window appt-visible appt-audible appt-message-warning-time -;;;;;; appt-issue-message) "appt" "calendar/appt.el" (17842 53792)) +;;;;;; appt-issue-message) "appt" "calendar/appt.el" (17952 17513)) ;;; Generated autoloads from calendar/appt.el (defvar appt-issue-message t "\ @@ -1129,8 +1129,8 @@ ;;;*** -;;;### (autoloads (archive-mode) "arc-mode" "arc-mode.el" (17842 -;;;;;; 58280)) +;;;### (autoloads (archive-mode) "arc-mode" "arc-mode.el" (17956 +;;;;;; 9517)) ;;; Generated autoloads from arc-mode.el (autoload (quote archive-mode) "arc-mode" "\ @@ -1794,8 +1794,8 @@ ;;;*** -;;;### (autoloads (bibtex-mode) "bibtex" "textmodes/bibtex.el" (17843 -;;;;;; 28300)) +;;;### (autoloads (bibtex-mode) "bibtex" "textmodes/bibtex.el" (17956 +;;;;;; 9518)) ;;; Generated autoloads from textmodes/bibtex.el (autoload (quote bibtex-mode) "bibtex" "\ @@ -2671,7 +2671,7 @@ ;;;;;; batch-byte-compile-if-not-done display-call-tree byte-compile ;;;;;; compile-defun byte-compile-file byte-recompile-directory ;;;;;; byte-force-recompile byte-compile-warnings-safe-p) "bytecomp" -;;;;;; "emacs-lisp/bytecomp.el" (17927 20254)) +;;;;;; "emacs-lisp/bytecomp.el" (17949 41467)) ;;; Generated autoloads from emacs-lisp/bytecomp.el (put 'byte-compile-dynamic 'safe-local-variable 'booleanp) (put 'byte-compile-disable-print-circle 'safe-local-variable 'booleanp) @@ -2802,7 +2802,7 @@ ;;;### (autoloads (defmath calc-embedded-activate calc-embedded calc-grab-rectangle ;;;;;; calc-grab-region full-calc-keypad calc-keypad calc-eval quick-calc ;;;;;; full-calc calc calc-dispatch calc-settings-file) "calc" "calc/calc.el" -;;;;;; (17919 4936)) +;;;;;; (17955 4296)) ;;; Generated autoloads from calc/calc.el (defvar calc-settings-file (convert-standard-filename "~/.calc.el") "\ @@ -2909,7 +2909,7 @@ ;;;;;; mark-holidays-in-calendar view-calendar-holidays-initially ;;;;;; calendar-remove-frame-by-deleting mark-diary-entries-in-calendar ;;;;;; view-diary-entries-initially calendar-offset) "calendar" -;;;;;; "calendar/calendar.el" (17929 8808)) +;;;;;; "calendar/calendar.el" (17944 20140)) ;;; Generated autoloads from calendar/calendar.el (defvar calendar-offset 0 "\ @@ -3507,7 +3507,7 @@ ;;;*** ;;;### (autoloads (c-guess-basic-syntax) "cc-engine" "progmodes/cc-engine.el" -;;;;;; (17926 45410)) +;;;;;; (17942 63381)) ;;; Generated autoloads from progmodes/cc-engine.el (autoload (quote c-guess-basic-syntax) "cc-engine" "\ @@ -3728,14 +3728,14 @@ ;;;*** -;;;### (autoloads nil "cc-subword" "progmodes/cc-subword.el" (17842 -;;;;;; 56333)) +;;;### (autoloads nil "cc-subword" "progmodes/cc-subword.el" (17949 +;;;;;; 41467)) ;;; Generated autoloads from progmodes/cc-subword.el (autoload 'c-subword-mode "cc-subword" "Mode enabling subword movement and editing keys." t) ;;;*** -;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (17854 7681)) +;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (17941 38806)) ;;; Generated autoloads from progmodes/cc-vars.el (put 'c-basic-offset 'safe-local-variable 'integerp) (put 'c-backslash-column 'safe-local-variable 'integerp) @@ -4535,7 +4535,7 @@ ;;;;;; compilation-shell-minor-mode compilation-mode compilation-start ;;;;;; compile compilation-disable-input compile-command compilation-search-path ;;;;;; compilation-ask-about-save compilation-window-height compilation-mode-hook) -;;;;;; "compile" "progmodes/compile.el" (17928 33291)) +;;;;;; "compile" "progmodes/compile.el" (17952 11093)) ;;; Generated autoloads from progmodes/compile.el (defvar compilation-mode-hook nil "\ @@ -4698,7 +4698,7 @@ ;;;*** ;;;### (autoloads (partial-completion-mode) "complete" "complete.el" -;;;;;; (17931 55720)) +;;;;;; (17954 15344)) ;;; Generated autoloads from complete.el (defvar partial-completion-mode nil "\ @@ -5200,7 +5200,7 @@ ;;;*** ;;;### (autoloads (cperl-perldoc-at-point cperl-perldoc cperl-mode) -;;;;;; "cperl-mode" "progmodes/cperl-mode.el" (17899 1957)) +;;;;;; "cperl-mode" "progmodes/cperl-mode.el" (17955 36604)) ;;; Generated autoloads from progmodes/cperl-mode.el (autoload (quote cperl-mode) "cperl-mode" "\ @@ -5538,7 +5538,7 @@ ;;;;;; customize-mode customize customize-save-variable customize-set-variable ;;;;;; customize-set-value custom-menu-sort-alphabetically custom-buffer-sort-alphabetically ;;;;;; custom-browse-sort-alphabetically) "cus-edit" "cus-edit.el" -;;;;;; (17900 13368)) +;;;;;; (17952 11093)) ;;; Generated autoloads from cus-edit.el (defvar custom-browse-sort-alphabetically nil "\ @@ -6044,8 +6044,8 @@ ;;;*** -;;;### (autoloads (dcl-mode) "dcl-mode" "progmodes/dcl-mode.el" (17842 -;;;;;; 56333)) +;;;### (autoloads (dcl-mode) "dcl-mode" "progmodes/dcl-mode.el" (17949 +;;;;;; 41468)) ;;; Generated autoloads from progmodes/dcl-mode.el (autoload (quote dcl-mode) "dcl-mode" "\ @@ -6442,7 +6442,7 @@ ;;;### (autoloads (desktop-revert desktop-save-in-desktop-dir desktop-change-dir ;;;;;; desktop-load-default desktop-read desktop-remove desktop-save ;;;;;; desktop-clear desktop-locals-to-save desktop-save-mode) "desktop" -;;;;;; "desktop.el" (17893 17506)) +;;;;;; "desktop.el" (17949 41467)) ;;; Generated autoloads from desktop.el (defvar desktop-save-mode nil "\ @@ -6676,7 +6676,7 @@ ;;;*** ;;;### (autoloads (diary-mode diary-mail-entries diary) "diary-lib" -;;;;;; "calendar/diary-lib.el" (17929 8808)) +;;;;;; "calendar/diary-lib.el" (17944 20140)) ;;; Generated autoloads from calendar/diary-lib.el (autoload (quote diary) "diary-lib" "\ @@ -6756,14 +6756,13 @@ ;;;*** ;;;### (autoloads (diff-minor-mode diff-mode) "diff-mode" "diff-mode.el" -;;;;;; (17907 56729)) +;;;;;; (17942 63381)) ;;; Generated autoloads from diff-mode.el (autoload (quote diff-mode) "diff-mode" "\ Major mode for viewing/editing context diffs. Supports unified and context diffs as well as (to a lesser extent) -normal diffs. If you edit the buffer manually, diff-mode will try -to update the hunk headers for you on-the-fly. +normal diffs. When the buffer is read-only, the ESC prefix is not necessary. If you edit the buffer manually, diff-mode will try to update the hunk @@ -6773,9 +6772,6 @@ or vice versa with \\[diff-unified->context] and you can also reverse the direction of a diff with \\[diff-reverse-direction]. -When the buffer is read-only, the Meta- modifier is not necessary -to run the Diff mode commands: - \\{diff-mode-map} \(fn)" t nil) @@ -7412,7 +7408,7 @@ ;;;*** ;;;### (autoloads (dired-do-relsymlink dired-jump) "dired-x" "dired-x.el" -;;;;;; (17859 33405)) +;;;;;; (17942 63381)) ;;; Generated autoloads from dired-x.el (autoload (quote dired-jump) "dired-x" "\ @@ -7596,7 +7592,7 @@ ;;;*** ;;;### (autoloads (dissociated-press) "dissociate" "play/dissociate.el" -;;;;;; (17842 55395)) +;;;;;; (17941 38806)) ;;; Generated autoloads from play/dissociate.el (autoload (quote dissociated-press) "dissociate" "\ @@ -7612,7 +7608,7 @@ ;;;*** -;;;### (autoloads (dnd-protocol-alist) "dnd" "dnd.el" (17842 58280)) +;;;### (autoloads (dnd-protocol-alist) "dnd" "dnd.el" (17949 41467)) ;;; Generated autoloads from dnd.el (defvar dnd-protocol-alist (quote (("^file:///" . dnd-open-local-file) ("^file://" . dnd-open-file) ("^file:" . dnd-open-local-file) ("^\\(https?\\|ftp\\|file\\|nfs\\)://" . dnd-open-file))) "\ @@ -7657,7 +7653,7 @@ ;;;*** -;;;### (autoloads (doctor) "doctor" "play/doctor.el" (17842 55395)) +;;;### (autoloads (doctor) "doctor" "play/doctor.el" (17941 38806)) ;;; Generated autoloads from play/doctor.el (autoload (quote doctor) "doctor" "\ @@ -7956,7 +7952,7 @@ ;;;;;; ebnf-eps-directory ebnf-spool-region ebnf-spool-buffer ebnf-spool-file ;;;;;; ebnf-spool-directory ebnf-print-region ebnf-print-buffer ;;;;;; ebnf-print-file ebnf-print-directory ebnf-customize) "ebnf2ps" -;;;;;; "progmodes/ebnf2ps.el" (17859 54480)) +;;;;;; "progmodes/ebnf2ps.el" (17952 11093)) ;;; Generated autoloads from progmodes/ebnf2ps.el (autoload (quote ebnf-customize) "ebnf2ps" "\ @@ -8413,7 +8409,7 @@ ;;;### (autoloads (edebug-all-forms edebug-all-defs edebug-eval-top-level-form ;;;;;; edebug-basic-spec edebug-all-forms edebug-all-defs) "edebug" -;;;;;; "emacs-lisp/edebug.el" (17930 34071)) +;;;;;; "emacs-lisp/edebug.el" (17952 11093)) ;;; Generated autoloads from emacs-lisp/edebug.el (defvar edebug-all-defs nil "\ @@ -10719,7 +10715,7 @@ ;;;*** ;;;### (autoloads (ffap-bindings dired-at-point ffap-at-mouse ffap-menu -;;;;;; find-file-at-point ffap-next) "ffap" "ffap.el" (17829 31540)) +;;;;;; find-file-at-point ffap-next) "ffap" "ffap.el" (17943 4602)) ;;; Generated autoloads from ffap.el (autoload (quote ffap-next) "ffap" "\ @@ -11271,7 +11267,7 @@ ;;;### (autoloads (flyspell-buffer flyspell-region flyspell-mode-off ;;;;;; turn-off-flyspell turn-on-flyspell flyspell-mode flyspell-prog-mode) -;;;;;; "flyspell" "textmodes/flyspell.el" (17927 20254)) +;;;;;; "flyspell" "textmodes/flyspell.el" (17942 63381)) ;;; Generated autoloads from textmodes/flyspell.el (autoload (quote flyspell-prog-mode) "flyspell" "\ @@ -11414,8 +11410,8 @@ ;;;*** -;;;### (autoloads (footnote-mode) "footnote" "mail/footnote.el" (17842 -;;;;;; 55035)) +;;;### (autoloads (footnote-mode) "footnote" "mail/footnote.el" (17954 +;;;;;; 24686)) ;;; Generated autoloads from mail/footnote.el (autoload (quote footnote-mode) "footnote" "\ @@ -11609,7 +11605,7 @@ ;;;*** ;;;### (autoloads (gdb-enable-debug gdba) "gdb-ui" "progmodes/gdb-ui.el" -;;;;;; (17893 61665)) +;;;;;; (17941 38806)) ;;; Generated autoloads from progmodes/gdb-ui.el (autoload (quote gdba) "gdb-ui" "\ @@ -12303,7 +12299,7 @@ ;;;*** ;;;### (autoloads (gnus-button-reply gnus-button-mailto gnus-msg-mail) -;;;;;; "gnus-msg" "gnus/gnus-msg.el" (17938 61442)) +;;;;;; "gnus-msg" "gnus/gnus-msg.el" (17949 41467)) ;;; Generated autoloads from gnus/gnus-msg.el (autoload (quote gnus-msg-mail) "gnus-msg" "\ @@ -12543,7 +12539,7 @@ ;;;*** -;;;### (autoloads (gomoku) "gomoku" "play/gomoku.el" (17842 55395)) +;;;### (autoloads (gomoku) "gomoku" "play/gomoku.el" (17941 38806)) ;;; Generated autoloads from play/gomoku.el (autoload (quote gomoku) "gomoku" "\ @@ -12600,7 +12596,7 @@ ;;;### (autoloads (rgrep lgrep grep-find grep grep-mode grep-compute-defaults ;;;;;; grep-process-setup grep-setup-hook grep-find-command grep-command -;;;;;; grep-window-height) "grep" "progmodes/grep.el" (17908 16392)) +;;;;;; grep-window-height) "grep" "progmodes/grep.el" (17944 20144)) ;;; Generated autoloads from progmodes/grep.el (defvar grep-window-height nil "\ @@ -12643,10 +12639,10 @@ This variable's value takes effect when `grep-compute-defaults' is called.") (defvar grep-find-use-xargs nil "\ -Whether \\[grep-find] uses the `xargs' utility by default. - -If `exec', it uses `find -exec'; if `gnu', it uses `find -print0' and `xargs -0'; -if not nil and not `gnu', it uses `find -print' and `xargs'. +Non-nil means that `grep-find' uses the `xargs' utility by default. +If `exec', use `find -exec'. +If `gnu', use `find -print0' and `xargs -0'. +Any other non-nil value means to use `find -print' and `xargs'. This variable's value takes effect when `grep-compute-defaults' is called.") @@ -12754,7 +12750,7 @@ ;;;*** ;;;### (autoloads (gdb-script-mode jdb pdb perldb xdb dbx sdb gdb) -;;;;;; "gud" "progmodes/gud.el" (17938 61442)) +;;;;;; "gud" "progmodes/gud.el" (17950 21759)) ;;; Generated autoloads from progmodes/gud.el (autoload (quote gdb) "gud" "\ @@ -16488,7 +16484,7 @@ ;;;*** ;;;### (autoloads (lm lm-test-run) "landmark" "play/landmark.el" -;;;;;; (17842 55395)) +;;;;;; (17941 38806)) ;;; Generated autoloads from play/landmark.el (defalias (quote landmark-repeat) (quote lm-test-run)) @@ -16711,8 +16707,8 @@ ;;;*** -;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (17870 -;;;;;; 63949)) +;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (17942 +;;;;;; 63381)) ;;; Generated autoloads from loadhist.el (autoload (quote unload-feature) "loadhist" "\ @@ -17450,8 +17446,8 @@ ;;;*** -;;;### (autoloads (menu-bar-mode) "menu-bar" "menu-bar.el" (17842 -;;;;;; 58279)) +;;;### (autoloads (menu-bar-mode) "menu-bar" "menu-bar.el" (17942 +;;;;;; 63381)) ;;; Generated autoloads from menu-bar.el (put (quote menu-bar-mode) (quote standard-value) (quote (t))) @@ -17486,7 +17482,7 @@ ;;;;;; message-cite-function message-yank-prefix message-citation-line-function ;;;;;; message-send-mail-function message-user-organization-file ;;;;;; message-signature-separator message-from-style) "message" -;;;;;; "gnus/message.el" (17929 33467)) +;;;;;; "gnus/message.el" (17949 41467)) ;;; Generated autoloads from gnus/message.el (defvar message-from-style (quote default) "\ @@ -19570,7 +19566,7 @@ ;;;*** ;;;### (autoloads (outline-minor-mode outline-mode) "outline" "outline.el" -;;;;;; (17881 61722)) +;;;;;; (17952 11093)) ;;; Generated autoloads from outline.el (put 'outline-regexp 'safe-local-variable 'string-or-null-p) @@ -19949,8 +19945,8 @@ ;;;### (autoloads (pcomplete-shell-setup pcomplete-comint-setup pcomplete-list ;;;;;; pcomplete-help pcomplete-expand pcomplete-continue pcomplete-expand-and-complete -;;;;;; pcomplete-reverse pcomplete) "pcomplete" "pcomplete.el" (17900 -;;;;;; 30230)) +;;;;;; pcomplete-reverse pcomplete) "pcomplete" "pcomplete.el" (17944 +;;;;;; 62194)) ;;; Generated autoloads from pcomplete.el (autoload (quote pcomplete) "pcomplete" "\ @@ -20094,7 +20090,7 @@ ;;;*** ;;;### (autoloads (perl-mode) "perl-mode" "progmodes/perl-mode.el" -;;;;;; (17842 56332)) +;;;;;; (17955 36604)) ;;; Generated autoloads from progmodes/perl-mode.el (autoload (quote perl-mode) "perl-mode" "\ @@ -21451,7 +21447,7 @@ ;;;*** ;;;### (autoloads (jython-mode python-mode run-python) "python" "progmodes/python.el" -;;;;;; (17930 34071)) +;;;;;; (17956 9518)) ;;; Generated autoloads from progmodes/python.el (add-to-list (quote interpreter-mode-alist) (quote ("jython" . jython-mode))) @@ -23470,7 +23466,7 @@ ;;;;;; mail-alias-file mail-default-reply-to mail-archive-file-name ;;;;;; mail-header-separator send-mail-function mail-interactive ;;;;;; mail-self-blind mail-specify-envelope-from mail-from-style) -;;;;;; "sendmail" "mail/sendmail.el" (17842 55035)) +;;;;;; "sendmail" "mail/sendmail.el" (17942 63381)) ;;; Generated autoloads from mail/sendmail.el (defvar mail-from-style (quote angles) "\ @@ -23667,16 +23663,16 @@ \\[mail-send-and-exit] mail-send-and-exit (send the message and exit) Here are commands that move to a header field (and create it if there isn't): - \\[mail-to] move to To: \\[mail-subject] move to Subject: - \\[mail-cc] move to CC: \\[mail-bcc] move to BCC: + \\[mail-to] move to To: \\[mail-subject] move to Subj: + \\[mail-bcc] move to BCC: \\[mail-cc] move to CC: \\[mail-fcc] move to FCC: \\[mail-reply-to] move to Reply-To: \\[mail-mail-reply-to] move to Mail-Reply-To: \\[mail-mail-followup-to] move to Mail-Followup-To: -\\[mail-text] mail-text (move to beginning of message text). +\\[mail-text] move to message text. \\[mail-signature] mail-signature (insert `mail-signature-file' file). \\[mail-yank-original] mail-yank-original (insert current message, in Rmail). \\[mail-fill-yanked-message] mail-fill-yanked-message (fill what was yanked). -\\[mail-sent-via] mail-sent-via (add a Sent-via field for each To or CC). +\\[mail-sent-via] mail-sent-via (add a sent-via field for each To or CC). Turning on Mail mode runs the normal hooks `text-mode-hook' and `mail-mode-hook' (in that order). @@ -24141,7 +24137,7 @@ ;;;*** -;;;### (autoloads nil "simple" "simple.el" (17938 22875)) +;;;### (autoloads nil "simple" "simple.el" (17949 41467)) ;;; Generated autoloads from simple.el (put 'fill-prefix 'safe-local-variable 'string-or-null-p) @@ -24344,7 +24340,7 @@ ;;;*** ;;;### (autoloads (smtpmail-send-queued-mail smtpmail-send-it) "smtpmail" -;;;;;; "mail/smtpmail.el" (17938 24686)) +;;;;;; "mail/smtpmail.el" (17939 50716)) ;;; Generated autoloads from mail/smtpmail.el (autoload (quote smtpmail-send-it) "smtpmail" "\ @@ -25404,7 +25400,7 @@ ;;;*** -;;;### (autoloads (locate-library) "subr" "subr.el" (17938 61442)) +;;;### (autoloads (locate-library) "subr" "subr.el" (17949 41467)) ;;; Generated autoloads from subr.el (autoload (quote locate-library) "subr" "\ @@ -26215,8 +26211,8 @@ ;;;*** -;;;### (autoloads (ansi-term term make-term) "term" "term.el" (17922 -;;;;;; 37595)) +;;;### (autoloads (ansi-term term make-term) "term" "term.el" (17952 +;;;;;; 11093)) ;;; Generated autoloads from term.el (autoload (quote make-term) "term" "\ @@ -26292,7 +26288,7 @@ ;;;*** -;;;### (autoloads (tetris) "tetris" "play/tetris.el" (17897 26294)) +;;;### (autoloads (tetris) "tetris" "play/tetris.el" (17941 38806)) ;;; Generated autoloads from play/tetris.el (autoload (quote tetris) "tetris" "\ @@ -27396,7 +27392,7 @@ ;;;*** ;;;### (autoloads (tmm-prompt tmm-menubar-mouse tmm-menubar) "tmm" -;;;;;; "tmm.el" (17938 22875)) +;;;;;; "tmm.el" (17952 58711)) ;;; Generated autoloads from tmm.el (define-key global-map "\M-`" 'tmm-menubar) (define-key global-map [f10] 'tmm-menubar) @@ -28469,7 +28465,7 @@ ;;;*** ;;;### (autoloads (url-http-options url-http-file-attributes url-http-file-exists-p -;;;;;; url-http) "url-http" "url/url-http.el" (17935 53395)) +;;;;;; url-http) "url-http" "url/url-http.el" (17952 11683)) ;;; Generated autoloads from url/url-http.el (autoload (quote url-http) "url-http" "\ @@ -28665,7 +28661,7 @@ ;;;*** ;;;### (autoloads (url-generic-parse-url url-recreate-url) "url-parse" -;;;;;; "url/url-parse.el" (17842 56569)) +;;;;;; "url/url-parse.el" (17954 22157)) ;;; Generated autoloads from url/url-parse.el (autoload (quote url-recreate-url) "url-parse" "\ @@ -30415,8 +30411,8 @@ ;;;*** ;;;### (autoloads (widget-setup widget-insert widget-delete widget-create -;;;;;; widget-prompt-value widgetp) "wid-edit" "wid-edit.el" (17884 -;;;;;; 58614)) +;;;;;; widget-prompt-value widgetp) "wid-edit" "wid-edit.el" (17952 +;;;;;; 11093)) ;;; Generated autoloads from wid-edit.el (autoload (quote widgetp) "wid-edit" "\ @@ -30533,7 +30529,7 @@ ;;;*** ;;;### (autoloads (woman-find-file woman-dired-find-file woman) "woman" -;;;;;; "woman.el" (17934 34122)) +;;;;;; "woman.el" (17949 41467)) ;;; Generated autoloads from woman.el (autoload (quote woman) "woman" "\ @@ -30778,7 +30774,7 @@ ;;;*** -;;;### (autoloads (zone) "zone" "play/zone.el" (17842 55395)) +;;;### (autoloads (zone) "zone" "play/zone.el" (17941 38806)) ;;; Generated autoloads from play/zone.el (autoload (quote zone) "zone" "\ @@ -30918,7 +30914,7 @@ ;;;;;; "url/url-vars.el" "url/vc-dav.el" "vc-hooks.el" "vcursor.el" ;;;;;; "version.el" "vms-patch.el" "vmsproc.el" "vt-control.el" ;;;;;; "vt100-led.el" "w32-fns.el" "w32-vars.el" "widget.el" "window.el" -;;;;;; "x-dnd.el") (17938 62045 277063)) +;;;;;; "x-dnd.el") (17956 9728 35408)) ;;;***
--- a/lisp/locate.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/locate.el Tue Apr 24 21:56:25 2007 +0000 @@ -114,8 +114,10 @@ ;; Variables -(defvar locate-current-search nil) (defvar locate-current-filter nil) +(defvar locate-local-filter nil) +(defvar locate-local-search nil) +(defvar locate-local-prompt nil) (defgroup locate nil "Interface to the locate command." @@ -220,7 +222,10 @@ (defcustom locate-prompt-for-command nil "If non-nil, the `locate' command prompts for a command to run. -Otherwise, that behavior is invoked via a prefix argument." +Otherwise, that behavior is invoked via a prefix argument. + +Setting this option non-nil actually inverts the meaning of a prefix arg; +that is, with a prefix arg, you get the default behavior." :group 'locate :type 'boolean) @@ -240,8 +245,32 @@ (skip-chars-backward "." pt) (point))))) +;; Function for use in interactive declarations. +(defun locate-prompt-for-search-string () + (if (or (and current-prefix-arg + (not locate-prompt-for-command)) + (and (not current-prefix-arg) locate-prompt-for-command)) + (let ((locate-cmd (funcall locate-make-command-line ""))) + (read-from-minibuffer + "Run locate (like this): " + (cons + (concat (car locate-cmd) " " + (mapconcat 'identity (cdr locate-cmd) " ")) + (+ 2 (length (car locate-cmd)))) + nil nil 'locate-history-list)) + (let* ((default (locate-word-at-point)) + (input + (read-from-minibuffer + (if (> (length default) 0) + (format "Locate (default %s): " default) + (format "Locate: ")) + nil nil nil 'locate-history-list default t))) + (and (equal input "") default + (setq input default)) + input))) + ;;;###autoload -(defun locate (search-string &optional filter) +(defun locate (search-string &optional filter arg) "Run the program `locate', putting results in `*Locate*' buffer. Pass it SEARCH-STRING as argument. Interactively, prompt for SEARCH-STRING. With prefix arg, prompt for the exact shell command to run instead. @@ -258,68 +287,49 @@ the variables `locate-command' or `locate-make-command-line'. The main use of FILTER is to implement `locate-with-filter'. See -the docstring of that function for its meaning." +the docstring of that function for its meaning. + +ARG is the interactive prefix arg." (interactive - (list - (if (or (and current-prefix-arg - (not locate-prompt-for-command)) - (and (not current-prefix-arg) locate-prompt-for-command)) - (let ((locate-cmd (funcall locate-make-command-line ""))) - (read-from-minibuffer - "Run locate (like this): " - (cons - (concat (car locate-cmd) " " - (mapconcat 'identity (cdr locate-cmd) " ")) - (+ 2 (length (car locate-cmd)))) - nil nil 'locate-history-list)) - (let* ((default (locate-word-at-point)) - (input - (read-from-minibuffer - (if (> (length default) 0) - (format "Locate (default %s): " default) - (format "Locate: ")) - nil nil nil 'locate-history-list default t))) - (and (equal input "") default - (setq input default)) - input)))) + (list + (locate-prompt-for-search-string) + nil + current-prefix-arg)) + (if (equal search-string "") (error "Please specify a filename to search for")) (let* ((locate-cmd-list (funcall locate-make-command-line search-string)) (locate-cmd (car locate-cmd-list)) (locate-cmd-args (cdr locate-cmd-list)) (run-locate-command - (or (and current-prefix-arg (not locate-prompt-for-command)) - (and (not current-prefix-arg) locate-prompt-for-command))) - locate-buffer + (or (and arg (not locate-prompt-for-command)) + (and (not arg) locate-prompt-for-command))) ) ;; Find the Locate buffer - (setq locate-buffer (if (eq major-mode 'locate-mode) - (current-buffer) - (get-buffer-create locate-buffer-name))) + (save-window-excursion + (set-buffer (get-buffer-create locate-buffer-name)) + (locate-mode) + (let ((inhibit-read-only t) + (buffer-undo-list t)) + (erase-buffer) - (save-excursion - (set-buffer locate-buffer) - (locate-mode) - - (let ((inhibit-read-only t) - (buffer-undo-list t)) - (erase-buffer) + (setq locate-current-filter filter) + (set (make-local-variable 'locate-local-search) search-string) + (set (make-local-variable 'locate-local-filter) filter) + (set (make-local-variable 'locate-local-prompt) run-locate-command) - (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)) + (if run-locate-command + (shell-command search-string locate-buffer-name) + (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))) - - (unless (eq (current-buffer) locate-buffer) - (switch-to-buffer-other-window locate-buffer)) + (locate-do-setup search-string) + )) + (and (not (string-equal (buffer-name) locate-buffer-name)) + (switch-to-buffer-other-window locate-buffer-name)) (run-hooks 'dired-mode-hook) (dired-next-line 3) ;move to first matching file. @@ -328,7 +338,7 @@ ) ;;;###autoload -(defun locate-with-filter (search-string filter) +(defun locate-with-filter (search-string filter &optional arg) "Run the executable program `locate' with a filter. This function is similar to the function `locate', which see. The difference is that, when invoked interactively, the present function @@ -338,14 +348,17 @@ contain a match for the regular expression FILTER; this is often useful to constrain a big search. +ARG is the interactive prefix arg, which has the same effect as in `locate'. + When called from Lisp, this function is identical with `locate', except that FILTER is not optional." (interactive - (list (read-from-minibuffer "Locate: " nil nil - nil 'locate-history-list) - (read-from-minibuffer "Filter: " nil nil - nil 'locate-grep-history-list))) - (locate search-string filter)) + (list + (locate-prompt-for-search-string) + (read-from-minibuffer "Filter: " nil nil + nil 'locate-grep-history-list) + current-prefix-arg)) + (locate search-string filter arg)) (defun locate-filter-output (filter) "Filter output from the locate command." @@ -469,7 +482,6 @@ 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) @@ -501,12 +513,11 @@ ;; Nothing returned from locate command? (and (eobp) (progn - (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))))) + (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)))) (locate-insert-header search-string) @@ -590,14 +601,16 @@ "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'." - (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)) + (let ((locate-buffer-name (buffer-name)) + (locate-prompt-for-command locate-local-prompt)) + (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-local-search locate-local-filter))) ;;; Modified three functions from `dired.el': ;;; dired-find-directory,
--- a/lisp/mail/footnote.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/mail/footnote.el Tue Apr 24 21:56:25 2007 +0000 @@ -267,14 +267,17 @@ ;; Latin-1 -(defconst footnote-latin-regexp "¹²³ºª§¶" +(defconst footnote-latin-string "¹²³ºª§¶" + "String of Latin-1 footnoting characters.") + +(defconst footnote-latin-regexp (concat "[" footnote-latin-string "]") "Regexp for Latin-1 footnoting characters.") (defun Footnote-latin (n) "Latin-1 footnote style. Use a range of Latin-1 non-ASCII characters for footnoting." - (string (aref footnote-latin-regexp - (mod (1- n) (length footnote-latin-regexp))))) + (string (aref footnote-latin-string + (mod (1- n) (length footnote-latin-string))))) ;;; list of all footnote styles (defvar footnote-style-alist @@ -291,14 +294,18 @@ exciting styles.") (defcustom footnote-style 'numeric - "*Style used for footnoting. + "*Default style used for footnoting. numeric == 1, 2, 3, ... english-lower == a, b, c, ... english-upper == A, B, C, ... roman-lower == i, ii, iii, iv, v, ... roman-upper == I, II, III, IV, V, ... latin == ¹ ² ³ º ª § ¶ -See also variables `footnote-start-tag' and `footnote-end-tag'." +See also variables `footnote-start-tag' and `footnote-end-tag'. + +Customizing this variable has no effect on buffers already +displaying footnotes. You can change the style of existing +buffers using the command `Footnote-set-style'." :type (cons 'choice (mapcar (lambda (x) (list 'const (car x))) footnote-style-alist)) :group 'footnote) @@ -654,7 +661,7 @@ (while (< i notes) (setq alist-ptr (nth i footnote-pointer-marker-alist)) (setq alist-txt (nth i footnote-text-marker-alist)) - (unless (eq (1+ i) (car alist-ptr)) + (unless (= (1+ i) (car alist-ptr)) (Footnote-renumber (car alist-ptr) (1+ i) alist-ptr alist-txt)) (setq i (1+ i))))))
--- a/lisp/outline.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/outline.el Tue Apr 24 21:56:25 2007 +0000 @@ -1000,7 +1000,8 @@ (error "No following same-level heading")))))) (defun outline-get-next-sibling () - "Move to next heading of the same level, and return point or nil if none." + "Move to next heading of the same level, and return point. +If there is no such heading, return nil." (let ((level (funcall outline-level))) (outline-next-visible-heading 1) (while (and (not (eobp)) (> (funcall outline-level) level)) @@ -1026,15 +1027,18 @@ (error "No previous same-level heading")))))) (defun outline-get-last-sibling () - "Move to previous heading of the same level, and return point or nil if none." - (let ((level (funcall outline-level))) + "Move to previous heading of the same level, and return point. +If there is no such heading, return nil." + (let ((opoint (point)) + (level (funcall outline-level))) (outline-previous-visible-heading 1) - (while (and (> (funcall outline-level) level) - (not (bobp))) - (outline-previous-visible-heading 1)) - (if (< (funcall outline-level) level) - nil - (point)))) + (when (and (/= (point) opoint) (outline-on-heading-p)) + (while (and (> (funcall outline-level) level) + (not (bobp))) + (outline-previous-visible-heading 1)) + (if (< (funcall outline-level) level) + nil + (point))))) (defun outline-headers-as-kill (beg end) "Save the visible outline headers in region at the start of the kill ring.
--- a/lisp/paren.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/paren.el Tue Apr 24 21:56:25 2007 +0000 @@ -143,6 +143,7 @@ (let ((oldpos (point)) (dir (cond ((eq (syntax-class (syntax-after (1- (point)))) 5) -1) ((eq (syntax-class (syntax-after (point))) 4) 1))) + (window-start (window-start)) pos mismatch face) ;; ;; Find the other end of the sexp. @@ -247,7 +248,13 @@ ;; ;; Always set the overlay face, since it varies. (overlay-put show-paren-overlay 'priority show-paren-priority) - (overlay-put show-paren-overlay 'face face))) + (overlay-put show-paren-overlay 'face face)) + ;; If there are continued lines, the above operations can + ;; force redisplay to recenter the window (since there is no + ;; way for it to know that the overlay changes to the buffer + ;; are harmless). So reset the window-start. + (unless (window-minibuffer-p) + (set-window-start (selected-window) window-start))) ;; show-paren-mode is nil in this buffer. (and show-paren-overlay (delete-overlay show-paren-overlay))
--- a/lisp/progmodes/cc-cmds.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/progmodes/cc-cmds.el Tue Apr 24 21:56:25 2007 +0000 @@ -856,8 +856,8 @@ (narrow-to-region (point-min) (point)) (back-to-indentation) (looking-at (concat c-current-comment-prefix "[ \t]*$"))))) - (kill-region (progn (forward-line 0) (point)) - (progn (end-of-line) (point))) + (delete-region (progn (forward-line 0) (point)) + (progn (end-of-line) (point))) (insert-char ?* 1)) ; the / comes later. ; Do I need a t (retain sticky properties) here? (setq indentp (and (not arg) @@ -1360,10 +1360,24 @@ (and c-opt-block-decls-with-vars-key (save-excursion (c-syntactic-skip-backward "^;}" lim) - (and (eq (char-before) ?\}) - (eq (car (c-beginning-of-decl-1 lim)) 'previous) - (looking-at c-opt-block-decls-with-vars-key) - (point))))) + (let ((eo-block (point)) + bod) + (and (eq (char-before) ?\}) + (eq (car (c-beginning-of-decl-1 lim)) 'previous) + (setq bod (point)) + ;; Look for struct or union or ... If we find one, it might + ;; be the return type of a function, or the like. Exclude + ;; this case. + (c-syntactic-re-search-forward + (concat "[;=\(\[{]\\|\\(" + c-opt-block-decls-with-vars-key + "\\)") + eo-block t t t) + (match-beginning 1) ; Is there a "struct" etc., somewhere? + (not (eq (char-before) ?_)) + (c-syntactic-re-search-forward "[;=\(\[{]" eo-block t t t) + (eq (char-before) ?\{) + bod))))) (defun c-where-wrt-brace-construct () ;; Determine where we are with respect to functions (or other brace @@ -1531,7 +1545,7 @@ (setq arg (c-forward-to-nth-EOF-} (- arg) where))) ;; Move forward to the next opening brace.... (when (and (= arg 0) - (c-syntactic-re-search-forward "{" nil t)) + (c-syntactic-re-search-forward "{" nil 'eob)) (backward-char) ;; ... and backward to the function header. (c-beginning-of-decl-1)
--- a/lisp/progmodes/cc-mode.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/progmodes/cc-mode.el Tue Apr 24 21:56:25 2007 +0000 @@ -820,7 +820,7 @@ "$") nil t) (beginning-of-line) - (kill-line 1))) + (delete-region (point) (progn (end-of-line) (point))))) ;; Delete the first line, if we've got one, in case it contains a mode spec. (unless (and lv-point @@ -828,8 +828,7 @@ (forward-line 0) (bobp))) (goto-char (point-min)) - (unless (eobp) - (kill-line 1))))) + (delete-region (point) (progn (end-of-line) (point)))))) (defun c-postprocess-file-styles () "Function that post processes relevant file local variables in CC Mode.
--- a/lisp/progmodes/compile.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/progmodes/compile.el Tue Apr 24 21:56:25 2007 +0000 @@ -1042,7 +1042,7 @@ highlight-regexp)) ;; Output a mode setter, for saving and later reloading this buffer. (insert "-*- mode: " name-of-mode - "; compilation-directory: " (prin1-to-string compilation-directory) + "; default-directory: " (prin1-to-string default-directory) " -*-\n" (format "%s started at %s\n\n" mode-name
--- a/lisp/progmodes/cperl-mode.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/progmodes/cperl-mode.el Tue Apr 24 21:56:25 2007 +0000 @@ -233,6 +233,7 @@ "*Indentation of CPerl statements with respect to containing block." :type 'integer :group 'cperl-indentation-details) +(put 'cperl-indent-level 'safe-local-variable 'integerp) (defcustom cperl-lineup-step nil "*`cperl-lineup' will always lineup at multiple of this number.
--- a/lisp/progmodes/ebnf2ps.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/progmodes/ebnf2ps.el Tue Apr 24 21:56:25 2007 +0000 @@ -2830,7 +2830,7 @@ (and (assoc name ebnf-style-database) (error "Style name already exists: %s" name)) (or (assoc inherits ebnf-style-database) - (error "Style inheritance name does'nt exist: %s" inherits)) + (error "Style inheritance name doesn't exist: %s" inherits)) (setq ebnf-style-database (cons (cons name (cons inherits (ebnf-check-style-values values))) ebnf-style-database))) @@ -2860,7 +2860,7 @@ See `ebnf-style-database' documentation." (interactive "SStyle name: \nXStyle values: ") (let ((style (or (assoc name ebnf-style-database) - (error "Style name does'nt exist: %s" name))) + (error "Style name doesn't exist: %s" name))) (merge (ebnf-check-style-values values)) val elt new check) ;; modify value of existing variables
--- a/lisp/progmodes/gud.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/progmodes/gud.el Tue Apr 24 21:56:25 2007 +0000 @@ -238,7 +238,7 @@ ,(propertize "run" 'face 'font-lock-doc-face) gud-run :visible (memq gud-minor-mode '(gdbmi gdb dbx jdb))) ([menu-bar go] menu-item - ,(propertize "go" 'face 'font-lock-doc-face) gud-go + ,(propertize " go " 'face 'font-lock-doc-face) gud-go :visible (and (not gud-running) (eq gud-minor-mode 'gdba))) ([menu-bar stop] menu-item @@ -2304,6 +2304,8 @@ (gud-def gud-up "up\C-Mwhere" "<" "Up one stack frame.") (gud-def gud-down "down\C-Mwhere" ">" "Up one stack frame.") (gud-def gud-run "run" nil "Run the program.") ;if VM start using jdb + (gud-def gud-print "print %e" "\C-p" "Evaluate Java expression at point.") + (setq comint-prompt-regexp "^> \\|^[^ ]+\\[[0-9]+\\] ") (setq paragraph-start comint-prompt-regexp) @@ -2853,7 +2855,9 @@ (when (looking-at comint-prompt-regexp) (set-marker gud-delete-prompt-marker (point)) (set-marker-insertion-type gud-delete-prompt-marker t)) - (insert (concat expr " = "))))) + (unless (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) + 'jdb) + (insert (concat expr " = ")))))) expr)) ;; The next eight functions are hacked from gdbsrc.el by
--- a/lisp/progmodes/idlw-shell.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/progmodes/idlw-shell.el Tue Apr 24 21:56:25 2007 +0000 @@ -2586,7 +2586,7 @@ (if (idlwave-shell-hide-p 'debug) 'mostly) nil t)) -(defun idlwave-shell-clear-bp (bp) +(defun idlwave-shell-clear-bp (bp &optional no-query) "Clear breakpoint BP. Clears in IDL and in `idlwave-shell-bp-alist'." (let ((index (idlwave-shell-bp-get bp))) @@ -2595,7 +2595,7 @@ (idlwave-shell-send-command (concat "breakpoint,/clear," (int-to-string index)) nil (idlwave-shell-hide-p 'breakpoint) nil t) - (idlwave-shell-bp-query))))) + (unless no-query (idlwave-shell-bp-query)))))) (defun idlwave-shell-current-frame () "Return a list containing the current file name and line point is in. @@ -3722,17 +3722,22 @@ (setq old-buffers (delq (current-buffer) old-buffers))) (if (fboundp 'set-specifier) ;; XEmacs (set-specifier left-margin-width (cons (current-buffer) 2)) - (setq left-margin-width 2)) - (if (setq win (get-buffer-window (current-buffer) t)) - (set-window-buffer win (current-buffer)))))) + (if (< left-margin-width 2) + (setq left-margin-width 2))) + (let ((window (get-buffer-window (current-buffer) 0))) + (if window + (set-window-margins + window left-margin-width right-margin-width)))))) (if use-glyph (while (setq buf (pop old-buffers)) (with-current-buffer buf (if (fboundp 'set-specifier) ;; XEmacs (set-specifier left-margin-width (cons (current-buffer) 0)) (setq left-margin-width 0)) - (if (setq win (get-buffer-window buf t)) - (set-window-buffer win buf)))))))) + (let ((window (get-buffer-window buf 0))) + (if window + (set-window-margins + window left-margin-width right-margin-width))))))))) (defun idlwave-shell-make-new-bp-overlay (&optional type disabled) "Make a new overlay for highlighting breakpoints. @@ -4055,7 +4060,9 @@ idlwave-shell-bp-query '(progn (idlwave-shell-filter-bp) - (mapcar 'idlwave-shell-clear-bp idlwave-shell-bp-alist)) + (mapcar (lambda (x) (idlwave-shell-clear-bp x 'no-query)) + idlwave-shell-bp-alist) + (idlwave-shell-bp-query)) 'hide)) (defun idlwave-shell-list-all-bp ()
--- a/lisp/progmodes/mantemp.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/progmodes/mantemp.el Tue Apr 24 21:56:25 2007 +0000 @@ -105,14 +105,14 @@ "^[A-z :&*<>~=,0-9+]*>::operator " nil t nil) (progn (backward-char 11) - (kill-line))) + (delete-region (point) (line-end-position)))) ;; Remove other member function extensions. (goto-char (point-min)) (message "Removing member function extensions") (while (re-search-forward "^[A-z :&*<>~=,0-9+]*>::" nil t nil) (progn (backward-char 2) - (kill-line))))) + (delete-region (point) (line-end-position)))))) (defun mantemp-sort-and-unique-lines () "Eliminate all consecutive duplicate lines in the buffer." @@ -127,7 +127,7 @@ (progn (forward-line -1) (beginning-of-line) - (kill-line 1))))) + (delete-region (point) (progn (forward-line 1) (point))))))) (defun mantemp-insert-cxx-syntax () "Insert C++ syntax around each template class and function. @@ -161,7 +161,7 @@ (progn (beginning-of-line) (forward-word 1) - (kill-word 1))))) + (delete-region (point) (progn (forward-word 1) (point))))))) (defun mantemp-make-mantemps () "Gathering interface to the functions modifying the buffer." @@ -189,16 +189,16 @@ but operates on the region." (interactive) (let ((cur-buf (current-buffer)) - (mantemp-buffer (generate-new-buffer "*mantemp*"))) + (mantemp-buffer (generate-new-buffer "*mantemp*")) + (str (buffer-substring (mark) (point)))) ;; Copy the region to a temporary buffer, make the C++ code there ;; and copy the result back to the current buffer. - (kill-region (mark) (point)) (set-buffer mantemp-buffer) - (yank) + (insert str) (mantemp-make-mantemps) - (kill-region (point-min) (point-max)) + (setq str (buffer-string)) (set-buffer cur-buf) - (yank) + (insert str) (kill-buffer mantemp-buffer)) (message "Done"))
--- a/lisp/progmodes/perl-mode.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/progmodes/perl-mode.el Tue Apr 24 21:56:25 2007 +0000 @@ -391,6 +391,7 @@ "*Indentation of Perl statements with respect to containing block." :type 'integer :group 'perl) +(put 'perl-indent-level 'safe-local-variable 'integerp) (defcustom perl-continued-statement-offset 4 "*Extra indent for lines not starting new statements." :type 'integer @@ -646,10 +647,10 @@ (if (and comment-start-skip (re-search-forward comment-start-skip eol 'move)) (if (eolp) - (progn ; kill existing comment + (progn ; delete existing comment (goto-char (match-beginning 0)) (skip-chars-backward " \t") - (kill-region (point) eol)) + (delete-region (point) eol)) (if (or (< oldpnt (point)) (= oldpnt eol)) (indent-for-comment) ; indent existing comment (end-of-line)))
--- a/lisp/progmodes/python.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/progmodes/python.el Tue Apr 24 21:56:25 2007 +0000 @@ -981,11 +981,15 @@ (_ (if (python-comment-line-p) (python-skip-comments/blanks t))) (ci (current-indentation)) - (open (python-open-block-statement-p))) + (open (python-open-block-statement-p)) + opoint) (if (and (zerop ci) (not open)) (not (goto-char point)) (catch 'done - (while (zerop (python-next-statement)) + (setq opoint (point)) + (while (and (zerop (python-next-statement)) + (not (= opoint (point)))) + (setq opoint (point)) (when (or (and open (<= (current-indentation) ci)) (< (current-indentation) ci)) (python-skip-comments/blanks t)
--- a/lisp/progmodes/vhdl-mode.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/progmodes/vhdl-mode.el Tue Apr 24 21:56:25 2007 +0000 @@ -7028,7 +7028,7 @@ (indent-to comment-column) (indent-according-to-mode)) (t ; inline comment indent - (kill-line -0)))) + (delete-region (line-beginning-position) (point))))) ;; dedent ((and (>= (current-indentation) vhdl-basic-offset) (or (eq last-command 'vhdl-electric-tab) @@ -7161,7 +7161,7 @@ (when (not (looking-at "^\\s-*\\(--.*\\)?$")) (end-of-line) (if (search-backward " -- ((" (vhdl-point 'bol) t) - (kill-line)) + (delete-region (point) (line-end-position))) (insert " -- ") (insert (format "%s" expurgated)))))) (vhdl-keep-region-active)) @@ -8346,7 +8346,9 @@ (progn (vhdl-insert-keyword "FOR ") (if (vhdl-template-field "[quantity name]" " USE " t) (progn (vhdl-template-field "quantity name" " => ") t) - (kill-word -1) nil)) + (delete-region (point) + (progn (forward-word -1) (point))) + nil)) (vhdl-template-field "[quantity name]" " => " t)) (vhdl-template-field "expression") (setq position (point)) @@ -8482,7 +8484,7 @@ (setq position (point)) (vhdl-insert-keyword "PORT ") (unless (vhdl-template-map position t t) - (kill-line -0) + (delete-region (line-beginning-position) (point)) (delete-char -1)) (insert ";")))) @@ -8573,7 +8575,7 @@ (setq position (point)) (vhdl-insert-keyword "PORT ") (unless (vhdl-template-map position t t) - (kill-line -0) + (delete-region (line-beginning-position) (point)) (delete-char -1)) (insert ";") t) @@ -9116,11 +9118,11 @@ (cond ((equal definition "") (insert ";")) ((equal definition "ARRAY") - (kill-word -1) + (delete-region (point) (progn (forward-word -1) (point))) (vhdl-template-array 'nature t)) ((equal definition "RECORD") (setq mid-pos (point-marker)) - (kill-word -1) + (delete-region (point) (progn (forward-word -1) (point))) (vhdl-template-record 'nature name t)) (t (vhdl-insert-keyword " ACROSS ") @@ -9435,7 +9437,7 @@ (insert "\n") (indent-to (+ margin vhdl-basic-offset)) (setq first nil)) - (kill-line -0) + (delete-region (line-beginning-position) (point)) (indent-to margin) (vhdl-insert-keyword "END RECORD") (unless (vhdl-standard-p '87) (and name (insert " " name))) @@ -9600,11 +9602,11 @@ (delete-backward-char 4) (insert ";")) ((equal definition "ARRAY") - (kill-word -1) + (delete-region (point) (progn (forward-word -1) (point))) (vhdl-template-array 'type t)) ((equal definition "RECORD") (setq mid-pos (point-marker)) - (kill-word -1) + (delete-region (point) (progn (forward-word -1) (point))) (vhdl-template-record 'type name t)) ((equal definition "ACCESS") (insert " ")
--- a/lisp/replace.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/replace.el Tue Apr 24 21:56:25 2007 +0000 @@ -303,6 +303,11 @@ (defun query-replace-regexp-eval (regexp to-expr &optional delimited start end) "Replace some things after point matching REGEXP with the result of TO-EXPR. + +Interactive use of this function is deprecated in favor of the +`\\,' feature of `query-replace-regexp'. For non-interactive use, a loop +using `search-forward-regexp' and `replace-match' is preferred. + As each match is found, the user must type a character saying what to do with it. For directions, type \\[help-command] at that time. @@ -354,6 +359,11 @@ (perform-replace regexp (cons 'replace-eval-replacement to-expr) t 'literal delimited nil nil start end)) +(make-obsolete 'query-replace-regexp-eval + "for interactive use, use the special `\\,' feature of +`query-replace-regexp' instead. Non-interactively, a loop +using `search-forward-regexp' and `replace-match' is preferred." "22.1") + (defun map-query-replace-regexp (regexp to-strings &optional n start end) "Replace some matches for REGEXP with various strings, in rotation. The second argument TO-STRINGS contains the replacement strings,
--- a/lisp/simple.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/simple.el Tue Apr 24 21:56:25 2007 +0000 @@ -3179,6 +3179,8 @@ (interactive) (if (null (mark t)) (error "No mark set in this buffer") + (if (= (point) (mark t)) + (message "Mark popped")) (goto-char (mark t)) (pop-mark))) @@ -3196,24 +3198,31 @@ (message "Mark activated"))))) (defcustom set-mark-command-repeat-pop nil - "*Non-nil means that repeating \\[set-mark-command] after popping will pop. -This means that if you type C-u \\[set-mark-command] \\[set-mark-command] -will pop twice." + "*Non-nil means repeating \\[set-mark-command] after popping mark pops it again. +That means that C-u \\[set-mark-command] \\[set-mark-command] +will pop the mark twice, and +C-u \\[set-mark-command] \\[set-mark-command] \\[set-mark-command] +will pop the mark three times. + +nil means \\[set-mark-command]'s behavior does not change +after C-u \\[set-mark-command]." :type 'boolean - :group 'editing) + :group 'editing-basics) (defun set-mark-command (arg) - "Set mark where point is, or jump to mark. -Setting the mark also sets the \"region\", which is the closest -equivalent in Emacs to what some editors call the \"selection\". - -With no prefix argument, set mark and push old mark position on local -mark ring. Also, push mark on global mark ring, if last mark was set in -another buffer. Immediately repeating the command activates -`transient-mark-mode' temporarily. + "Set the mark where point is, or jump to the mark. +Setting the mark also alters the region, which is the text +between point and mark; this is the closest equivalent in +Emacs to what some editors call the \"selection\". + +With no prefix argument, set the mark at point, and push the +old mark position on local mark ring. Also push the old mark on +global mark ring, if the previous mark was set in another buffer. + +Immediately repeating this command activates `transient-mark-mode' temporarily. With prefix argument \(e.g., \\[universal-argument] \\[set-mark-command]\), \ -jump to mark, and set mark from +jump to the mark, and set the mark from position popped off the local mark ring \(this does not affect the global mark ring\). Use \\[pop-global-mark] to jump to a mark popped off the global mark ring \(see `pop-global-mark'\). @@ -3222,9 +3231,9 @@ the \\[set-mark-command] command with no prefix argument pops the next position off the local (or global) mark ring and jumps there. -With a double \\[universal-argument] prefix argument \(e.g., \\[universal-argument] \ -\\[universal-argument] \\[set-mark-command]\), unconditionally -set mark where point is, even if `set-mark-command-repeat-pop' is non-nil. +With \\[universal-argument] \\[universal-argument] as prefix +argument, unconditionally set mark where point is, even if +`set-mark-command-repeat-pop' is non-nil. Novice Emacs Lisp programmers often try to use the mark for the wrong purposes. See the documentation of `set-mark' for more information."
--- a/lisp/subr.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/subr.el Tue Apr 24 21:56:25 2007 +0000 @@ -1719,6 +1719,9 @@ ;; This should be used by `call-interactively' for `n' specs. (defun read-number (prompt &optional default) + "Read a numeric value in the minibuffer, prompting with PROMPT. +DEFAULT specifies a default value to return if the user just types RET. +The value of DEFAULT is inserted into PROMPT." (let ((n nil)) (when default (setq prompt @@ -1732,9 +1735,11 @@ (let ((str (read-from-minibuffer prompt nil nil nil nil (and default (number-to-string default))))) - (setq n (cond - ((zerop (length str)) default) - ((stringp str) (read str))))) + (condition-case nil + (setq n (cond + ((zerop (length str)) default) + ((stringp str) (read str)))) + (error nil))) (unless (numberp n) (message "Please enter a number.") (sit-for 1)
--- a/lisp/t-mouse.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/t-mouse.el Tue Apr 24 21:56:25 2007 +0000 @@ -166,6 +166,8 @@ (if (or (eq (car ob-pos) 'STILL) (eq (car ob-pos) '***) (not ob-pos)) nil (setq ob (car ob-pos)) + (if (string-match "mev:$" (prin1-to-string ob)) + (error "Can't open mouse connection")) (setq t-mouse-filter-accumulator (substring t-mouse-filter-accumulator (cdr ob-pos)))
--- a/lisp/term.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/term.el Tue Apr 24 21:56:25 2007 +0000 @@ -627,7 +627,7 @@ "Keyboard map for sending characters directly to the inferior process.") (defvar term-escape-char nil "Escape character for char sub-mode of term mode. -Do not change it directly; use `term-set-escape-char' instead.") +Do not change it directly; use `term-set-escape-char' instead.") (defvar term-raw-escape-map nil) (defvar term-pager-break-map nil) @@ -714,7 +714,7 @@ (defvar term-buffer-maximum-size 2048 "*The maximum size in lines for term buffers. Term buffers are truncated from the top to be no greater than this number. -Notice that a setting of 0 means 'don't truncate anything'. This variable +Notice that a setting of 0 means \"don't truncate anything\". This variable is buffer-local.") ;;; @@ -856,7 +856,7 @@ ;; Set up term-raw-map, etc. (defun term-set-escape-char (c) - "Change term-escape-char and keymaps that depend on it." + "Change `term-escape-char' and keymaps that depend on it." (when term-escape-char (define-key term-raw-map term-escape-char 'term-send-raw)) (setq c (make-string 1 c)) @@ -1098,7 +1098,7 @@ (make-local-variable 'term-current-face) (make-local-variable 'term-pending-frame) (setq term-pending-frame nil) - ;; Cua-mode's keybindings interfere with the term keybindings, disable it. + ;; Cua-mode's keybindings interfere with the term keybindings, disable it. (set (make-local-variable 'cua-mode) nil) (run-mode-hooks 'term-mode-hook) (when (featurep 'xemacs) @@ -1194,7 +1194,7 @@ "Insert the last stretch of killed text at the position clicked on." (interactive "e\nP") (if (featurep 'xemacs) - (term-send-raw-string + (term-send-raw-string (or (condition-case () (x-get-selection) (error ())) (x-get-cutbuffer) (error "No selection or cut buffer available"))) @@ -1312,7 +1312,7 @@ "Start up a process in buffer for term modes. Blasts any old process running in the buffer. Doesn't set the buffer mode. You can use this to cheaply run a series of processes in the same term -buffer. The hook term-exec-hook is run after each exec." +buffer. The hook `term-exec-hook' is run after each exec." (save-excursion (set-buffer buffer) (let ((proc (get-buffer-process buffer))) ; Blast any old process. @@ -1342,7 +1342,7 @@ (run-hooks 'term-exec-hook) buffer))) -(defun term-sentinel (proc msg) +(defun term-sentinel (proc msg) "Sentinel for term buffers. The main purpose is to get rid of the local keymap." (let ((buffer (process-buffer proc))) @@ -1402,7 +1402,7 @@ :kb=^?:kD=^[[3~:sc=\\E7:rc=\\E8:r1=\\Ec:" ;;; : -undefine ic ;;; don't define :te=\\E[2J\\E[?47l\\E8:ti=\\E7\\E[?47h\ - "termcap capabilities supported") + "Termcap capabilities supported.") ;;; This auxiliary function cranks up the process for term-exec in ;;; the appropriate environment. @@ -2044,9 +2044,9 @@ (funcall term-input-sender proc input))))) (defun term-get-old-input-default () - "Default for term-get-old-input. + "Default for `term-get-old-input'. Take the current line, and discard any initial text matching -term-prompt-regexp." +`term-prompt-regexp'." (save-excursion (beginning-of-line) (term-skip-prompt) @@ -2066,7 +2066,7 @@ (insert input)))) (defun term-skip-prompt () - "Skip past the text matching regexp term-prompt-regexp. + "Skip past the text matching regexp `term-prompt-regexp'. If this takes us past the end of the current line, don't skip at all." (let ((eol (save-excursion (end-of-line) (point)))) (when (and (looking-at term-prompt-regexp) @@ -2097,7 +2097,7 @@ -- go straight to column 0. The prompt skip is done by skipping text matching the regular expression -term-prompt-regexp, a buffer local variable." +`term-prompt-regexp', a buffer local variable." (interactive "P") (beginning-of-line) (when (null arg) (term-skip-prompt))) @@ -2180,8 +2180,8 @@ (defun term-send-string (proc str) "Send to PROC the contents of STR as input. -This is equivalent to process-send-string, except that long input strings -are broken up into chunks of size term-input-chunk-size. Processes +This is equivalent to `process-send-string', except that long input strings +are broken up into chunks of size `term-input-chunk-size'. Processes are given a chance to output between chunks. This can help prevent processes from hanging when you send them long inputs on some OS's." (let* ((len (length str)) @@ -2195,7 +2195,7 @@ (defun term-send-region (proc start end) "Send to PROC the region delimited by START and END. -This is a replacement for process-send-region that tries to keep +This is a replacement for `process-send-region' that tries to keep your process from hanging on long inputs. See `term-send-string'." (term-send-string proc (buffer-substring start end))) @@ -2874,7 +2874,7 @@ ;; (setq term-terminal-state 0)) ((eq char ?M) ;; scroll reversed (terminfo: ri) (if (or (< (term-current-row) term-scroll-start) - (>= (1- (term-current-row)) + (>= (1- (term-current-row)) term-scroll-start)) ;; Scrolling up will not move outside ;; the scroll region. @@ -2900,7 +2900,7 @@ (when term-saved-cursor (term-goto (nth 0 term-saved-cursor) (nth 1 term-saved-cursor)) - (setq term-ansi-current-bg-color + (setq term-ansi-current-bg-color (nth 2 term-saved-cursor) term-ansi-current-bold (nth 3 term-saved-cursor) @@ -3188,7 +3188,7 @@ (when term-ansi-current-underline (setq term-current-face (append '(:underline t) term-current-face)))))) - + ;;; (message "Debug %S" term-current-face) (setq term-ansi-face-already-done nil)) @@ -3217,7 +3217,7 @@ ((eq char ?A) (term-handle-deferred-scroll) (let ((tcr (term-current-row))) - (term-down + (term-down (if (< (- tcr term-terminal-parameter) term-scroll-start) ;; If the amount to move is before scroll start, move ;; to scroll start. @@ -3229,7 +3229,7 @@ ((eq char ?B) (let ((tcr (term-current-row))) (unless (= tcr (1- term-scroll-end)) - (term-down + (term-down (if (> (+ tcr term-terminal-parameter) term-scroll-end) (- term-scroll-end 1 tcr) (max 1 term-terminal-parameter)) t)))) @@ -3493,7 +3493,7 @@ ((term-pager-continue deficit))))) (defun term-pager-page (arg) - "Proceed past the **MORE** break, allowing the next page of output to appear" + "Proceed past the **MORE** break, allowing the next page of output to appear." (interactive "p") (term-pager-line (* arg term-height))) @@ -3562,7 +3562,7 @@ (put 'term-fake-pager-disable 'menu-enable 'term-pager-count)) (defun term-pager-help () - "Provide help on commands available in a terminal-emulator **MORE** break" + "Provide help on commands available in a terminal-emulator **MORE** break." (interactive) (message "Terminal-emulator pager break help...") (sit-for 0) @@ -3604,9 +3604,9 @@ (defun term-handle-scroll (down) (let ((scroll-needed - (- (+ (term-current-row) down) + (- (+ (term-current-row) down) (if (< down 0) term-scroll-start term-scroll-end)))) - (when (or (and (< down 0) (< scroll-needed 0)) + (when (or (and (< down 0) (< scroll-needed 0)) (and (> down 0) (> scroll-needed 0))) (let ((save-point (copy-marker (point))) (save-top)) (goto-char term-home-marker) @@ -3704,7 +3704,7 @@ ;; contain a space, to force the previous line to continue to wrap. ;; We could do this always, but it seems preferable to not add the ;; extra space when wrapped is false. - (when wrapped + (when wrapped (insert ? )) (insert ?\n) (put-text-property saved-point (point) 'face 'default) @@ -3795,8 +3795,8 @@ ;; we need to go one line past it in order to ensure correct ;; scrolling. (if (< save-current-row term-scroll-start) - ;; If point is before scroll start, - (progn + ;; If point is before scroll start, + (progn (setq lines (- lines (- term-scroll-start save-current-row))) (term-down (- term-scroll-start save-current-row)) (setq start (point)))
--- a/lisp/textmodes/bibtex.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/textmodes/bibtex.el Tue Apr 24 21:56:25 2007 +0000 @@ -86,7 +86,7 @@ :group 'bibtex :type '(choice (const :tag "None" nil) (string :tag "Initial text") - (function :tag "Initialize Function" :value fun) + (function :tag "Initialize Function") (const :tag "Default" t))) (put 'bibtex-include-OPTkey 'risky-local-variable t) @@ -98,11 +98,8 @@ :group 'bibtex :type '(repeat (group (string :tag "Field") (string :tag "Comment") - (option (group :inline t - :extra-offset -4 - (choice :tag "Init" :value "" - string - function)))))) + (option (choice :tag "Init" + (const nil) string function))))) (put 'bibtex-user-optional-fields 'risky-local-variable t) (defcustom bibtex-entry-format @@ -224,7 +221,7 @@ :group 'bibtex :type 'boolean) -(defvar bibtex-entry-field-alist +(defcustom bibtex-entry-field-alist '(("Article" ((("author" "Author1 [and Author2 ...] [and others]") ("title" "Title of the article (BibTeX converts it to lowercase)") @@ -452,7 +449,36 @@ field or a function, which is called to determine the initial content of the field, and ALTERNATIVE-FLAG (either nil or t) marks if the field is an alternative. ALTERNATIVE-FLAG may be t only in the -REQUIRED or CROSSREF-REQUIRED lists.") +REQUIRED or CROSSREF-REQUIRED lists." + :group 'bibtex + :type '(repeat (group (string :tag "Entry name") + (group (repeat :tag "Required fields" + (group (string :tag "Field") + (string :tag "Comment") + (option (choice :tag "Init" :value nil + (const nil) string function)) + (option (choice :tag "Alternative" + (const :tag "No" nil) + (const :tag "Yes" t))))) + (repeat :tag "Optional fields" + (group (string :tag "Field") + (string :tag "Comment") + (option (choice :tag "Init" :value nil + (const nil) string function))))) + (option :extra-offset -4 + (group (repeat :tag "Crossref: required fields" + (group (string :tag "Field") + (string :tag "Comment") + (option (choice :tag "Init" :value nil + (const nil) string function)) + (option (choice :tag "Alternative" + (const :tag "No" nil) + (const :tag "Yes" t))))) + (repeat :tag "Crossref: optional fields" + (group (string :tag "Field") + (string :tag "Comment") + (option (choice :tag "Init" :value nil + (const nil) string function))))))))) (put 'bibtex-entry-field-alist 'risky-local-variable t) (defcustom bibtex-comment-start "@Comment" @@ -1785,7 +1811,7 @@ (set-mark (point)) (message "Mark set") (bibtex-make-field (funcall fun 'bibtex-field-kill-ring-yank-pointer - bibtex-field-kill-ring) t)) + bibtex-field-kill-ring) t nil t)) ;; insert past the current entry (bibtex-skip-to-valid-entry) (set-mark (point)) @@ -2831,7 +2857,7 @@ (push (list "key" "Used for reference key creation if author and editor fields are missing" (if (or (stringp bibtex-include-OPTkey) - (fboundp bibtex-include-OPTkey)) + (functionp bibtex-include-OPTkey)) bibtex-include-OPTkey)) optional)) (if (member-ignore-case entry-type bibtex-include-OPTcrossref) @@ -3020,7 +3046,7 @@ (if comment (message "%s" (nth 1 comment)) (message "No comment available"))))) -(defun bibtex-make-field (field &optional move interactive) +(defun bibtex-make-field (field &optional move interactive nodelim) "Make a field named FIELD in current BibTeX entry. FIELD is either a string or a list of the form \(FIELD-NAME COMMENT-STRING INIT ALTERNATIVE-FLAG) as in @@ -3028,7 +3054,8 @@ If MOVE is non-nil, move point past the present field before making the new field. If INTERACTIVE is non-nil, move point to the end of the new field. Otherwise move point past the new field. -MOVE and INTERACTIVE are t when called interactively." +MOVE and INTERACTIVE are t when called interactively. +INIT is surrounded by field delimiters, unless NODELIM is non-nil." (interactive (list (let ((completion-ignore-case t) (field-list (bibtex-field-list @@ -3058,10 +3085,13 @@ (indent-to-column (+ bibtex-entry-offset bibtex-text-indentation))) (let ((init (nth 2 field))) - (insert (cond ((stringp init) init) - ((fboundp init) (funcall init)) - (t (concat (bibtex-field-left-delimiter) - (bibtex-field-right-delimiter)))))) + (if (not init) (setq init "") + (if (functionp init) (setq init (funcall init))) + (unless (stringp init) (error "`%s' is not a string" init))) + ;; NODELIM is required by `bibtex-insert-kill' + (if nodelim (insert init) + (insert (bibtex-field-left-delimiter) init + (bibtex-field-right-delimiter)))) (when interactive ;; (bibtex-find-text nil nil bibtex-help-message) (if (memq (preceding-char) '(?} ?\")) (forward-char -1))
--- a/lisp/textmodes/fill.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/textmodes/fill.el Tue Apr 24 21:56:25 2007 +0000 @@ -526,7 +526,6 @@ ;; Ok, skip at least one word or one \c| character. ;; Meanwhile, don't stop at a period followed by one space. (let ((to (line-end-position)) - (fill-nobreak-predicate nil) ;to break sooner. (first t)) (goto-char linebeg) (while (and (< (point) to) (or first (fill-nobreak-p)))
--- a/lisp/textmodes/flyspell.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/textmodes/flyspell.el Tue Apr 24 21:56:25 2007 +0000 @@ -1827,7 +1827,7 @@ (defun flyspell-define-abbrev (name expansion) (let ((table (flyspell-abbrev-table))) (when table - (define-abbrev table name expansion)))) + (define-abbrev table (downcase name) expansion)))) ;;*---------------------------------------------------------------------*/ ;;* flyspell-auto-correct-word ... */
--- a/lisp/thumbs.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/thumbs.el Tue Apr 24 21:56:25 2007 +0000 @@ -29,7 +29,7 @@ ;; It is used for basic browsing and viewing of images from within Emacs. ;; Minimal image manipulation functions are also available via external ;; programs. If you want to do more complex tasks like categorise and tag -;; your images, use tumme.el +;; your images, use image-dired.el ;; ;; The 'convert' program from 'ImageMagick' ;; [URL:http://www.imagemagick.org/] is required.
--- a/lisp/tmm.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/tmm.el Tue Apr 24 21:56:25 2007 +0000 @@ -541,15 +541,15 @@ ;; Make a list of all the bindings in all the keymaps. (setq minorbind (mapcar 'cdr (minor-mode-key-binding keyseq))) (setq localbind (local-key-binding keyseq)) - (setq globalbind (cdr (global-key-binding keyseq))) + (setq globalbind (copy-sequence (cdr (global-key-binding keyseq)))) ;; If items have been redefined/undefined locally, remove them from ;; the global list. (dolist (minor minorbind) (dolist (item (cdr minor)) - (setq globalbind (assq-delete-all (car item) globalbind)))) + (setq globalbind (assq-delete-all (car-safe item) globalbind)))) (dolist (item (cdr localbind)) - (setq globalbind (assq-delete-all (car item) globalbind))) + (setq globalbind (assq-delete-all (car-safe item) globalbind))) (setq globalbind (cons 'keymap globalbind)) (setq allbind (cons globalbind (cons localbind minorbind)))
--- a/lisp/tumme.el Tue Apr 24 11:35:23 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2599 +0,0 @@ -;;; tumme.el --- use dired to browse and manipulate your images -;; -;; Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. -;; -;; Version: 0.4.11 -;; Keywords: multimedia -;; Author: Mathias Dahl <mathias.rem0veth1s.dahl@gmail.com> - -;; 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: -;; -;; BACKGROUND -;; ========== -;; -;; I needed a program to browse, organize and tag my pictures. I got -;; tired of the old gallery program I used as it did not allow -;; multi-file operations easily. Also, it put things out of my -;; control. Image viewing programs I tested did not allow multi-file -;; operations or did not do what I wanted it to. -;; -;; So, I got the idea to use the wonderful functionality of Emacs and -;; `dired' to do it. It would allow me to do almost anything I wanted, -;; which is basically just to browse all my pictures in an easy way, -;; letting me manipulate and tag them in various ways. `dired' already -;; provide all the file handling and navigation facilities; I only -;; needed to add some functions to display the images. -;; -;; I briefly tried out thumbs.el, and although it seemed more -;; powerful than this package, it did not work the way I wanted to. It -;; was too slow to created thumbnails of all files in a directory (I -;; currently keep all my 2000+ images in the same directory) and -;; browsing the thumbnail buffer was slow too. tumme.el will not -;; create thumbnails until they are needed and the browsing is done -;; quickly and easily in dired. I copied a great deal of ideas and -;; code from there though... :) -;; -;; About the name: tumme means thumb in Swedish and it is used for -;; working with thumbnails, so... :) If you want to know how to -;; pronounce it, go to the page on EmacsWiki and download the .ogg -;; file from there. -;; -;; `tumme' stores the thumbnail files in `tumme-dir' using the file -;; name format ORIGNAME.thumb.ORIGEXT. For example -;; ~/.emacs.d/tumme/myimage01.thumb.jpg. The "database" is for now -;; just a plain text file with the following format: -;; -;; file-name-non-directory;comment:comment-text;tag1;tag2;tag3;...;tagN -;; -;; -;; PREREQUISITES -;; ============= -;; -;; * The ImageMagick package. Currently, `convert' and `mogrify' are -;; used. Find it here: http://www.imagemagick.org. -;; -;; * For non-lossy rotation of JPEG images, the JpegTRAN program is -;; needed. -;; -;; * For `tumme-get-exif-data' and `tumme-write-exif-data' to work, -;; the command line tool `exiftool' is needed. It can be found here: -;; http://www.sno.phy.queensu.ca/~phil/exiftool/. These two functions -;; are, among other things, used for writing comments to image files -;; using `tumme-thumbnail-set-image-description' and to create -;; "unique" file names using `tumme-get-exif-file-name' (used by -;; `tumme-copy-with-exif-file-name'). -;; -;; -;; USAGE -;; ===== -;; -;; This information has been moved to the manual. Type `C-h r' to open -;; the Emacs manual and go to the node Thumbnails by typing `g -;; Thumbnails RET'. -;; -;; Quickstart: M-x tumme RET DIRNAME RET -;; -;; where DIRNAME is a directory containing image files. -;; -;; LIMITATIONS -;; =========== -;; -;; * Supports all image formats that Emacs and convert supports, but -;; the thumbnails are hard-coded to JPEG format. -;; -;; * WARNING: The "database" format used might be changed so keep a -;; backup of `tumme-db-file' when testing new versions. -;; -;; -;; TODO -;; ==== -;; -;; * Support gallery creation when using per-directory thumbnail -;; storage. -;; -;; * Some sort of auto-rotate function based on rotate info in the -;; EXIF data. -;; -;; * Check if exiftool exist before trying to call it to give a better -;; error message. -;; -;; * Investigate if it is possible to also write the tags to the image -;; files. -;; -;; * From thumbs.el: Add an option for clean-up/max-size functionality -;; for thumbnail directory. -;; -;; * From thumbs.el: Add setroot function. -;; -;; * From thumbs.el: Add image resizing, if useful (tumme's automatic -;; "image fit" might be enough) -;; -;; * From thumbs.el: Add the "modify" commands (emboss, negate, -;; monochrome etc). -;; -;; * Asynchronous creation of thumbnails. -;; -;; * Add `tumme-display-thumbs-ring' and functions to cycle that. Find -;; out which is best, saving old batch just before inserting new, or -;; saving the current batch in the ring when inserting it. Adding it -;; probably needs rewriting `tumme-display-thumbs' to be more general. -;; -;; * Find some way of toggling on and off really nice keybindings in -;; dired (for example, using C-n or <down> instead of C-S-n). Richard -;; suggested that we could keep C-t as prefix for tumme commands as it -;; is currently not used in dired. He also suggested that -;; `dired-next-line' and `dired-previous-line' figure out if tumme is -;; enabled in the current buffer and, if it is, call -;; `tumme-dired-next-line' and `tumme-dired-previous-line', -;; respectively. Update: This is partly done; some bindings have now -;; been added to dired. -;; -;; * Enhanced gallery creation with basic CSS-support and pagination -;; of tag pages with many pictures. -;; -;; * Rewrite `tumme-modify-mark-on-thumb-original-file' to be less -;; ugly. -;; -;; * In some way keep track of buffers and windows and stuff so that -;; it works as the user expects. -;; -;; * More/better documentation -;; -;; -;;; Code: - -(require 'dired) -(require 'format-spec) -(require 'widget) - -(eval-when-compile - (require 'wid-edit)) - -(defgroup tumme nil - "Use dired to browse your images as thumbnails, and more." - :prefix "tumme-" - :group 'multimedia) - -(defcustom tumme-dir "~/.emacs.d/tumme/" - "Directory where thumbnail images are stored." - :type 'string - :group 'tumme) - -(defcustom tumme-thumbnail-storage 'use-tumme-dir - "How to store tumme's thumbnail files. -Tumme can store thumbnail files in one of two ways and this is -controlled by this variable. \"Use tumme dir\" means that the -thumbnails are stored in a central directory. \"Per directory\" -means that each thumbnail is stored in a subdirectory called -\".tumme\" in the same directory where the image file is. -\"Thumbnail Managing Standard\" means that the thumbnails are -stored and generated according to the Thumbnail Managing Standard -that allows sharing of thumbnails across different programs." - :type '(choice :tag "How to store thumbnail files" - (const :tag "Thumbnail Managing Standard" standard) - (const :tag "Use tumme-dir" use-tumme-dir) - (const :tag "Per-directory" per-directory)) - :group 'tumme) - -(defcustom tumme-db-file "~/.emacs.d/tumme/.tumme_db" - "Database file where file names and their associated tags are stored." - :type 'string - :group 'tumme) - -(defcustom tumme-temp-image-file "~/.emacs.d/tumme/.tumme_temp" - "Name of temporary image file used by various commands." - :type 'string - :group 'tumme) - -(defcustom tumme-gallery-dir "~/.emacs.d/tumme/.tumme_gallery" - "Directory to store generated gallery html pages. -This path needs to be \"shared\" to the public so that it can access -the index.html page that tumme creates." - :type 'string - :group 'tumme) - -(defcustom tumme-gallery-image-root-url -"http://your.own.server/tummepics" - "URL where the full size images are to be found. -Note that this path has to be configured in your web server. Tumme -expects to find pictures in this directory." - :type 'string - :group 'tumme) - -(defcustom tumme-gallery-thumb-image-root-url -"http://your.own.server/tummethumbs" - "URL where the thumbnail images are to be found. -Note that this path has to be configured in your web server. Tumme -expects to find pictures in this directory." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-create-thumbnail-program - "convert" - "Executable used to create thumbnail. -Used together with `tumme-cmd-create-thumbnail-options'." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-create-thumbnail-options - "%p -size %wx%h \"%f\" -resize %wx%h +profile \"*\" jpeg:\"%t\"" - "Format of command used to create thumbnail image. -Available options are %p which is replaced by -`tumme-cmd-create-thumbnail-program', %w which is replaced by -`tumme-thumb-width', %h which is replaced by `tumme-thumb-height', -%f which is replaced by the file name of the original image and %t -which is replaced by the file name of the thumbnail file." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-create-temp-image-program - "convert" - "Executable used to create temporary image. -Used together with `tumme-cmd-create-temp-image-options'." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-create-temp-image-options - "%p -size %wx%h \"%f\" -resize %wx%h +profile \"*\" jpeg:\"%t\"" - "Format of command used to create temporary image for display window. -Available options are %p which is replaced by -`tumme-cmd-create-temp-image-program', %w and %h which is replaced by -the calculated max size for width and height in the image display window, -%f which is replaced by the file name of the original image and %t which -is replaced by the file name of the temporary file." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-pngnq-program (executable-find "pngnq") - "The file name of the `pngnq' program. -It quantizes colors of PNG images down to 256 colors." - :type '(choice (const :tag "Not Set" nil) string) - :group 'tumme) - -(defcustom tumme-cmd-pngcrush-program (executable-find "pngcrush") - "The file name of the `pngcrush' program. -It optimizes the compression of PNG images. Also it adds PNG textual chunks -with the information required by the Thumbnail Managing Standard." - :type '(choice (const :tag "Not Set" nil) string) - :group 'tumme) - -(defcustom tumme-cmd-create-standard-thumbnail-command - (concat - tumme-cmd-create-thumbnail-program " " - "-size %wx%h \"%f\" " - (unless (or tumme-cmd-pngcrush-program tumme-cmd-pngnq-program) - (concat - "-set \"Thumb::MTime\" \"%m\" " - "-set \"Thumb::URI\" \"file://%f\" " - "-set \"Description\" \"Thumbnail of file://%f\" " - "-set \"Software\" \"" (emacs-version) "\" ")) - "-thumbnail %wx%h png:\"%t\"" - (if tumme-cmd-pngnq-program - (concat - " ; " tumme-cmd-pngnq-program " -f \"%t\"" - (unless tumme-cmd-pngcrush-program - " ; mv %q %t"))) - (if tumme-cmd-pngcrush-program - (concat - (unless tumme-cmd-pngcrush-program - " ; cp %t %q") - " ; " tumme-cmd-pngcrush-program " -q " - "-text b \"Description\" \"Thumbnail of file://%f\" " - "-text b \"Software\" \"" (emacs-version) "\" " - ;; "-text b \"Thumb::Image::Height\" \"%oh\" " - ;; "-text b \"Thumb::Image::Mimetype\" \"%mime\" " - ;; "-text b \"Thumb::Image::Width\" \"%ow\" " - "-text b \"Thumb::MTime\" \"%m\" " - ;; "-text b \"Thumb::Size\" \"%b\" " - "-text b \"Thumb::URI\" \"file://%f\" " - "%q %t" - " ; rm %q"))) - "Command to create thumbnails according to the Thumbnail Managing Standard." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-rotate-thumbnail-program - "mogrify" - "Executable used to rotate thumbnail. -Used together with `tumme-cmd-rotate-thumbnail-options'." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-rotate-thumbnail-options - "%p -rotate %d \"%t\"" - "Format of command used to rotate thumbnail image. -Available options are %p which is replaced by -`tumme-cmd-rotate-thumbnail-program', %d which is replaced by the -number of (positive) degrees to rotate the image, normally 90 or 270 -\(for 90 degrees right and left), %t which is replaced by the file name -of the thumbnail file." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-rotate-original-program - "jpegtran" - "Executable used to rotate original image. -Used together with `tumme-cmd-rotate-original-options'." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-rotate-original-options - "%p -rotate %d -copy all -outfile %t \"%o\"" - "Format of command used to rotate original image. -Available options are %p which is replaced by -`tumme-cmd-rotate-original-program', %d which is replaced by the -number of (positive) degrees to rotate the image, normally 90 or -270 \(for 90 degrees right and left), %o which is replaced by the -original image file name and %t which is replaced by -`tumme-temp-image-file'." - :type 'string - :group 'tumme) - -(defcustom tumme-temp-rotate-image-file - "~/.emacs.d/tumme/.tumme_rotate_temp" - "Temporary file for rotate operations." - :type 'string - :group 'tumme) - -(defcustom tumme-rotate-original-ask-before-overwrite t - "Confirm overwrite of original file after rotate operation. -If non-nil, ask user for confirmation before overwriting the -original file with `tumme-temp-rotate-image-file'." - :type 'boolean - :group 'tumme) - -(defcustom tumme-cmd-write-exif-data-program - "exiftool" - "Program used to write EXIF data to image. -Used together with `tumme-cmd-write-exif-data-options'." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-write-exif-data-options - "%p -%t=\"%v\" \"%f\"" - "Format of command used to write EXIF data. -Available options are %p which is replaced by -`tumme-cmd-write-exif-data-program', %f which is replaced by the -image file name, %t which is replaced by the tag name and %v -which is replaced by the tag value." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-read-exif-data-program - "exiftool" - "Program used to read EXIF data to image. -Used together with `tumme-cmd-read-exif-data-program-options'." - :type 'string - :group 'tumme) - -(defcustom tumme-cmd-read-exif-data-options - "%p -s -s -s -%t \"%f\"" - "Format of command used to read EXIF data. -Available options are %p which is replaced by -`tumme-cmd-write-exif-data-options', %f which is replaced -by the image file name and %t which is replaced by the tag name." - :type 'string - :group 'tumme) - -(defcustom tumme-gallery-hidden-tags - (list "private" "hidden" "pending") - "List of \"hidden\" tags. -Used by `tumme-gallery-generate' to leave out \"hidden\" images." - :type '(repeat string) - :group 'tumme) - -(defcustom tumme-thumb-size (if (eq 'standard tumme-thumbnail-storage) 128 100) - "Size of thumbnails, in pixels. -This is the default size for both `tumme-thumb-width' and `tumme-thumb-height'." - :type 'integer - :group 'tumme) - -(defcustom tumme-thumb-width tumme-thumb-size - "Width of thumbnails, in pixels." - :type 'integer - :group 'tumme) - -(defcustom tumme-thumb-height tumme-thumb-size - "Height of thumbnails, in pixels." - :type 'integer - :group 'tumme) - -(defcustom tumme-thumb-relief 2 - "Size of button-like border around thumbnails." - :type 'integer - :group 'tumme) - -(defcustom tumme-thumb-margin 2 - "Size of the margin around thumbnails. -This is where you see the cursor." - :type 'integer - :group 'tumme) - -(defcustom tumme-line-up-method 'dynamic - "Default method for line-up of thumbnails in thumbnail buffer. -Used by `tumme-display-thumbs' and other functions that needs to -line-up thumbnails. Dynamic means to use the available width of the -window containing the thumbnail buffer, Fixed means to use -`tumme-thumbs-per-row', Interactive is for asking the user, and No -line-up means that no automatic line-up will be done." - :type '(choice :tag "Default line-up method" - (const :tag "Dynamic" dynamic) - (const :tag "Fixed" fixed) - (const :tag "Interactive" interactive) - (const :tag "No line-up" none)) - :group 'tumme) - -(defcustom tumme-thumbs-per-row 3 - "Number of thumbnails to display per row in thumb buffer." - :type 'integer - :group 'tumme) - -(defcustom tumme-display-window-width-correction 1 - "Number to be used to correct image display window width. -Change if the default (1) does not work (i.e. if the image does not -completely fit)." - :type 'integer - :group 'tumme) - -(defcustom tumme-display-window-height-correction 0 - "Number to be used to correct image display window height. -Change if the default (0) does not work (i.e. if the image does not -completely fit)." - :type 'integer - :group 'tumme) - -(defcustom tumme-track-movement t - "The current state of the tracking and mirroring. -For more information, see the documentation for -`tumme-toggle-movement-tracking'." - :type 'boolean - :group 'tumme) - -(defcustom tumme-append-when-browsing nil - "Append thumbnails in thumbnail buffer when browsing. -If non-nil, using `tumme-next-line-and-display' and -`tumme-previous-line-and-display' will leave a trail of thumbnail -images in the thumbnail buffer. If you enable this and want to clean -the thumbnail buffer because it is filled with too many thumbmnails, -just call `tumme-display-thumb' to display only the image at point. -This value can be toggled using `tumme-toggle-append-browsing'." - :type 'boolean - :group 'tumme) - -(defcustom tumme-dired-disp-props t - "If non-nil, display properties for dired file when browsing. -Used by `tumme-next-line-and-display', -`tumme-previous-line-and-display' and `tumme-mark-and-display-next'. -If the database file is large, this can slow down image browsing in -dired and you might want to turn it off." - :type 'boolean - :group 'tumme) - -(defcustom tumme-display-properties-format "%b: %f (%t): %c" - "Display format for thumbnail properties. -%b is replaced with associated dired buffer name, %f with file name -\(without path) of original image file, %t with the list of tags and %c -with the comment." - :type 'string - :group 'tumme) - -(defcustom tumme-external-viewer - ;; TODO: Use mailcap, dired-guess-shell-alist-default, - ;; dired-view-command-alist. - (cond ((executable-find "display")) - ((executable-find "xli")) - ((executable-find "qiv") "qiv -t")) - "Name of external viewer. -Including parameters. Used when displaying original image from -`tumme-thumbnail-mode'." - :type 'string - :group 'tumme) - -(defcustom tumme-main-image-directory "~/pics/" - "Name of main image directory, if any. -Used by `tumme-copy-with-exif-file-name'." - :type 'string - :group 'tumme) - -(defcustom tumme-show-all-from-dir-max-files 50 - "Maximum number of files to show using `tumme-show-all-from-dir'. -before warning the user." - :type 'integer - :group 'tumme) - -(defun tumme-dir () - "Return the current thumbnails directory (from variable `tumme-dir'). -Create the thumbnails directory if it does not exist." - (let ((tumme-dir (file-name-as-directory - (expand-file-name tumme-dir)))) - (unless (file-directory-p tumme-dir) - (make-directory tumme-dir t) - (message "Creating thumbnails directory")) - tumme-dir)) - -(defun tumme-insert-image (file type relief margin) - "Insert image FILE of image TYPE, using RELIEF and MARGIN, at point." - - (let ((i `(image :type ,type - :file ,file - :relief ,relief - :margin ,margin))) - (insert-image i))) - -(defun tumme-get-thumbnail-image (file) - "Return the image descriptor for a thumbnail of image file FILE." - (unless (string-match (image-file-name-regexp) file) - (error "%s is not a valid image file" file)) - (let ((thumb-file (tumme-thumb-name file))) - (unless (and (file-exists-p thumb-file) - (<= (float-time (nth 5 (file-attributes file))) - (float-time (nth 5 (file-attributes thumb-file))))) - (tumme-create-thumb file thumb-file)) - (create-image thumb-file) -;; (list 'image :type 'jpeg -;; :file thumb-file -;; :relief tumme-thumb-relief :margin tumme-thumb-margin) - )) - -(defun tumme-insert-thumbnail (file original-file-name - associated-dired-buffer) - "Insert thumbnail image FILE. -Add text properties ORIGINAL-FILE-NAME and ASSOCIATED-DIRED-BUFFER." - (let (beg end) - (setq beg (point)) - (tumme-insert-image file - ;; TODO: this should depend on the real file type - (if (eq 'standard tumme-thumbnail-storage) - 'png 'jpeg) - tumme-thumb-relief - tumme-thumb-margin) - (setq end (point)) - (add-text-properties - beg end - (list 'tumme-thumbnail t - 'original-file-name original-file-name - 'associated-dired-buffer associated-dired-buffer - 'tags (tumme-list-tags original-file-name) - 'mouse-face 'highlight - 'comment (tumme-get-comment original-file-name))))) - -(defun tumme-thumb-name (file) - "Return thumbnail file name for FILE. -Depending on the value of `tumme-thumbnail-storage', the file -name will vary. For central thumbnail file storage, make a -MD5-hash of the image file's directory name and add that to make -the thumbnail file name unique. For per-directory storage, just -add a subdirectory. For standard storage, produce the file name -according to the Thumbnail Managing Standard." - (cond ((eq 'standard tumme-thumbnail-storage) - (expand-file-name - (concat "~/.thumbnails/normal/" - (md5 (concat "file://" (expand-file-name file))) ".png"))) - ((eq 'use-tumme-dir tumme-thumbnail-storage) - (let* ((f (expand-file-name file)) - (md5-hash - ;; Is MD5 hashes fast enough? The checksum of a - ;; thumbnail file name need not be that - ;; "cryptographically" good so a faster one could - ;; be used here. - (md5 (file-name-as-directory (file-name-directory f))))) - (format "%s%s%s.thumb.%s" - (file-name-as-directory (expand-file-name (tumme-dir))) - (file-name-sans-extension (file-name-nondirectory f)) - (if md5-hash (concat "_" md5-hash) "") - (file-name-extension f)))) - ((eq 'per-directory tumme-thumbnail-storage) - (let ((f (expand-file-name file))) - (format "%s.tumme/%s.thumb.%s" - (file-name-directory f) - (file-name-sans-extension (file-name-nondirectory f)) - (file-name-extension f)))))) - -(defun tumme-create-thumb (original-file thumbnail-file) - "For ORIGINAL-FILE, create thumbnail image named THUMBNAIL-FILE." - (let* ((width (int-to-string tumme-thumb-width)) - (height (int-to-string tumme-thumb-height)) - (modif-time (format "%.0f" (float-time (nth 5 (file-attributes - original-file))))) - (thumbnail-nq8-file (replace-regexp-in-string ".png\\'" "-nq8.png" - thumbnail-file)) - (command - (format-spec - (if (eq 'standard tumme-thumbnail-storage) - tumme-cmd-create-standard-thumbnail-command - tumme-cmd-create-thumbnail-options) - (list - (cons ?p tumme-cmd-create-thumbnail-program) - (cons ?w width) - (cons ?h height) - (cons ?m modif-time) - (cons ?f original-file) - (cons ?q thumbnail-nq8-file) - (cons ?t thumbnail-file)))) - thumbnail-dir) - (when (not (file-exists-p - (setq thumbnail-dir (file-name-directory thumbnail-file)))) - (message "Creating thumbnail directory.") - (make-directory thumbnail-dir)) - (call-process shell-file-name nil nil nil shell-command-switch command))) - -;;;###autoload -(defun tumme-dired-insert-marked-thumbs () - "Insert thumbnails before file names of marked files in the dired buffer." - (interactive) - (dired-map-over-marks - (let* ((image-pos (dired-move-to-filename)) - (image-file (dired-get-filename)) - (thumb-file (tumme-get-thumbnail-image image-file)) - overlay) - ;; If image is not already added, then add it. - (unless (delq nil (mapcar (lambda (o) (overlay-get o 'put-image)) - ;; Can't use (overlays-at (point)), BUG? - (overlays-in (point) (1+ (point))))) - (put-image thumb-file image-pos) - (setq - overlay - (car (delq nil (mapcar (lambda (o) (and (overlay-get o 'put-image) o)) - (overlays-in (point) (1+ (point))))))) - (overlay-put overlay 'image-file image-file) - (overlay-put overlay 'thumb-file thumb-file))) - nil) - (add-hook 'dired-after-readin-hook 'tumme-dired-after-readin-hook nil t)) - -(defun tumme-dired-after-readin-hook () - "Relocate existing thumbnail overlays in dired buffer after reverting. -Move them to their corresponding files if they are still exist. -Otherwise, delete overlays." - (mapc (lambda (overlay) - (when (overlay-get overlay 'put-image) - (let* ((image-file (overlay-get overlay 'image-file)) - (image-pos (dired-goto-file image-file))) - (if image-pos - (move-overlay overlay image-pos image-pos) - (delete-overlay overlay))))) - (overlays-in (point-min) (point-max)))) - -(defun tumme-next-line-and-display () - "Move to next dired line and display thumbnail image." - (interactive) - (dired-next-line 1) - (tumme-display-thumbs - t (or tumme-append-when-browsing nil) t) - (if tumme-dired-disp-props - (tumme-dired-display-properties))) - -(defun tumme-previous-line-and-display () - "Move to previous dired line and display thumbnail image." - (interactive) - (dired-previous-line 1) - (tumme-display-thumbs - t (or tumme-append-when-browsing nil) t) - (if tumme-dired-disp-props - (tumme-dired-display-properties))) - -(defun tumme-toggle-append-browsing () - "Toggle `tumme-append-when-browsing'." - (interactive) - (setq tumme-append-when-browsing - (not tumme-append-when-browsing)) - (message "Append browsing %s." - (if tumme-append-when-browsing - "on" - "off"))) - -(defun tumme-mark-and-display-next () - "Mark current file in dired and display next thumbnail image." - (interactive) - (dired-mark 1) - (tumme-display-thumbs - t (or tumme-append-when-browsing nil) t) - (if tumme-dired-disp-props - (tumme-dired-display-properties))) - -(defun tumme-toggle-dired-display-properties () - "Toggle `tumme-dired-disp-props'." - (interactive) - (setq tumme-dired-disp-props - (not tumme-dired-disp-props)) - (message "Dired display properties %s." - (if tumme-dired-disp-props - "on" - "off"))) - -(defvar tumme-thumbnail-buffer "*tumme*" - "Tumme's thumbnail buffer.") - -(defun tumme-create-thumbnail-buffer () - "Create thumb buffer and set `tumme-thumbnail-mode'." - (let ((buf (get-buffer-create tumme-thumbnail-buffer))) - (with-current-buffer buf - (setq buffer-read-only t) - (if (not (eq major-mode 'tumme-thumbnail-mode)) - (tumme-thumbnail-mode))) - buf)) - -(defvar tumme-display-image-buffer "*tumme-display-image*" - "Where larger versions of the images are display.") - -(defun tumme-create-display-image-buffer () - "Create image display buffer and set `tumme-display-image-mode'." - (let ((buf (get-buffer-create tumme-display-image-buffer))) - (with-current-buffer buf - (setq buffer-read-only t) - (if (not (eq major-mode 'tumme-display-image-mode)) - (tumme-display-image-mode))) - buf)) - -(defvar tumme-saved-window-configuration nil - "Saved window configuration.") - -;;;###autoload -(defun tumme-dired-with-window-configuration (dir &optional arg) - "Open directory DIR and create a default window configuration. - -Convenience command that: - - - Opens dired in folder DIR - - Splits windows in most useful (?) way - - Set `truncate-lines' to t - -After the command has finished, you would typically mark some -image files in dired and type -\\[tumme-display-thumbs] (`tumme-display-thumbs'). - -If called with prefix argument ARG, skip splitting of windows. - -The current window configuration is saved and can be restored by -calling `tumme-restore-window-configuration'." - (interactive "DDirectory: \nP") - (let ((buf (tumme-create-thumbnail-buffer)) - (buf2 (tumme-create-display-image-buffer))) - (setq tumme-saved-window-configuration - (current-window-configuration)) - (dired dir) - (delete-other-windows) - (when (not arg) - (split-window-horizontally) - (setq truncate-lines t) - (save-excursion - (other-window 1) - (switch-to-buffer buf) - (split-window-vertically) - (other-window 1) - (switch-to-buffer buf2) - (other-window -2))))) - -(defun tumme-restore-window-configuration () - "Restore window configuration. -Restore any changes to the window configuration made by calling -`tumme-dired-with-window-configuration'." - (interactive) - (if tumme-saved-window-configuration - (set-window-configuration tumme-saved-window-configuration) - (message "No saved window configuration"))) - -;;;###autoload -(defun tumme-display-thumbs (&optional arg append do-not-pop) - "Display thumbnails of all marked files, in `tumme-thumbnail-buffer'. -If a thumbnail image does not exist for a file, it is created on the -fly. With prefix argument ARG, display only thumbnail for file at -point (this is useful if you have marked some files but want to show -another one). - -Recommended usage is to split the current frame horizontally so that -you have the dired buffer in the left window and the -`tumme-thumbnail-buffer' buffer in the right window. - -With optional argument APPEND, append thumbnail to thumbnail buffer -instead of erasing it first. - -Option argument DO-NOT-POP controls if `pop-to-buffer' should be -used or not. If non-nil, use `display-buffer' instead of -`pop-to-buffer'. This is used from functions like -`tumme-next-line-and-display' and -`tumme-previous-line-and-display' where we do not want the -thumbnail buffer to be selected." - (interactive "P") - (let ((buf (tumme-create-thumbnail-buffer)) - curr-file thumb-name files count dired-buf beg) - (if arg - (setq files (list (dired-get-filename))) - (setq files (dired-get-marked-files))) - (setq dired-buf (current-buffer)) - (with-current-buffer buf - (let ((inhibit-read-only t)) - (if (not append) - (erase-buffer) - (goto-char (point-max))) - (mapcar - (lambda (curr-file) - (setq thumb-name (tumme-thumb-name curr-file)) - (if (and (not (file-exists-p thumb-name)) - (not (= 0 (tumme-create-thumb curr-file thumb-name)))) - (message "Thumb could not be created for file %s" curr-file) - (tumme-insert-thumbnail thumb-name curr-file dired-buf))) - files)) - (cond ((eq 'dynamic tumme-line-up-method) - (tumme-line-up-dynamic)) - ((eq 'fixed tumme-line-up-method) - (tumme-line-up)) - ((eq 'interactive tumme-line-up-method) - (tumme-line-up-interactive)) - ((eq 'none tumme-line-up-method) - nil) - (t - (tumme-line-up-dynamic)))) - (if do-not-pop - (display-buffer tumme-thumbnail-buffer) - (pop-to-buffer tumme-thumbnail-buffer)))) - -;;;###autoload -(defun tumme-show-all-from-dir (dir) - "Make a preview buffer for all images in DIR and display it. -If the number of files in DIR matching `image-file-name-regexp' -exceeds `tumme-show-all-from-dir-max-files', a warning will be -displayed." - (interactive "DDir: ") - (dired dir) - (dired-mark-files-regexp (image-file-name-regexp)) - (let ((files (dired-get-marked-files))) - (if (or (<= (length files) tumme-show-all-from-dir-max-files) - (and (> (length files) tumme-show-all-from-dir-max-files) - (y-or-n-p - (format - "Directory contains more than %d image files. Proceed? " - tumme-show-all-from-dir-max-files)))) - (progn - (tumme-display-thumbs) - (pop-to-buffer tumme-thumbnail-buffer)) - (message "Cancelled.")))) - -;;;###autoload -(defalias 'tumme 'tumme-show-all-from-dir) - -(defun tumme-write-tags (file-tags) - "Write file tags to database. -Write each file and tag in FILE-TAGS to the database. FILE-TAGS -is an alist in the following form: - ((FILE . TAG) ... )" - (let (end file tag) - (with-temp-file tumme-db-file - (insert-file-contents tumme-db-file) - (dolist (elt file-tags) - (setq file (car elt) - tag (cdr elt)) - (goto-char (point-min)) - (if (search-forward-regexp (format "^%s.*$" file) nil t) - (progn - (setq end (point)) - (beginning-of-line) - (when (not (search-forward (format ";%s" tag) end t)) - (end-of-line) - (insert (format ";%s" tag)))) - (goto-char (point-max)) - (insert (format "\n%s;%s" file tag))))))) - -(defun tumme-remove-tag (files tag) - "For all FILES, remove TAG from the image database." - (save-excursion - (let (end buf start) - (setq buf (find-file tumme-db-file)) - (if (not (listp files)) - (if (stringp files) - (setq files (list files)) - (error "Files must be a string or a list of strings!"))) - (mapcar - (lambda (file) - (goto-char (point-min)) - (when (search-forward-regexp - (format "^%s" file) nil t) - (end-of-line) - (setq end (point)) - (beginning-of-line) - (when (search-forward-regexp (format "\\(;%s\\)" tag) end t) - (delete-region (match-beginning 1) (match-end 1)) - ;; Check if file should still be in the database. If - ;; it has no tags or comments, it will be removed. - (end-of-line) - (setq end (point)) - (beginning-of-line) - (when (not (search-forward ";" end t)) - (kill-line 1) - ;; If on empty line at end of buffer - (when (and (eobp) - (looking-at "^$")) - (delete-backward-char 1)))))) - files) - (save-buffer) - (kill-buffer buf)))) - -(defun tumme-list-tags (file) - "Read all tags for image FILE from the image database." - (save-excursion - (let (end buf (tags "")) - (setq buf (find-file tumme-db-file)) - (goto-char (point-min)) - (when (search-forward-regexp - (format "^%s" file) nil t) - (end-of-line) - (setq end (point)) - (beginning-of-line) - (if (search-forward ";" end t) - (if (search-forward "comment:" end t) - (if (search-forward ";" end t) - (setq tags (buffer-substring (point) end))) - (setq tags (buffer-substring (point) end))))) - (kill-buffer buf) - (split-string tags ";")))) - -;;;###autoload -(defun tumme-tag-files (arg) - "Tag marked file(s) in dired. With prefix ARG, tag file at point." - (interactive "P") - (let ((tag (read-string "Tags to add (separate tags with a semicolon): ")) - curr-file files) - (if arg - (setq files (list (dired-get-filename))) - (setq files (dired-get-marked-files))) - (tumme-write-tags - (mapcar - (lambda (x) - (cons x tag)) - files)))) - -(defun tumme-tag-thumbnail () - "Tag current thumbnail." - (interactive) - (let ((tag (read-string "Tags to add (separate tags with a semicolon): "))) - (tumme-write-tags (list (cons (tumme-original-file-name) tag)))) - (tumme-update-property - 'tags (tumme-list-tags (tumme-original-file-name)))) - -;;;###autoload -(defun tumme-delete-tag (arg) - "Remove tag for selected file(s). -With prefix argument ARG, remove tag from file at point." - (interactive "P") - (let ((tag (read-string "Tag to remove: ")) - files) - (if arg - (setq files (list (dired-get-filename))) - (setq files (dired-get-marked-files))) - (tumme-remove-tag files tag))) - -(defun tumme-tag-thumbnail-remove () - "Remove tag from thumbnail." - (interactive) - (let ((tag (read-string "Tag to remove: "))) - (tumme-remove-tag (tumme-original-file-name) tag)) - (tumme-update-property - 'tags (tumme-list-tags (tumme-original-file-name)))) - -(defun tumme-original-file-name () - "Get original file name for thumbnail or display image at point." - (get-text-property (point) 'original-file-name)) - -(defun tumme-associated-dired-buffer () - "Get associated dired buffer at point." - (get-text-property (point) 'associated-dired-buffer)) - -(defun tumme-get-buffer-window (buf) - "Return window where buffer BUF is." - (get-window-with-predicate - (lambda (window) - (equal (window-buffer window) buf)) - nil t)) - -(defun tumme-track-original-file () - "Track the original file in the associated dired buffer. -See documentation for `tumme-toggle-movement-tracking'. Interactive -use only useful if `tumme-track-movement' is nil." - (interactive) - (let ((old-buf (current-buffer)) - (dired-buf (tumme-associated-dired-buffer)) - (file-name (tumme-original-file-name))) - (when (and (buffer-live-p dired-buf) file-name) - (setq file-name (file-name-nondirectory file-name)) - (set-buffer dired-buf) - (goto-char (point-min)) - (if (not (search-forward file-name nil t)) - (message "Could not track file") - (dired-move-to-filename) - (set-window-point - (tumme-get-buffer-window dired-buf) (point))) - (set-buffer old-buf)))) - -(defun tumme-toggle-movement-tracking () - "Turn on and off `tumme-track-movement'. -Tracking of the movements between thumbnail and dired buffer so that -they are \"mirrored\" in the dired buffer. When this is on, moving -around in the thumbnail or dired buffer will find the matching -position in the other buffer." - (interactive) - (setq tumme-track-movement (not tumme-track-movement)) - (message "Tracking %s" (if tumme-track-movement "on" "off"))) - -(defun tumme-track-thumbnail () - "Track current dired file's thumb in `tumme-thumbnail-buffer'. -This is almost the same as what `tumme-track-original-file' does, but -the other way around." - (let ((file (dired-get-filename)) - (old-buf (current-buffer)) - prop-val found) - (when (get-buffer tumme-thumbnail-buffer) - (set-buffer tumme-thumbnail-buffer) - (goto-char (point-min)) - (while (and (not (eobp)) - (not found)) - (if (and (setq prop-val - (get-text-property (point) 'original-file-name)) - (string= prop-val file)) - (setq found t)) - (if (not found) - (forward-char 1))) - (when found - (set-window-point - (tumme-thumbnail-window) (point)) - (tumme-display-thumb-properties)) - (set-buffer old-buf)))) - -(defun tumme-dired-next-line (&optional arg) - "Call `dired-next-line', then track thumbnail. -This can safely replace `dired-next-line'. With prefix argument, move -ARG lines." - (interactive "P") - (dired-next-line (or arg 1)) - (if tumme-track-movement - (tumme-track-thumbnail))) - -(defun tumme-dired-previous-line (&optional arg) - "Call `dired-previous-line', then track thumbnail. -This can safely replace `dired-previous-line'. With prefix argument, -move ARG lines." - (interactive "P") - (dired-previous-line (or arg 1)) - (if tumme-track-movement - (tumme-track-thumbnail))) - -(defun tumme-forward-image (&optional arg) - "Move to next image and display properties. -Optional prefix ARG says how many images to move; default is one -image." - (interactive "p") - (let (pos (steps (or arg 1))) - (dotimes (i steps) - (if (and (not (eobp)) - (save-excursion - (forward-char) - (while (and (not (eobp)) - (not (tumme-image-at-point-p))) - (forward-char)) - (setq pos (point)) - (tumme-image-at-point-p))) - (goto-char pos) - (error "At last image")))) - (when tumme-track-movement - (tumme-track-original-file)) - (tumme-display-thumb-properties)) - -(defun tumme-backward-image (&optional arg) - "Move to previous image and display properties. -Optional prefix ARG says how many images to move; default is one -image." - (interactive "p") - (let (pos (steps (or arg 1))) - (dotimes (i steps) - (if (and (not (bobp)) - (save-excursion - (backward-char) - (while (and (not (bobp)) - (not (tumme-image-at-point-p))) - (backward-char)) - (setq pos (point)) - (tumme-image-at-point-p))) - (goto-char pos) - (error "At first image")))) - (when tumme-track-movement - (tumme-track-original-file)) - (tumme-display-thumb-properties)) - -(defun tumme-next-line () - "Move to next line and display properties." - (interactive) - (next-line 1) - ;; If we end up in an empty spot, back up to the next thumbnail. - (if (not (tumme-image-at-point-p)) - (tumme-backward-image)) - (if tumme-track-movement - (tumme-track-original-file)) - (tumme-display-thumb-properties)) - - -(defun tumme-previous-line () - "Move to previous line and display properties." - (interactive) - (previous-line 1) - ;; If we end up in an empty spot, back up to the next - ;; thumbnail. This should only happen if the user deleted a - ;; thumbnail and did not refresh, so it is not very common. But we - ;; can handle it in a good manner, so why not? - (if (not (tumme-image-at-point-p)) - (tumme-backward-image)) - (if tumme-track-movement - (tumme-track-original-file)) - (tumme-display-thumb-properties)) - -(defun tumme-format-properties-string (buf file props comment) - "Format display properties. -BUF is the associated dired buffer, FILE is the original image file -name, PROPS is a list of tags and COMMENT is the image files's -comment." - (format-spec - tumme-display-properties-format - (list - (cons ?b (or buf "")) - (cons ?f file) - (cons ?t (or (princ props) "")) - (cons ?c (or comment ""))))) - -(defun tumme-display-thumb-properties () - "Display thumbnail properties in the echo area." - (if (not (eobp)) - (let ((file-name (file-name-nondirectory (tumme-original-file-name))) - (dired-buf (buffer-name (tumme-associated-dired-buffer))) - (props (mapconcat - 'princ - (get-text-property (point) 'tags) - ", ")) - (comment (get-text-property (point) 'comment))) - (if file-name - (message - (tumme-format-properties-string - dired-buf - file-name - props - comment)))))) - -(defun tumme-dired-file-marked-p () - "Check whether file on current line is marked or not." - (save-excursion - (beginning-of-line) - (not (looking-at "^ .*$")))) - -(defun tumme-modify-mark-on-thumb-original-file (command) - "Modify mark in dired buffer. -This is quite ugly but I don't know how to implemented in a better -way. COMMAND is one of 'mark for marking file in dired, 'unmark for -unmarking file in dired or 'flag for flagging file for delete in -dired." - (let ((file-name (tumme-original-file-name)) - (dired-buf (tumme-associated-dired-buffer))) - (if (not (and dired-buf file-name)) - (message "No image, or image with correct properties, at point.") - (with-current-buffer dired-buf - (message file-name) - (setq file-name (file-name-nondirectory file-name)) - (goto-char (point-min)) - (if (search-forward file-name nil t) - (cond ((eq command 'mark) (dired-mark 1)) - ((eq command 'unmark) (dired-unmark 1)) - ((eq command 'toggle) - (if (tumme-dired-file-marked-p) - (dired-unmark 1) - (dired-mark 1))) - ((eq command 'flag) (dired-flag-file-deletion 1)))))))) - -(defun tumme-mark-thumb-original-file () - "Mark original image file in associated dired buffer." - (interactive) - (tumme-modify-mark-on-thumb-original-file 'mark) - (tumme-forward-image)) - -(defun tumme-unmark-thumb-original-file () - "Unmark original image file in associated dired buffer." - (interactive) - (tumme-modify-mark-on-thumb-original-file 'unmark) - (tumme-forward-image)) - -(defun tumme-flag-thumb-original-file () - "Flag original image file for deletion in associated dired buffer." - (interactive) - (tumme-modify-mark-on-thumb-original-file 'flag) - (tumme-forward-image)) - -(defun tumme-toggle-mark-thumb-original-file () - "Toggle mark on original image file in associated dired buffer." - (interactive) - (tumme-modify-mark-on-thumb-original-file 'toggle)) - -(defun tumme-jump-original-dired-buffer () - "Jump to the dired buffer associated with the current image file. -You probably want to use this together with -`tumme-track-original-file'." - (interactive) - (let ((buf (tumme-associated-dired-buffer)) - window frame) - (setq window (tumme-get-buffer-window buf)) - (if window - (progn - (if (not (equal (selected-frame) (setq frame (window-frame window)))) - (select-frame-set-input-focus frame)) - (select-window window)) - (message "Associated dired buffer not visible")))) - -;;;###autoload -(defun tumme-jump-thumbnail-buffer () - "Jump to thumbnail buffer." - (interactive) - (let ((window (tumme-thumbnail-window)) - frame) - (if window - (progn - (if (not (equal (selected-frame) (setq frame (window-frame window)))) - (select-frame-set-input-focus frame)) - (select-window window)) - (message "Thumbnail buffer not visible")))) - -(defvar tumme-thumbnail-mode-map (make-sparse-keymap) - "Keymap for `tumme-thumbnail-mode'.") - -(defvar tumme-thumbnail-mode-line-up-map (make-sparse-keymap) - "Keymap for line-up commands in `tumme-thumbnail-mode'.") - -(defvar tumme-thumbnail-mode-tag-map (make-sparse-keymap) - "Keymap for tag commands in `tumme-thumbnail-mode'.") - -(defun tumme-define-thumbnail-mode-keymap () - "Define keymap for `tumme-thumbnail-mode'." - - ;; Keys - (define-key tumme-thumbnail-mode-map [right] 'tumme-forward-image) - (define-key tumme-thumbnail-mode-map [left] 'tumme-backward-image) - (define-key tumme-thumbnail-mode-map [up] 'tumme-previous-line) - (define-key tumme-thumbnail-mode-map [down] 'tumme-next-line) - (define-key tumme-thumbnail-mode-map "\C-f" 'tumme-forward-image) - (define-key tumme-thumbnail-mode-map "\C-b" 'tumme-backward-image) - (define-key tumme-thumbnail-mode-map "\C-p" 'tumme-previous-line) - (define-key tumme-thumbnail-mode-map "\C-n" 'tumme-next-line) - - (define-key tumme-thumbnail-mode-map "d" 'tumme-flag-thumb-original-file) - (define-key tumme-thumbnail-mode-map [delete] - 'tumme-flag-thumb-original-file) - (define-key tumme-thumbnail-mode-map "m" 'tumme-mark-thumb-original-file) - (define-key tumme-thumbnail-mode-map "u" 'tumme-unmark-thumb-original-file) - (define-key tumme-thumbnail-mode-map "." 'tumme-track-original-file) - (define-key tumme-thumbnail-mode-map [tab] 'tumme-jump-original-dired-buffer) - - ;; add line-up map - (define-key tumme-thumbnail-mode-map "g" tumme-thumbnail-mode-line-up-map) - - ;; map it to "g" so that the user can press it more quickly - (define-key tumme-thumbnail-mode-line-up-map "g" 'tumme-line-up-dynamic) - ;; "f" for "fixed" number of thumbs per row - (define-key tumme-thumbnail-mode-line-up-map "f" 'tumme-line-up) - ;; "i" for "interactive" - (define-key tumme-thumbnail-mode-line-up-map "i" 'tumme-line-up-interactive) - - ;; add tag map - (define-key tumme-thumbnail-mode-map "t" tumme-thumbnail-mode-tag-map) - - ;; map it to "t" so that the user can press it more quickly - (define-key tumme-thumbnail-mode-tag-map "t" 'tumme-tag-thumbnail) - ;; "r" for "remove" - (define-key tumme-thumbnail-mode-tag-map "r" 'tumme-tag-thumbnail-remove) - - (define-key tumme-thumbnail-mode-map "\C-m" - 'tumme-display-thumbnail-original-image) - (define-key tumme-thumbnail-mode-map [C-return] - 'tumme-thumbnail-display-external) - - (define-key tumme-thumbnail-mode-map "l" 'tumme-rotate-thumbnail-left) - (define-key tumme-thumbnail-mode-map "r" 'tumme-rotate-thumbnail-right) - - (define-key tumme-thumbnail-mode-map "L" 'tumme-rotate-original-left) - (define-key tumme-thumbnail-mode-map "R" 'tumme-rotate-original-right) - - (define-key tumme-thumbnail-mode-map "D" - 'tumme-thumbnail-set-image-description) - - (define-key tumme-thumbnail-mode-map "\C-d" 'tumme-delete-char) - (define-key tumme-thumbnail-mode-map " " - 'tumme-display-next-thumbnail-original) - (define-key tumme-thumbnail-mode-map - (kbd "DEL") 'tumme-display-previous-thumbnail-original) - (define-key tumme-thumbnail-mode-map "c" 'tumme-comment-thumbnail) - (define-key tumme-thumbnail-mode-map "q" 'tumme-kill-buffer-and-window) - - ;; Mouse - (define-key tumme-thumbnail-mode-map [mouse-2] 'tumme-mouse-display-image) - (define-key tumme-thumbnail-mode-map [mouse-1] 'tumme-mouse-select-thumbnail) - - ;; Seems I must first set C-down-mouse-1 to undefined, or else it - ;; will trigger the buffer menu. If I try to instead bind - ;; C-down-mouse-1 to `tumme-mouse-toggle-mark', I get a message - ;; about C-mouse-1 not being defined afterwards. Annoying, but I - ;; probably do not completely understand mouse events. - - (define-key tumme-thumbnail-mode-map [C-down-mouse-1] 'undefined) - (define-key tumme-thumbnail-mode-map [C-mouse-1] 'tumme-mouse-toggle-mark) - - ;; Menu - (define-key tumme-thumbnail-mode-map [menu-bar tumme] - (cons "Tumme" (make-sparse-keymap "Tumme"))) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-kill-buffer-and-window] - '("Quit" . tumme-kill-buffer-and-window)) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-delete-char] - '("Delete thumbnail from buffer" . tumme-delete-char)) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-tag-thumbnail-remove] - '("Remove tag from thumbnail" . tumme-tag-thumbnail-remove)) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-tag-thumbnail] - '("Tag thumbnail" . tumme-tag-thumbnail)) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-comment-thumbnail] - '("Comment thumbnail" . tumme-comment-thumbnail)) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-refresh-thumb] - '("Refresh thumb" . tumme-refresh-thumb)) - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-line-up-dynamic] - '("Dynamic line up" . tumme-line-up-dynamic)) - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-line-up] - '("Line up thumbnails" . tumme-line-up)) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-rotate-thumbnail-left] - '("Rotate thumbnail left" . tumme-rotate-thumbnail-left)) - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-rotate-thumbnail-right] - '("Rotate thumbnail right" . tumme-rotate-thumbnail-right)) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-rotate-original-left] - '("Rotate original left" . tumme-rotate-original-left)) - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-rotate-original-right] - '("Rotate original right" . tumme-rotate-original-right)) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-toggle-movement-tracking] - '("Toggle movement tracking on/off" . tumme-toggle-movement-tracking)) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-jump-original-dired-buffer] - '("Jump to dired buffer" . tumme-jump-original-dired-buffer)) - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-track-original-file] - '("Track original" . tumme-track-original-file)) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-flag-thumb-original-file] - '("Flag original for deletion" . tumme-flag-thumb-original-file)) - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-unmark-thumb-original-file] - '("Unmark original" . tumme-unmark-thumb-original-file)) - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-mark-thumb-original-file] - '("Mark original" . tumme-mark-thumb-original-file)) - - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-thumbnail-display-external] - '("Display in external viewer" . tumme-thumbnail-display-external)) - (define-key tumme-thumbnail-mode-map - [menu-bar tumme tumme-display-thumbnail-original-image] - '("Display image" . tumme-display-thumbnail-original-image))) - -(defvar tumme-display-image-mode-map (make-sparse-keymap) - "Keymap for `tumme-display-image-mode'.") - -(defun tumme-define-display-image-mode-keymap () - "Define keymap for `tumme-display-image-mode'." - - ;; Keys - (define-key tumme-display-image-mode-map "q" 'tumme-kill-buffer-and-window) - - (define-key tumme-display-image-mode-map "f" - 'tumme-display-current-image-full) - - (define-key tumme-display-image-mode-map "s" - 'tumme-display-current-image-sized) - - ;; Menu - (define-key tumme-display-image-mode-map [menu-bar tumme] - (cons "Tumme" (make-sparse-keymap "Tumme"))) - - (define-key tumme-display-image-mode-map - [menu-bar tumme tumme-kill-buffer-and-window] - '("Quit" . tumme-kill-buffer-and-window)) - - (define-key tumme-display-image-mode-map - [menu-bar tumme tumme-display-current-image-sized] - '("Display original, sized to fit" . tumme-display-current-image-sized)) - - (define-key tumme-display-image-mode-map - [menu-bar tumme tumme-display-current-image-full] - '("Display original, full size" . tumme-display-current-image-full)) - - ) - -(defun tumme-display-current-image-full () - "Display current image in full size." - (interactive) - (let ((file (tumme-original-file-name))) - (if file - (progn - (tumme-display-image file t) - (message "Full size image displayed")) - (error "No original file name at point")))) - -(defun tumme-display-current-image-sized () - "Display current image in sized to fit window dimensions." - (interactive) - (let ((file (tumme-original-file-name))) - (if file - (progn - (tumme-display-image file) - (message "Full size image displayed")) - (error "No original file name at point")))) - -(define-derived-mode tumme-thumbnail-mode - fundamental-mode "tumme-thumbnail" - "Browse and manipulate thumbnail images using dired. -Use `tumme-dired' and `tumme-setup-dired-keybindings' to get a -nice setup to start with." - (tumme-define-thumbnail-mode-keymap) - (message "tumme-thumbnail-mode enabled")) - -(define-derived-mode tumme-display-image-mode - fundamental-mode "tumme-image-display" - "Mode for displaying and manipulating original image. -Resized or in full-size." - (tumme-define-display-image-mode-keymap) - (message "tumme-display-image-mode enabled")) - -;;;###autoload -(defun tumme-setup-dired-keybindings () - "Setup easy-to-use keybindings for the commands to be used in dired mode. -Note that n, p and <down> and <up> will be hijacked and bound to -`tumme-dired-x-line'." - (interactive) - - ;; Hijack previous and next line movement. Let C-p and C-b be - ;; though... - - (define-key dired-mode-map "p" 'tumme-dired-previous-line) - (define-key dired-mode-map "n" 'tumme-dired-next-line) - (define-key dired-mode-map [up] 'tumme-dired-previous-line) - (define-key dired-mode-map [down] 'tumme-dired-next-line) - - (define-key dired-mode-map (kbd "C-S-n") 'tumme-next-line-and-display) - (define-key dired-mode-map (kbd "C-S-p") 'tumme-previous-line-and-display) - (define-key dired-mode-map (kbd "C-S-m") 'tumme-mark-and-display-next) - - (define-key dired-mode-map "\C-td" 'tumme-display-thumbs) - (define-key dired-mode-map "\C-tt" 'tumme-tag-files) - (define-key dired-mode-map "\C-tr" 'tumme-delete-tag) - (define-key dired-mode-map [tab] 'tumme-jump-thumbnail-buffer) - (define-key dired-mode-map "\C-ti" 'tumme-dired-display-image) - (define-key dired-mode-map "\C-tx" 'tumme-dired-display-external) - (define-key dired-mode-map "\C-ta" 'tumme-display-thumbs-append) - (define-key dired-mode-map "\C-t." 'tumme-display-thumb) - (define-key dired-mode-map "\C-tc" 'tumme-dired-comment-files) - (define-key dired-mode-map "\C-tf" 'tumme-mark-tagged-files) - - ;; Menu for dired - (define-key dired-mode-map [menu-bar tumme] - (cons "Tumme" (make-sparse-keymap "Tumme"))) - - (define-key dired-mode-map [menu-bar tumme tumme-copy-with-exif-file-name] - '("Copy with EXIF file name" . tumme-copy-with-exif-file-name)) - - (define-key dired-mode-map [menu-bar tumme tumme-dired-comment-files] - '("Comment files" . tumme-dired-comment-files)) - - (define-key dired-mode-map [menu-bar tumme tumme-mark-tagged-files] - '("Mark tagged files" . tumme-mark-tagged-files)) - - (define-key dired-mode-map [menu-bar tumme tumme-delete-tag] - '("Remove tag from files" . tumme-delete-tag)) - - (define-key dired-mode-map [menu-bar tumme tumme-tag-files] - '("Tag files" . tumme-tag-files)) - - (define-key dired-mode-map [menu-bar tumme tumme-jump-thumbnail-buffer] - '("Jump to thumbnail buffer" . tumme-jump-thumbnail-buffer)) - - (define-key dired-mode-map [menu-bar tumme tumme-toggle-movement-tracking] - '("Toggle movement tracking" . tumme-toggle-movement-tracking)) - - (define-key dired-mode-map - [menu-bar tumme tumme-toggle-append-browsing] - '("Toggle append browsing" . tumme-toggle-append-browsing)) - - (define-key dired-mode-map - [menu-bar tumme tumme-toggle-disp-props] - '("Toggle display properties" . tumme-toggle-dired-display-properties)) - - (define-key dired-mode-map - [menu-bar tumme tumme-dired-display-external] - '("Display in external viewer" . tumme-dired-display-external)) - (define-key dired-mode-map - [menu-bar tumme tumme-dired-display-image] - '("Display image" . tumme-dired-display-image)) - (define-key dired-mode-map - [menu-bar tumme tumme-display-thumb] - '("Display this thumbnail" . tumme-display-thumb)) - (define-key dired-mode-map - [menu-bar tumme tumme-display-thumbs-append] - '("Display thumbnails append" . tumme-display-thumbs-append)) - (define-key dired-mode-map - [menu-bar tumme tumme-display-thumbs] - '("Display thumbnails" . tumme-display-thumbs)) - - (define-key dired-mode-map - [menu-bar tumme tumme-create-thumbs] - '("Create thumbnails for marked files" . tumme-create-thumbs)) - - (define-key dired-mode-map - [menu-bar tumme tumme-mark-and-display-next] - '("Mark and display next" . tumme-mark-and-display-next)) - (define-key dired-mode-map - [menu-bar tumme tumme-previous-line-and-display] - '("Display thumb for previous file" . tumme-previous-line-and-display)) - (define-key dired-mode-map - [menu-bar tumme tumme-next-line-and-display] - '("Display thumb for next file" . tumme-next-line-and-display))) - -(defun tumme-create-thumbs (&optional arg) - "Create thumbnail images for all marked files in dired. -With prefix argument ARG, create thumbnails even if they already exist -\(i.e. use this to refresh your thumbnails)." - (interactive "P") - (let (curr-file thumb-name files count) - (setq files (dired-get-marked-files)) - (mapcar - (lambda (curr-file) - (setq thumb-name (tumme-thumb-name curr-file)) - ;; If the user overrides the exist check, we must clear the - ;; image cache so that if the user wants to display the - ;; thumnail, it is not fetched from cache. - (if arg - (clear-image-cache)) - (if (or (not (file-exists-p thumb-name)) - arg) - (if (not (= 0 (tumme-create-thumb curr-file - (tumme-thumb-name curr-file)))) - (error "Thumb could not be created")))) - files))) - -(defvar tumme-slideshow-timer nil - "Slideshow timer.") - -(defvar tumme-slideshow-count 0 - "Keeping track on number of images in slideshow.") - -(defvar tumme-slideshow-times 0 - "Number of pictures to display in slideshow.") - -(defun tumme-slideshow-step () - "Step to next file, if `tumme-slideshow-times' has not been reached." - (if (< tumme-slideshow-count tumme-slideshow-times) - (progn - (message "%s" (1+ tumme-slideshow-count)) - (setq tumme-slideshow-count (1+ tumme-slideshow-count)) - (tumme-next-line-and-display)) - (tumme-slideshow-stop))) - -(defun tumme-slideshow-start () - "Start slideshow. -Ask user for number of images to show and the delay in between." - (interactive) - (setq tumme-slideshow-count 0) - (setq tumme-slideshow-times (string-to-number (read-string "How many: "))) - (let ((repeat (string-to-number - (read-string - "Delay, in seconds. Decimals are accepted : " "1")))) - (setq tumme-slideshow-timer - (run-with-timer - 0 repeat - 'tumme-slideshow-step)))) - -(defun tumme-slideshow-stop () - "Cancel slideshow." - (interactive) - (cancel-timer tumme-slideshow-timer)) - -(defun tumme-delete-char () - "Remove current thumbnail from thumbnail buffer and line up." - (interactive) - (let ((inhibit-read-only t)) - (delete-char 1) - (if (looking-at " ") - (delete-char 1)))) - -;;;###autoload -(defun tumme-display-thumbs-append () - "Append thumbnails to `tumme-thumbnail-buffer'." - (interactive) - (tumme-display-thumbs nil t t)) - -;;;###autoload -(defun tumme-display-thumb () - "Shorthand for `tumme-display-thumbs' with prefix argument." - (interactive) - (tumme-display-thumbs t nil t)) - -(defun tumme-line-up () - "Line up thumbnails according to `tumme-thumbs-per-row'. -See also `tumme-line-up-dynamic'." - (interactive) - (let ((inhibit-read-only t)) - (goto-char (point-min)) - (while (and (not (tumme-image-at-point-p)) - (not (eobp))) - (delete-char 1)) - (while (not (eobp)) - (forward-char) - (while (and (not (tumme-image-at-point-p)) - (not (eobp))) - (delete-char 1))) - (goto-char (point-min)) - (let ((count 0)) - (while (not (eobp)) - (forward-char) - (if (= tumme-thumbs-per-row 1) - (insert "\n") - (insert " ") - (setq count (1+ count)) - (when (and (= count (- tumme-thumbs-per-row 1)) - (not (eobp))) - (forward-char) - (insert "\n") - (setq count 0))))) - (goto-char (point-min)))) - -(defun tumme-line-up-dynamic () - "Line up thumbnails images dynamically. -Calculate how many thumbnails fit." - (interactive) - (let* ((char-width (frame-char-width)) - (width (tumme-window-width-pixels (tumme-thumbnail-window))) - (tumme-thumbs-per-row - (/ width - (+ (* 2 tumme-thumb-relief) - (* 2 tumme-thumb-margin) - tumme-thumb-width char-width)))) - (tumme-line-up))) - -(defun tumme-line-up-interactive () - "Line up thumbnails interactively. -Ask user how many thumbnails should be displayed per row." - (interactive) - (let ((tumme-thumbs-per-row - (string-to-number (read-string "How many thumbs per row: ")))) - (if (not (> tumme-thumbs-per-row 0)) - (message "Number must be greater than 0") - (tumme-line-up)))) - -(defun tumme-thumbnail-display-external () - "Display original image for thumbnail at point using external viewer." - (interactive) - (let ((file (tumme-original-file-name))) - (if (not (tumme-image-at-point-p)) - (message "No thumbnail at point") - (if (not file) - (message "No original file name found") - (call-process shell-file-name nil nil nil shell-command-switch - (format "%s \"%s\"" tumme-external-viewer file)))))) - -;;;###autoload -(defun tumme-dired-display-external () - "Display file at point using an external viewer." - (interactive) - (let ((file (dired-get-filename))) - (call-process shell-file-name nil nil nil shell-command-switch - (format "%s \"%s\"" tumme-external-viewer file)))) - -(defun tumme-window-width-pixels (window) - "Calculate WINDOW width in pixels." - (* (window-width window) (frame-char-width))) - -(defun tumme-window-height-pixels (window) - "Calculate WINDOW height in pixels." - ;; Note: The mode-line consumes one line - (* (- (window-height window) 1) (frame-char-height))) - -(defun tumme-display-window () - "Return window where `tumme-display-image-buffer' is visible." - (get-window-with-predicate - (lambda (window) - (equal (buffer-name (window-buffer window)) tumme-display-image-buffer)) - nil t)) - -(defun tumme-thumbnail-window () - "Return window where `tumme-thumbnail-buffer' is visible." - (get-window-with-predicate - (lambda (window) - (equal (buffer-name (window-buffer window)) tumme-thumbnail-buffer)) - nil t)) - -(defun tumme-associated-dired-buffer-window () - "Return window where associated dired buffer is visible." - (let (buf) - (if (tumme-image-at-point-p) - (progn - (setq buf (tumme-associated-dired-buffer)) - (get-window-with-predicate - (lambda (window) - (equal (window-buffer window) buf)))) - (error "No thumbnail image at point")))) - -(defun tumme-display-window-width () - "Return width, in pixels, of tumme's image display window." - (- (tumme-window-width-pixels (tumme-display-window)) - tumme-display-window-width-correction)) - -(defun tumme-display-window-height () - "Return height, in pixels, of tumme's image display window." - (- (tumme-window-height-pixels (tumme-display-window)) - tumme-display-window-height-correction)) - -(defun tumme-display-image (file &optional original-size) - "Display image FILE in image buffer. -Use this when you want to display the image, semi sized, in a new -window. The image is sized to fit the display window (using a -temporary file, don't worry). Because of this, it will not be as -quick as opening it directly, but on most modern systems it -should feel snappy enough. - -If optional argument ORIGINAL-SIZE is non-nil, display image in its -original size." - (let ((new-file (expand-file-name tumme-temp-image-file)) - width height command ret) - (setq file (expand-file-name file)) - (if (not original-size) - (progn - (setq width (tumme-display-window-width)) - (setq height (tumme-display-window-height)) - (setq command - (format-spec - tumme-cmd-create-temp-image-options - (list - (cons ?p tumme-cmd-create-temp-image-program) - (cons ?w width) - (cons ?h height) - (cons ?f file) - (cons ?t new-file)))) - (setq ret (call-process shell-file-name nil nil nil - shell-command-switch command)) - (if (not (= 0 ret)) - (error "Could not resize image"))) - (copy-file file new-file t)) - (with-current-buffer (tumme-create-display-image-buffer) - (let ((inhibit-read-only t)) - (erase-buffer) - (clear-image-cache) - (tumme-insert-image tumme-temp-image-file 'jpeg 0 0) - (goto-char (point-min)) - (tumme-update-property 'original-file-name file))))) - -(defun tumme-display-thumbnail-original-image (&optional arg) - "Display current thumbnail's original image in display buffer. -See documentation for `tumme-display-image' for more information. -With prefix argument ARG, display image in its original size." - (interactive "P") - (let ((file (tumme-original-file-name))) - (if (not (string-equal major-mode "tumme-thumbnail-mode")) - (message "Not in tumme-thumbnail-mode") - (if (not (tumme-image-at-point-p)) - (message "No thumbnail at point") - (if (not file) - (message "No original file name found") - (tumme-create-display-image-buffer) - (display-buffer tumme-display-image-buffer) - (tumme-display-image file arg)))))) - - -;;;###autoload -(defun tumme-dired-display-image (&optional arg) - "Display current image file. -See documentation for `tumme-display-image' for more information. -With prefix argument ARG, display image in its original size." - (interactive "P") - (tumme-create-display-image-buffer) - (display-buffer tumme-display-image-buffer) - (tumme-display-image (dired-get-filename) arg)) - -(defun tumme-image-at-point-p () - "Return true if there is a tumme thumbnail at point." - (get-text-property (point) 'tumme-thumbnail)) - -(defun tumme-rotate-thumbnail (degrees) - "Rotate thumbnail DEGREES degrees." - (if (not (tumme-image-at-point-p)) - (message "No thumbnail at point") - (let ((file (tumme-thumb-name (tumme-original-file-name))) - command) - (setq command (format-spec - tumme-cmd-rotate-thumbnail-options - (list - (cons ?p tumme-cmd-rotate-thumbnail-program) - (cons ?d degrees) - (cons ?t (expand-file-name file))))) - (call-process shell-file-name nil nil nil shell-command-switch command) - ;; Clear the cache to refresh image. I wish I could just refresh - ;; the current file but I do not know how to do that. Yet... - (clear-image-cache)))) - -(defun tumme-rotate-thumbnail-left () - "Rotate thumbnail left (counter clockwise) 90 degrees. -The result of the rotation is displayed in the image display area -and a confirmation is needed before the original image files is -overwritten. This confirmation can be turned off using -`tumme-rotate-original-ask-before-overwrite'." - (interactive) - (tumme-rotate-thumbnail "270")) - -(defun tumme-rotate-thumbnail-right () - "Rotate thumbnail counter right (clockwise) 90 degrees. -The result of the rotation is displayed in the image display area -and a confirmation is needed before the original image files is -overwritten. This confirmation can be turned off using -`tumme-rotate-original-ask-before-overwrite'." - (interactive) - (tumme-rotate-thumbnail "90")) - -(defun tumme-refresh-thumb () - "Force creation of new image for current thumbnail." - (interactive) - (let ((file (tumme-original-file-name))) - (clear-image-cache) - (tumme-create-thumb file (tumme-thumb-name file)))) - -(defun tumme-rotate-original (degrees) - "Rotate original image DEGREES degrees." - (if (not (tumme-image-at-point-p)) - (message "No image at point") - (let ((file (tumme-original-file-name)) - command temp-file) - (if (not (string-match "\.[jJ][pP[eE]?[gG]$" file)) - (error "Only JPEG images can be rotated!")) - (setq command (format-spec - tumme-cmd-rotate-original-options - (list - (cons ?p tumme-cmd-rotate-original-program) - (cons ?d degrees) - (cons ?o (expand-file-name file)) - (cons ?t tumme-temp-rotate-image-file)))) - (if (not (= 0 (call-process shell-file-name nil nil nil - shell-command-switch command))) - (error "Could not rotate image") - (tumme-display-image tumme-temp-rotate-image-file) - (if (or (and tumme-rotate-original-ask-before-overwrite - (y-or-n-p - "Rotate to temp file OK. Overwrite original image? ")) - (not tumme-rotate-original-ask-before-overwrite)) - (progn - (copy-file tumme-temp-rotate-image-file file t) - (tumme-refresh-thumb)) - (tumme-display-image file)))))) - -(defun tumme-rotate-original-left () - "Rotate original image left (counter clockwise) 90 degrees." - (interactive) - (tumme-rotate-original "270")) - -(defun tumme-rotate-original-right () - "Rotate original image right (clockwise) 90 degrees." - (interactive) - (tumme-rotate-original "90")) - -(defun tumme-get-exif-file-name (file) - "Use the image's EXIF information to return a unique file name. -The file name should be unique as long as you do not take more than -one picture per second. The original file name is suffixed at the end -for traceability. The format of the returned file name is -YYYY_MM_DD_HH_MM_DD_ORIG_FILE_NAME.jpg. Used from -`tumme-copy-with-exif-file-name'." - (let (data no-exif-data-found) - (if (not (string-match "\.[Jj][Pp][Ee]?[Gg]$" (expand-file-name file))) - (progn - (setq no-exif-data-found t) - (setq data - (format-time-string - "%Y:%m:%d %H:%M:%S" - (nth 5 (file-attributes (expand-file-name file)))))) - (setq data (tumme-get-exif-data (expand-file-name file) - "DateTimeOriginal"))) - (while (string-match "[ :]" data) - (setq data (replace-match "_" nil nil data))) - (format "%s%s%s" data - (if no-exif-data-found - "_noexif_" - "_") - (file-name-nondirectory file)))) - -(defun tumme-thumbnail-set-image-description () - "Set the ImageDescription EXIF tag for the original image. -If the image already has a value for this tag, it is used as the -default value at the prompt." - (interactive) - (if (not (tumme-image-at-point-p)) - (message "No thumbnail at point") - (let* ((file (tumme-original-file-name)) - (old-value (tumme-get-exif-data file "ImageDescription"))) - (if (eq 0 - (tumme-set-exif-data file "ImageDescription" - (read-string "Value of ImageDescription: " - old-value))) - (message "Successfully wrote ImageDescription tag.") - (error "Could not write ImageDescription tag"))))) - -(defun tumme-set-exif-data (file tag-name tag-value) - "In FILE, set EXIF tag TAG-NAME to value TAG-VALUE." - (let (command) - (setq command (format-spec - tumme-cmd-write-exif-data-options - (list - (cons ?p tumme-cmd-write-exif-data-program) - (cons ?f (expand-file-name file)) - (cons ?t tag-name) - (cons ?v tag-value)))) - (call-process shell-file-name nil nil nil shell-command-switch command))) - -(defun tumme-get-exif-data (file tag-name) - "From FILE, return EXIF tag TAG-NAME." - (let ((buf (get-buffer-create "*tumme-get-exif-data*")) - command tag-value) - (setq command (format-spec - tumme-cmd-read-exif-data-options - (list - (cons ?p tumme-cmd-read-exif-data-program) - (cons ?f file) - (cons ?t tag-name)))) - (with-current-buffer buf - (delete-region (point-min) (point-max)) - (if (not (eq (call-process shell-file-name nil t nil - shell-command-switch command) 0)) - (error "Could not get EXIF tag") - (goto-char (point-min)) - ;; Clean buffer from newlines and carriage returns before - ;; getting final info - (while (search-forward-regexp "[\n\r]" nil t) - (replace-match "" nil t)) - (setq tag-value (buffer-substring (point-min) (point-max))))) - tag-value)) - -(defun tumme-copy-with-exif-file-name () - "Copy file with unique name to main image directory. -Copy current or all marked files in dired to a new file in your -main image directory, using a file name generated by -`tumme-get-exif-file-name'. A typical usage for this if when -copying images from a digital camera into the image directory. - - Typically, you would open up the folder with the incoming -digital images, mark the files to be copied, and execute this -function. The result is a couple of new files in -`tumme-main-image-directory' called -2005_05_08_12_52_00_dscn0319.jpg, -2005_05_08_14_27_45_dscn0320.jpg etc." - (interactive) - (let (new-name - (files (dired-get-marked-files))) - (mapcar - (lambda (curr-file) - (setq new-name - (format "%s/%s" - (file-name-as-directory - (expand-file-name tumme-main-image-directory)) - (tumme-get-exif-file-name curr-file))) - (message "Copying %s to %s" curr-file new-name) - (copy-file curr-file new-name)) - files))) - -(defun tumme-display-next-thumbnail-original () - "In thubnail buffer, move to next thumbnail and display the image." - (interactive) - (tumme-forward-image) - (tumme-display-thumbnail-original-image)) - -(defun tumme-display-previous-thumbnail-original () - "Move to previous thumbnail and display image." - (interactive) - (tumme-backward-image) - (tumme-display-thumbnail-original-image)) - -(defun tumme-write-comments (file-comments) - "Write file comments to database. -Write file comments to one or more files. FILE-COMMENTS is an alist on -the following form: - ((FILE . COMMENT) ... )" - (let (end comment-beg-pos comment-end-pos file comment) - (with-temp-file tumme-db-file - (insert-file-contents tumme-db-file) - (dolist (elt file-comments) - (setq file (car elt) - comment (cdr elt)) - (goto-char (point-min)) - (if (search-forward-regexp (format "^%s.*$" file) nil t) - (progn - (setq end (point)) - (beginning-of-line) - ;; Delete old comment, if any - (when (search-forward ";comment:" end t) - (setq comment-beg-pos (match-beginning 0)) - ;; Any tags after the comment? - (if (search-forward ";" end t) - (setq comment-end-pos (- (point) 1)) - (setq comment-end-pos end)) - ;; Delete comment tag and comment - (delete-region comment-beg-pos comment-end-pos)) - ;; Insert new comment - (beginning-of-line) - (unless (search-forward ";" end t) - (end-of-line) - (insert ";")) - (insert (format "comment:%s;" comment))) - ;; File does not exist in database - add it. - (goto-char (point-max)) - (insert (format "\n%s;comment:%s" file comment))))))) - -(defun tumme-update-property (prop value) - "Update text property PROP with value VALUE at point." - (let ((inhibit-read-only t)) - (put-text-property - (point) (1+ (point)) - prop - value))) - -;;;###autoload -(defun tumme-dired-comment-files () - "Add comment to current or marked files in dired." - (interactive) - (let ((comment (tumme-read-comment))) - (tumme-write-comments - (mapcar - (lambda (curr-file) - (cons curr-file comment)) - (dired-get-marked-files))))) - -(defun tumme-comment-thumbnail () - "Add comment to current thumbnail in thumbnail buffer." - (interactive) - (let* ((file (tumme-original-file-name)) - (comment (tumme-read-comment file))) - (tumme-write-comments (list (cons file comment))) - (tumme-update-property 'comment comment)) - (tumme-display-thumb-properties)) - -(defun tumme-read-comment (&optional file) - "Read comment for an image. -Read comment for an image, optionally using old comment from FILE -as initial value." - (let ((comment - (read-string - "Comment: " - (if file (tumme-get-comment file))))) - comment)) - -(defun tumme-get-comment (file) - "Get comment for file FILE." - (save-excursion - (let (end buf comment-beg-pos comment-end-pos comment) - (setq buf (find-file tumme-db-file)) - (goto-char (point-min)) - (when (search-forward-regexp - (format "^%s" file) nil t) - (end-of-line) - (setq end (point)) - (beginning-of-line) - (cond ((search-forward ";comment:" end t) - (setq comment-beg-pos (point)) - (if (search-forward ";" end t) - (setq comment-end-pos (- (point) 1)) - (setq comment-end-pos end)) - (setq comment (buffer-substring - comment-beg-pos comment-end-pos))))) - (kill-buffer buf) - comment))) - -;;;###autoload -(defun tumme-mark-tagged-files () - "Use regexp to mark files with matching tag. -A `tag' is a keyword, a piece of meta data, associated with an -image file and stored in tumme's database file. This command -lets you input a regexp and this will be matched against all tags -on all image files in the database file. The files that have a -matching tags will be marked in the dired buffer." - (interactive) - (let ((tag (read-string "Mark tagged files (regexp): ")) - (hits 0) - files buf) - (save-excursion - (setq buf (find-file tumme-db-file)) - (goto-char (point-min)) - ;; Collect matches - (while (search-forward-regexp - (concat "\\(^[^;\n]+\\);.*" tag ".*$") nil t) - (setq files (append (list (match-string 1)) files))) - (kill-buffer buf) - ;; Mark files - (mapcar - ;; I tried using `dired-mark-files-regexp' but it was - ;; waaaay to slow. - (lambda (curr-file) - ;; Don't bother about hits found in other directories than - ;; the current one. - (when (string= (file-name-as-directory - (expand-file-name default-directory)) - (file-name-as-directory - (file-name-directory curr-file))) - (setq curr-file (file-name-nondirectory curr-file)) - (goto-char (point-min)) - (when (search-forward-regexp (format "\\s %s$" curr-file) nil t) - (setq hits (+ hits 1)) - (dired-mark 1)))) - files)) - (message "%d files with matching tag marked." hits))) - -(defun tumme-mouse-display-image (event) - "Use mouse EVENT, call `tumme-display-image' to display image. -Track this in associated dired buffer if `tumme-track-movement' is -non-nil." - (interactive "e") - (let (file) - (mouse-set-point event) - (goto-char (posn-point (event-end event))) - (setq file (tumme-original-file-name)) - (if tumme-track-movement - (tumme-track-original-file)) - (tumme-create-display-image-buffer) - (display-buffer tumme-display-image-buffer) - (tumme-display-image file))) - -(defun tumme-mouse-select-thumbnail (event) - "Use mouse EVENT to select thumbnail image. -Track this in associated dired buffer if `tumme-track-movement' is -non-nil." - (interactive "e") - (let (file) - (mouse-set-point event) - (goto-char (posn-point (event-end event))) - (if tumme-track-movement - (tumme-track-original-file))) - (tumme-display-thumb-properties)) - -(defun tumme-mouse-toggle-mark (event) - "Use mouse EVENT to toggle dired mark for thumbnail. -Track this in associated dired buffer if `tumme-track-movement' is -non-nil." - (interactive "e") - (let (file) - (mouse-set-point event) - (goto-char (posn-point (event-end event))) - (if tumme-track-movement - (tumme-track-original-file))) - (tumme-toggle-mark-thumb-original-file)) - -(defun tumme-dired-display-properties () - "Display properties for dired file in the echo area." - (interactive) - (let* ((file (dired-get-filename)) - (file-name (file-name-nondirectory file)) - (dired-buf (buffer-name (current-buffer))) - (props (mapconcat - 'princ - (tumme-list-tags file) - ", ")) - (comment (tumme-get-comment file))) - (if file-name - (message - (tumme-format-properties-string - dired-buf - file-name - props - comment))))) - -(defvar tumme-tag-file-list nil - "List to store tag-file structure.") - -(defvar tumme-file-tag-list nil - "List to store file-tag structure.") - -(defvar tumme-file-comment-list nil - "List to store file comments.") - -(defun tumme-add-to-tag-file-list (tag file) - "Add relation between TAG and FILE." - (let (curr) - (if tumme-tag-file-list - (if (setq curr (assoc tag tumme-tag-file-list)) - (if (not (member file curr)) - (setcdr curr (cons file (cdr curr)))) - (setcdr tumme-tag-file-list - (cons (list tag file) (cdr tumme-tag-file-list)))) - (setq tumme-tag-file-list (list (list tag file)))))) - -(defun tumme-add-to-tag-file-lists (tag file) - "Helper function used from `tumme-create-gallery-lists'. - -Add TAG to FILE in one list and FILE to TAG in the other. - -Lisp structures look like the following: - -tumme-file-tag-list: - - ((\"filename1\" \"tag1\" \"tag2\" \"tag3\" ...) - (\"filename2\" \"tag1\" \"tag2\" \"tag3\" ...) - ...) - -tumme-tag-file-list: - - ((\"tag1\" \"filename1\" \"filename2\" \"filename3\" ...) - (\"tag2\" \"filename1\" \"filename2\" \"filename3\" ...) - ...)" - ;; Add tag to file list - (let (curr) - (if tumme-file-tag-list - (if (setq curr (assoc file tumme-file-tag-list)) - (setcdr curr (cons tag (cdr curr))) - (setcdr tumme-file-tag-list - (cons (list file tag) (cdr tumme-file-tag-list)))) - (setq tumme-file-tag-list (list (list file tag)))) - ;; Add file to tag list - (if tumme-tag-file-list - (if (setq curr (assoc tag tumme-tag-file-list)) - (if (not (member file curr)) - (setcdr curr (cons file (cdr curr)))) - (setcdr tumme-tag-file-list - (cons (list tag file) (cdr tumme-tag-file-list)))) - (setq tumme-tag-file-list (list (list tag file)))))) - -(defun tumme-add-to-file-comment-list (file comment) - "Helper function used from `tumme-create-gallery-lists'. - -For FILE, add COMMENT to list. - -Lisp structure looks like the following: - -tumme-file-comment-list: - - ((\"filename1\" . \"comment1\") - (\"filename2\" . \"comment2\") - ...)" - (if tumme-file-comment-list - (if (not (assoc file tumme-file-comment-list)) - (setcdr tumme-file-comment-list - (cons (cons file comment) - (cdr tumme-file-comment-list)))) - (setq tumme-file-comment-list (list (cons file comment))))) - -(defun tumme-create-gallery-lists () - "Create temporary lists used by `tumme-gallery-generate'." - (let ((buf (find-file tumme-db-file)) - end beg file row-tags) - (setq tumme-tag-file-list nil) - (setq tumme-file-tag-list nil) - (setq tumme-file-comment-list nil) - (goto-char (point-min)) - (while (search-forward-regexp "^." nil t) - (end-of-line) - (setq end (point)) - (beginning-of-line) - (setq beg (point)) - (if (not (search-forward ";" end nil)) - (error "Something is really wrong, check format of database")) - (setq row-tags (split-string - (buffer-substring beg end) ";")) - (setq file (car row-tags)) - (mapc - (lambda (x) - (if (not (string-match "^comment:\\(.*\\)" x)) - (tumme-add-to-tag-file-lists x file) - (tumme-add-to-file-comment-list file (match-string 1 x)))) - (cdr row-tags))) - (kill-buffer buf)) - ;; Sort tag-file list - (setq tumme-tag-file-list - (sort tumme-tag-file-list - (lambda (x y) - (string< (car x) (car y)))))) - -(defun tumme-hidden-p (file) - "Return t if image FILE has a \"hidden\" tag." - (let (hidden) - (mapc - (lambda (tag) - (if (member tag tumme-gallery-hidden-tags) - (setq hidden t))) - (cdr (assoc file tumme-file-tag-list))) - hidden)) - -(defun tumme-gallery-generate () - "Generate gallery pages. -First we create a couple of Lisp structures from the database to make -it easier to generate, then HTML-files are created in -`tumme-gallery-dir'" - (interactive) - (if (eq 'per-directory tumme-thumbnail-storage) - (error "Currently, gallery generation is not supported \ -when using per-directory thumbnail file storage")) - (tumme-create-gallery-lists) - (let ((tags tumme-tag-file-list) - count curr tag index-buf tag-buf - comment file-tags tag-link tag-link-list) - ;; Make sure gallery root exist - (if (file-exists-p tumme-gallery-dir) - (if (not (file-directory-p tumme-gallery-dir)) - (error "Variable tumme-gallery-dir is not a directory")) - (make-directory tumme-gallery-dir)) - ;; Open index file - (setq index-buf (find-file - (format "%s/index.html" tumme-gallery-dir))) - (erase-buffer) - (insert "<html>\n") - (insert " <body>\n") - (insert " <h2>Tumme Gallery</h2>\n") - (insert (format "<p>\n Gallery generated %s\n <p>\n" - (current-time-string))) - (insert " <h3>Tag index</h3>\n") - (setq count 1) - ;; Pre-generate list of all tag links - (mapc - (lambda (curr) - (setq tag (car curr)) - (when (not (member tag tumme-gallery-hidden-tags)) - (setq tag-link (format "<a href=\"%d.html\">%s</a>" count tag)) - (if tag-link-list - (setq tag-link-list - (append tag-link-list (list (cons tag tag-link)))) - (setq tag-link-list (list (cons tag tag-link)))) - (setq count (1+ count)))) - tags) - (setq count 1) - ;; Main loop where we generated thumbnail pages per tag - (mapc - (lambda (curr) - (setq tag (car curr)) - ;; Don't display hidden tags - (when (not (member tag tumme-gallery-hidden-tags)) - ;; Insert link to tag page in index - (insert (format " %s<br>\n" (cdr (assoc tag tag-link-list)))) - ;; Open per-tag file - (setq tag-buf (find-file - (format "%s/%s.html" tumme-gallery-dir count))) - (erase-buffer) - (insert "<html>\n") - (insert " <body>\n") - (insert " <p><a href=\"index.html\">Index</a></p>\n") - (insert (format " <h2>Images with tag "%s"</h2>" tag)) - ;; Main loop for files per tag page - (mapc - (lambda (file) - (when (not (tumme-hidden-p file)) - ;; Insert thumbnail with link to full image - (insert - (format "<a href=\"%s/%s\"><img src=\"%s/%s\"%s></a>\n" - tumme-gallery-image-root-url - (file-name-nondirectory file) - tumme-gallery-thumb-image-root-url - (file-name-nondirectory (tumme-thumb-name file)) file)) - ;; Insert comment, if any - (if (setq comment (cdr (assoc file tumme-file-comment-list))) - (insert (format "<br>\n%s<br>\n" comment)) - (insert "<br>\n")) - ;; Insert links to other tags, if any - (when (> (length - (setq file-tags (assoc file tumme-file-tag-list))) 2) - (insert "[ ") - (mapc - (lambda (extra-tag) - ;; Only insert if not file name or the main tag - (if (and (not (equal extra-tag tag)) - (not (equal extra-tag file))) - (insert - (format "%s " (cdr (assoc extra-tag tag-link-list)))))) - file-tags) - (insert "]<br>\n")))) - (cdr curr)) - (insert " <p><a href=\"index.html\">Index</a></p>\n") - (insert " </body>\n") - (insert "</html>\n") - (save-buffer) - (kill-buffer tag-buf) - (setq count (1+ count)))) - tags) - (insert " </body>\n") - (insert "</html>") - (save-buffer) - (kill-buffer index-buf))) - -(defun tumme-kill-buffer-and-window () - "Kill the current buffer and, if possible, also the window." - (interactive) - (let ((buffer (current-buffer))) - (condition-case nil - (delete-window (selected-window)) - (error nil)) - (kill-buffer buffer))) - -(defvar tumme-widget-list nil - "List to keep track of meta data in edit buffer.") - -;;;###autoload -(defun tumme-dired-edit-comment-and-tags () - "Edit comment and tags of current or marked image files. -Edit comment and tags for all marked image files in an -easy-to-use form." - (interactive) - (setq tumme-widget-list nil) - ;; Setup buffer. - (let ((files (dired-get-marked-files))) - (switch-to-buffer "*Tumme Edit Meta Data*") - (kill-all-local-variables) - (make-local-variable 'widget-example-repeat) - (let ((inhibit-read-only t)) - (erase-buffer)) - (remove-overlays) - ;; Some help for the user. - (widget-insert -"\nEdit comments and tags for each image. Separate multiple tags -with a comma. Move forward between fields using TAB or RET. -Move to the previous field using backtab (S-TAB). Save by -activating the Save button at the bottom of the form or cancel -the operation by activating the Cancel button.\n\n") - ;; Here comes all images and a comment and tag field for each - ;; image. - (let (thumb-file img comment-widget tag-widget) - - (dolist (file files) - - (setq thumb-file (tumme-thumb-name file) - img (create-image thumb-file)) - - (insert-image img) - (widget-insert "\n\nComment: ") - (setq comment-widget - (widget-create 'editable-field - :size 60 - :format "%v " - :value (or (tumme-get-comment file) ""))) - (widget-insert "\nTags: ") - (setq tag-widget - (widget-create 'editable-field - :size 60 - :format "%v " - :value (or (mapconcat - (lambda (tag) - tag) - (tumme-list-tags file) - ",") ""))) - ;; Save information in all widgets so that we can use it when - ;; the user saves the form. - (setq tumme-widget-list - (append tumme-widget-list - (list (list file comment-widget tag-widget)))) - (widget-insert "\n\n"))) - - ;; Footer with Save and Cancel button. - (widget-insert "\n") - (widget-create 'push-button - :notify - (lambda (&rest ignore) - (tumme-save-information-from-widgets) - (bury-buffer) - (message "Done.")) - "Save") - (widget-insert " ") - (widget-create 'push-button - :notify - (lambda (&rest ignore) - (bury-buffer) - (message "Operation canceled.")) - "Cancel") - (widget-insert "\n") - (use-local-map widget-keymap) - (widget-setup) - ;; Jump to the first widget. - (widget-forward 1))) - -(defun tumme-save-information-from-widgets () - "Save information found in `tumme-widget-list'. -Use the information in `tumme-widget-list' to save comments and -tags to their respective image file. Internal function used by -`tumme-dired-edit-comment-and-tags'." - (let (file comment tag-string tag-list lst) - (tumme-write-comments - (mapcar - (lambda (widget) - (setq file (car widget) - comment (widget-value (cadr widget))) - (cons file comment)) - tumme-widget-list)) - (tumme-write-tags - (dolist (widget tumme-widget-list lst) - (setq file (car widget) - tag-string (widget-value (car (cddr widget))) - tag-list (split-string tag-string ",")) - (dolist (tag tag-list) - (push (cons file tag) lst)))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;;;;;;; TEST-SECTION ;;;;;;;;;;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; (defvar tumme-dir-max-size 12300000) - -;; (defun tumme-test-clean-old-files () -;; "Clean `tumme-dir' from old thumbnail files. -;; \"Oldness\" measured using last access time. If the total size of all -;; thumbnail files in `tumme-dir' is larger than 'tumme-dir-max-size', -;; old files are deleted until the max size is reached." -;; (let* ((files -;; (sort -;; (mapcar -;; (lambda (f) -;; (let ((fattribs (file-attributes f))) -;; ;; Get last access time and file size -;; `(,(nth 4 fattribs) ,(nth 7 fattribs) ,f))) -;; (directory-files (tumme-dir) t ".+\.thumb\..+$")) -;; ;; Sort function. Compare time between two files. -;; '(lambda (l1 l2) -;; (time-less-p (car l1) (car l2))))) -;; (dirsize (apply '+ (mapcar (lambda (x) (cadr x)) files)))) -;; (while (> dirsize tumme-dir-max-size) -;; (y-or-n-p -;; (format "Size of thumbnail directory: %d, delete old file %s? " -;; dirsize (cadr (cdar files)))) -;; (delete-file (cadr (cdar files))) -;; (setq dirsize (- dirsize (car (cdar files)))) -;; (setq files (cdr files))))) - -;;;;;;;;;;;;;;;;;;;;;;, - -;; (defun dired-speedbar-buttons (dired-buffer) -;; (when (and (boundp 'tumme-use-speedbar) -;; tumme-use-speedbar) -;; (let ((filename (with-current-buffer dired-buffer -;; (dired-get-filename)))) -;; (when (and (not (string-equal filename (buffer-string))) -;; (string-match (image-file-name-regexp) filename)) -;; (erase-buffer) -;; (insert (propertize -;; filename -;; 'display -;; (tumme-get-thumbnail-image filename))))))) - -;; (setq tumme-use-speedbar t) - -(provide 'tumme) - -;; arch-tag: 9d11411d-331f-4380-8b44-8adfe3a0343e -;;; tumme.el ends here
--- a/lisp/url/ChangeLog Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/url/ChangeLog Tue Apr 24 21:56:25 2007 +0000 @@ -1,4 +1,15 @@ -2007-04-01 Diane Murray <disumu@x3y2z1.net> +2007-04-15 Chong Yidong <cyd@stupidchicken.com> + + * url-parse.el (url-generic-parse-url): Revert 2006-10-09 changes. + +2007-04-13 Chong Yidong <cyd@stupidchicken.com> + + * url-http.el (url-http-parse-headers): Stop after a set number of + redirections. Suggested by Diane Murray. + + * url-vars.el (url-max-redirections): New var. + +2007-04-01 Diane Murray <disumu@x3y2z1.net> (tiny change) * url-http.el (url-http-handle-cookies): Reverse list returned by `mail-fetch-field', so that cookies are set in the correct order. @@ -65,7 +76,7 @@ (url-http-parse-response): Set it. (url-http-parse-headers): Use it to determine keep-alive behavior. -2006-11-23 Diane Murray <disumu@x3y2z1.net> +2006-11-23 Diane Murray <disumu@x3y2z1.net> (tiny change) * url-http.el (url-http-content-length-after-change-function): Use `url-lazy-message'. @@ -174,7 +185,7 @@ 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> +2006-08-31 Diane Murray <disumu@x3y2z1.net> (tiny change) * url-parse.el (url-recreate-url-attributes): New function, code simply moved from `url-recreate-url'. @@ -184,7 +195,7 @@ * url-http.el (url-http-create-request): Use `url-recreate-url-attributes' when setting real-fname. -2006-08-29 Diane Murray <disumu@x3y2z1.net> +2006-08-29 Diane Murray <disumu@x3y2z1.net> (tiny change) * url-cookie.el (url-cookie-write-file): Really don't use versioned backups.
--- a/lisp/url/url-http.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/url/url-http.el Tue Apr 24 21:56:25 2007 +0000 @@ -556,21 +556,43 @@ (let ((url-request-method url-http-method) (url-request-data url-http-data) (url-request-extra-headers url-http-extra-headers)) - ;; Remember that the request was redirected. - (setf (car url-callback-arguments) - (nconc (list :redirect redirect-uri) - (car url-callback-arguments))) - ;; Put in the current buffer a forwarding pointer to the new - ;; destination buffer. - ;; FIXME: This is a hack to fix url-retrieve-synchronously - ;; without changing the API. Instead url-retrieve should - ;; either simply not return the "destination" buffer, or it - ;; should take an optional `dest-buf' argument. - (set (make-local-variable 'url-redirect-buffer) - (url-retrieve-internal - redirect-uri url-callback-function - url-callback-arguments)) - (url-mark-buffer-as-dead (current-buffer)))))) + ;; Check existing number of redirects + (if (or (< url-max-redirections 0) + (and (> url-max-redirections 0) + (let ((events (car url-callback-arguments)) + (old-redirects 0)) + (while events + (if (eq (car events) :redirect) + (setq old-redirects (1+ old-redirects))) + (and (setq events (cdr events)) + (setq events (cdr events)))) + (< old-redirects url-max-redirections)))) + ;; url-max-redirections hasn't been reached, so go + ;; ahead and redirect. + (progn + ;; Remember that the request was redirected. + (setf (car url-callback-arguments) + (nconc (list :redirect redirect-uri) + (car url-callback-arguments))) + ;; Put in the current buffer a forwarding pointer to the new + ;; destination buffer. + ;; FIXME: This is a hack to fix url-retrieve-synchronously + ;; without changing the API. Instead url-retrieve should + ;; either simply not return the "destination" buffer, or it + ;; should take an optional `dest-buf' argument. + (set (make-local-variable 'url-redirect-buffer) + (url-retrieve-internal + redirect-uri url-callback-function + url-callback-arguments)) + (url-mark-buffer-as-dead (current-buffer))) + ;; We hit url-max-redirections, so issue an error and + ;; stop redirecting. + (url-http-debug "Maximum redirections reached") + (setf (car url-callback-arguments) + (nconc (list :error (list 'error 'http-redirect-limit + redirect-uri)) + (car url-callback-arguments))) + (setq success t)))))) (4 ; Client error ;; 400 Bad Request ;; 401 Unauthorized
--- a/lisp/url/url-parse.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/url/url-parse.el Tue Apr 24 21:56:25 2007 +0000 @@ -108,7 +108,7 @@ (defun url-recreate-url-attributes (urlobj) "Recreate the attributes of an URL string from the parsed URLOBJ." (when (url-attributes urlobj) - (concat "?" + (concat ";" (mapconcat (lambda (x) (if (cdr x) (concat (car x) "=" (cdr x)) @@ -168,7 +168,7 @@ (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) @@ -189,25 +189,29 @@ (setq port (url-scheme-get-property prot 'default-port))) ;; 3.3. Path + ;; Gross hack to preserve ';' in data URLs (setq save-pos (point)) - (skip-chars-forward "^#?") - (setq file (buffer-substring save-pos (point))) ;; 3.4. Query - (when (looking-at "\\?") - (forward-char 1) - (setq save-pos (point)) + (if (string= "data" prot) + (goto-char (point-max)) + ;; Now check for references (skip-chars-forward "^#") - ;; 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))) + (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)))) - ;; 3.5. Fragment - (when (looking-at "#") - (forward-char 1) - (setq refs (buffer-substring (point) (point-max)))) - + (setq file (buffer-substring save-pos (point))) (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/url/url-vars.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/url/url-vars.el Tue Apr 24 21:56:25 2007 +0000 @@ -320,6 +320,12 @@ "\\`\\([-a-zA-Z0-9+.]+:\\)" "A regular expression that will match an absolute URL.") +(defcustom url-max-redirections 30 + "*The maximum number of redirection requests to honor in a HTTP connection. +A negative number means to honor an unlimited number of redirection requests." + :type 'integer + :group 'url) + (defcustom url-confirmation-func 'y-or-n-p "*What function to use for asking yes or no functions. Possible values are `yes-or-no-p' or `y-or-n-p', or any function that
--- a/lisp/wid-edit.el Tue Apr 24 11:35:23 2007 +0000 +++ b/lisp/wid-edit.el Tue Apr 24 21:56:25 2007 +0000 @@ -84,7 +84,7 @@ :group 'hypermedia) (defgroup widget-documentation nil - "Options controling the display of documentation strings." + "Options controlling the display of documentation strings." :group 'widgets) (defgroup widget-faces nil
--- a/lispref/ChangeLog Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/ChangeLog Tue Apr 24 21:56:25 2007 +0000 @@ -1,3 +1,61 @@ +2007-04-22 Richard Stallman <rms@gnu.org> + + * keymaps.texi (Extended Menu Items): Move the info about + format with cached keyboard binding. + +2007-04-21 Richard Stallman <rms@gnu.org> + + * text.texi (Special Properties): Clarify previous change. + + * files.texi (File Name Expansion): Clarify previous change. + + * display.texi (Attribute Functions): Fix example for + face-attribute-relative-p. + +2007-04-19 Kenichi Handa <handa@m17n.org> + + * text.texi (Special Properties): Document composition property. + +2007-04-19 Glenn Morris <rgm@gnu.org> + + * files.texi (File Name Expansion): Mention "superroot". + +2007-04-15 Chong Yidong <cyd@stupidchicken.com> + + * frames.texi (Multiple Displays): Add note about "multi-monitor" + setups. + (Display Feature Testing): Note that display refers to all + physical monitors for multi-monitor setups. + +2007-04-14 Richard Stallman <rms@gnu.org> + + * lists.texi (Sets And Lists): Clarify `delete' examples. + Remove spurious xref to same node. + Clarify xref for add-to-list. + +2007-04-12 Nick Roberts <nickrob@snap.net.nz> + + * keymaps.texi (Format of Keymaps): Remove spurious ")" from + value of lisp-mode-map. + +2007-04-11 Karl Berry <karl@gnu.org> + + * anti.texi (Antinews), + * display.texi (Overlay Properties) and (Defining Images), + * processes.texi (Synchronous Processes) and (Sentinels), + * syntax.texi (Syntax Table Internals), + * searching.texi (Regexp Special), + * nonascii.texi (Default Coding Systems), + * text.texi (Special Properties), + * minibuf.texi (Basic Completion): Wording to improve breaks in + 8.5x11 format. + * elisp.texi (smallbook): new @set to more easily switch between + smallbook and 8.5x11. + +2007-04-11 Richard Stallman <rms@gnu.org> + + * text.texi (Lazy Properties): Minor fix. + 2007-04-08 Karl Berry <karl@gnu.org> * symbols.texi (Plists and Alists): Period after "vs" in index entries. @@ -15,7 +73,7 @@ adaptive-fill-regexp's value, since they are not in the standard TeX fonts. -2007-04-07 Herbert Euler <herberteuler@hotmail.com> +2007-04-07 Guanpeng Xu <herberteuler@hotmail.com> * display.texi (Defining Faces): Fix example.
--- a/lispref/anti.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/anti.texi Tue Apr 24 21:56:25 2007 +0000 @@ -433,11 +433,10 @@ a char-table; it has to be a string. @item -The two functions @code{merge-coding-systems} and -@code{decode-coding-inserted-region}, and the variable -@code{auto-coding-functions}, have been deleted. The -@code{mime-text-unsuitable} coding system property no longer has any -special meaning. +The variable @code{auto-coding-functions} and the two functions +@code{merge-coding-systems} and @code{decode-coding-inserted-region} +have been deleted. The coding system property +@code{mime-text-unsuitable} no longer has any special meaning. @item If pure storage overflows while dumping, Emacs won't tell you how much
--- a/lispref/display.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/display.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1365,7 +1365,7 @@ Attributes}. @item -A cons cell of the form @code{(foreground-color . @var{color-name})} or +A cons cell, either of the form @code{(foreground-color . @var{color-name})} or @code{(background-color . @var{color-name})}. These elements specify just the foreground color or just the background color. @@ -2144,10 +2144,9 @@ For example: @example -(read-face-name "Describe face" "= `default' face" t) +(face-attribute-relative-p :height 2.0) + @result{} t @end example - -prompts with @samp{Describe face (default = `default' face): }. @end defun @defun merge-face-attribute attribute value1 value2 @@ -4138,8 +4137,8 @@ This function returns a suitable search path for images used by the Lisp package @var{library}. -The function searches for @var{image} first in @code{image-load-path} -(excluding @file{@code{data-directory}/images}) and then in +The function searches for @var{image} first using @code{image-load-path}, +excluding @file{@code{data-directory}/images}, and then in @code{load-path}, followed by a path suitable for @var{library}, which includes @file{../../etc/images} and @file{../etc/images} relative to the library file itself, and finally in
--- a/lispref/elisp.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/elisp.texi Tue Apr 24 21:56:25 2007 +0000 @@ -7,24 +7,29 @@ @c Version of the manual and of Emacs. @c Please remember to update the edition number in README as well. @set VERSION 2.9 -@set EMACSVER 22.0.97 +@set EMACSVER 22.0.98 @dircategory Emacs @direntry * Elisp: (elisp). The Emacs Lisp Reference Manual. @end direntry -@c So that anyone making the printed manual gets the version we have -@c tuned to avoid bad line breaks, etc. +@c for full 8.5x11, comment this out. +@set smallbook + +@ifset smallbook @smallbook +@end ifset @c per rms and peterb, use 10pt fonts for the main text, mostly to @c save on paper cost. Also, do not declare @setchapternewpage odd, @c for the same reason. Do this inside @tex for now, so the @c last-released makeinfo does not complain. @tex +@ifset smallbook @fonttextsize 10 -\global\hbadness=6000 % don't worry about not-too-underfull boxes +@end ifset +\global\hbadness=6666 % don't worry about not-too-underfull boxes @end tex @c Combine indices. @@ -61,7 +66,7 @@ @titlepage @title GNU Emacs Lisp Reference Manual @subtitle For Emacs Version @value{EMACSVER} -@subtitle Revision @value{VERSION}, January 2002 +@subtitle Revision @value{VERSION}, April 2007 @author by Bil Lewis, Dan LaLiberte, Richard Stallman @author and the GNU Manual Group
--- a/lispref/files.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/files.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1990,6 +1990,20 @@ @end group @end example +In some cases, a leading @samp{..} component can remain in the output: + +@example +@group +(expand-file-name "../home" "/") + @result{} "/../home" +@end group +@end example + +@noindent +This is for the sake of filesystems that have the concept of a +``superroot'' above the root directory @file{/}. On other filesystems, +@file{/../} is interpreted exactly the same as @file{/}. + Note that @code{expand-file-name} does @emph{not} expand environment variables; only @code{substitute-in-file-name} does that.
--- a/lispref/frames.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/frames.texi Tue Apr 24 21:56:25 2007 +0000 @@ -150,6 +150,13 @@ names that they share a single keyboard, and it treats them as a single terminal. + Note that some graphical terminals can output to more than a one +monitor (or other output device) at the same time. On these +``multi-monitor'' setups, a single @var{display} value controls the +output to all the physical monitors. In this situation, there is +currently no platform-independent way for Emacs to distinguish between +the different physical monitors. + @deffn Command make-frame-on-display display &optional parameters This creates and returns a new frame on display @var{display}, taking the other frame parameters from @var{parameters}. Aside from the @@ -2089,11 +2096,19 @@ @defun display-pixel-height &optional display This function returns the height of the screen in pixels. On a character terminal, it gives the height in characters. + +For graphical terminals, note that on ``multi-monitor'' setups this +refers to the pixel width for all physical monitors associated with +@var{display}. @xref{Multiple Displays}. @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. + +For graphical terminals, note that on ``multi-monitor'' setups this +refers to the pixel width for all physical monitors associated with +@var{display}. @xref{Multiple Displays}. @end defun @defun display-mm-height &optional display
--- a/lispref/keymaps.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/keymaps.texi Tue Apr 24 21:56:25 2007 +0000 @@ -255,7 +255,7 @@ (24 . lisp-send-defun) keymap ;; @r{@kbd{M-C-q}, treated as @kbd{@key{ESC} C-q}} - (17 . indent-sexp))) + (17 . indent-sexp)) @end group @group ;; @r{This part is inherited from @code{lisp-mode-shared-map}.} @@ -2094,7 +2094,17 @@ string. Thus, the string need not be a constant. The third element, @var{real-binding}, is the command to execute. The tail of the list, @var{item-property-list}, has the form of a property list which contains -other information. Here is a table of the properties that are supported: +other information. + + When an equivalent keyboard key binding is cached, the extended menu +item binding looks like this: + +@example +(menu-item @var{item-name} @var{real-binding} (@var{key-binding-data}) + . @var{item-property-list}) +@end example + + Here is a table of the properties that are supported: @table @code @item :enable @var{form} @@ -2180,13 +2190,6 @@ safely be called at any time. @end table - When an equivalent key binding is cached, the binding looks like this. - -@example -(menu-item @var{item-name} @var{real-binding} (@var{key-binding-data}) - . @var{item-property-list}) -@end example - @node Menu Separators @subsubsection Menu Separators @cindex menu separators
--- a/lispref/lists.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/lists.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1366,6 +1366,9 @@ (delq '(4) sample-list) @result{} (a c (4)) @end group + +If you want to delete elements that are @code{equal} to a given value, +use @code{delete} (see below). @end example @defun remq object list @@ -1388,9 +1391,6 @@ @result{} (a b c a b c) @end group @end example -@noindent -The function @code{delq} offers a way to perform this operation -destructively. See @ref{Sets And Lists}. @end defun @defun memql object list @@ -1448,8 +1448,8 @@ elements @code{equal} to @var{object} from @var{sequence}. For lists, @code{delete} is to @code{delq} as @code{member} is to @code{memq}: it uses @code{equal} to compare elements with @var{object}, like -@code{member}; when it finds an element that matches, it removes the -element just as @code{delq} would. +@code{member}; when it finds an element that matches, it cuts the +element out just as @code{delq} would. If @code{sequence} is a vector or string, @code{delete} returns a copy of @code{sequence} with all elements @code{equal} to @code{object} @@ -1459,8 +1459,22 @@ @example @group -(delete '(2) '((2) (1) (2))) +(setq l '((2) (1) (2))) +(delete '(2) l) @result{} ((1)) +l + @result{} ((2) (1)) +;; @r{If you want to change @code{l} reliably,} +;; @r{write @code{(setq l (delete elt l))}.} +@end group +@group +(setq l '((2) (1) (2))) +(delete '(1) l) + @result{} ((2) (2)) +l + @result{} ((2) (2)) +;; @r{In this case, it makes no difference whether you set @code{l},} +;; @r{but you should do so for the sake of the other case.} @end group @group (delete '(2) [(2) (1) (2)]) @@ -1470,7 +1484,7 @@ @end defun @defun remove object sequence -This function is the non-destructive counterpart of @code{delete}. If +This function is the non-destructive counterpart of @code{delete}. It returns a copy of @code{sequence}, a list, vector, or string, with elements @code{equal} to @code{object} removed. For example: @@ -1509,7 +1523,8 @@ @end defun See also the function @code{add-to-list}, in @ref{List Variables}, -for another way to add an element to a list stored in a variable. +for a way to add an element to a list stored in a variable and used as a +set. @node Association Lists @section Association Lists
--- a/lispref/minibuf.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/minibuf.texi Tue Apr 24 21:56:25 2007 +0000 @@ -767,7 +767,7 @@ strings, this is true if @var{string} appears in the list and @var{predicate} is satisfied. -@code{test-completion} uses @code{completion-regexp-list} in the same +This function uses @code{completion-regexp-list} in the same way that @code{try-completion} does. If @var{predicate} is non-@code{nil} and if @var{collection} contains
--- a/lispref/nonascii.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/nonascii.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1105,11 +1105,11 @@ @var{encoding-system} is the coding system for encoding (in case @var{operation} does encoding). -The argument @var{operation} should be a symbol, any one of -@code{insert-file-contents}, @code{write-region}, +The argument @var{operation} is a symbol, one of @code{write-region}, @code{start-process}, @code{call-process}, @code{call-process-region}, -or @code{open-network-stream}. These are the names of the Emacs I/O -primitives that can do character code and eol conversion. +@code{insert-file-contents}, or @code{open-network-stream}. These are +the names of the Emacs I/O primitives that can do character code and +eol conversion. The remaining arguments should be the same arguments that might be given to the corresponding I/O primitive. Depending on the primitive, one @@ -1165,9 +1165,9 @@ (insert-file-contents filename)) @end example -When its value is non-@code{nil}, @code{coding-system-for-read} takes -precedence over all other methods of specifying a coding system to use for -input, including @code{file-coding-system-alist}, +When its value is non-@code{nil}, this variable takes precedence over +all other methods of specifying a coding system to use for input, +including @code{file-coding-system-alist}, @code{process-coding-system-alist} and @code{network-coding-system-alist}. @end defvar
--- a/lispref/processes.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/processes.texi Tue Apr 24 21:56:25 2007 +0000 @@ -349,7 +349,7 @@ @var{infile} is on another remote host. Or @code{default-directory} could be non-special, whereas @var{infile} is on a remote host.) -If @var{buffer} has the form @code{(@var{real-destination} +If @var{buffer} is a list of the form @code{(@var{real-destination} @var{error-destination})}, and @var{error-destination} names a file, then the same remarks as for @var{infile} apply. @@ -2066,8 +2066,9 @@ string @code{"@var{a}.@var{b}.@var{c}.@var{d}:@var{p}"}. A nine-element vector @code{[@var{a} @var{b} @var{c} @var{d} @var{e} -@var{f} @var{g} @var{h} @var{p}]} represents an IPv6 address and port -number. @code{format-network-address} converts that to the string +@var{f} @var{g} @var{h} @var{p}]} represents an IPv6 address along +with a port number. @code{format-network-address} converts that to +the string @code{"[@var{a}:@var{b}:@var{c}:@var{d}:@var{e}:@var{f}:@var{g}:@var{h}]:@var{p}"}. If the vector does not include the port number, @var{p}, or if
--- a/lispref/searching.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/searching.texi Tue Apr 24 21:56:25 2007 +0000 @@ -309,17 +309,16 @@ The next alternative is for @samp{a*} to match only two @samp{a}s. With this choice, the rest of the regexp matches successfully. -@strong{Warning:} Nested repetition operators take a long time, -or even forever, if they -lead to ambiguous matching. For example, trying to match the regular -expression @samp{\(x+y*\)*a} against the string -@samp{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz} could take hours before it -ultimately fails. Emacs must try each way of grouping the 35 -@samp{x}s before concluding that none of them can work. Even worse, -@samp{\(x*\)*} can match the null string in infinitely many ways, so -it causes an infinite loop. To avoid these problems, check nested -repetitions carefully, to make sure that they do not cause combinatorial -explosions in backtracking. +@strong{Warning:} Nested repetition operators can run for an +indefinitely long time, if they lead to ambiguous matching. For +example, trying to match the regular expression @samp{\(x+y*\)*a} +against the string @samp{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz} could +take hours before it ultimately fails. Emacs must try each way of +grouping the @samp{x}s before concluding that none of them can work. +Even worse, @samp{\(x*\)*} can match the null string in infinitely +many ways, so it causes an infinite loop. To avoid these problems, +check nested repetitions carefully, to make sure that they do not +cause combinatorial explosions in backtracking. @item @samp{+} @cindex @samp{+} in regexp
--- a/lispref/syntax.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/syntax.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1011,8 +1011,9 @@ @end multitable @defun string-to-syntax @var{desc} -This function returns the internal form @code{(@var{syntax-code} . -@var{matching-char})} corresponding to the syntax descriptor @var{desc}. +This function returns the internal form corresponding to the syntax +descriptor @var{desc}, a cons cell @code{(@var{syntax-code} +. @var{matching-char})}. @end defun @defun syntax-after pos
--- a/lispref/text.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/lispref/text.texi Tue Apr 24 21:56:25 2007 +0000 @@ -2987,13 +2987,13 @@ @xref{Face Attributes}. @item -A cons cell of the form @code{(foreground-color . @var{color-name})} or +A cons cell with the form @code{(foreground-color . @var{color-name})} or @code{(background-color . @var{color-name})}. These elements specify just the foreground color or just the background color. @xref{Color Names}, for the supported forms of @var{color-name}. -@code{(foreground-color . @var{color-name})} is equivalent to -specifying @code{(:foreground @var{color-name})}, and likewise for the +A cons cell of @code{(foreground-color . @var{color-name})} is equivalent to +specifying @code{(:foreground @var{color-name})}; likewise for the background. @end itemize @@ -3241,7 +3241,6 @@ It is possible with @code{char-after} to examine characters at various buffer positions without moving point to those positions. Only an actual change in the value of point runs these hook functions. -@end table @defvar inhibit-point-motion-hooks When this variable is non-@code{nil}, @code{point-left} and @@ -3260,6 +3259,30 @@ Manual}) provides an example. @end defvar +@item composition +@kindex composition @r{(text property)} +This text property is used to display a sequence of characters as a +single glyph composed from components. For instance, in Thai a base +consonant is composed with the following combining vowel as a single +glyph. The value should be a character or a sequence (vector, list, +or string) of integers. + +@itemize @bullet +@item +If it is a character, it means to display that character instead of +the text in the region. + +@item +If it is a string, it means to display that string's contents instead +of the text in the region. + +@item +If it is a vector or list, the elements are characters interleaved +with internal codes specifying how to compose the following character +with the previous one. +@end itemize +@end table + @node Format Properties @subsection Formatted Text Properties @@ -3470,7 +3493,7 @@ @code{buffer-access-fontified-property}. @defvar buffer-access-fontified-property -If this value's variable is non-@code{nil}, it is a symbol which is used +If this variable's value is non-@code{nil}, it is a symbol which is used as a text property name. A non-@code{nil} value for that text property means, ``the other text properties for this character have already been computed.''
--- a/mac/Emacs.app/Contents/Resources/English.lproj/InfoPlist.strings Tue Apr 24 11:35:23 2007 +0000 +++ b/mac/Emacs.app/Contents/Resources/English.lproj/InfoPlist.strings Tue Apr 24 21:56:25 2007 +0000 @@ -1,5 +1,5 @@ /* Localized versions of Info.plist keys */ CFBundleName = "Emacs"; -CFBundleShortVersionString = "22.0.97"; -CFBundleGetInfoString = "22.0.97, Copyright (C) 2007 Free Software Foundation, Inc."; +CFBundleShortVersionString = "22.0.98"; +CFBundleGetInfoString = "22.0.98, Copyright (C) 2007 Free Software Foundation, Inc.";
--- a/mac/src/Emacs.r Tue Apr 24 11:35:23 2007 +0000 +++ b/mac/src/Emacs.r Tue Apr 24 21:56:25 2007 +0000 @@ -221,10 +221,10 @@ 0x22, /* Major revision in BCD */ 0x0, /* Minor revision in BCD */ alpha, /* development, alpha, beta, or final (release) */ - 97, /* Non-final release # */ + 98, /* Non-final release # */ 0, /* Region code */ - "22.0.97", /* Short version number */ - "22.0.97, Copyright \0xa9 2007 " + "22.0.98", /* Short version number */ + "22.0.98, Copyright \0xa9 2007 " "Free Software Foundation, Inc." /* Long version number */ };
--- a/man/ChangeLog Tue Apr 24 11:35:23 2007 +0000 +++ b/man/ChangeLog Tue Apr 24 21:56:25 2007 +0000 @@ -1,3 +1,122 @@ +2007-04-23 Jay Belanger <jay.p.belanger@gmail.com> + + * calc.texi (Reporting bugs): Update maintainer's address. + +2007-04-23 Chong Yidong <cyd@stupidchicken.com> + + * display.texi (Highlight Interactively): Correct description of + hi-lock-file-patterns-policy. + + * files.texi (File Archives): Mention self-extracting executables. + +2007-04-23 Eli Zaretskii <eliz@gnu.org> + + * search.texi (Unconditional Replace, Query Replace): Add xref to + "Replacement and Case". + +2007-04-22 Chong Yidong <cyd@stupidchicken.com> + + * dired.texi (Image-Dired): Move from Thumbnails node. + * misc.texi (Thumbnails): Node deleted. + * emacs.texi (Top): Update node listing. + + * files.texi (File Conveniences): + * ack.texi (Acknowledgments): + * faq.texi (New in Emacs 22): Rename "tumme" to "image-dired". + +2007-04-21 Richard Stallman <rms@gnu.org> + + * display.texi (Highlight Interactively): Correct previous change. + Clarify doc of hi-lock-find-patterns, and move new features into it. + +2007-04-20 David Koppelman <koppel@ece.lsu.edu> + + * display.texi (Highlight Interactively): Document + hi-lock-file-patterns-policy. + +2007-04-20 Martin Rudalics <rudalics@gmx.at> + + * display.texi (Scrolling): Fix typo. + +2007-04-15 Jay Belanger <belanger@truman.edu> + + * calc.texi (Title page): Remove the date. + (Basic Arithmetic): Emphasize that / binds less strongly than *. + (The Standard Calc Interface): Change trail title. + (Floats): Mention that when non-decimal floats are entered, only + approximations are stored. + (Copying): Move to the appendices. + (GNU Free Documentation License): Add as an appendix. + +2007-04-15 Chong Yidong <cyd@stupidchicken.com> + + * ada-mode.texi, autotype.texi, cc-mode.texi, cl.texi: + * dired-x.texi, ebrowse.texi, ediff.texi: + * emacs-mime.texi, erc.texi, eshell.texi: + * eudc.texi, flymake.texi, forms.texi, gnus.texi: + * idlwave.texi, message.texi, newsticker.texi, org.texi: + * pcl-cvs.texi, pgg.texi, rcirc.texi, reftex.texi, sc.texi: + * ses.texi, sieve.texi, smtpmail.texi, speedbar.texi: + * tramp.texi, url.texi, vip.texi, viper.texi, widget.texi: + * woman.texi: Include GFDL. + + * doclicense.texi: Remove node heading, so that it can be included by + other files. + + * emacs.texi: Insert node heading for GFDL. + + * dired-x.texi: Relicence under GFDL. Remove date from title page. + + * calc.texi (Algebraic Tutorial): Emphasize that / binds less strongly + than *. + +2007-04-14 Carsten Dominik <dominik@science.uva.nl> + + * org.texi (Formula syntax for Calc): Emphasize the operator precedence + in Calc. + +2007-04-14 Eli Zaretskii <eliz@gnu.org> + + * cmdargs.texi (Colors): Qualify "color of window" index entry by + "command line". + + * display.texi (Faces): Refer to "Creating Frames" for face + and other frame customizations in .emacs. + + * frames.texi (Creating Frames): Mention that face customizations can + be put in .emacs. Add index entries. + +2007-04-12 Richard Stallman <rms@gnu.org> + + * glossary.texi (Glossary): Explain `iff'. + +2007-04-11 Karl Berry <karl@gnu.org> + + * gnu.texi (Top), + * macos.texi (Mac Font Specs), + * anti.texi (Antinews), + * xresources.texi (Resources), + * misc.texi (Emulation), + * calendar.texi (Daylight Saving), + * dired.texi (Dired and Find), + * rmail.texi (Remote Mailboxes), + * sending.texi (Mail Headers), + * programs.texi (Which Function), + * files.texi (Recover), + * buffers.texi (Uniquify), + * frames.texi (Wheeled Mice), + * killing.texi (Rectangles): Wording to improve breaks in + 8.5x11 format. + * mule.texi (Language Environments): \hbadness=10000 since there's + no way to reword. + * emacs.texi (smallbook): New @set to more easily switch between + smallbook and 8.5x11. + +2007-04-11 Richard Stallman <rms@gnu.org> + + * files.texi (File Conveniences): Add xref to Tumme. + Delete text about Thumbnail mode. + 2007-04-09 Romain Francoise <romain@orebokech.com> * faq.texi (New in Emacs 22): Mention improvements to the Windows and
--- a/man/ack.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/ack.texi Tue Apr 24 21:56:25 2007 +0000 @@ -186,8 +186,8 @@ for compiled Emacs Lisp code. @item -Mathias Dahl wrote @file{tumme.el}, a package for viewing image files -as ``thumbnails.'' +Mathias Dahl wrote @file{image-dired.el}, a package for viewing image +files as ``thumbnails.'' @item Michael DeCorte wrote @file{emacs.csh}, a C-shell script that starts a
--- a/man/ada-mode.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/ada-mode.texi Tue Apr 24 21:56:25 2007 +0000 @@ -64,6 +64,7 @@ * Automatic Casing:: Adjusting the case of words automatically * Statement Templates:: Inserting code templates * Comment Handling:: Reformatting comments easily +* GNU Free Documentation License:: The license for this documentation. * Index:: @end menu @@ -1373,7 +1374,7 @@ type (@code{ada-type}). @end table -@node Comment Handling, Index, Statement Templates, Top +@node Comment Handling, GNU Free Documentation License, Statement Templates, Top @chapter Comment Handling By default, comment lines get indented like Ada code. There are a few @@ -1392,7 +1393,11 @@ autofill the current comment. @end table -@node Index, , Comment Handling, Top +@node GNU Free Documentation License, Index, Comment Handling, Top +@appendix GNU Free Documentation License +@include doclicense.texi + +@node Index, , GNU Free Documentation License, Top @unnumbered Index @printindex fn
--- a/man/anti.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/anti.texi Tue Apr 24 21:56:25 2007 +0000 @@ -53,9 +53,9 @@ been removed. @item -The command line options @samp{--color}, @samp{--fullwidth}, -@samp{--fullheight}, @samp{--fullscreen}, @samp{--no-blinking-cursor}, -@samp{--no-desktop}, and @samp{-Q} have also been removed. +These command line options have also been removed: @samp{--color}, +@samp{--fullwidth}, @samp{--fullheight}, @samp{--fullscreen}, +@samp{--no-blinking-cursor}, @samp{--no-desktop}, and @samp{-Q}. @item The @samp{--geometry} option applies only to the initial frame, and
--- a/man/autotype.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/autotype.texi Tue Apr 24 21:56:25 2007 +0000 @@ -101,6 +101,7 @@ * Tempo:: Flexible template insertion. * Hippie Expand:: Expansion of text trying various methods. +* GNU Free Documentation License:: The license for this documentation. * Concept Index:: * Command Index:: * Variable Index:: @@ -650,6 +651,9 @@ @code{dabbrev-expand}, the standard binding of @kbd{M-/}, providing one of the expansion possibilities. +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include doclicense.texi @node Concept Index @unnumbered Concept Index
--- a/man/buffers.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/buffers.texi Tue Apr 24 21:56:25 2007 +0000 @@ -573,14 +573,14 @@ buffer name. To select one, customize the variable @code{uniquify-buffer-name-style} (@pxref{Easy Customization}). - For instance, the @code{forward} naming method puts part of the -directory name at the beginning of the buffer name; using this method, -buffers visiting @file{/u/rms/tmp/Makefile} and + To begin with, the @code{forward} naming method includes part of the +file's directory name at the beginning of the buffer name; using this +method, buffers visiting the files @file{/u/rms/tmp/Makefile} and @file{/usr/projects/zaphod/Makefile} would be named @samp{tmp/Makefile} and @samp{zaphod/Makefile}, respectively (instead of @samp{Makefile} and @samp{Makefile<2>}). - By contrast, the @code{post-forward} naming method would call the + In contrast, the @code{post-forward} naming method would call the buffers @samp{Makefile|tmp} and @samp{Makefile|zaphod}, and the @code{reverse} naming method would call them @samp{Makefile\tmp} and @samp{Makefile\zaphod}. The nontrivial difference between
--- a/man/calc.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/calc.texi Tue Apr 24 21:56:25 2007 +0000 @@ -92,7 +92,8 @@ any later version published by the Free Software Foundation; with the Invariant Sections being just ``GNU GENERAL PUBLIC LICENSE'', with the Front-Cover texts being ``A GNU Manual,'' and with the Back-Cover -Texts as in (a) below. +Texts as in (a) below. A copy of the license is included in the section +entitled ``GNU Free Documentation License.'' (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free @@ -111,8 +112,6 @@ @sp 4 @center GNU Emacs Calc Version 2.1 @c [volume] -@sp 1 -@center March 2005 @sp 5 @center Dave Gillespie @center daveg@@synaptics.com @@ -126,7 +125,7 @@ @c [begin] @ifinfo -@node Top, , (dir), (dir) +@node Top, Getting Started, (dir), (dir) @chapter The GNU Emacs Calculator @noindent @@ -145,8 +144,6 @@ @end ifinfo @menu -* Copying:: How you can copy and share Calc. - * Getting Started:: General description and overview. * Interactive Tutorial:: * Tutorial:: A step-by-step introduction for beginners. @@ -167,7 +164,9 @@ * Embedded Mode:: Working with formulas embedded in a file. * Programming:: Calc as a programmable calculator. -* Customizing Calc:: Customizing Calc. +* Copying:: How you can copy and share Calc. +* GNU Free Documentation License:: The license for this documentation. +* Customizing Calc:: Customizing Calc. * Reporting Bugs:: How to report bugs and make suggestions. * Summary:: Summary of Calc commands and functions. @@ -180,400 +179,7 @@ * Lisp Function Index:: Internal Lisp math functions. @end menu -@node Copying, Getting Started, Top, Top -@unnumbered GNU GENERAL PUBLIC LICENSE -@center Version 2, June 1991 - -@c This file is intended to be included in another file. - -@display -Copyright @copyright{} 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. -@end display - -@unnumberedsec Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software---to make sure the software is free for all its users. This -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 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 -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - -@iftex -@unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -@end iftex -@ifinfo -@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -@end ifinfo - -@enumerate 0 -@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, -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''. - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - -@item -You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - -@item -You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - -@enumerate a -@item -You must cause the modified files to carry prominent notices -stating that you changed the files and the date of any change. - -@item -You must cause any work that you distribute or publish, that in -whole or in part contains or is derived from the Program or any -part thereof, to be licensed as a whole at no charge to all third -parties under the terms of this License. - -@item -If the modified program normally reads commands interactively -when run, you must cause it, when started running for such -interactive use in the most ordinary way, to print or display an -announcement including an appropriate copyright notice and a -notice that there is no warranty (or else, saying that you provide -a warranty) and that users may redistribute the program under -these conditions, and telling the user how to view a copy of this -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.) -@end enumerate - -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 -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - -@item -You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - -@enumerate a -@item -Accompany it with the complete corresponding machine-readable -source code, which must be distributed under the terms of Sections -1 and 2 above on a medium customarily used for software interchange; or, - -@item -Accompany it with a written offer, valid for at least three -years, to give any third party, for a charge no more than your -cost of physically performing source distribution, a complete -machine-readable copy of the corresponding source code, to be -distributed under the terms of Sections 1 and 2 above on a medium -customarily used for software interchange; or, - -@item -Accompany it with the information you received as to the offer -to distribute corresponding source code. (This alternative is -allowed only for noncommercial distribution and only if you -received the program in object code or executable form with such -an offer, in accord with Subsection b above.) -@end enumerate - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -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. - -@item -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 -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - -@item -You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - -@item -Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - -@item -If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - -@item -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 -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - -@item -The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -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 -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 -Foundation. - -@item -If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - -@iftex -@heading NO WARRANTY -@end iftex -@ifinfo -@center NO WARRANTY -@end ifinfo - -@item -BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - -@item -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. -@end enumerate - -@iftex -@heading END OF TERMS AND CONDITIONS -@end iftex -@ifinfo -@center END OF TERMS AND CONDITIONS -@end ifinfo - -@page -@unnumberedsec Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the ``copyright'' line and a pointer to where the full notice is found. - -@smallexample -@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 as published by -the Free Software Foundation; either version 2 of the License, 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 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. -@end smallexample - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - -@smallexample -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 -the appropriate parts of the General Public License. Of course, the -commands you use may be called something other than @samp{show w} and -@samp{show c}; they could even be mouse-clicks or menu items---whatever -suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a ``copyright disclaimer'' for the program, if -necessary. Here is a sample; alter the names: - -@example -Yoyodyne, Inc., hereby disclaims all copyright interest in the program -`Gnomovision' (which makes passes at compilers) written by James Hacker. - -@var{signature of Ty Coon}, 1 April 1989 -Ty Coon, President of Vice -@end example - -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 Lesser General -Public License instead of this License. - -@node Getting Started, Tutorial, Copying, Top +@node Getting Started, Interactive Tutorial, Top, Top @chapter Getting Started @noindent This chapter provides a general overview of Calc, the GNU Emacs @@ -1019,7 +625,7 @@ ... --**-Emacs: myfile (Fundamental)----All---------------------- ---- Emacs Calculator Mode --- |Emacs Calc Mode v2.1 ... +--- Emacs Calculator Mode --- |Emacs Calculator Trail 2: 17.3 | 17.3 1: -5 | 3 . | 2 @@ -1348,7 +954,7 @@ @c [fix-ref Embedded Mode] @xref{Embedded Mode}, for full details. -@node Other C-x * Commands, , Embedded Mode Overview, Using Calc +@node Other C-x * Commands, , Embedded Mode Overview, Using Calc @subsection Other @kbd{C-x *} Commands @noindent @@ -1514,7 +1120,7 @@ its initial state: Empty stack, and initial mode settings. @end table -@node History and Acknowledgements, , Using Calc, Getting Started +@node History and Acknowledgements, , Using Calc, Getting Started @section History and Acknowledgements @noindent @@ -1617,7 +1223,7 @@ @ifinfo @c This node is accessed by the `C-x * t' command. -@node Interactive Tutorial, , , Top +@node Interactive Tutorial, Tutorial, Getting Started, Top @chapter Tutorial @noindent @@ -1647,7 +1253,7 @@ @end menu @end ifinfo -@node Tutorial, Introduction, Getting Started, Top +@node Tutorial, Introduction, Interactive Tutorial, Top @chapter Tutorial @noindent @@ -2128,6 +1734,10 @@ non-RPN calculators work. In Algebraic mode, you enter formulas in traditional @expr{2+3} notation. +@strong{Warning:} Note that @samp{/} has lower precedence than +@samp{*}, so that @samp{a/b*c} is interpreted as @samp{a/(b*c)}. See +below for details. + You don't really need any special ``mode'' to enter algebraic formulas. You can enter a formula at any time by pressing the apostrophe (@kbd{'}) key. Answer the prompt with the desired formula, then press @key{RET}. @@ -2553,7 +2163,7 @@ of values you can put on the stack. The @kbd{`} key also works during entry of a number or algebraic formula. -@node Modes Tutorial, , Undo Tutorial, Basic Tutorial +@node Modes Tutorial, , Undo Tutorial, Basic Tutorial @subsection Mode-Setting Commands @noindent @@ -3891,7 +3501,7 @@ @noindent @xref{Matrix Answer 3, 3}. (@bullet{}) -@node List Tutorial, , Matrix Tutorial, Vector/Matrix Tutorial +@node List Tutorial, , Matrix Tutorial, Vector/Matrix Tutorial @subsection Vectors as Lists @noindent @@ -5641,7 +5251,7 @@ @c hard exercise: simplify (2^(n r) - 2^(r*(n - 1))) / (2^r - 1) 2^(n - 1) @c to 2^((n-1)*(r-1)). -@node Rewrites Tutorial, , Basic Algebra Tutorial, Algebra Tutorial +@node Rewrites Tutorial, , Basic Algebra Tutorial, Algebra Tutorial @subsection Rewrite Rules @noindent @@ -6757,7 +6367,7 @@ @c Volume II of this manual, the @dfn{Calc Reference}, tells the whole story. @page -@node Answers to Exercises, , Programming Tutorial, Tutorial +@node Answers to Exercises, , Programming Tutorial, Tutorial @section Answers to Exercises @noindent @@ -9945,7 +9555,7 @@ definition as it reads it in. For this reason, @code{C-x * m} is often the easiest way to create recursive programs in Calc. -@node Programming Answer 12, , Programming Answer 11, Answers to Exercises +@node Programming Answer 12, , Programming Answer 11, Answers to Exercises @subsection Programming Tutorial Exercise 12 @noindent @@ -10738,7 +10348,7 @@ There is only one trail buffer, @samp{*Calc Trail*}, used by all Calculator buffers. -@node Troubleshooting Commands, , Multiple Calculators, Introduction +@node Troubleshooting Commands, , Multiple Calculators, Introduction @section Troubleshooting Commands @noindent @@ -10829,7 +10439,7 @@ The @kbd{C-x * 0} (with the zero key) command also resets caches along with all other aspects of the Calculator's state. -@node Debugging Calc, , Caches, Troubleshooting Commands +@node Debugging Calc, , Caches, Troubleshooting Commands @subsection Debugging Calc @noindent @@ -11022,16 +10632,19 @@ way. While floats are always @emph{stored} in decimal, they can be entered -and displayed in any radix just like integers and fractions. The -notation @samp{@var{radix}#@var{ddd}.@var{ddd}} is a floating-point -number whose digits are in the specified radix. Note that the @samp{.} -is more aptly referred to as a ``radix point'' than as a decimal -point in this case. The number @samp{8#123.4567} is defined as -@samp{8#1234567 * 8^-4}. If the radix is 14 or less, you can use -@samp{e} notation to write a non-decimal number in scientific notation. -The exponent is written in decimal, and is considered to be a power -of the radix: @samp{8#1234567e-4}. If the radix is 15 or above, the -letter @samp{e} is a digit, so scientific notation must be written +and displayed in any radix just like integers and fractions. Since a +float that is entered in a radix other that 10 will be converted to +decimal, the number that Calc stores may not be exactly the number that +was entered, it will be the closest decimal approximation given the +current precison. The notation @samp{@var{radix}#@var{ddd}.@var{ddd}} +is a floating-point number whose digits are in the specified radix. +Note that the @samp{.} is more aptly referred to as a ``radix point'' +than as a decimal point in this case. The number @samp{8#123.4567} is +defined as @samp{8#1234567 * 8^-4}. If the radix is 14 or less, you can +use @samp{e} notation to write a non-decimal number in scientific +notation. The exponent is written in decimal, and is considered to be a +power of the radix: @samp{8#1234567e-4}. If the radix is 15 or above, +the letter @samp{e} is a digit, so scientific notation must be written out, e.g., @samp{16#123.4567*16^2}. The first two exercises of the Modes Tutorial explore some of the properties of non-decimal floats. @@ -11906,7 +11519,7 @@ @xref{Store and Recall}, for a discussion of commands dealing with variables. -@node Formulas, , Variables, Data Types +@node Formulas, , Variables, Data Types @section Formulas @noindent @@ -12352,7 +11965,7 @@ The @kbd{t .} (@code{calc-full-trail-vectors}) command is described elsewhere; @pxref{Vector and Matrix Formats}. -@node Keep Arguments, , Trail Commands, Stack and Trail +@node Keep Arguments, , Trail Commands, Stack and Trail @section Keep Arguments @noindent @@ -12854,7 +12467,7 @@ automatic recomputation is off, use @w{@kbd{C-x * u}}. @xref{Embedded Mode}. -@node Working Message, , Automatic Recomputation, Calculation Modes +@node Working Message, , Automatic Recomputation, Calculation Modes @subsection Working Messages @noindent @@ -13235,7 +12848,7 @@ or @kbd{s D} to check to make sure you don't still have an old declaration for the variable that will conflict with its new meaning. -@node Functions for Declarations, , Kinds of Declarations, Declarations +@node Functions for Declarations, , Kinds of Declarations, Declarations @subsection Functions for Declarations @noindent @@ -13935,7 +13548,7 @@ If you always enter a four-digit year, and use a name instead of a number for the month, there is no danger of ambiguity. -@node Standard Date Formats, , Free-Form Dates, Date Formats +@node Standard Date Formats, , Free-Form Dates, Date Formats @subsubsection Standard Date Formats @noindent @@ -14070,7 +13683,7 @@ case, the display is formatted as specified, and then uniformly shifted over four spaces to fit the line numbers. -@node Labels, , Justification, Display Modes +@node Labels, , Justification, Display Modes @subsection Labels @noindent @@ -15361,7 +14974,7 @@ returns 1. The only formula for which @code{cascent} will return zero is @samp{cvspace(0)} or equivalents. -@node User-Defined Compositions, , Information about Compositions, Compositions +@node User-Defined Compositions, , Information about Compositions, Compositions @subsubsection User-Defined Compositions @noindent @@ -15492,7 +15105,7 @@ You can save your display formats permanently using the @kbd{Z P} command (@pxref{Creating User Keys}). -@node Syntax Tables, , Compositions, Language Modes +@node Syntax Tables, , Compositions, Language Modes @subsection Syntax Tables @noindent @@ -15825,7 +15438,7 @@ backtracking. A fully backtracking parser would go on to make sure the rest of the pattern matched before finalizing the choice. -@node Conditional Syntax Rules, , Advanced Syntax Patterns, Syntax Tables +@node Conditional Syntax Rules, , Advanced Syntax Patterns, Syntax Tables @subsubsection Conditional Syntax Rules @noindent @@ -16001,7 +15614,7 @@ do a full emulation with the help of the @kbd{Z [} and @kbd{Z ]} programming commands. @xref{Conditionals in Macros}.) -@node Calc Mode Line, , Modes Variable, Mode Settings +@node Calc Mode Line, , Modes Variable, Mode Settings @section The Calc Mode Line @noindent @@ -16362,20 +15975,24 @@ @mindex @null @end ignore @tindex / -The @kbd{/} (@code{calc-divide}) command divides two numbers. When -dividing a scalar @expr{B} by a square matrix @expr{A}, the computation -performed is @expr{B} times the inverse of @expr{A}. This also occurs -if @expr{B} is itself a vector or matrix, in which case the effect is -to solve the set of linear equations represented by @expr{B}. If @expr{B} -is a matrix with the same number of rows as @expr{A}, or a plain vector -(which is interpreted here as a column vector), then the equation -@expr{A X = B} is solved for the vector or matrix @expr{X}. Otherwise, -if @expr{B} is a non-square matrix with the same number of @emph{columns} -as @expr{A}, the equation @expr{X A = B} is solved. If you wish a vector -@expr{B} to be interpreted as a row vector to be solved as @expr{X A = B}, -make it into a one-row matrix with @kbd{C-u 1 v p} first. To force a -left-handed solution with a square matrix @expr{B}, transpose @expr{A} and -@expr{B} before dividing, then transpose the result. +The @kbd{/} (@code{calc-divide}) command divides two numbers. Note that +when using algebraic entry, @samp{/} has lower precedence than @samp{*}, +so that @samp{a/b*c} is interpreted as @samp{a/(b*c)}. + +When dividing a scalar @expr{B} by a square matrix @expr{A}, the +computation performed is @expr{B} times the inverse of @expr{A}. This +also occurs if @expr{B} is itself a vector or matrix, in which case the +effect is to solve the set of linear equations represented by @expr{B}. +If @expr{B} is a matrix with the same number of rows as @expr{A}, or a +plain vector (which is interpreted here as a column vector), then the +equation @expr{A X = B} is solved for the vector or matrix @expr{X}. +Otherwise, if @expr{B} is a non-square matrix with the same number of +@emph{columns} as @expr{A}, the equation @expr{X A = B} is solved. If +you wish a vector @expr{B} to be interpreted as a row vector to be +solved as @expr{X A = B}, make it into a one-row matrix with @kbd{C-u 1 +v p} first. To force a left-handed solution with a square matrix +@expr{B}, transpose @expr{A} and @expr{B} before dividing, then +transpose the result. HMS forms can be divided by real numbers or by other HMS forms. Error forms can be divided in any combination of ways. Modulo forms where both @@ -17359,7 +16976,7 @@ holiday, as defined in @code{Holidays}, or 0 if the date is a business day. -@node Time Zones, , Business Days, Date Arithmetic +@node Time Zones, , Business Days, Date Arithmetic @subsection Time Zones @noindent @@ -18006,7 +17623,7 @@ the total depreciation in any method is (by definition) the difference between the cost and the salvage value. -@node Definitions of Financial Functions, , Depreciation Functions, Financial Functions +@node Definitions of Financial Functions, , Depreciation Functions, Financial Functions @subsection Definitions @noindent @@ -18161,7 +17778,7 @@ function returns the amount the book value decreased in the specified period. -@node Binary Functions, , Financial Functions, Arithmetic +@node Binary Functions, , Financial Functions, Arithmetic @section Binary Number Functions @noindent @@ -19092,7 +18709,7 @@ * Random Number Generator:: (Complete description of Calc's algorithm) @end menu -@node Random Number Generator, , Random Numbers, Random Numbers +@node Random Number Generator, , Random Numbers, Random Numbers @subsection Random Number Generator Calc's random number generator uses several methods to ensure that @@ -19408,7 +19025,7 @@ duplicate factors (i.e., can be divided by the same prime more than once), the result is zero. -@node Probability Distribution Functions, , Combinatorial Functions, Scientific Functions +@node Probability Distribution Functions, , Combinatorial Functions, Scientific Functions @section Probability Distribution Functions @noindent @@ -20858,7 +20475,7 @@ in this section. For example, @samp{vflat(1, [2, [3, 4]], 5)} returns @samp{[1, 2, 3, 4, 5]}. -@node Paired-Sample Statistics, , Single-Variable Statistics, Statistical Operations +@node Paired-Sample Statistics, , Single-Variable Statistics, Statistical Operations @subsection Paired-Sample Statistics @noindent @@ -21350,7 +20967,7 @@ stopping when the result is correct within the specified tolerance, or when 20 steps have been taken, whichever is sooner. -@node Generalized Products, , Nesting and Fixed Points, Reducing and Mapping +@node Generalized Products, , Nesting and Fixed Points, Reducing and Mapping @subsection Generalized Products @kindex V O @@ -21385,7 +21002,7 @@ first (multiplicative) operator is taken from the top of the stack and the second (additive) operator is taken from second-to-top. -@node Vector and Matrix Formats, , Reducing and Mapping, Matrix Functions +@node Vector and Matrix Formats, , Reducing and Mapping, Matrix Functions @section Vector and Matrix Display Formats @noindent @@ -22006,7 +21623,7 @@ @end group @end smallexample -@node Rearranging with Selections, , Operating on Selections, Selecting Subformulas +@node Rearranging with Selections, , Operating on Selections, Selecting Subformulas @subsection Rearranging Formulas using Selections @noindent @@ -23104,7 +22721,7 @@ The @kbd{a M /} command can be used to divide a factor out of both sides of an inequality. -@node Simplification of Units, , Unsafe Simplifications, Simplifying Formulas +@node Simplification of Units, , Unsafe Simplifications, Simplifying Formulas @subsection Simplification of Units @noindent @@ -23738,7 +23355,7 @@ by Calc's symbolic integrator, for example), but @kbd{a I} will fail because the integrand goes to infinity at one of the endpoints. -@node Taylor Series, , Numerical Integration, Calculus +@node Taylor Series, , Numerical Integration, Calculus @subsection Taylor Series @noindent @@ -23984,7 +23601,7 @@ equations is the @kbd{a F} command, which does least-squares fitting to satisfy the equations. @xref{Curve Fitting}. -@node Decomposing Polynomials, , Solving Systems of Equations, Solving Equations +@node Decomposing Polynomials, , Solving Systems of Equations, Solving Equations @subsection Decomposing Polynomials @noindent @@ -24295,7 +23912,7 @@ over the complex numbers; if it is real or an interval it will be minimized over the reals. -@node Numerical Systems of Equations, , Minimization, Numerical Solutions +@node Numerical Systems of Equations, , Minimization, Numerical Solutions @subsection Systems of Equations @noindent @@ -25343,7 +24960,7 @@ The @code{efit} (corresponding to @kbd{H a F}) and @code{xfit} (for @kbd{I a F}) functions are completely analogous. -@node Interpolation, , Curve Fitting Details, Curve Fitting +@node Interpolation, , Curve Fitting Details, Curve Fitting @subsection Polynomial Interpolation @kindex a p @@ -25940,7 +25557,7 @@ it returns 0 when @code{dnonzero} would return 0 or leave itself in symbolic form.) -@node Rewrite Rules, , Logical Operations, Algebra +@node Rewrite Rules, , Logical Operations, Algebra @section Rewrite Rules @noindent @@ -27607,7 +27224,7 @@ existence and forget about it, all your future rewrite commands will be needlessly slow. -@node Examples of Rewrite Rules, , Debugging Rewrites, Rewrite Rules +@node Examples of Rewrite Rules, , Debugging Rewrites, Rewrite Rules @subsection Examples of Rewrite Rules @noindent @@ -28029,7 +27646,7 @@ @c Describe angular units, luminosity vs. steradians problem. -@node User-Defined Units, , Predefined Units, Units +@node User-Defined Units, , Predefined Units, Units @section User-Defined Units @noindent @@ -28573,7 +28190,7 @@ produce @samp{f(2 pi)}, whereas @kbd{s l} would give @samp{f(6.28)} since the evaluation step will also evaluate @code{pi}. -@node Evaluates-To Operator, , Let Command, Store and Recall +@node Evaluates-To Operator, , Let Command, Store and Recall @section The Evaluates-To Operator @noindent @@ -29206,7 +28823,7 @@ still be assigned automatically, but you could store another vector in @code{PointStyles} to define them, too. -@node Devices, , Graphics Options, Graphics +@node Devices, , Graphics Options, Graphics @section Graphical Devices @noindent @@ -29637,7 +29254,7 @@ it can be typed anywhere, not just in Calc. This provides an easy way to guarantee that Calc knows which editing buffer you want to use! -@node X Cut and Paste, , Yanking Into Buffers, Kill and Yank +@node X Cut and Paste, , Yanking Into Buffers, Kill and Yank @section X Cut and Paste @noindent @@ -30007,7 +29624,7 @@ @kbd{"x"} key pushes the variable names @expr{y}, @expr{z}, and @expr{t}, respectively. -@node Keypad Modes Menu, , Keypad Vectors Menu, Keypad Mode +@node Keypad Modes Menu, , Keypad Vectors Menu, Keypad Mode @section Modes Menu @smallexample @@ -30799,7 +30416,7 @@ When Embedded mode is not enabled, mode-recording modes except for @code{Save} have no effect. -@node Customizing Embedded Mode, , Mode Settings in Embedded Mode, Embedded Mode +@node Customizing Embedded Mode, , Mode Settings in Embedded Mode, Embedded Mode @section Customizing Embedded Mode @noindent @@ -30953,7 +30570,7 @@ major modes. If you change this, it is a good idea still to end with a newline so that mode annotations will appear on lines by themselves. -@node Programming, Customizing Calc, Embedded Mode, Top +@node Programming, Copying, Embedded Mode, Top @chapter Programming @noindent @@ -31406,7 +31023,7 @@ other settings such as the language mode and the various display modes, are @emph{not} affected by @kbd{Z `} and @kbd{Z '}. -@node Queries in Macros, , Local Values in Macros, Keyboard Macros +@node Queries in Macros, , Local Values in Macros, Keyboard Macros @subsection Queries in Keyboard Macros @c @noindent @@ -31591,7 +31208,7 @@ in symbolic form without ever activating the @code{deriv} function. Press @kbd{m D} to turn the default simplifications back on afterwards. -@node Lisp Definitions, , Algebraic Definitions, Programming +@node Lisp Definitions, , Algebraic Definitions, Programming @section Programming with Lisp @noindent @@ -32296,7 +31913,7 @@ a division by 512 in disguise; @code{idivmod} allows us to do the same thing with a single division by 512. -@node Sine Example, , Bit Counting Example, Example Definitions +@node Sine Example, , Bit Counting Example, Example Definitions @subsubsection The Sine Function @noindent @@ -32776,7 +32393,7 @@ ``F'' and ``C'', so that the character winds up before the cursor instead of after it. -@node Internals, , Calling Calc from Your Programs, Lisp Definitions +@node Internals, , Calling Calc from Your Programs, Lisp Definitions @subsection Calculator Internals @noindent @@ -34668,7 +34285,7 @@ @comment @noindent @comment (This section is currently unfinished.) -@node Hooks, , Formatting Lisp Functions, Internals +@node Hooks, , Formatting Lisp Functions, Internals @subsubsection Hooks @noindent @@ -34832,7 +34449,404 @@ list and also call @code{make-local-variable} itself. @end defvar -@node Customizing Calc, Reporting Bugs, Programming, Top +@node Copying, GNU Free Documentation License, Programming, Top +@appendix GNU GENERAL PUBLIC LICENSE +@center Version 2, June 1991 + +@c This file is intended to be included in another file. + +@display +Copyright @copyright{} 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. +@end display + +@unnumberedsec Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software---to make sure the software is free for all its users. This +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 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 +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + +@iftex +@unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end iftex +@ifinfo +@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end ifinfo + +@enumerate 0 +@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, +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''. + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +@item +You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +@item +You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +@enumerate a +@item +You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +@item +You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +@item +If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +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.) +@end enumerate + +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 +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +@item +You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +@enumerate a +@item +Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +@item +Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +@item +Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) +@end enumerate + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +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. + +@item +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 +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +@item +You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +@item +Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +@item +If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +@item +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 +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +@item +The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +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 +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 +Foundation. + +@item +If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +@iftex +@heading NO WARRANTY +@end iftex +@ifinfo +@center NO WARRANTY +@end ifinfo + +@item +BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +@item +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. +@end enumerate + +@iftex +@heading END OF TERMS AND CONDITIONS +@end iftex +@ifinfo +@center END OF TERMS AND CONDITIONS +@end ifinfo + +@page +@unnumberedsec Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the ``copyright'' line and a pointer to where the full notice is found. + +@smallexample +@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 as published by +the Free Software Foundation; either version 2 of the License, 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 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. +@end smallexample + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +@smallexample +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 +the appropriate parts of the General Public License. Of course, the +commands you use may be called something other than @samp{show w} and +@samp{show c}; they could even be mouse-clicks or menu items---whatever +suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a ``copyright disclaimer'' for the program, if +necessary. Here is a sample; alter the names: + +@example +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +@var{signature of Ty Coon}, 1 April 1989 +Ty Coon, President of Vice +@end example + +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 Lesser General +Public License instead of this License. + +@node GNU Free Documentation License, Customizing Calc, Copying, Top +@appendix GNU Free Documentation License +@include doclicense.texi + +@node Customizing Calc, Reporting Bugs, GNU Free Documentation License, Top @appendix Customizing Calc The usual prefix for Calc is the key sequence @kbd{C-x *}. If you wish @@ -35151,7 +35165,7 @@ If you find a bug in Calc, send e-mail to Jay Belanger, @example -belanger@@truman.edu +jay.p.belanger@@gmail.com @end example @noindent @@ -36457,7 +36471,7 @@ @printindex vr -@node Lisp Function Index, , Variable Index, Top +@node Lisp Function Index, , Variable Index, Top @unnumbered Index of Lisp Math Functions The following functions are meant to be used with @code{defmath}, not
--- a/man/calendar.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/calendar.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1614,11 +1614,12 @@ @c @vindex calendar-daylight-savings-starts-time too long! @vindex calendar-daylight-savings-ends-time - The two variables @code{calendar-daylight-savings-starts-time} and -@code{calendar-daylight-savings-ends-time} specify the number of minutes -after midnight local time when the transition to and from daylight -saving time should occur. For Cambridge, Massachusetts both variables' -values are 120. + Finally, the two variables +@code{calendar-daylight-savings-starts-time} and +@code{calendar-daylight-savings-ends-time} specify the number of +minutes after midnight local time when the transition to and from +daylight saving time should occur. For Cambridge, Massachusetts both +variables' values are 120. @node Time Intervals @section Summing Time Intervals
--- a/man/cc-mode.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/cc-mode.texi Tue Apr 24 21:56:25 2007 +0000 @@ -255,6 +255,7 @@ * FAQ:: * Updating CC Mode:: * Mailing Lists and Bug Reports:: +* GNU Free Documentation License:: * Command and Function Index:: * Variable Index:: * Concept and Key Index:: @@ -6892,7 +6893,7 @@ @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@node Mailing Lists and Bug Reports, Command and Function Index, Updating CC Mode, Top +@node Mailing Lists and Bug Reports, GNU Free Documentation License, Updating CC Mode, Top @comment node-name, next, previous, up @appendix Mailing Lists and Submitting Bug Reports @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -6934,9 +6935,15 @@ @code{comp.lang.idl}, and @code{comp.lang.awk}. @c There is no newsgroup for Pike. :-( + +@node GNU Free Documentation License, Command and Function Index, Mailing Lists and Bug Reports, Top +@appendix GNU Free Documentation License +@include doclicense.texi + + @c Removed the tentative node "Mode Initialization" from here, 2005/8/27. @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@node Command and Function Index, Variable Index, Mailing Lists and Bug Reports, Top +@node Command and Function Index, Variable Index, GNU Free Documentation License, Top @comment node-name, next, previous, up @unnumbered Command and Function Index @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--- a/man/cl.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/cl.texi Tue Apr 24 21:56:25 2007 +0000 @@ -78,6 +78,7 @@ * Old CL Compatibility:: All known differences with old cl.el * Porting Common Lisp:: Hints for porting Common Lisp code +* GNU Free Documentation License:: The license for this documentation. * Function Index:: * Variable Index:: @end menu @@ -5141,7 +5142,7 @@ @code{floor}, @code{ceiling}, etc.; @code{cl-compat} cannot use these names because they conflict with Emacs built-ins. -@node Porting Common Lisp, Function Index, Old CL Compatibility, Top +@node Porting Common Lisp, GNU Free Documentation License, Old CL Compatibility, Top @appendix Porting Common Lisp @noindent @@ -5353,7 +5354,11 @@ recursion. @end itemize -@node Function Index, Variable Index, Porting Common Lisp, Top +@node GNU Free Documentation License, Function Index, Porting Common Lisp, Top +@appendix GNU Free Documentation License +@include doclicense.texi + +@node Function Index, Variable Index, GNU Free Documentation License, Top @unnumbered Function Index @printindex fn
--- a/man/cmdargs.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/cmdargs.texi Tue Apr 24 21:56:25 2007 +0000 @@ -892,7 +892,7 @@ @node Colors @appendixsec Window Color Options -@cindex color of window +@cindex color of window, from command line @cindex text colors, from command line @findex list-colors-display
--- a/man/dired-x.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/dired-x.texi Tue Apr 24 21:56:25 2007 +0000 @@ -25,38 +25,27 @@ @comment %**end of header (This is for running Texinfo on a region.) @copying -This documents the ``extra'' features for Dired Mode for GNU Emacs found in -the file @file{dired-x.el}. - -Copyright @copyright{} 1993, 1994, 2001, 2002, 2003, 2004, +Copyright @copyright{} 1994, 1995, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. @quotation -Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - -Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of -a permission notice identical to this one. +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with the +Invariant Sections being ``The GNU Manifesto'', ``Distribution'' and +``GNU GENERAL PUBLIC LICENSE'', with the Front-Cover texts being ``A GNU +Manual'', and with the Back-Cover Texts as in (a) below. A copy of the +license is included in the section entitled ``GNU Free Documentation +License'' in the Emacs manual. -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for -modified versions, except that this permission notice may be stated -in a translation approved by the Free Software Foundation. +(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify +this GNU Manual, like GNU software. Copies published by the Free +Software Foundation raise funds for GNU development.'' -The file used to create this is called @file{dired-x.texi}, but the -original work that was altered to make that file was called -@file{dired.texi} written by Sebastian Kremer. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore +This document is part of a collection distributed under the GNU Free +Documentation License. If you want to distribute this document +separately from the collection, you can do so by adding a copy of the +license to the document, as described in section 6 of the license. @end quotation @end copying @@ -80,9 +69,6 @@ @sp 1 @center @titlefont{Directory Editor} @sp 4 -@center Manual Revision: 2.53 -@center 2001/02/25 14:05:46 -@sp 5 @center Lawrence R@. Dodd @c @center @t{dodd@@roebling.poly.edu} @sp 5 @@ -138,6 +124,7 @@ * Miscellaneous Commands:: * Bugs:: +* GNU Free Documentation License:: * Concept Index:: * Command Index:: * Key Index:: @@ -1228,7 +1215,7 @@ info. @end table -@node Bugs, Concept Index, Miscellaneous Commands, Top +@node Bugs, GNU Free Documentation License, Miscellaneous Commands, Top @comment node-name, next, previous, up @chapter Bugs @cindex Bugs @@ -1252,7 +1239,11 @@ Lawrence R. Dodd @c <dodd@@roebling.poly.edu> -@node Concept Index, Command Index, Bugs, Top +@node GNU Free Documentation License, Concept Index, Bugs, Top +@appendix GNU Free Documentation License +@include doclicense.texi + +@node Concept Index, Command Index, GNU Free Documentation License, Top @comment node-name, next, previous, up @unnumbered Concept Index @printindex cp
--- a/man/dired.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/dired.texi Tue Apr 24 21:56:25 2007 +0000 @@ -44,6 +44,7 @@ * Updating: Dired Updating. Discarding lines for files of no interest. * Find: Dired and Find. Using `find' to choose the files for Dired. * Wdired:: Operating on files by editing the Dired buffer. +* Image-Dired:: Viewing image thumbnails in Dired * Misc: Misc Dired Features. Various other features. @end menu @@ -920,6 +921,9 @@ subdirectory's contents. Use @kbd{C-u k} on the subdirectory header line to delete the subdirectory. @xref{Dired Updating}. + + + @ifnottex @include dired-xtra.texi @end ifnottex @@ -1132,9 +1136,9 @@ @findex locate-with-filter @cindex file database (locate) @vindex locate-command - @kbd{M-x locate} provides a similar interface to the @code{locate} -program. @kbd{M-x locate-with-filter} is similar, but keeps only files -whose names match a given regular expression. + The command @kbd{M-x locate} provides a similar interface to the +@code{locate} program. @kbd{M-x locate-with-filter} is similar, but +keeps only files whose names match a given regular expression. These buffers don't work entirely like ordinary Dired buffers: file operations work, but do not always automatically update the buffer. @@ -1174,6 +1178,78 @@ world-writable. These changes also take effect when you type @kbd{C-c C-c}. +@node Image-Dired +@section Viewing Image Thumbnails in Dired +@cindex image-dired mode +@cindex image-dired + + Image-Dired is a facility for browsing image files. It provides viewing +the images either as thumbnails or in full size, either inside Emacs +or through an external viewer. + +@kindex C-t d @r{(Image-Dired)} +@findex image-dired-display-thumbs + To enter Image-Dired, mark the image files you want to look at in +the Dired buffer, using @kbd{m} as usual. Then type @kbd{C-t d} +(@code{image-dired-display-thumbs}). This creates and switches to a +buffer containing image-dired, corresponding to the marked files. + + You can also enter Image-Dired directly by typing @kbd{M-x +image-dired}. This prompts for a directory; specify one that has +images files. This creates thumbnails for all the images in that +directory, and displays them all in the ``thumbnail buffer.'' This +takes a long time if the directory contains many image files, and it +asks for confirmation if the number of image files exceeds +@code{image-dired-show-all-from-dir-max-files}. + + With point in the thumbnail buffer, type @kbd{RET} +(@code{image-dired-display-thumbnail-original-image}) to display a +sized version of it in another window. This sizes the image to fit +the window. Use the arrow keys to move around in the buffer. For +easy browsing, type @kbd{SPC} +(@code{image-dired-display-next-thumbnail-original}) to advance and +display the next image. Typing @kbd{DEL} +(@code{image-dired-display-previous-thumbnail-original}) backs up to +the previous thumbnail and displays that instead. + +@vindex image-dired-external-viewer + To view and the image in its original size, either provide a prefix +argument (@kbd{C-u}) before pressing @kbd{RET}, or type +@kbd{C-@key{RET}} (@code{image-dired-thumbnail-display-external}) to +display the image in an external viewer. You must first configure +@code{image-dired-external-viewer}. + + You can delete images through Image-Dired also. Type @kbd{d} +(@code{image-dired-flag-thumb-original-file}) to flag the image file +for deletion in the Dired buffer. You can also delete the thumbnail +image from the thumbnail buffer with @kbd{C-d} +(@code{image-dired-delete-char}). + + More advanced features include @dfn{image tags}, which are metadata +used to categorize image files. The tags are stored in a plain text +file configured by @code{image-dired-db-file}. + + To tag image files, mark them in the dired buffer (you can also mark +files in Dired from the thumbnail buffer by typing @kbd{m}) and type +@kbd{C-t t} (@code{image-dired-tag-files}). You will be prompted for +a tag. To mark files having a certain tag, type @kbd{C-t f} +(@code{image-dired-mark-tagged-files}). After marking image files +with a certain tag, you can use @kbd{C-t d} to view them. + + You can also tag a file directly from the thumbnail buffer by typing +@kbd{t t} and you can remove a tag by typing @kbd{t r}. There is also +a special ``tag'' called ``comment'' for each file (it is not a tag in +the exact same sense as the other tags, it is handled slightly +different). That is used to enter a comment or description about the +image. You comment a file from the thumbnail buffer by typing +@kbd{c}. You will be prompted for a comment. Type @kbd{C-t c} to add +a comment from Dired (@code{image-dired-dired-comment-files}). + + Image-Dired also provides simple image manipulation. In the +thumbnail buffer, type @kbd{L} to rotate the original image 90 degrees +anti clockwise, and @kbd{R} to rotate it 90 degrees clockwise. This +rotation is lossless, and uses an external utility called JpegTRAN. + @node Misc Dired Features @section Other Dired Features
--- a/man/display.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/display.texi Tue Apr 24 21:56:25 2007 +0000 @@ -128,7 +128,7 @@ @code{scroll-preserve-screen-position} to a non-@code{nil} value. In this mode, when these commands would scroll the text around point off the screen, or within @code{scroll-margin} lines of the edge, they -moves point to keep the same vertical position within the window. +move point to keep the same vertical position within the window. This mode is convenient for browsing through a file by scrolling by screenfuls; if you come back to the screen where you started, point goes back to the line where it started. However, this mode is @@ -333,6 +333,11 @@ background colors for the current frame only; see @ref{Frame Parameters}.) + If you want to alter the appearance of all Emacs frames, you need to +customize the frame parameters in the variable +@code{default-frame-alist}; see @ref{Creating Frames, +default-frame-alist}. + Emacs can correctly display variable-width fonts, but Emacs commands that calculate width and indentation do not know how to calculate variable widths. This can sometimes lead to incorrect results when @@ -646,15 +651,14 @@ @cindex Hi Lock mode @findex hi-lock-mode - Hi Lock mode is another minor mode, which highlights text that -matches your specified regular expressions. For example, you might -wish to see all the references to a certain variable in a program -source file, highlight certain parts in a voluminous output of some -program, or make certain names stand out in an article. Use the -@kbd{M-x hi-lock-mode} command to enable (or disable) Hi Lock mode. -To enable Hi Lock mode for all buffers, use @kbd{M-x -global-hi-lock-mode} or place @code{(global-hi-lock-mode 1)} in your -@file{.emacs} file. + Hi Lock mode highlights text that matches regular expressions you +specify. For example, you might wish to see all the references to a +certain variable in a program source file, highlight certain parts in +a voluminous output of some program, or make certain names stand out +in an article. Use the @kbd{M-x hi-lock-mode} command to enable (or +disable) Hi Lock mode. To enable Hi Lock mode for all buffers, use +@kbd{M-x global-hi-lock-mode} or place @code{(global-hi-lock-mode 1)} +in your @file{.emacs} file. Hi Lock mode works like Font Lock mode (@pxref{Font Lock}), except that you specify explicitly the regular expressions to highlight. You @@ -706,26 +710,36 @@ program. (This key binding runs the @code{hi-lock-write-interactive-patterns} command.) -These patterns will be read the next time you visit the file while -Hi Lock mode is enabled, or whenever you use the @kbd{M-x -hi-lock-find-patterns} command. +These patterns are extracted from the comments, if appropriate, if you +invoke @kbd{M-x hi-lock-find-patterns}, or if you visit the file while +Hi Lock mode is enabled (since that runs @code{hi-lock-find-patterns}). @item C-x w i @kindex C-x w i @findex hi-lock-find-patterns -@vindex hi-lock-exclude-modes -Re-read regexp/face pairs in the current buffer -(@code{hi-lock-write-interactive-patterns}). Users familiar with Font -Lock keywords might interactively enter patterns -(@code{highlight-regexp}), write them into the file -(@code{hi-lock-write-interactive-patterns}), edit them, perhaps +Extract regexp/face pairs from comments in the current buffer +(@code{hi-lock-find-patterns}). Thus, you can enter patterns +interactively with @code{highlight-regexp}, store them into the file +with @code{hi-lock-write-interactive-patterns}, edit them (perhaps including different faces for different parenthesized parts of the -match, and finally use this command -(@code{hi-lock-write-interactive-patterns}) to have Hi Lock highlight -them. +match), and finally use this command (@code{hi-lock-find-patterns}) to +have Hi Lock highlight the edited patterns. -This command does nothing if the current major mode's symbol is a member -of the list @code{hi-lock-exclude-modes}. +@vindex hi-lock-file-patterns-policy +The variable @code{hi-lock-file-patterns-policy} controls whether Hi +Lock mode should automatically extract and highlight patterns found in +a file when it is visited. Its value can be @code{nil} (never +highlight), @code{t} (highlight the patterns), @code{ask} (query the +user), or a function. If it is a function, +@code{hi-lock-find-patterns} calls it with the patterns as argument; +if the function returns non-@code{nil}, the patterns are used. The +default is @code{nil}. Note that patterns are always highlighted if +you call @code{hi-lock-find-patterns} directly, regardless of the +value of this variable. + +@vindex hi-lock-exclude-modes +Also, @code{hi-lock-find-patterns} does nothing if the current major +mode's symbol is a member of the list @code{hi-lock-exclude-modes}. @end table @node Fringes
--- a/man/doclicense.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/doclicense.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1,6 +1,4 @@ @c -*-texinfo-*- -@node GNU Free Documentation License, Emacs Invocation, Copying, Top -@appendix GNU Free Documentation License @center Version 1.2, November 2002 @display
--- a/man/ebrowse.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/ebrowse.texi Tue Apr 24 21:56:25 2007 +0000 @@ -42,8 +42,6 @@ @title Ebrowse User's Manual @sp 4 @subtitle Ebrowse/Emacs -@sp 1 -@subtitle May 2000 @sp 5 @author Gerd Moellmann @page @@ -65,6 +63,7 @@ * Tree Buffers:: Traversing class hierarchies * Member Buffers:: Looking at member information * Tags-like Functions:: Finding members from source files +* GNU Free Documentation License:: The license for this documentation. * Concept Index:: An entry for each concept defined @end menu @@ -1240,7 +1239,7 @@ @comment *** TAGS LIKE FUNCTIONS @comment ************************************************************** -@node Tags-like Functions, Concept Index, Member Buffers, Top +@node Tags-like Functions, GNU Free Documentation License, Member Buffers, Top @comment node-name, next, previous, up @chapter Tags-like Functions @@ -1438,7 +1437,7 @@ -@node Member Buffer Display, , Symbol Completion, Tags-like Functions +@node Member Buffer Display, , Symbol Completion, Tags-like Functions @section Quick Member Display @cindex member buffer, for member at point @@ -1446,7 +1445,12 @@ in on with the command @kbd{C-c C-m m}. -@node Concept Index, , Tags-like Functions, Top +@node GNU Free Documentation License, Concept Index, Tags-like Functions, Top +@appendix GNU Free Documentation License +@include doclicense.texi + + +@node Concept Index, , GNU Free Documentation License, Top @unnumbered Concept Index @printindex cp
--- a/man/ediff.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/ediff.texi Tue Apr 24 21:56:25 2007 +0000 @@ -56,9 +56,9 @@ @titlepage @title Ediff User's Manual @sp 4 -@subtitle Ediff version 2.76.1 +@subtitle Ediff version 2.81.1 @sp 1 -@subtitle January 2002 +@subtitle April 2007 @sp 5 @author Michael Kifer @page @@ -80,6 +80,7 @@ * Remote and Compressed Files:: You may want to know about this. * Customization:: How to make Ediff work the way YOU want. * Credits:: Thanks to those who helped. +* GNU Free Documentation License:: The license for this documentation. * Index:: @end menu @@ -2411,7 +2412,7 @@ the control buffer is in its own frame. @end table -@node Credits, Index, Customization, Top +@node Credits, GNU Free Documentation License, Customization, Top @chapter Credits Ediff was written by Michael Kifer <kifer@@cs.stonybrook.edu>. It was inspired @@ -2527,7 +2528,12 @@ Eli Zaretskii (eliz@@is.elta.co.il) @end example -@node Index, , Credits, Top +@node GNU Free Documentation License, Index, Credits, Top +@appendix GNU Free Documentation License +@include doclicense.texi + + +@node Index, , GNU Free Documentation License, Top @unnumbered Index @printindex cp
--- a/man/emacs-mime.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/emacs-mime.texi Tue Apr 24 21:56:25 2007 +0000 @@ -75,6 +75,7 @@ * Interface Functions:: An abstraction over the basic functions. * Basic Functions:: Utility and basic parsing functions. * Standards:: A summary of RFCs and working documents used. +* GNU Free Documentation License:: The license for this documentation. * Index:: Function and variable index. @end menu @@ -1805,6 +1806,9 @@ @end table +@node GNU Free Documentation License +@chapter GNU Free Documentation License +@include doclicense.texi @node Index @chapter Index
--- a/man/emacs.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/emacs.texi Tue Apr 24 21:56:25 2007 +0000 @@ -5,7 +5,7 @@ @c The edition number appears in several places in this file @set EDITION Sixteenth -@set EMACSVER 22.0.97 +@set EMACSVER 22.0.98 @copying This is the @value{EDITION} edition of the @cite{GNU Emacs Manual}, @@ -39,15 +39,20 @@ @c in general, keep the following line commented out, unless doing a @c copy of this manual that will be published. the manual should go @c onto the distribution in the full, 8.5 x 11" size. +@set smallbook +@ifset smallbook @smallbook +@end ifset @c per rms and peterb, use 10pt fonts for the main text, mostly to @c save on paper cost. Also do not declare @setchapternewpage odd. @c Do this inside @tex for now, so current makeinfo does not complain. @tex +@ifset smallbook @fonttextsize 10 -\global\hbadness=6000 % don't worry about not-too-underfull boxes +@end ifset +\global\hbadness=6666 % don't worry about not-too-underfull boxes @end tex @defcodeindex op @@ -217,7 +222,6 @@ "recursive editing level". * Emulation:: Emulating some other editors with Emacs. * Hyperlinking:: Following links in buffers. -* Thumbnails:: Browsing images using thumbnails. * Dissociated Press:: Dissociating text for fun. * Amusements:: Various games and hacks. * Customization:: Modifying the behavior of Emacs. @@ -796,6 +800,7 @@ * Dired Updating:: Discarding lines for files of no interest. * Dired and Find:: Using `find' to choose the files for Dired. * Wdired:: Operating on files by editing the Dired buffer. +* Image-Dired:: Viewing image thumbnails in Dired * Misc Dired Features:: Various other features. The Calendar and the Diary @@ -1683,7 +1688,10 @@ library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. +@node GNU Free Documentation License, Emacs Invocation, Copying, Top +@appendix GNU Free Documentation License @include doclicense.texi + @include cmdargs.texi @include xresources.texi
--- a/man/erc.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/erc.texi Tue Apr 24 21:56:25 2007 +0000 @@ -20,7 +20,14 @@ Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no -Invariant Sections, Front-Cover texts, or Back-Cover Texts. +Invariant Sections, Front-Cover texts, or Back-Cover Texts. A copy of +the license is included in the section entitled ``GNU Free +Documentation License'' in the Emacs manual. + +This document is part of a collection distributed under the GNU Free +Documentation License. If you want to distribute this document +separately from the collection, you can do so by adding a copy of the +license to the document, as described in section 6 of the license. All Emacs Lisp code contained in this document may be used, distributed, and modified without restriction. @@ -61,6 +68,7 @@ * Advanced Usage:: Cool ways of using ERC. * Getting Help and Reporting Bugs:: * History:: The history of ERC. +* GNU Free Documentation License:: The license for this documentation. * Concept Index:: Search for terms. @detailmenu @@ -939,7 +947,7 @@ @end itemize -@node History, Concept Index, Getting Help and Reporting Bugs, Top +@node History, GNU Free Documentation License, Getting Help and Reporting Bugs, Top @comment node-name, next, previous, up @chapter History @cindex history, of ERC @@ -1001,7 +1009,11 @@ @end itemize -@node Concept Index, , History, Top +@node GNU Free Documentation License, Concept Index, History, Top +@appendix GNU Free Documentation License +@include doclicense.texi + +@node Concept Index, , GNU Free Documentation License, Top @comment node-name, next, previous, up @unnumbered Index
--- a/man/eshell.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/eshell.texi Tue Apr 24 21:56:25 2007 +0000 @@ -89,6 +89,7 @@ * Extension modules:: * Extras and Goodies:: * Bugs and ideas:: Known problems, and future ideas. +* GNU Free Documentation License:: The license for this documentation. * Concept Index:: * Function and Variable Index:: * Key Index:: @@ -922,6 +923,10 @@ @end table +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include doclicense.texi + @node Concept Index @unnumbered Concept Index
--- a/man/eudc.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/eudc.texi Tue Apr 24 21:56:25 2007 +0000 @@ -70,6 +70,7 @@ * Installation:: How to install EUDC * Usage:: The various usage possibilities explained * Credits:: Who's done what +* GNU Free Documentation License:: The license for this documentation. * Command and Function Index:: * Variables Index:: @end menu @@ -949,7 +950,7 @@ -@node Credits, Command and Function Index, Usage, Top +@node Credits, GNU Free Documentation License, Usage, Top @comment node-name, next, previous, up @chapter Credits @@ -959,7 +960,11 @@ Thanks to Soren Dayton for his suggestions, his enthusiasm and his help in testing and proofreading the code and docs of @file{ph.el}. -@node Command and Function Index, Variables Index, Credits, Top +@node GNU Free Documentation License, Command and Function Index, Credits, Top +@appendix GNU Free Documentation License +@include doclicense.texi + +@node Command and Function Index, Variables Index, GNU Free Documentation License, Top @comment node-name, next, previous, up @unnumbered Command and Function Index
--- a/man/faq.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/faq.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1211,8 +1211,8 @@ @item @cindex New modes Many new modes and packages have been included in Emacs, such as Calc, -TRAMP, URL, IDO, CUA, ERC, rcirc, Table, Tumme, SES, Ruler, Org, PGG, -Flymake, Password, Printing, Reveal, wdired, t-mouse, longlines, +TRAMP, URL, IDO, CUA, ERC, rcirc, Table, Image-Dired, SES, Ruler, Org, +PGG, Flymake, Password, Printing, Reveal, wdired, t-mouse, longlines, savehist, Conf mode, Python mode, DNS mode, etc. @cindex Multilingual Environment
--- a/man/files.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/files.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1153,13 +1153,14 @@ this---saving them---updates the files themselves. @vindex auto-save-list-file-prefix - Emacs records interrupted sessions for later recovery in files named + Emacs records information about interrupted sessions for later +recovery in files named @file{~/.emacs.d/auto-save-list/.saves-@var{pid}-@var{hostname}}. All -of this name except @file{@var{pid}-@var{hostname}} comes from the -value of @code{auto-save-list-file-prefix}. You can record sessions -in a different place by customizing that variable. If you set -@code{auto-save-list-file-prefix} to @code{nil} in your @file{.emacs} -file, sessions are not recorded for recovery. +of this name except the @file{@var{pid}-@var{hostname}} part comes +from the value of @code{auto-save-list-file-prefix}. You can record +sessions in a different place by customizing that variable. If you +set @code{auto-save-list-file-prefix} to @code{nil} in your +@file{.emacs} file, sessions are not recorded for recovery. @node File Aliases @section File Name Aliases @@ -2582,6 +2583,8 @@ A separate but similar Archive mode is used for archives produced by the programs @code{arc}, @code{jar}, @code{lzh}, @code{zip}, and @code{zoo}, which have extensions corresponding to the program names. +Archive mode also works for those @code{exe} files that are +self-extracting executables. The key bindings of Archive mode are similar to those in Tar mode, with the addition of the @kbd{m} key which marks a file for subsequent @@ -2815,13 +2818,8 @@ @findex thumbs-mode @findex mode, thumbs - Thumbs mode is a major mode for viewing directories containing many -image files. To use it, type @kbd{M-x thumbs} and specify the -directory to view. The images in that directory will be displayed in -a @samp{Thumbs} buffer as @dfn{thumbnails}; type @kbd{RET} on a -thumbnail to view the full-size image. Thumbs mode requires the -@file{convert} program, which is part of the ImageMagick software -package. + See also the Image-Dired package (@pxref{Image-Dired}) for viewing +images as thumbnails. @node Filesets @section Filesets
--- a/man/flymake.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/flymake.texi Tue Apr 24 21:56:25 2007 +0000 @@ -44,6 +44,7 @@ @author Pavel Kobiakov(@email{pk_at_work@@yahoo.com}) @page @vskip 0pt plus 1filll +@insertcopying @end titlepage @contents @@ -59,6 +60,7 @@ * Using Flymake:: * Configuring Flymake:: * Flymake Implementation:: +* GNU Free Documentation License:: * Index:: @end menu @@ -744,6 +746,10 @@ It just kills all the active syntax check processes before calling @code{compile}. +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include doclicense.texi + @node Index @unnumbered Index
--- a/man/forms.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/forms.texi Tue Apr 24 21:56:25 2007 +0000 @@ -53,9 +53,9 @@ @sp 4 @center Forms-Mode version 2 @sp 1 -@center for GNU Emacs 20.1 +@center for GNU Emacs 22.1 @sp 1 -@center June 1997 +@center April 2007 @sp 5 @center Johan Vromans @center @i{jvromans@@squirrel.nl} @@ -91,6 +91,7 @@ * Miscellaneous:: Forms mode messages and other remarks. * Error Messages:: List of error messages forms mode can produce. * Long Example:: A more complex control file example. +* GNU Free Documentation License:: The license for this documentation. * Credits:: Thanks everyone. * Index:: Index to this manual. @end menu @@ -968,6 +969,10 @@ None of this would have been possible without GNU Emacs of the Free Software Foundation. Thanks, Richard! +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include doclicense.texi + @node Index @unnumbered Index @printindex cp
--- a/man/frames.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/frames.texi Tue Apr 24 21:56:25 2007 +0000 @@ -515,6 +515,8 @@ @cindex default-frame-alist @cindex initial-frame-alist +@cindex face customization, in @file{~/.emacs} +@cindex color customization, in @file{~/.emacs} You can control the appearance of new frames you create by setting the frame parameters in @code{default-frame-alist}. You can use the variable @code{initial-frame-alist} to specify parameters that affect @@ -538,6 +540,11 @@ (add-to-list 'default-frame-alist '(foreground-color . "blue")) @end example +@noindent +By putting such customizations in your @file{~/.emacs} init file, you +can control the appearance of all the frames Emacs creates, including +the initial one. + @node Frame Commands @section Frame Commands @@ -874,7 +881,7 @@ @vindex mouse-wheel-follow-mouse @vindex mouse-wheel-scroll-amount @vindex mouse-wheel-progressive-speed - The variables @code{mouse-wheel-follow-mouse} and + The two variables @code{mouse-wheel-follow-mouse} and @code{mouse-wheel-scroll-amount} determine where and by how much buffers are scrolled. The variable @code{mouse-wheel-progressive-speed} determines whether the scroll
--- a/man/glossary.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/glossary.texi Tue Apr 24 21:56:25 2007 +0000 @@ -601,6 +601,10 @@ @kbd{Hyper-} (usually written @kbd{H-} for short). @xref{User Input, Hyper}. +@item Iff +``Iff'' means ``if and only if.'' This terminology comes from +mathematics. + @item Inbox An inbox is a file in which mail is delivered by the operating system. Rmail transfers mail from inboxes to Rmail files (q.v.@:) in which the
--- a/man/gnu.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/gnu.texi Tue Apr 24 21:56:25 2007 +0000 @@ -41,10 +41,9 @@ that different wording could help avoid. Footnotes added in 1993 help clarify these points. -For up-to-date information about the available GNU software, please -see @uref{http://www.gnu.org}. For software tasks to work on, see -@uref{http://savannah.gnu.org/projects/tasklist}. For other ways to -contribute, see @uref{http://www.gnu.org/help}. +For up-to-date information about available GNU software, please see +our web site, @uref{http://www.gnu.org}. For software tasks and other +ways to contribute, see @uref{http://www.gnu.org/help}. @end quotation @unnumberedsec What's GNU? Gnu's Not Unix! @@ -503,10 +502,11 @@ employ programmers. People with new ideas could distribute programs as -freeware@footnote{Subsequently we have learned to distinguish between -"free software" and "freeware". The term "freeware" means software -you are free to redistribute, but usually you are not free to study -and change the source code, so most of it is not free software. See +freeware@footnote{Subsequently we have discovered the need to +distinguish between ``free software'' and ``freeware''. The term +``freeware'' means software you are free to redistribute, but usually +you are not free to study and change the source code, so most of it is +not free software. See @uref{http://www.gnu.org/philosophy/words-to-avoid.html} for more explanation.}, asking for donations from satisfied users, or selling hand-holding services. I have met people who are already working this
--- a/man/gnus.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/gnus.texi Tue Apr 24 21:56:25 2007 +0000 @@ -402,6 +402,7 @@ * Various:: General purpose settings. * The End:: Farewell and goodbye. * Appendices:: Terminology, Emacs intro, @acronym{FAQ}, History, Internals. +* GNU Free Documentation License:: The license for this documentation. * Index:: Variable, function and concept index. * Key Index:: Key Index. @@ -29028,6 +29029,10 @@ @page @include gnus-faq.texi +@node GNU Free Documentation License +@chapter GNU Free Documentation License +@include doclicense.texi + @node Index @chapter Index @printindex cp
--- a/man/idlwave.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/idlwave.texi Tue Apr 24 21:56:25 2007 +0000 @@ -106,6 +106,7 @@ * Configuration Examples:: The user is king * Windows and MacOS:: What still works, and how * Troubleshooting:: When good computers turn bad +* GNU Free Documentation License:: The license for this documentation. * Index:: Fast access @detailmenu @@ -4096,7 +4097,7 @@ @html <A NAME="TROUBLE"></A> @end html -@node Troubleshooting, Index, Windows and MacOS, Top +@node Troubleshooting, GNU Free Documentation License, Windows and MacOS, Top @appendix Troubleshooting @cindex Troubleshooting @@ -4302,7 +4303,11 @@ @end enumerate -@node Index, , Troubleshooting, Top +@node GNU Free Documentation License, Index, Troubleshooting, Top +@appendix GNU Free Documentation License +@include doclicense.texi + +@node Index, , GNU Free Documentation License, Top @unnumbered Index @printindex cp
--- a/man/killing.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/killing.texi Tue Apr 24 21:56:25 2007 +0000 @@ -551,13 +551,13 @@ (@code{open-rectangle}). This pushes the previous contents of the region-rectangle rightward. @item C-x r c -Clear the region-rectangle by replacing its contents with spaces +Clear the region-rectangle by replacing all of its contents with spaces (@code{clear-rectangle}). @item M-x delete-whitespace-rectangle Delete whitespace in each of the lines on the specified rectangle, starting from the left edge column of the rectangle. @item C-x r t @var{string} @key{RET} -Replace rectangle contents with @var{string} on each line. +Replace rectangle contents with @var{string} on each line (@code{string-rectangle}). @item M-x string-insert-rectangle @key{RET} @var{string} @key{RET} Insert @var{string} on each line of the rectangle.
--- a/man/macos.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/macos.texi Tue Apr 24 21:56:25 2007 +0000 @@ -319,8 +319,9 @@ -apple-monaco-medium-r-normal--12-*-*-*-*-*-iso10646-1 @end example -Note that it must be specified in a format containing 14 @samp{-}s -(e.g., not by @samp{-apple-monaco-medium-r-normal--12-*-iso10646-1}), +Note that these names must be specified using a format containing all +14 @samp{-}s (not by +@samp{-apple-monaco-medium-r-normal--12-*-iso10646-1}, for instance), because every @acronym{ATSUI}-compatible font is a scalable one. QuickDraw Text fonts have maker name @code{apple} and various charset @@ -340,7 +341,7 @@ Native Apple Traditional Chinese, Simplified Chinese, Japanese, Korean, Central European, Cyrillic, Symbol, and Dingbats fonts have -charsets @samp{big5-0}, @samp{gb2312.1980-0}, +the charsets @samp{big5-0}, @samp{gb2312.1980-0}, @samp{jisx0208.1983-sjis} and @samp{jisx0201.1976-0}, @samp{ksc5601.1989-0}, @samp{mac-centraleurroman}, @samp{mac-cyrillic}, @samp{mac-symbol}, and @samp{mac-dingbats},
--- a/man/message.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/message.texi Tue Apr 24 21:56:25 2007 +0000 @@ -63,6 +63,7 @@ * Variables:: Customizing the message buffers. * Compatibility:: Making Message backwards compatible. * Appendices:: More technical things. +* GNU Free Documentation License:: The license for this documentation. * Index:: Variable, function and concept index. * Key Index:: List of Message mode keys. @end menu @@ -2338,6 +2339,9 @@ @end table +@node GNU Free Documentation License +@chapter GNU Free Documentation License +@include doclicense.texi @node Index @chapter Index
--- a/man/misc.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/misc.texi Tue Apr 24 21:56:25 2007 +0000 @@ -2177,8 +2177,9 @@ @item EDT (DEC VMS editor) @findex edt-emulation-on @findex edt-emulation-off -Turn on EDT emulation with @kbd{M-x edt-emulation-on}. @kbd{M-x -edt-emulation-off} restores normal Emacs command bindings. +Turn on EDT emulation with the command @kbd{M-x edt-emulation-on}, +while @kbd{M-x edt-emulation-off} restores normal Emacs command +bindings. Most of the EDT emulation commands are keypad keys, and most standard Emacs key bindings are still available. The EDT emulation rebindings @@ -2234,7 +2235,7 @@ key bindings. @end table -@node Hyperlinking, Thumbnails, Emulation, Top +@node Hyperlinking, Dissociated Press, Emulation, Top @section Hyperlinking and Navigation Features @cindex hyperlinking @@ -2400,76 +2401,7 @@ find the one you select (@code{ffap-menu}). @end table -@node Thumbnails, Dissociated Press, Hyperlinking, Top -@section Viewing Images as Thumbnails -@cindex tumme mode -@cindex thumbnails - - Tumme is a facility for browsing image files. It provides viewing -the images either as thumbnails or in full size, either inside Emacs -or through an external viewer. - - To enter Tumme, type @kbd{M-x tumme}. It prompts for a directory; -specify one that has images files. This creates thumbnails for all -the images in that directory, and displays them all in the ``thumbnail -buffer.'' This takes a long time if the directory contains many image -files, and it asks for confirmation if the number of image files -exceeds @code{tumme-show-all-from-dir-max-files}. - -@kindex C-t d @r{(Tumme)} -@findex tumme-display-thumbs - You can also enter Tumme through Dired. Mark the image files you -want to look at, using @kbd{m} as usual, then type @kbd{C-t d} -(@code{tumme-display-thumbs}). This too creates and switches to -a buffer containing thumbnails, corresponding to the marked files. - - With point in the thumbnail buffer, type @kbd{RET} -(@code{tumme-display-thumbnail-original-image}) to display a sized -version of it in another window. This sizes the image to fit the -window. Use the arrow keys to move around in the buffer. For easy -browsing, type @kbd{SPC} (@code{tumme-display-next-thumbnail-original}) -to advance and display the next image. Typing @kbd{DEL} -(@code{tumme-display-previous-thumbnail-original}) backs up to the -previous thumbnail and displays that instead. - -@vindex tumme-external-viewer - To view and the image in its original size, either provide a prefix -argument (@kbd{C-u}) before pressing @kbd{RET}, or type @kbd{C-@key{RET}} -(@code{tumme-thumbnail-display-external}) to display the image in an -external viewer. You must first configure -@code{tumme-external-viewer}. - - You can delete images through Tumme also. Type @kbd{d} -(@code{tumme-flag-thumb-original-file}) to flag the image file for -deletion in the Dired buffer. You can also delete the thumbnail image -from the thumbnail buffer with @kbd{C-d} (@code{tumme-delete-char}). - - More advanced features include @dfn{image tags}, which are metadata -used to categorize image files. The tags are stored in a plain text -file configured by @code{tumme-db-file}. - - To tag image files, mark them in the dired buffer (you can also mark -files in Dired from the thumbnail buffer by typing @kbd{m}) and type -@kbd{C-t t} (@code{tumme-tag-files}). You will be prompted for a tag. -To mark files having a certain tag, type @kbd{C-t f} -(@code{tumme-mark-tagged-files}). After marking image files with a -certain tag, you can use @kbd{C-t d} to view them. - - You can also tag a file directly from the thumbnail buffer by typing -@kbd{t t} and you can remove a tag by typing @kbd{t r}. There is also -a special ``tag'' called ``comment'' for each file (it is not a tag in -the exact same sense as the other tags, it is handled slightly -different). That is used to enter a comment or description about the -image. You comment a file from the thumbnail buffer by typing -@kbd{c}. You will be prompted for a comment. Type @kbd{C-t c} to add -a comment from Dired (@code{tumme-dired-comment-files}). - - Tumme also provides simple image manipulation. In the thumbnail -buffer, type @kbd{L} to rotate the original image 90 degrees anti -clockwise, and @kbd{R} to rotate it 90 degrees clockwise. This -rotation is lossless, and uses an external utility called JpegTRAN. - -@node Dissociated Press, Amusements, Thumbnails, Top +@node Dissociated Press, Amusements, Hyperlinking, Top @section Dissociated Press @findex dissociated-press
--- a/man/mule.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/mule.texi Tue Apr 24 21:56:25 2007 +0000 @@ -261,6 +261,9 @@ characters and files encoded in UTF-8), Ukrainian, Vietnamese, Welsh, and Windows-1255 (for a setup which prefers Cyrillic characters and files encoded in Windows-1255). +@tex +\hbadness=10000\par % just avoid underfull hbox warning +@end tex @end quotation @cindex fonts for various scripts
--- a/man/newsticker.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/newsticker.texi Tue Apr 24 21:56:25 2007 +0000 @@ -48,6 +48,7 @@ @author @uref{http://de.geocities.com/ulf_jasper} @page @vskip 0pt plus 1filll +@insertcopying @end titlepage @contents @@ -64,6 +65,7 @@ * Usage:: Basic newsticker instructions. * Configuration:: Customizable newsticker settings. * Remarks:: Remarks about newsticker. +* GNU Free Documentation License:: The license for this documentation. * Index:: Variable, function, and concept index. @end menu @@ -270,7 +272,9 @@ Byte-compiling newsticker.el is recommended. - +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include doclicense.texi @node Index @unnumbered Index
--- a/man/org.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/org.texi Tue Apr 24 21:56:25 2007 +0000 @@ -89,6 +89,7 @@ * Miscellaneous:: All the rest which did not fit elsewhere * Extensions and Hacking:: It is possible to write add-on code * History and Acknowledgments:: How Org-mode came into being +* GNU Free Documentation License:: The license for this documentation. * Index:: The fast road to specific information * Key Index:: Key bindings and where they are described @@ -1478,9 +1479,9 @@ @cindex syntax, of formulas A formula can be any algebraic expression understood by the Emacs -@file{Calc} package. Note that @file{calc} has the slightly +@file{Calc} package. @b{Note that @file{calc} has the non-standard convention that @samp{/} has lower precedence than -@samp{*}, so that @samp{a/b*c} is interpreted as @samp{a/(b*c)}. Before +@samp{*}, so that @samp{a/b*c} is interpreted as @samp{a/(b*c)}.} Before evaluation by @code{calc-eval} (@pxref{Calling Calc from Your Programs,calc-eval,Calling calc from Your Lisp Programs,calc,GNU Emacs Calc Manual}), @@ -6416,7 +6417,7 @@ @end lisp -@node History and Acknowledgments, Index, Extensions and Hacking, Top +@node History and Acknowledgments, GNU Free Documentation License, Extensions and Hacking, Top @appendix History and Acknowledgments @cindex acknowledgments @cindex history @@ -6567,8 +6568,12 @@ and contributed various ideas and code snippets. @end itemize - -@node Index, Key Index, History and Acknowledgments, Top +@node GNU Free Documentation License, Index, History and Acknowledgments, Top +@appendix GNU Free Documentation License +@include doclicense.texi + + +@node Index, Key Index, GNU Free Documentation License, Top @unnumbered Index @printindex cp
--- a/man/pcl-cvs.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/pcl-cvs.texi Tue Apr 24 21:56:25 2007 +0000 @@ -91,6 +91,7 @@ * Customization:: How you can tailor PCL-CVS to suit your needs. * Bugs:: Bugs (known and unknown). +* GNU Free Documentation License:: The license for this documentation. * Function and Variable Index:: List of functions and variables. * Concept Index:: List of concepts. * Key Index:: List of keystrokes. @@ -1363,7 +1364,7 @@ @end table -@node Bugs, Function and Variable Index, Customization, Top +@node Bugs, GNU Free Documentation License, Customization, Top @chapter Bugs (known and unknown) @cindex Reporting bugs and ideas @cindex Bugs, how to report them @@ -1403,7 +1404,13 @@ buffer), and the versions of Emacs, PCL-CVS and CVS you are using. @end table -@node Function and Variable Index, Concept Index, Bugs, Top +@node GNU Free Documentation License, Function and Variable Index, Bugs, Top +@appendix GNU Free Documentation License +@include doclicense.texi + + + +@node Function and Variable Index, Concept Index, GNU Free Documentation License, Top @unnumbered Function and Variable Index This is an index of all the functions and variables documented in this
--- a/man/pgg.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/pgg.texi Tue Apr 24 21:56:25 2007 +0000 @@ -52,6 +52,7 @@ * How to use:: Getting started quickly. * Architecture:: * Parsing OpenPGP packets:: +* GNU Free Documentation License:: The license for this documentation. * Function Index:: * Variable Index:: @end menu @@ -474,12 +475,16 @@ If non-@code{nil}, don't check the checksum of the packets. @end defvar +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include doclicense.texi + @node Function Index -@chapter Function Index +@unnumbered Function Index @printindex fn @node Variable Index -@chapter Variable Index +@unnumbered Variable Index @printindex vr @summarycontents
--- a/man/programs.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/programs.texi Tue Apr 24 21:56:25 2007 +0000 @@ -338,13 +338,13 @@ @findex which-function-mode @vindex which-func-modes - To enable (or disable) Which Function mode, use the command @kbd{M-x -which-function-mode}. This command is global; it applies to all -buffers, both existing ones and those yet to be created. However, it -takes effect only in certain major modes, those listed in the value of -@code{which-func-modes}. If the value is @code{t}, then Which Function -mode applies to all major modes that know how to support it---in other -words, all the major modes that support Imenu. + To either enable or disable Which Function mode, use the command +@kbd{M-x which-function-mode}. This command is global; it applies to +all buffers, both existing ones and those yet to be created. However, +it takes effect only in certain major modes, those listed in the value +of @code{which-func-modes}. If the value is @code{t}, then Which +Function mode applies to all major modes that know how to support +it---in other words, all the major modes that support Imenu. @node Program Indent @section Indentation for Programs
--- a/man/rcirc.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/rcirc.texi Tue Apr 24 21:56:25 2007 +0000 @@ -55,6 +55,7 @@ * Basics:: * Reference:: * Hacking and Tweaking:: +* GNU Free Documentation License:: * Key Index:: * Variable Index:: * Index:: @@ -589,7 +590,7 @@ (rcirc-track-minor-mode 1))) @end example -@node Hacking and Tweaking, Key Index, Reference, Top +@node Hacking and Tweaking, GNU Free Documentation License, Reference, Top @chapter Hacking and Tweaking @cindex hacking and tweaking @@ -743,7 +744,12 @@ channels)))) @end smallexample -@node Key Index, Variable Index, Hacking and Tweaking, Top +@node GNU Free Documentation License, Key Index, Hacking and Tweaking, Top +@appendix GNU Free Documentation License +@include doclicense.texi + + +@node Key Index, Variable Index, GNU Free Documentation License, Top @unnumbered Key Index @printindex ky
--- a/man/reftex.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/reftex.texi Tue Apr 24 21:56:25 2007 +0000 @@ -116,6 +116,7 @@ * Options:: How to extend and configure RefTeX. * Keymaps and Hooks:: For customization. * Changes:: A List of recent changes to RefTeX. +* GNU Free Documentation License:: The license for this documentation. The Index @@ -5149,7 +5150,7 @@ are many more hooks which are described in the relevant sections about options for a specific part of @b{Ref@TeX{}}. -@node Changes, , Keymaps and Hooks, Top +@node Changes, GNU Free Documentation License, Keymaps and Hooks, Top @chapter Changes @cindex Changes @@ -5880,11 +5881,11 @@ released on 7 Jan 1997. @end itemize - - - - -@node Index, , , Top +@node GNU Free Documentation License, Index, Changes, Top +@appendix GNU Free Documentation License +@include doclicense.texi + +@node Index, , GNU Free Documentation License, Top @unnumbered Index @printindex cp
--- a/man/rmail.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/rmail.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1382,9 +1382,10 @@ Otherwise, Rmail assumes no password is required. @end enumerate - For compatibility with previous versions, @code{rmail-pop-password} -and @code{rmail-pop-password-required} may be used instead of -@code{rmail-remote-password} and @code{rmail-remote-password-required}. + For compatibility with previous versions, the variables +@code{rmail-pop-password} and @code{rmail-pop-password-required} may +be used instead of @code{rmail-remote-password} and +@code{rmail-remote-password-required}. @vindex rmail-movemail-flags If you need to pass additional command-line flags to @code{movemail},
--- a/man/sc.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/sc.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1,5 +1,5 @@ \input texinfo @comment -*-texinfo-*- -@comment 3.47 +@comment 3.48 @comment %**start of header (This is for running Texinfo on a region.) @setfilename ../info/sc @settitle Supercite Version 3.1 User's Manual @@ -52,8 +52,8 @@ @sp 2 @center @titlefont{Supercite Version 3.1} @sp 4 -@center Manual Revision: 3.47 -@center August 1993 +@center Manual Revision: 3.48 +@center April 2007 @sp 5 @center Barry A@. Warsaw @center @t{bwarsaw@@cen.com} @@ -86,6 +86,7 @@ * Thanks and History:: * The Supercite Mailing List:: +* GNU Free Documentation License:: * Concept Index:: * Command Index:: * Key Index:: @@ -2444,7 +2445,7 @@ All who have helped and contributed have been greatly appreciated. -@node The Supercite Mailing List, Concept Index, Thanks and History, Top +@node The Supercite Mailing List, GNU Free Documentation License, Thanks and History, Top @comment node-name, next, previous, up @cindex supercite mailing list address @cindex mailing list address @@ -2481,7 +2482,11 @@ supercite-help@@python.org @end example -@node Concept Index, Command Index, The Supercite Mailing List, Top +@node GNU Free Documentation License, Concept Index, The Supercite Mailing List, Top +@appendix GNU Free Documentation License +@include doclicense.texi + +@node Concept Index, Command Index, GNU Free Documentation License, Top @comment node-name, next, previous, up @unnumbered Concept Index @printindex cp
--- a/man/search.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/search.texi Tue Apr 24 21:56:25 2007 +0000 @@ -1002,6 +1002,9 @@ A numeric argument restricts replacement to matches that are surrounded by word boundaries. The argument's value doesn't matter. + @xref{Replacement and Case}, for details about case-sensitivity in +replace commands. + What if you want to exchange @samp{x} and @samp{y}: replace every @samp{x} with a @samp{y} and vice versa? You can do it this way: @example @@ -1155,9 +1158,9 @@ occurrence and asks you whether to replace it. Aside from querying, @code{query-replace} works just like @code{replace-string}. It preserves case, like @code{replace-string}, provided -@code{case-replace} is non-@code{nil}, as it normally is. A numeric -argument means consider only occurrences that are bounded by -word-delimiter characters. +@code{case-replace} is non-@code{nil}, as it normally is +(@pxref{Replacement and Case}). A numeric argument means consider +only occurrences that are bounded by word-delimiter characters. @kindex C-M-% @findex query-replace-regexp
--- a/man/sending.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/sending.texi Tue Apr 24 21:56:25 2007 +0000 @@ -240,11 +240,11 @@ @item nil Use just the email address, as in @samp{king@@grassland.com}. @item parens -Use both email address and full name, as in @samp{king@@grassland.com (Elvis -Parsley)}. +Use both email address and full name, as in:@* +@samp{king@@grassland.com (Elvis Parsley)}. @item angles -Use both email address and full name, as in @samp{Elvis Parsley -<king@@grassland.com>}. +Use both email address and full name, as in:@* +@samp{Elvis Parsley <king@@grassland.com>}. @item system-default Allow the system to insert the @samp{From} field. @end table
--- a/man/ses.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/ses.texi Tue Apr 24 21:56:25 2007 +0000 @@ -77,6 +77,7 @@ * For Gurus:: Want to know @emph{even more}? * Index:: Concept, Function and Variable Index * Acknowledgements:: Acknowledgements +* GNU Free Documentation License:: The license for this documentation. @end menu @c =================================================================== @@ -929,7 +930,7 @@ @c =================================================================== -@node Acknowledgements, , Index, Top +@node Acknowledgements, GNU Free Documentation License, Index, Top @chapter Acknowledgements Coding by: @@ -970,6 +971,10 @@ @c =================================================================== +@node GNU Free Documentation License, , Acknowledgements, Top +@appendix GNU Free Documentation License +@include doclicense.texi + @bye @ignore
--- a/man/sieve.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/sieve.texi Tue Apr 24 21:56:25 2007 +0000 @@ -73,6 +73,7 @@ * Examples :: A few Sieve code snippets. * Manage Sieve API :: Interfacing to the Manage Sieve Protocol API. * Standards:: A summary of RFCs and working documents used. +* GNU Free Documentation License:: The license for this documentation. * Index:: Function and variable index. @end menu @@ -349,9 +350,12 @@ @end table +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include doclicense.texi @node Index -@chapter Index +@unnumbered Index @printindex cp @summarycontents
--- a/man/smtpmail.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/smtpmail.texi Tue Apr 24 21:56:25 2007 +0000 @@ -55,6 +55,7 @@ * Queued delivery:: Sending mail without an internet connection. * Server workarounds:: Mail servers with special requirements. * Debugging:: Tracking down problems. +* GNU Free Documentation License:: The license for this documentation. Indices @@ -403,6 +404,10 @@ @end table +@node GNU Free Documentation License +@chapter GNU Free Documentation License +@include doclicense.texi + @node Index @chapter Index
--- a/man/speedbar.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/speedbar.texi Tue Apr 24 21:56:25 2007 +0000 @@ -82,6 +82,7 @@ * Minor Modes:: Additional minor modes such as Info and RMAIL. * Customizing:: Changing speedbar behavior. * Extending:: Extend speedbar for your own project. +* GNU Free Documentation License:: The license for this documentation. * Index:: @end menu @@ -885,7 +886,7 @@ state data. @end table -@node Extending, Index, Customizing, Top +@node Extending, GNU Free Documentation License, Customizing, Top @comment node-name, next, previous, up @chapter Extending @cindex extending @@ -1241,7 +1242,12 @@ @end defun -@node Index, , Extending, Top +@node GNU Free Documentation License, Index, Extending, Top +@appendix GNU Free Documentation License +@include doclicense.texi + + +@node Index, , GNU Free Documentation License, Top @comment node-name, next, previous, up @unnumbered Concept Index @printindex cp
--- a/man/tramp.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/tramp.texi Tue Apr 24 21:56:25 2007 +0000 @@ -159,6 +159,8 @@ * Files directories and localnames:: How file names, directories and localnames are mangled and managed. * Issues:: Debatable Issues and What Was Decided. +* GNU Free Documentation License:: The license for this documentation. + @detailmenu --- The Detailed Node Listing --- @c @@ -2406,6 +2408,10 @@ @end ifset @end itemize +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include doclicense.texi + @node Concept Index @comment node-name, next, previous, up @unnumbered Concept Index
--- a/man/url.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/url.texi Tue Apr 24 21:56:25 2007 +0000 @@ -74,6 +74,7 @@ * General Facilities:: URLs can be cached, accessed via a gateway and tracked in a history list. * Customization:: Variables you can alter. +* GNU Free Documentation License:: The license for this documentation. * Function Index:: * Variable Index:: * Concept Index:: @@ -1176,6 +1177,10 @@ @end table @end defopt +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include doclicense.texi + @node Function Index @unnumbered Command and Function Index @printindex fn
--- a/man/vip.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/vip.texi Tue Apr 24 21:56:25 2007 +0000 @@ -73,6 +73,8 @@ * Vi Commands:: Details of Vi commands. * Ex Commands:: Details of Ex commands. * Customization:: How to customize VIP. +* GNU Free Documentation License:: The license for this documentation. + @end menu @iftex @unnumbered Introduction @@ -1935,6 +1937,11 @@ (define-key vip-command-mode-map "X" 'vip-delete-backward-char) @end example +@node GNU Free Documentation License,,, Top +@appendix GNU Free Documentation License +@include doclicense.texi + + @unnumbered Key Index @printindex ky
--- a/man/viper.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/viper.texi Tue Apr 24 21:56:25 2007 +0000 @@ -42,7 +42,7 @@ @titlepage @title Viper Is a Package for Emacs Rebels @subtitle a Vi emulator for Emacs -@subtitle January 2002, Viper Version 3.11.2 +@subtitle April 2007, Viper Version 3.13.1 @author Michael Kifer (Viper) @author Aamod Sane (VIP 4.4) @@ -114,6 +114,8 @@ * Concept Index:: Vi, Ex and Emacs concepts * Acknowledgments:: +* GNU Free Documentation License:: The license for this documentation. + @end menu @iftex @unnumbered Introduction @@ -4534,6 +4536,9 @@ zapman@@cc.gatech.edu (Jason Zapman II), @end example +@node GNU Free Documentation License,,, Top +@appendix GNU Free Documentation License +@include doclicense.texi @node Key Index,Function Index,,Top @comment node-name, next, previous, up
--- a/man/widget.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/widget.texi Tue Apr 24 21:56:25 2007 +0000 @@ -57,6 +57,7 @@ * Widget Minor Mode:: * Utilities:: * Widget Wishlist:: +* GNU Free Documentation License:: * Index:: @end menu @@ -1774,7 +1775,7 @@ This is only meaningful for radio buttons or checkboxes in a list. @end defun -@node Widget Wishlist, Index, Utilities, Top +@node Widget Wishlist, GNU Free Documentation License, Utilities, Top @comment node-name, next, previous, up @section Wishlist @cindex todo @@ -1833,7 +1834,11 @@ Add a @code{mailto} widget. @end itemize -@node Index, , Widget Wishlist, Top +@node GNU Free Documentation License, Index, Widget Wishlist, Top +@appendix GNU Free Documentation License +@include doclicense.texi + +@node Index, , GNU Free Documentation License, Top @comment node-name, next, previous, up @unnumbered Index
--- a/man/woman.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/woman.texi Tue Apr 24 21:56:25 2007 +0000 @@ -99,6 +99,7 @@ * Technical:: Technical Details * Bugs:: Reporting Bugs * Acknowledgements:: Acknowledgements +* GNU Free Documentation License:: The license for this documentation. * Command Index:: Command Index * Variable Index:: Variable Index * Keystroke Index:: Keystroke Index @@ -1334,7 +1335,7 @@ @c =================================================================== -@node Acknowledgements, Command Index, Bugs, Top +@node Acknowledgements, GNU Free Documentation License, Bugs, Top @comment node-name, next, previous, up @chapter Acknowledgements @cindex acknowledgements @@ -1390,7 +1391,12 @@ @comment END OF MANUAL TEXT @page -@node Command Index, Variable Index, Acknowledgements, Top + +@node GNU Free Documentation License, Command Index, Acknowledgements, Top +@appendix GNU Free Documentation License +@include doclicense.texi + +@node Command Index, Variable Index, GNU Free Documentation License, Top @comment node-name, next, previous, up @unnumbered Command Index
--- a/man/xresources.texi Tue Apr 24 11:35:23 2007 +0000 +++ b/man/xresources.texi Tue Apr 24 21:56:25 2007 +0000 @@ -58,14 +58,15 @@ (optionally even for all programs). @cindex Registry (MS-Windows) - MS-Windows systems don't support @file{~/.Xdefaults} files, but -Emacs compiled for Windows looks for X resources in the Windows -Registry, under the key @samp{HKEY_CURRENT_USER\SOFTWARE\GNU\Emacs} -and then under the key @samp{HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs}. -The menu and scroll bars are native widgets on MS-Windows, so they are -only customizable via the system-wide settings in the Display Control -Panel. You can also set resources using the @samp{-xrm} command line -option (see below.) + MS-Windows systems do not support @file{~/.Xdefaults} files, so +instead Emacs compiled for Windows looks for X resources in the +Windows Registry, first under the key +@samp{HKEY_CURRENT_USER\SOFTWARE\GNU\Emacs} and then under the key +@samp{HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs}. The menu and scroll +bars are native widgets on MS-Windows, so they are only customizable +via the system-wide settings in the Display Control Panel. You can +also set resources using the @samp{-xrm} command line option (see +below.) @iftex Applications such as Emacs look for resources with specific names
--- a/nt/emacs.rc Tue Apr 24 11:35:23 2007 +0000 +++ b/nt/emacs.rc Tue Apr 24 21:56:25 2007 +0000 @@ -6,8 +6,8 @@ #endif VS_VERSION_INFO VERSIONINFO - FILEVERSION 22,0,97,0 - PRODUCTVERSION 22,0,97,0 + FILEVERSION 22,0,98,0 + PRODUCTVERSION 22,0,98,0 FILEFLAGSMASK 0x3FL #ifdef EMACSDEBUG FILEFLAGS 0x1L @@ -24,12 +24,12 @@ BEGIN VALUE "CompanyName", "Free Software Foundation\0" VALUE "FileDescription", "GNU Emacs for Windows NT/95/98/2000/ME/XP\0" - VALUE "FileVersion", "22, 0, 97, 0\0" + VALUE "FileVersion", "22, 0, 98, 0\0" VALUE "InternalName", "Emacs\0" VALUE "LegalCopyright", "Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007\0" VALUE "OriginalFilename", "emacs.exe" VALUE "ProductName", "Emacs: The extensible self-documenting text editor\0" - VALUE "ProductVersion", "22, 0, 97, 0\0" + VALUE "ProductVersion", "22, 0, 98, 0\0" VALUE "OLESelfRegister", "\0" END END
--- a/src/ChangeLog Tue Apr 24 11:35:23 2007 +0000 +++ b/src/ChangeLog Tue Apr 24 21:56:25 2007 +0000 @@ -1,3 +1,86 @@ +2007-04-24 Chong Yidong <cyd@stupidchicken.com> + + * xdisp.c (redisplay_window): Use BEG_UNCHANGED and END_UNCHANGED + values of the actual window. + +2007-04-23 Richard Stallman <rms@gnu.org> + + * process.c (Fstart_process): Doc fix. + +2007-04-23 Eli Zaretskii <eliz@gnu.org> + + * process.c (Fstart_process): Doc fix. + +2007-04-22 Richard Stallman <rms@gnu.org> + + * abbrev.c (Fdefine_abbrev): Doc fix. + + * keymap.c (Fdefine_key): Minor doc fix. + +2007-04-21 Glenn Morris <rgm@gnu.org> + + * keymap.c (Fdefine_key): Fix info ref in doc string. + +2007-04-20 Glenn Morris <rgm@gnu.org> + + * sysdep.c (init_system_name): Don't accept localhost.localdomain. + +2007-04-19 Juanma Barranquero <lekktu@gmail.com> + + * minibuf.c (Fminibuffer_contents, Fminibuffer_contents_no_properties) + (Fminibuffer_completion_contents, Fdelete_minibuffer_contents): + Doc fixes. + +2007-04-16 Chong Yidong <cyd@stupidchicken.com> + + * dispnew.c (adjust_frame_glyphs_for_frame_redisplay): Set + garbaged flag in presence of window margins. + (showing_window_margins_p): New function. + + * xdisp.c (cursor_row_p): Only end row on newline if it's a + display string. Suggested by Lennart Borgman. + +2007-04-16 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * alloc.c (mem_insert): Set min_heap_address and max_heap_address + if they are not yet initialized. + +2007-04-15 Chong Yidong <cyd@stupidchicken.com> + + * xdisp.c (redisplay_window): When deciding whether or not to + recenter, don't use the reset values of BEG_UNCHANGED and + END_UNCHANGED. + +2007-04-13 Kim F. Storm <storm@cua.dk> + + * buffer.c (Fkill_buffer): gcpro BUF during kill_buffer_processes + and check that buffer is still alive upon return. + +2007-04-13 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * macterm.c [!TARGET_API_MAC_CARBON]: Include Displays.h. + (mac_screen_config_changed): New variable. + (mac_handle_dm_notification, init_dm_notification_handler) + (mac_get_screen_info): New functions. + [MAC_OS8] (main): Call init_dm_notification_handler. + (mac_initialize) [MAC_OSX]: Likewise. + (XTread_socket): Call mac_get_screen_info if screen config changed. + (mac_initialized): Make static. + (mac_initialize_display_info): Remove function. + (mac_term_init): Call mac_get_screen_info. Add partial contents of + mac_initialize_display_info. + +2007-04-12 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * mac.c (xrm_get_preference_database, Fmac_get_preference) + [TARGET_API_MAC_CARBON]: Use CFPreferencesAppSynchronize. + + * macterm.c [TARGET_API_MAC_CARBON] (mac_post_mouse_moved_event): + Use GetGlobalMouse instead of GetMouse and LocalToGlobal. + (mac_initialize_display_info) [MAC_OSX]: Use CGRectZero. + (mac_initialize_display_info) [!MAC_OSX]: dpyinfo->height and + dpyinfo->width are those of whole screen. + 2007-04-10 Chong Yidong <cyd@stupidchicken.com> * xdisp.c (note_mode_line_or_margin_highlight): Don't decrement
--- a/src/abbrev.c Tue Apr 24 11:35:23 2007 +0000 +++ b/src/abbrev.c Tue Apr 24 21:56:25 2007 +0000 @@ -110,7 +110,7 @@ DEFUN ("define-abbrev", Fdefine_abbrev, Sdefine_abbrev, 3, 6, 0, doc: /* Define an abbrev in TABLE named NAME, to expand to EXPANSION and call HOOK. -NAME must be a string. +NAME must be a string, and should be lower-case. EXPANSION should usually be a string. To undefine an abbrev, define it with EXPANSION = nil. If HOOK is non-nil, it should be a function of no arguments;
--- a/src/alloc.c Tue Apr 24 11:35:23 2007 +0000 +++ b/src/alloc.c Tue Apr 24 21:56:25 2007 +0000 @@ -3572,9 +3572,9 @@ { struct mem_node *c, *parent, *x; - if (start < min_heap_address) + if (min_heap_address == NULL || start < min_heap_address) min_heap_address = start; - if (end > max_heap_address) + if (max_heap_address == NULL || end > max_heap_address) max_heap_address = end; /* See where in the tree a node for START belongs. In this
--- a/src/buffer.c Tue Apr 24 11:35:23 2007 +0000 +++ b/src/buffer.c Tue Apr 24 21:56:25 2007 +0000 @@ -1459,7 +1459,16 @@ unlock_buffer (b); #endif /* CLASH_DETECTION */ + GCPRO1 (buf); kill_buffer_processes (buf); + UNGCPRO; + + /* Killing buffer processes may run sentinels which may + have called kill-buffer. */ + + if (NILP (b->name)) + return Qnil; + clear_charpos_cache (b); tem = Vinhibit_quit;
--- a/src/dispnew.c Tue Apr 24 11:35:23 2007 +0000 +++ b/src/dispnew.c Tue Apr 24 21:56:25 2007 +0000 @@ -120,6 +120,7 @@ static struct glyph_matrix *save_current_matrix P_ ((struct frame *)); static void restore_current_matrix P_ ((struct frame *, struct glyph_matrix *)); +static int showing_window_margins_p P_ ((struct window *)); static void fake_current_matrices P_ ((Lisp_Object)); static void redraw_overlapping_rows P_ ((struct window *, int)); static void redraw_overlapped_rows P_ ((struct window *, int)); @@ -2164,6 +2165,33 @@ f->glyphs_initialized_p = 1; } +/* Return 1 if any window in the tree has nonzero window margins. See + the hack at the end of adjust_frame_glyphs_for_frame_redisplay. */ +static int +showing_window_margins_p (w) + struct window *w; +{ + while (w) + { + if (!NILP (w->hchild)) + { + if (showing_window_margins_p (XWINDOW (w->hchild))) + return 1; + } + else if (!NILP (w->vchild)) + { + if (showing_window_margins_p (XWINDOW (w->vchild))) + return 1; + } + else if (!NILP (w->left_margin_cols) + || !NILP (w->right_margin_cols)) + return 1; + + w = NILP (w->next) ? 0 : XWINDOW (w->next); + } + return 0; +} + /* In the window tree with root W, build current matrices of leaf windows from the frame's current matrix. */ @@ -2351,7 +2379,12 @@ if (display_completed && !FRAME_GARBAGED_P (f) && matrix_dim.width == f->current_matrix->matrix_w - && matrix_dim.height == f->current_matrix->matrix_h) + && matrix_dim.height == f->current_matrix->matrix_h + /* For some reason, the frame glyph matrix gets corrupted if + any of the windows contain margins. I haven't been able + to hunt down the reason, but for the moment this prevents + the problem from manifesting. -- cyd */ + && !showing_window_margins_p (XWINDOW (FRAME_ROOT_WINDOW (f)))) { struct glyph_matrix *copy = save_current_matrix (f); adjust_glyph_matrix (NULL, f->desired_matrix, 0, 0, matrix_dim);
--- a/src/keymap.c Tue Apr 24 11:35:23 2007 +0000 +++ b/src/keymap.c Tue Apr 24 21:56:25 2007 +0000 @@ -1148,7 +1148,8 @@ a cons (STRING . DEFN), meaning that DEFN is the definition (DEFN should be a valid definition in its own right), or a cons (MAP . CHAR), meaning use definition of CHAR in keymap MAP, - or an extended menu item definition. (See info node `Extended Menu Items'.) + or an extended menu item definition. + (See info node `(elisp)Extended Menu Items'.) If KEYMAP is a sparse keymap with a binding for KEY, the existing binding is altered. If there is no binding for KEY, the new pair
--- a/src/mac.c Tue Apr 24 11:35:23 2007 +0000 +++ b/src/mac.c Tue Apr 24 21:56:25 2007 +0000 @@ -1835,6 +1835,8 @@ if (app_id == NULL) goto out; } + if (!CFPreferencesAppSynchronize (app_id)) + goto out; key_set = CFSetCreateMutable (NULL, 0, &kCFCopyStringSetCallBacks); if (key_set == NULL) @@ -4650,6 +4652,9 @@ if (app_id == NULL) goto out; } + if (!CFPreferencesAppSynchronize (app_id)) + goto out; + key_str = cfstring_create_with_string (XCAR (key)); if (key_str == NULL) goto out; @@ -4986,7 +4991,7 @@ 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). + SELECT_TIMEOUT_THRESHOLD_RUNLOOP seconds). -> Create CFSocket for each socket and add it into the current event RunLoop so that the current event loop gets quit when the socket becomes ready. Then ReceiveNextEvent can wait for
--- a/src/macterm.c Tue Apr 24 11:35:23 2007 +0000 +++ b/src/macterm.c Tue Apr 24 21:56:25 2007 +0000 @@ -52,6 +52,7 @@ #include <LowMem.h> #include <Controls.h> #include <Windows.h> +#include <Displays.h> #if defined (__MRC__) || (__MSL__ >= 0x6000) #include <ControlDefinitions.h> #endif @@ -8890,6 +8891,9 @@ Carbon/Apple event handlers. */ static struct input_event *read_socket_inev = NULL; +/* Whether or not the screen configuration has changed. */ +static int mac_screen_config_changed = 0; + Point saved_menu_event_location; /* Apple Events */ @@ -10420,6 +10424,87 @@ } +static pascal void +mac_handle_dm_notification (event) + AppleEvent *event; +{ + mac_screen_config_changed = 1; +} + +static OSErr +init_dm_notification_handler () +{ + OSErr err; + static DMNotificationUPP handle_dm_notificationUPP = NULL; + ProcessSerialNumber psn; + + if (handle_dm_notificationUPP == NULL) + handle_dm_notificationUPP = + NewDMNotificationUPP (mac_handle_dm_notification); + + err = GetCurrentProcess (&psn); + if (err == noErr) + err = DMRegisterNotifyProc (handle_dm_notificationUPP, &psn); + + return err; +} + +static void +mac_get_screen_info (dpyinfo) + struct mac_display_info *dpyinfo; +{ +#ifdef MAC_OSX + /* HasDepth returns true if it is possible to have a 32 bit display, + but this may not be what is actually used. Mac OSX can do better. */ + dpyinfo->color_p = CGDisplaySamplesPerPixel (kCGDirectMainDisplay) > 1; + dpyinfo->n_planes = CGDisplayBitsPerPixel (kCGDirectMainDisplay); + { + CGDisplayErr err; + CGDisplayCount ndisps; + CGDirectDisplayID *displays; + + err = CGGetActiveDisplayList (0, NULL, &ndisps); + if (err == noErr) + { + displays = alloca (sizeof (CGDirectDisplayID) * ndisps); + err = CGGetActiveDisplayList (ndisps, displays, &ndisps); + } + if (err == noErr) + { + CGRect bounds = CGRectZero; + + while (ndisps-- > 0) + bounds = CGRectUnion (bounds, CGDisplayBounds (displays[ndisps])); + dpyinfo->height = CGRectGetHeight (bounds); + dpyinfo->width = CGRectGetWidth (bounds); + } + else + { + dpyinfo->height = CGDisplayPixelsHigh (kCGDirectMainDisplay); + dpyinfo->width = CGDisplayPixelsWide (kCGDirectMainDisplay); + } + } +#else /* !MAC_OSX */ + { + GDHandle gdh = GetMainDevice (); + Rect rect = (**gdh).gdRect; + + dpyinfo->color_p = TestDeviceAttribute (gdh, gdDevType); + for (dpyinfo->n_planes = 32; dpyinfo->n_planes > 0; dpyinfo->n_planes >>= 1) + if (HasDepth (gdh, dpyinfo->n_planes, gdDevType, dpyinfo->color_p)) + break; + + for (gdh = DMGetFirstScreenDevice (dmOnlyActiveDisplays); gdh; + gdh = DMGetNextScreenDevice (gdh, dmOnlyActiveDisplays)) + UnionRect (&rect, &(**gdh).gdRect, &rect); + + dpyinfo->height = rect.bottom - rect.top; + dpyinfo->width = rect.right - rect.left; + } +#endif /* !MAC_OSX */ +} + + #if __profile__ void profiler_exit_proc () @@ -10477,6 +10562,8 @@ init_apple_event_handler (); + init_dm_notification_handler (); + { char **argv; int argc = 0; @@ -10554,8 +10641,7 @@ { Point mouse_pos; - GetMouse (&mouse_pos); - LocalToGlobal (&mouse_pos); + GetGlobalMouse (&mouse_pos); err = SetEventParameter (event, kEventParamMouseLocation, typeQDPoint, sizeof (Point), &mouse_pos); } @@ -11375,6 +11461,12 @@ pending_autoraise_frame = 0; } + if (mac_screen_config_changed) + { + mac_get_screen_info (dpyinfo); + mac_screen_config_changed = 0; + } + #if !USE_CARBON_EVENTS /* Check which frames are still visible. We do this here because there doesn't seem to be any direct notification from the Window @@ -11509,86 +11601,7 @@ Initialization ***********************************************************************/ -int mac_initialized = 0; - -void -mac_initialize_display_info () -{ - struct mac_display_info *dpyinfo = &one_mac_display_info; - - bzero (dpyinfo, sizeof (*dpyinfo)); - -#ifdef MAC_OSX - dpyinfo->mac_id_name - = (char *) xmalloc (SCHARS (Vinvocation_name) - + SCHARS (Vsystem_name) - + 2); - sprintf (dpyinfo->mac_id_name, "%s@%s", - SDATA (Vinvocation_name), SDATA (Vsystem_name)); -#else - dpyinfo->mac_id_name = (char *) xmalloc (strlen ("Mac Display") + 1); - strcpy (dpyinfo->mac_id_name, "Mac Display"); -#endif - - dpyinfo->reference_count = 0; - dpyinfo->resx = 72.0; - dpyinfo->resy = 72.0; -#ifdef MAC_OSX - /* HasDepth returns true if it is possible to have a 32 bit display, - but this may not be what is actually used. Mac OSX can do better. */ - dpyinfo->color_p = CGDisplaySamplesPerPixel (kCGDirectMainDisplay) > 1; - dpyinfo->n_planes = CGDisplayBitsPerPixel (kCGDirectMainDisplay); - { - CGDisplayErr err; - CGDisplayCount ndisps; - CGDirectDisplayID *displays; - - err = CGGetActiveDisplayList (0, NULL, &ndisps); - if (err == noErr) - { - displays = alloca (sizeof (CGDirectDisplayID) * ndisps); - err = CGGetActiveDisplayList (ndisps, displays, &ndisps); - } - if (err == noErr) - { - CGRect bounds = CGRectMake (0, 0, 0, 0); - - while (ndisps-- > 0) - bounds = CGRectUnion (bounds, CGDisplayBounds (displays[ndisps])); - dpyinfo->height = CGRectGetHeight (bounds); - dpyinfo->width = CGRectGetWidth (bounds); - } - else - { - dpyinfo->height = CGDisplayPixelsHigh (kCGDirectMainDisplay); - dpyinfo->width = CGDisplayPixelsWide (kCGDirectMainDisplay); - } - } -#else - { - GDHandle main_device_handle = LMGetMainDevice(); - - dpyinfo->color_p = TestDeviceAttribute (main_device_handle, gdDevType); - for (dpyinfo->n_planes = 32; dpyinfo->n_planes > 0; dpyinfo->n_planes >>= 1) - if (HasDepth (main_device_handle, dpyinfo->n_planes, - gdDevType, dpyinfo->color_p)) - break; - dpyinfo->height = (**main_device_handle).gdRect.bottom; - dpyinfo->width = (**main_device_handle).gdRect.right; - } -#endif - dpyinfo->grabbed = 0; - dpyinfo->root_window = NULL; - dpyinfo->image_cache = make_image_cache (); - - dpyinfo->mouse_face_beg_row = dpyinfo->mouse_face_beg_col = -1; - dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_end_col = -1; - dpyinfo->mouse_face_face_id = DEFAULT_FACE_ID; - dpyinfo->mouse_face_window = Qnil; - dpyinfo->mouse_face_overlay = Qnil; - dpyinfo->mouse_face_hidden = 0; -} - +static int mac_initialized = 0; static XrmDatabase mac_make_rdb (xrm_option) @@ -11622,9 +11635,37 @@ if (x_display_list) error ("Sorry, this version can only handle one display"); - mac_initialize_display_info (); - dpyinfo = &one_mac_display_info; + bzero (dpyinfo, sizeof (*dpyinfo)); + +#ifdef MAC_OSX + dpyinfo->mac_id_name + = (char *) xmalloc (SCHARS (Vinvocation_name) + + SCHARS (Vsystem_name) + + 2); + sprintf (dpyinfo->mac_id_name, "%s@%s", + SDATA (Vinvocation_name), SDATA (Vsystem_name)); +#else + dpyinfo->mac_id_name = (char *) xmalloc (strlen ("Mac Display") + 1); + strcpy (dpyinfo->mac_id_name, "Mac Display"); +#endif + + dpyinfo->reference_count = 0; + dpyinfo->resx = 72.0; + dpyinfo->resy = 72.0; + + mac_get_screen_info (dpyinfo); + + dpyinfo->grabbed = 0; + dpyinfo->root_window = NULL; + dpyinfo->image_cache = make_image_cache (); + + dpyinfo->mouse_face_beg_row = dpyinfo->mouse_face_beg_col = -1; + dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_end_col = -1; + dpyinfo->mouse_face_face_id = DEFAULT_FACE_ID; + dpyinfo->mouse_face_window = Qnil; + dpyinfo->mouse_face_overlay = Qnil; + dpyinfo->mouse_face_hidden = 0; dpyinfo->xrdb = mac_make_rdb (xrm_option); @@ -11642,6 +11683,7 @@ return dpyinfo; } + /* Get rid of display DPYINFO, assuming all frames are already gone. */ void @@ -11861,6 +11903,8 @@ init_apple_event_handler (); + init_dm_notification_handler (); + if (!inhibit_window_system) { static const ProcessSerialNumber psn = {0, kCurrentProcess};
--- a/src/minibuf.c Tue Apr 24 11:35:23 2007 +0000 +++ b/src/minibuf.c Tue Apr 24 21:56:25 2007 +0000 @@ -386,7 +386,7 @@ DEFUN ("minibuffer-contents", Fminibuffer_contents, Sminibuffer_contents, 0, 0, 0, doc: /* Return the user input in a minibuffer as a string. -The current buffer must be a minibuffer. */) +If the current buffer is not a minibuffer, return its entire contents. */) () { int prompt_end = XINT (Fminibuffer_prompt_end ()); @@ -396,7 +396,7 @@ DEFUN ("minibuffer-contents-no-properties", Fminibuffer_contents_no_properties, Sminibuffer_contents_no_properties, 0, 0, 0, doc: /* Return the user input in a minibuffer as a string, without text-properties. -The current buffer must be a minibuffer. */) +If the current buffer is not a minibuffer, return its entire contents. */) () { int prompt_end = XINT (Fminibuffer_prompt_end ()); @@ -407,7 +407,7 @@ Sminibuffer_completion_contents, 0, 0, 0, doc: /* Return the user input in a minibuffer before point as a string. That is what completion commands operate on. -The current buffer must be a minibuffer. */) +If the current buffer is not a minibuffer, return its entire contents. */) () { int prompt_end = XINT (Fminibuffer_prompt_end ()); @@ -419,7 +419,7 @@ DEFUN ("delete-minibuffer-contents", Fdelete_minibuffer_contents, Sdelete_minibuffer_contents, 0, 0, 0, doc: /* Delete all user input in a minibuffer. -The current buffer must be a minibuffer. */) +If the current buffer is not a minibuffer, erase its entire contents. */) () { int prompt_end = XINT (Fminibuffer_prompt_end ()); @@ -704,7 +704,7 @@ if (!NILP (current_buffer->enable_multibyte_characters) && ! STRING_MULTIBYTE (minibuf_prompt)) minibuf_prompt = Fstring_make_multibyte (minibuf_prompt); - + /* Insert the prompt, record where it ends. */ Finsert (1, &minibuf_prompt); if (PT > BEG)
--- a/src/process.c Tue Apr 24 11:35:23 2007 +0000 +++ b/src/process.c Tue Apr 24 21:56:25 2007 +0000 @@ -1557,13 +1557,19 @@ doc: /* Start a program in a subprocess. Return the process object for it. NAME is name for process. It is modified if necessary to make it unique. BUFFER is the buffer (or buffer name) to associate with the process. - Process output goes at end of that buffer, unless you specify - an output stream or filter function to handle the output. - BUFFER may be also nil, meaning that this process is not associated - with any buffer. + +Process output (both standard output and standard error streams) goes +at end of BUFFER, unless you specify an output stream or filter +function to handle the output. BUFFER may also be nil, meaning that +this process is not associated with any buffer. + PROGRAM is the program file name. It is searched for in PATH. Remaining arguments are strings to give program as arguments. +If you want to separate standard output from standard error, invoke +the command through a shell and redirect one of them using the shell +syntax. + usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */) (nargs, args) int nargs;
--- a/src/sysdep.c Tue Apr 24 11:35:23 2007 +0000 +++ b/src/sysdep.c Tue Apr 24 21:56:25 2007 +0000 @@ -2433,7 +2433,9 @@ /* We still don't have a fully qualified domain name. Try to find one in the list of alternate names */ char **alias = hp->h_aliases; - while (*alias && !index (*alias, '.')) + while (*alias + && (!index (*alias, '.') + || !strcmp (*alias, "localhost.localdomain"))) alias++; if (*alias) fqdn = *alias;
--- a/src/xdisp.c Tue Apr 24 11:35:23 2007 +0000 +++ b/src/xdisp.c Tue Apr 24 21:56:25 2007 +0000 @@ -12926,6 +12926,7 @@ int rc; int centering_position = -1; int last_line_misfit = 0; + int save_beg_unchanged, save_end_unchanged; SET_TEXT_POS (lpoint, PT, PT_BYTE); opoint = lpoint; @@ -12990,6 +12991,9 @@ set_buffer_internal_1 (XBUFFER (w->buffer)); SET_TEXT_POS (opoint, PT, PT_BYTE); + save_beg_unchanged = BEG_UNCHANGED; + save_end_unchanged = END_UNCHANGED; + current_matrix_up_to_date_p = (!NILP (w->window_end_valid) && !current_buffer->clip_changed @@ -13294,11 +13298,20 @@ && NILP (do_mouse_tracking) && CHARPOS (startp) > BEGV) { - /* Make sure beg_unchanged and end_unchanged are up to date. - Do it only if buffer has really changed. This may or may - not have been done by try_window_id (see which) already. */ +#if 0 + /* The following code tried to make BEG_UNCHANGED and + END_UNCHANGED up to date (similar to try_window_id). + Is it important to do so? + + The trouble is that it's a little too strict when it + comes to overlays: modify_overlay can call + BUF_COMPUTE_UNCHANGED, which alters BUF_BEG_UNCHANGED and + BUF_END_UNCHANGED directly without moving the gap. + + This can result in spurious recentering when overlays are + altered in the buffer. So unless it's proven necessary, + let's leave this commented out for now. -- cyd. */ if (MODIFF > SAVE_MODIFF - /* This seems to happen sometimes after saving a buffer. */ || BEG_UNCHANGED + END_UNCHANGED > Z_BYTE) { if (GPT - BEG < BEG_UNCHANGED) @@ -13306,9 +13319,10 @@ if (Z - GPT < END_UNCHANGED) END_UNCHANGED = Z - GPT; } - - if (CHARPOS (startp) > BEG + BEG_UNCHANGED - && CHARPOS (startp) <= Z - END_UNCHANGED) +#endif + + if (CHARPOS (startp) > BEG + save_beg_unchanged + && CHARPOS (startp) <= Z - save_end_unchanged) { /* There doesn't seems to be a simple way to find a new window start that is near the old window start, so @@ -16002,13 +16016,37 @@ if (PT == MATRIX_ROW_END_CHARPOS (row)) { - /* If the row ends with a newline from a string, we don't want - the cursor there, but we still want it at the start of the - string if the string starts in this row. - If the row is continued it doesn't end in a newline. */ + /* Suppose the row ends on a string. + Unless the row is continued, that means it ends on a newline + in the string. If it's anything other than a display string + (e.g. a before-string from an overlay), we don't want the + cursor there. (This heuristic seems to give the optimal + behavior for the various types of multi-line strings.) */ if (CHARPOS (row->end.string_pos) >= 0) - cursor_row_p = (row->continued_p - || PT >= MATRIX_ROW_START_CHARPOS (row)); + { + if (row->continued_p) + cursor_row_p = 1; + else + { + /* Check for `display' property. */ + struct glyph *beg = row->glyphs[TEXT_AREA]; + struct glyph *end = beg + row->used[TEXT_AREA] - 1; + struct glyph *glyph; + + cursor_row_p = 0; + for (glyph = end; glyph >= beg; --glyph) + if (STRINGP (glyph->object)) + { + Lisp_Object prop + = Fget_char_property (make_number (PT), + Qdisplay, Qnil); + cursor_row_p = + (!NILP (prop) + && display_prop_string_p (prop, glyph->object)); + break; + } + } + } else if (MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P (row)) { /* If the row ends in middle of a real character,